hydra_attribute 0.3.2 → 0.4.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (65) hide show
  1. data/CHANGELOG.md +1 -1
  2. data/README.md +7 -0
  3. data/features/entity/create.feature +128 -0
  4. data/features/entity/destroy.feature +111 -0
  5. data/features/entity/new.feature +121 -0
  6. data/features/entity/update.feature +147 -0
  7. data/features/{attributes → hydra_attribute}/create.feature +7 -7
  8. data/features/{attributes → hydra_attribute}/destroy.feature +2 -4
  9. data/features/{attributes → hydra_attribute}/update.feature +10 -10
  10. data/features/hydra_set/destroy.feature +31 -0
  11. data/features/migrations/create_and_drop.feature +165 -0
  12. data/features/migrations/migrate_and_rollback.feature +211 -0
  13. data/features/relation/query_methods/group.feature +42 -0
  14. data/features/relation/query_methods/order.feature +67 -0
  15. data/features/relation/query_methods/reorder.feature +29 -0
  16. data/features/relation/query_methods/reverse_order.feature +29 -0
  17. data/features/relation/query_methods/select.feature +50 -0
  18. data/features/relation/query_methods/where.feature +70 -0
  19. data/features/step_definitions/connections.rb +65 -0
  20. data/features/step_definitions/model_steps.rb +79 -6
  21. data/features/step_definitions/query_methods.rb +3 -3
  22. data/features/step_definitions/record_steps.rb +3 -4
  23. data/features/support/env.rb +17 -3
  24. data/features/support/world.rb +15 -10
  25. data/gemfiles/3.1.gemfile.lock +15 -15
  26. data/gemfiles/3.2.gemfile.lock +15 -15
  27. data/lib/hydra_attribute/active_record/association.rb +74 -38
  28. data/lib/hydra_attribute/active_record/association_preloader.rb +49 -49
  29. data/lib/hydra_attribute/active_record/attribute_methods.rb +37 -85
  30. data/lib/hydra_attribute/active_record/migration.rb +2 -2
  31. data/lib/hydra_attribute/active_record/reflection.rb +1 -1
  32. data/lib/hydra_attribute/active_record/relation/query_methods.rb +8 -7
  33. data/lib/hydra_attribute/active_record/relation.rb +1 -0
  34. data/lib/hydra_attribute/active_record.rb +20 -12
  35. data/lib/hydra_attribute/association_builder.rb +1 -2
  36. data/lib/hydra_attribute/builder.rb +7 -8
  37. data/lib/hydra_attribute/entity_callbacks.rb +12 -32
  38. data/lib/hydra_attribute/hydra_attribute.rb +25 -16
  39. data/lib/hydra_attribute/hydra_attribute_methods.rb +85 -0
  40. data/lib/hydra_attribute/hydra_methods.rb +123 -0
  41. data/lib/hydra_attribute/hydra_set.rb +36 -0
  42. data/lib/hydra_attribute/hydra_set_methods.rb +39 -0
  43. data/lib/hydra_attribute/hydra_value_methods.rb +14 -0
  44. data/lib/hydra_attribute/memoize.rb +37 -0
  45. data/lib/hydra_attribute/migrator.rb +100 -51
  46. data/lib/hydra_attribute/railtie.rb +1 -3
  47. data/lib/hydra_attribute/version.rb +1 -1
  48. data/lib/hydra_attribute.rb +7 -1
  49. data/spec/hydra_attribute_methods_spec.rb +458 -0
  50. data/spec/hydra_attribute_spec.rb +19 -0
  51. data/spec/hydra_methods_spec.rb +457 -0
  52. data/spec/hydra_set_methods_spec.rb +203 -0
  53. data/spec/hydra_set_spec.rb +19 -0
  54. data/spec/memoize_spec.rb +95 -0
  55. data/spec/spec_helper.rb +42 -2
  56. metadata +71 -43
  57. data/features/create.feature +0 -47
  58. data/features/define.feature +0 -38
  59. data/features/destroy.feature +0 -102
  60. data/features/query_methods/group.feature +0 -42
  61. data/features/query_methods/order.feature +0 -99
  62. data/features/query_methods/select.feature +0 -50
  63. data/features/query_methods/where.feature +0 -70
  64. data/features/support/schema.rb +0 -79
  65. data/features/update.feature +0 -114
@@ -0,0 +1,165 @@
1
+ Feature: create and drop hydra EAV stack
2
+ When create hydra entity
3
+ Then all necessary tables with indexes should be created
4
+
5
+ When drop hydra entity
6
+ Then all necessary tables should be dropped
7
+
8
+ Background: create migration with separate connection
9
+ Given create connection
10
+
11
+ Scenario: create and drop hydra entity
12
+ When create hydra entity "wheels"
13
+ Then should have the following 10 tables:
14
+ | tables |
15
+ | wheels |
16
+ | hydra_attributes |
17
+ | hydra_sets |
18
+ | hydra_attribute_sets |
19
+ | hydra_string_wheels |
20
+ | hydra_text_wheels |
21
+ | hydra_float_wheels |
22
+ | hydra_integer_wheels |
23
+ | hydra_boolean_wheels |
24
+ | hydra_datetime_wheels |
25
+ And table "wheels" should have the following columns:
26
+ | name | type | limit | default | null | precision | scale |
27
+ | id | [sym:integer] | [nil:] | [nil:] | [bool:f] | [nil:] | [nil:] |
28
+ | hydra_set_id | [sym:integer] | [nil:] | [nil:] | [bool:t] | [nil:] | [nil:] |
29
+ And table "wheels" should have the following indexes:
30
+ | name | columns | unique |
31
+ | wheels_hydra_set_id_index | [array:hydra_set_id] | [bool:f] |
32
+ And table "hydra_attributes" should have the following columns:
33
+ | name | type | limit | default | null | precision | scale |
34
+ | id | [sym:integer] | [nil:] | [nil:] | [bool:f] | [nil:] | [nil:] |
35
+ | entity_type | [sym:string] | [int:32] | [nil:] | [bool:f] | [nil:] | [nil:] |
36
+ | name | [sym:string] | [int:32] | [nil:] | [bool:f] | [nil:] | [nil:] |
37
+ | backend_type | [sym:string] | [int:16] | [nil:] | [bool:f] | [nil:] | [nil:] |
38
+ | default_value | [sym:string] | [int:255] | [nil:] | [bool:t] | [nil:] | [nil:] |
39
+ | white_list | [sym:boolean] | [nil:] | [bool:f] | [bool:f] | [nil:] | [nil:] |
40
+ | created_at | [sym:datetime] | [nil:] | [nil:] | [bool:t] | [nil:] | [nil:] |
41
+ | updated_at | [sym:datetime] | [nil:] | [nil:] | [bool:t] | [nil:] | [nil:] |
42
+ And table "hydra_attributes" should have the following indexes:
43
+ | name | columns | unique |
44
+ | hydra_attributes_index | [array:entity_type,name] | [bool:t] |
45
+ And table "hydra_sets" should have the following columns:
46
+ | name | type | limit | default | null | precision | scale |
47
+ | id | [sym:integer] | [nil:] | [nil:] | [bool:f] | [nil:] | [nil:] |
48
+ | entity_type | [sym:string] | [int:32] | [nil:] | [bool:f] | [nil:] | [nil:] |
49
+ | name | [sym:string] | [int:32] | [nil:] | [bool:f] | [nil:] | [nil:] |
50
+ | created_at | [sym:datetime] | [nil:] | [nil:] | [bool:t] | [nil:] | [nil:] |
51
+ | updated_at | [sym:datetime] | [nil:] | [nil:] | [bool:t] | [nil:] | [nil:] |
52
+ And table "hydra_sets" should have the following indexes:
53
+ | name | columns | unique |
54
+ | hydra_sets_index | [array:entity_type,name] | [bool:t] |
55
+ And table "hydra_attribute_sets" should have the following columns:
56
+ | name | type | limit | default | null | precision | scale |
57
+ | hydra_attribute_id | [sym:integer] | [nil:] | [nil:] | [bool:f] | [nil:] | [nil:] |
58
+ | hydra_set_id | [sym:integer] | [nil:] | [nil:] | [bool:f] | [nil:] | [nil:] |
59
+ And table "hydra_attribute_sets" should have the following indexes:
60
+ | name | columns | unique |
61
+ | hydra_attribute_sets_index | [array:hydra_attribute_id,hydra_set_id] | [bool:t] |
62
+ And table "hydra_string_wheels" should have the following columns:
63
+ | name | type | limit | default | null | precision | scale |
64
+ | id | [sym:integer] | [nil:] | [nil:] | [bool:f] | [nil:] | [nil:] |
65
+ | entity_id | [sym:integer] | [nil:] | [nil:] | [bool:f] | [nil:] | [nil:] |
66
+ | hydra_attribute_id | [sym:integer] | [nil:] | [nil:] | [bool:f] | [nil:] | [nil:] |
67
+ | value | [sym:string] | [int:255] | [nil:] | [bool:t] | [nil:] | [nil:] |
68
+ | created_at | [sym:datetime] | [nil:] | [nil:] | [bool:t] | [nil:] | [nil:] |
69
+ | updated_at | [sym:datetime] | [nil:] | [nil:] | [bool:t] | [nil:] | [nil:] |
70
+ And table "hydra_string_wheels" should have the following indexes:
71
+ | name | columns | unique |
72
+ | hydra_string_wheels_index | [array:entity_id,hydra_attribute_id] | [bool:t] |
73
+ And table "hydra_text_wheels" should have the following columns:
74
+ | name | type | limit | default | null | precision | scale |
75
+ | id | [sym:integer] | [nil:] | [nil:] | [bool:f] | [nil:] | [nil:] |
76
+ | entity_id | [sym:integer] | [nil:] | [nil:] | [bool:f] | [nil:] | [nil:] |
77
+ | hydra_attribute_id | [sym:integer] | [nil:] | [nil:] | [bool:f] | [nil:] | [nil:] |
78
+ | value | [sym:text] | [nil:] | [nil:] | [bool:t] | [nil:] | [nil:] |
79
+ | created_at | [sym:datetime] | [nil:] | [nil:] | [bool:t] | [nil:] | [nil:] |
80
+ | updated_at | [sym:datetime] | [nil:] | [nil:] | [bool:t] | [nil:] | [nil:] |
81
+ And table "hydra_text_wheels" should have the following indexes:
82
+ | name | columns | unique |
83
+ | hydra_text_wheels_index | [array:entity_id,hydra_attribute_id] | [bool:t] |
84
+ And table "hydra_integer_wheels" should have the following columns:
85
+ | name | type | limit | default | null | precision | scale |
86
+ | id | [sym:integer] | [nil:] | [nil:] | [bool:f] | [nil:] | [nil:] |
87
+ | entity_id | [sym:integer] | [nil:] | [nil:] | [bool:f] | [nil:] | [nil:] |
88
+ | hydra_attribute_id | [sym:integer] | [nil:] | [nil:] | [bool:f] | [nil:] | [nil:] |
89
+ | value | [sym:integer] | [nil:] | [nil:] | [bool:t] | [nil:] | [nil:] |
90
+ | created_at | [sym:datetime] | [nil:] | [nil:] | [bool:t] | [nil:] | [nil:] |
91
+ | updated_at | [sym:datetime] | [nil:] | [nil:] | [bool:t] | [nil:] | [nil:] |
92
+ And table "hydra_integer_wheels" should have the following indexes:
93
+ | name | columns | unique |
94
+ | hydra_integer_wheels_index | [array:entity_id,hydra_attribute_id] | [bool:t] |
95
+ And table "hydra_float_wheels" should have the following columns:
96
+ | name | type | limit | default | null | precision | scale |
97
+ | id | [sym:integer] | [nil:] | [nil:] | [bool:f] | [nil:] | [nil:] |
98
+ | entity_id | [sym:integer] | [nil:] | [nil:] | [bool:f] | [nil:] | [nil:] |
99
+ | hydra_attribute_id | [sym:integer] | [nil:] | [nil:] | [bool:f] | [nil:] | [nil:] |
100
+ | value | [sym:float] | [nil:] | [nil:] | [bool:t] | [nil:] | [nil:] |
101
+ | created_at | [sym:datetime] | [nil:] | [nil:] | [bool:t] | [nil:] | [nil:] |
102
+ | updated_at | [sym:datetime] | [nil:] | [nil:] | [bool:t] | [nil:] | [nil:] |
103
+ And table "hydra_float_wheels" should have the following indexes:
104
+ | name | columns | unique |
105
+ | hydra_float_wheels_index | [array:entity_id,hydra_attribute_id] | [bool:t] |
106
+ And table "hydra_boolean_wheels" should have the following columns:
107
+ | name | type | limit | default | null | precision | scale |
108
+ | id | [sym:integer] | [nil:] | [nil:] | [bool:f] | [nil:] | [nil:] |
109
+ | entity_id | [sym:integer] | [nil:] | [nil:] | [bool:f] | [nil:] | [nil:] |
110
+ | hydra_attribute_id | [sym:integer] | [nil:] | [nil:] | [bool:f] | [nil:] | [nil:] |
111
+ | value | [sym:boolean] | [nil:] | [nil:] | [bool:t] | [nil:] | [nil:] |
112
+ | created_at | [sym:datetime] | [nil:] | [nil:] | [bool:t] | [nil:] | [nil:] |
113
+ | updated_at | [sym:datetime] | [nil:] | [nil:] | [bool:t] | [nil:] | [nil:] |
114
+ And table "hydra_boolean_wheels" should have the following indexes:
115
+ | name | columns | unique |
116
+ | hydra_boolean_wheels_index | [array:entity_id,hydra_attribute_id] | [bool:t] |
117
+ And table "hydra_datetime_wheels" should have the following columns:
118
+ | name | type | limit | default | null | precision | scale |
119
+ | id | [sym:integer] | [nil:] | [nil:] | [bool:f] | [nil:] | [nil:] |
120
+ | entity_id | [sym:integer] | [nil:] | [nil:] | [bool:f] | [nil:] | [nil:] |
121
+ | hydra_attribute_id | [sym:integer] | [nil:] | [nil:] | [bool:f] | [nil:] | [nil:] |
122
+ | value | [sym:datetime] | [nil:] | [nil:] | [bool:t] | [nil:] | [nil:] |
123
+ | created_at | [sym:datetime] | [nil:] | [nil:] | [bool:t] | [nil:] | [nil:] |
124
+ | updated_at | [sym:datetime] | [nil:] | [nil:] | [bool:t] | [nil:] | [nil:] |
125
+ And table "hydra_datetime_wheels" should have the following indexes:
126
+ | name | columns | unique |
127
+ | hydra_datetime_wheels_index | [array:entity_id,hydra_attribute_id] | [bool:t] |
128
+
129
+ When create hydra entity "cars"
130
+ Then should have the following 17 tables:
131
+ | tables |
132
+ | wheels |
133
+ | hydra_attributes |
134
+ | hydra_sets |
135
+ | hydra_attribute_sets |
136
+ | hydra_string_wheels |
137
+ | hydra_text_wheels |
138
+ | hydra_float_wheels |
139
+ | hydra_integer_wheels |
140
+ | hydra_boolean_wheels |
141
+ | hydra_datetime_wheels |
142
+ | cars |
143
+ | hydra_string_cars |
144
+ | hydra_text_cars |
145
+ | hydra_float_cars |
146
+ | hydra_integer_cars |
147
+ | hydra_boolean_cars |
148
+ | hydra_datetime_cars |
149
+
150
+ When drop hydra entity "wheels"
151
+ Then should have the following 10 tables:
152
+ | tables |
153
+ | hydra_attributes |
154
+ | hydra_sets |
155
+ | hydra_attribute_sets |
156
+ | cars |
157
+ | hydra_string_cars |
158
+ | hydra_text_cars |
159
+ | hydra_float_cars |
160
+ | hydra_integer_cars |
161
+ | hydra_boolean_cars |
162
+ | hydra_datetime_cars |
163
+
164
+ When drop hydra entity "cars"
165
+ Then should not have any tables
@@ -0,0 +1,211 @@
1
+ Feature: migrate to and rollback from hydra EAV stack
2
+ When migrate existing table to EAV
3
+ Then all additional tables with indexes should be created
4
+
5
+ When rollback from hydra entity
6
+ Then all hydra attribute tables should be dropped
7
+ And hydra_set_id column from entity table should be removed
8
+ But main entity table should be kept
9
+
10
+ Background: create migration with separate connection
11
+ Given create connection
12
+
13
+ Scenario: migrate existing tables to hydra and then rollback them
14
+ When create table "wheels"
15
+ And create table "cars"
16
+ Then should have the following 2 tables:
17
+ | tables |
18
+ | wheels |
19
+ | cars |
20
+ And table "wheels" should have the following columns:
21
+ | name | type | limit | default | null | precision | scale |
22
+ | id | [sym:integer] | [nil:] | [nil:] | [bool:f] | [nil:] | [nil:] |
23
+ And table "cars" should have the following columns:
24
+ | name | type | limit | default | null | precision | scale |
25
+ | id | [sym:integer] | [nil:] | [nil:] | [bool:f] | [nil:] | [nil:] |
26
+
27
+ When migrate to hydra entity "wheels"
28
+ Then should have the following 11 tables:
29
+ | tables |
30
+ | wheels |
31
+ | cars |
32
+ | hydra_attributes |
33
+ | hydra_sets |
34
+ | hydra_attribute_sets |
35
+ | hydra_string_wheels |
36
+ | hydra_text_wheels |
37
+ | hydra_float_wheels |
38
+ | hydra_integer_wheels |
39
+ | hydra_boolean_wheels |
40
+ | hydra_datetime_wheels |
41
+ And table "wheels" should have the following columns:
42
+ | name | type | limit | default | null | precision | scale |
43
+ | id | [sym:integer] | [nil:] | [nil:] | [bool:f] | [nil:] | [nil:] |
44
+ | hydra_set_id | [sym:integer] | [nil:] | [nil:] | [bool:t] | [nil:] | [nil:] |
45
+ And table "wheels" should have the following indexes:
46
+ | name | columns | unique |
47
+ | wheels_hydra_set_id_index | [array:hydra_set_id] | [bool:f] |
48
+ And table "cars" should have the following columns:
49
+ | name | type | limit | default | null | precision | scale |
50
+ | id | [sym:integer] | [nil:] | [nil:] | [bool:f] | [nil:] | [nil:] |
51
+ And table "hydra_attributes" should have the following columns:
52
+ | name | type | limit | default | null | precision | scale |
53
+ | id | [sym:integer] | [nil:] | [nil:] | [bool:f] | [nil:] | [nil:] |
54
+ | entity_type | [sym:string] | [int:32] | [nil:] | [bool:f] | [nil:] | [nil:] |
55
+ | name | [sym:string] | [int:32] | [nil:] | [bool:f] | [nil:] | [nil:] |
56
+ | backend_type | [sym:string] | [int:16] | [nil:] | [bool:f] | [nil:] | [nil:] |
57
+ | default_value | [sym:string] | [int:255] | [nil:] | [bool:t] | [nil:] | [nil:] |
58
+ | white_list | [sym:boolean] | [nil:] | [bool:f] | [bool:f] | [nil:] | [nil:] |
59
+ | created_at | [sym:datetime] | [nil:] | [nil:] | [bool:t] | [nil:] | [nil:] |
60
+ | updated_at | [sym:datetime] | [nil:] | [nil:] | [bool:t] | [nil:] | [nil:] |
61
+ And table "hydra_attributes" should have the following indexes:
62
+ | name | columns | unique |
63
+ | hydra_attributes_index | [array:entity_type,name] | [bool:t] |
64
+ And table "hydra_sets" should have the following columns:
65
+ | name | type | limit | default | null | precision | scale |
66
+ | id | [sym:integer] | [nil:] | [nil:] | [bool:f] | [nil:] | [nil:] |
67
+ | entity_type | [sym:string] | [int:32] | [nil:] | [bool:f] | [nil:] | [nil:] |
68
+ | name | [sym:string] | [int:32] | [nil:] | [bool:f] | [nil:] | [nil:] |
69
+ | created_at | [sym:datetime] | [nil:] | [nil:] | [bool:t] | [nil:] | [nil:] |
70
+ | updated_at | [sym:datetime] | [nil:] | [nil:] | [bool:t] | [nil:] | [nil:] |
71
+ And table "hydra_sets" should have the following indexes:
72
+ | name | columns | unique |
73
+ | hydra_sets_index | [array:entity_type,name] | [bool:t] |
74
+ And table "hydra_attribute_sets" should have the following columns:
75
+ | name | type | limit | default | null | precision | scale |
76
+ | hydra_attribute_id | [sym:integer] | [nil:] | [nil:] | [bool:f] | [nil:] | [nil:] |
77
+ | hydra_set_id | [sym:integer] | [nil:] | [nil:] | [bool:f] | [nil:] | [nil:] |
78
+ And table "hydra_attribute_sets" should have the following indexes:
79
+ | name | columns | unique |
80
+ | hydra_attribute_sets_index | [array:hydra_attribute_id,hydra_set_id] | [bool:t] |
81
+ And table "hydra_string_wheels" should have the following columns:
82
+ | name | type | limit | default | null | precision | scale |
83
+ | id | [sym:integer] | [nil:] | [nil:] | [bool:f] | [nil:] | [nil:] |
84
+ | entity_id | [sym:integer] | [nil:] | [nil:] | [bool:f] | [nil:] | [nil:] |
85
+ | hydra_attribute_id | [sym:integer] | [nil:] | [nil:] | [bool:f] | [nil:] | [nil:] |
86
+ | value | [sym:string] | [int:255] | [nil:] | [bool:t] | [nil:] | [nil:] |
87
+ | created_at | [sym:datetime] | [nil:] | [nil:] | [bool:t] | [nil:] | [nil:] |
88
+ | updated_at | [sym:datetime] | [nil:] | [nil:] | [bool:t] | [nil:] | [nil:] |
89
+ And table "hydra_string_wheels" should have the following indexes:
90
+ | name | columns | unique |
91
+ | hydra_string_wheels_index | [array:entity_id,hydra_attribute_id] | [bool:t] |
92
+ And table "hydra_text_wheels" should have the following columns:
93
+ | name | type | limit | default | null | precision | scale |
94
+ | id | [sym:integer] | [nil:] | [nil:] | [bool:f] | [nil:] | [nil:] |
95
+ | entity_id | [sym:integer] | [nil:] | [nil:] | [bool:f] | [nil:] | [nil:] |
96
+ | hydra_attribute_id | [sym:integer] | [nil:] | [nil:] | [bool:f] | [nil:] | [nil:] |
97
+ | value | [sym:text] | [nil:] | [nil:] | [bool:t] | [nil:] | [nil:] |
98
+ | created_at | [sym:datetime] | [nil:] | [nil:] | [bool:t] | [nil:] | [nil:] |
99
+ | updated_at | [sym:datetime] | [nil:] | [nil:] | [bool:t] | [nil:] | [nil:] |
100
+ And table "hydra_text_wheels" should have the following indexes:
101
+ | name | columns | unique |
102
+ | hydra_text_wheels_index | [array:entity_id,hydra_attribute_id] | [bool:t] |
103
+ And table "hydra_integer_wheels" should have the following columns:
104
+ | name | type | limit | default | null | precision | scale |
105
+ | id | [sym:integer] | [nil:] | [nil:] | [bool:f] | [nil:] | [nil:] |
106
+ | entity_id | [sym:integer] | [nil:] | [nil:] | [bool:f] | [nil:] | [nil:] |
107
+ | hydra_attribute_id | [sym:integer] | [nil:] | [nil:] | [bool:f] | [nil:] | [nil:] |
108
+ | value | [sym:integer] | [nil:] | [nil:] | [bool:t] | [nil:] | [nil:] |
109
+ | created_at | [sym:datetime] | [nil:] | [nil:] | [bool:t] | [nil:] | [nil:] |
110
+ | updated_at | [sym:datetime] | [nil:] | [nil:] | [bool:t] | [nil:] | [nil:] |
111
+ And table "hydra_integer_wheels" should have the following indexes:
112
+ | name | columns | unique |
113
+ | hydra_integer_wheels_index | [array:entity_id,hydra_attribute_id] | [bool:t] |
114
+ And table "hydra_float_wheels" should have the following columns:
115
+ | name | type | limit | default | null | precision | scale |
116
+ | id | [sym:integer] | [nil:] | [nil:] | [bool:f] | [nil:] | [nil:] |
117
+ | entity_id | [sym:integer] | [nil:] | [nil:] | [bool:f] | [nil:] | [nil:] |
118
+ | hydra_attribute_id | [sym:integer] | [nil:] | [nil:] | [bool:f] | [nil:] | [nil:] |
119
+ | value | [sym:float] | [nil:] | [nil:] | [bool:t] | [nil:] | [nil:] |
120
+ | created_at | [sym:datetime] | [nil:] | [nil:] | [bool:t] | [nil:] | [nil:] |
121
+ | updated_at | [sym:datetime] | [nil:] | [nil:] | [bool:t] | [nil:] | [nil:] |
122
+ And table "hydra_float_wheels" should have the following indexes:
123
+ | name | columns | unique |
124
+ | hydra_float_wheels_index | [array:entity_id,hydra_attribute_id] | [bool:t] |
125
+ And table "hydra_boolean_wheels" should have the following columns:
126
+ | name | type | limit | default | null | precision | scale |
127
+ | id | [sym:integer] | [nil:] | [nil:] | [bool:f] | [nil:] | [nil:] |
128
+ | entity_id | [sym:integer] | [nil:] | [nil:] | [bool:f] | [nil:] | [nil:] |
129
+ | hydra_attribute_id | [sym:integer] | [nil:] | [nil:] | [bool:f] | [nil:] | [nil:] |
130
+ | value | [sym:boolean] | [nil:] | [nil:] | [bool:t] | [nil:] | [nil:] |
131
+ | created_at | [sym:datetime] | [nil:] | [nil:] | [bool:t] | [nil:] | [nil:] |
132
+ | updated_at | [sym:datetime] | [nil:] | [nil:] | [bool:t] | [nil:] | [nil:] |
133
+ And table "hydra_boolean_wheels" should have the following indexes:
134
+ | name | columns | unique |
135
+ | hydra_boolean_wheels_index | [array:entity_id,hydra_attribute_id] | [bool:t] |
136
+ And table "hydra_datetime_wheels" should have the following columns:
137
+ | name | type | limit | default | null | precision | scale |
138
+ | id | [sym:integer] | [nil:] | [nil:] | [bool:f] | [nil:] | [nil:] |
139
+ | entity_id | [sym:integer] | [nil:] | [nil:] | [bool:f] | [nil:] | [nil:] |
140
+ | hydra_attribute_id | [sym:integer] | [nil:] | [nil:] | [bool:f] | [nil:] | [nil:] |
141
+ | value | [sym:datetime] | [nil:] | [nil:] | [bool:t] | [nil:] | [nil:] |
142
+ | created_at | [sym:datetime] | [nil:] | [nil:] | [bool:t] | [nil:] | [nil:] |
143
+ | updated_at | [sym:datetime] | [nil:] | [nil:] | [bool:t] | [nil:] | [nil:] |
144
+ And table "hydra_datetime_wheels" should have the following indexes:
145
+ | name | columns | unique |
146
+ | hydra_datetime_wheels_index | [array:entity_id,hydra_attribute_id] | [bool:t] |
147
+
148
+ When migrate to hydra entity "cars"
149
+ Then should have the following 17 tables:
150
+ | tables |
151
+ | wheels |
152
+ | hydra_attributes |
153
+ | hydra_sets |
154
+ | hydra_attribute_sets |
155
+ | hydra_string_wheels |
156
+ | hydra_text_wheels |
157
+ | hydra_float_wheels |
158
+ | hydra_integer_wheels |
159
+ | hydra_boolean_wheels |
160
+ | hydra_datetime_wheels |
161
+ | cars |
162
+ | hydra_string_cars |
163
+ | hydra_text_cars |
164
+ | hydra_float_cars |
165
+ | hydra_integer_cars |
166
+ | hydra_boolean_cars |
167
+ | hydra_datetime_cars |
168
+ And table "cars" should have the following columns:
169
+ | name | type | limit | default | null | precision | scale |
170
+ | id | [sym:integer] | [nil:] | [nil:] | [bool:f] | [nil:] | [nil:] |
171
+ | hydra_set_id | [sym:integer] | [nil:] | [nil:] | [bool:t] | [nil:] | [nil:] |
172
+ And table "cars" should have the following indexes:
173
+ | name | columns | unique |
174
+ | cars_hydra_set_id_index | [array:hydra_set_id] | [bool:f] |
175
+
176
+ When rollback from hydra entity "wheels"
177
+ Then should have the following 11 tables:
178
+ | tables |
179
+ | wheels |
180
+ | hydra_attributes |
181
+ | hydra_sets |
182
+ | hydra_attribute_sets |
183
+ | cars |
184
+ | hydra_string_cars |
185
+ | hydra_text_cars |
186
+ | hydra_float_cars |
187
+ | hydra_integer_cars |
188
+ | hydra_boolean_cars |
189
+ | hydra_datetime_cars |
190
+ And table "wheels" should have the following columns:
191
+ | name | type | limit | default | null | precision | scale |
192
+ | id | [sym:integer] | [nil:] | [nil:] | [bool:f] | [nil:] | [nil:] |
193
+ And table "cars" should have the following columns:
194
+ | name | type | limit | default | null | precision | scale |
195
+ | id | [sym:integer] | [nil:] | [nil:] | [bool:f] | [nil:] | [nil:] |
196
+ | hydra_set_id | [sym:integer] | [nil:] | [nil:] | [bool:t] | [nil:] | [nil:] |
197
+ And table "cars" should have the following indexes:
198
+ | name | columns | unique |
199
+ | cars_hydra_set_id_index | [array:hydra_set_id] | [bool:f] |
200
+
201
+ When rollback from hydra entity "cars"
202
+ Then should have the following 2 tables:
203
+ | tables |
204
+ | wheels |
205
+ | cars |
206
+ And table "wheels" should have the following columns:
207
+ | name | type | limit | default | null | precision | scale |
208
+ | string:id | [sym:integer] | [nil:] | [nil:] | [bool:f] | [nil:] | [nil:] |
209
+ And table "cars" should have the following columns:
210
+ | name | type | limit | default | null | precision | scale |
211
+ | id | [sym:integer] | [nil:] | [nil:] | [bool:f] | [nil:] | [nil:] |
@@ -0,0 +1,42 @@
1
+ Feature: group conditions by hydra attributes
2
+ When group by hydra attribute
3
+ Then correct table should be joined and group condition should be added
4
+
5
+ Background: create models and describe hydra attributes
6
+ Given create hydra attributes for "Product" with role "admin" as "hashes":
7
+ | name | backend_type | white_list |
8
+ | code | integer | [bool:t] |
9
+ | title | string | [bool:t] |
10
+ | total | integer | [bool:t] |
11
+ Given create "Product" model with attributes as "hashes":
12
+ | name | code | title | total |
13
+ | a | 1 | q | 5 |
14
+ | b | 2 | w | 5 |
15
+ | b | 3 | w | |
16
+ | c | 4 | e | |
17
+
18
+ Scenario Outline: group by attributes
19
+ When group "Product" by "<group by>"
20
+ Then total records should be "<total>"
21
+ And "first" record should have "<first attribute>"
22
+ And "last" record should have "<last attribute>"
23
+
24
+ Scenarios: group attributes
25
+ | group by | total | first attribute | last attribute |
26
+ | code | 4 | code=[int:1] | code=[int:4] |
27
+ | name | 3 | name=a code=[int:1] | name=c code=[int:4] |
28
+ | name title | 3 | name=a code=[int:1] | name=c code=[int:4] |
29
+
30
+ Scenario Outline: group by attributes with filter
31
+ When group "Product" by "<group by>"
32
+ And filter records by "<filter>"
33
+ Then total records should be "<total>"
34
+ And "first" record should have "<first attribute>"
35
+ And "last" record should have "<last attribute>"
36
+
37
+ Scenarios: group attributes
38
+ | group by | filter | total | first attribute | last attribute |
39
+ | code | title=w | 2 | code=[int:2] | code=[int:3] |
40
+ | name | title=w | 1 | name=b title=w | name=b title=w |
41
+ | name title | title=w | 1 | name=b title=w | name=b title=w |
42
+ | name title | total=[nil:] | 2 | name=b title=w | name=c title=e |
@@ -0,0 +1,67 @@
1
+ Feature: order conditions by hydra attributes
2
+ When order records by hydra attribute
3
+ Then correct table should be joined and order by value should be added
4
+
5
+ When correct table is already joined
6
+ Then only order condition should be added
7
+
8
+ When order by several attributes
9
+ Then order all of them by ascending
10
+
11
+ Background: create hydra attributes
12
+ Given create hydra attributes for "Product" with role "admin" as "hashes":
13
+ | name | backend_type | white_list |
14
+ | code | integer | [bool:t] |
15
+ | state | integer | [bool:t] |
16
+ | title | string | [bool:t] |
17
+
18
+ Scenario Outline: order by one field
19
+ Given create "Product" model with attributes as "hashes":
20
+ | name | code | state |
21
+ | c | 1 | 1 |
22
+ | b | 2 | 2 |
23
+ | a | 3 | 3 |
24
+ When order "Product" records by "<attributes>"
25
+ Then "first" record should have "<first identifier>"
26
+ And "last" record should have "<last identifier>"
27
+
28
+ Scenarios: order conditions
29
+ | attributes | first identifier | last identifier |
30
+ | state=asc | code=[int:1] | code=[int:3] |
31
+ | state=desc | code=[int:3] | code=[int:1] |
32
+ | name=asc | code=[int:3] | code=[int:1] |
33
+ | name=desc | code=[int:1] | code=[int:3] |
34
+
35
+ Scenario Outline: order by several attributes
36
+ Given create "Product" model with attributes as "hashes":
37
+ | name | code | state | title |
38
+ | c | 1 | 1 | b |
39
+ | b | 2 | 2 | a |
40
+ | a | 3 | 3 | c |
41
+ When order "Product" records by "<attributes>"
42
+ Then "first" record should have "<first identifier>"
43
+ And "last" record should have "<last identifier>"
44
+
45
+ Scenarios: order conditions
46
+ | attributes | first identifier | last identifier |
47
+ | name state | code=[int:3] | code=[int:1] |
48
+ | state title | code=[int:1] | code=[int:3] |
49
+ | title state | code=[int:2] | code=[int:3] |
50
+
51
+ Scenario Outline: order by filtered attribute
52
+ Given create "Product" model with attributes as "hashes":
53
+ | code | state | title |
54
+ | 1 | 1 | |
55
+ | 2 | | |
56
+ | 3 | 1 | a |
57
+ When filter "Product" records by "<filter attribute>"
58
+ And order records by "<order attributes>"
59
+ Then total records should be "<count>"
60
+ And "first" record should have "<first identifier>"
61
+ And "last" record should have "<last identifier>"
62
+
63
+ Scenarios: order conditions
64
+ | filter attribute | order attributes | count | first identifier | last identifier |
65
+ | state=[int:1] | state code | 2 | code=[int:1] | code=[int:3] |
66
+ | state=[nil:] | state code | 1 | code=[int:2] | code=[int:2] |
67
+ | title=[nil:] | title code | 2 | code=[int:1] | code=[int:2] |
@@ -0,0 +1,29 @@
1
+ Feature: reorder by hydra attributes
2
+ When reorder relation object with new hydra attributes
3
+ Then old order hydra attributes should be removed
4
+ And new hydra attributes should be added to order list
5
+
6
+ Background: create hydra attributes
7
+ Given create hydra attributes for "Product" with role "admin" as "hashes":
8
+ | name | backend_type | white_list |
9
+ | code | integer | [bool:t] |
10
+ | state | integer | [bool:t] |
11
+ | title | string | [bool:t] |
12
+
13
+ Scenario Outline: reorder
14
+ Given create "Product" model with attributes as "hashes":
15
+ | code | name | title |
16
+ | 1 | a | c |
17
+ | 2 | b | b |
18
+ | 3 | c | a |
19
+ When order "Product" records by "<order>"
20
+ And reorder records by "<reorder>"
21
+ Then total records should be "<count>"
22
+ And "first" record should have "<first identifier>"
23
+ And "last" record should have "<last identifier>"
24
+
25
+ Scenarios: order conditions
26
+ | order | reorder | count | first identifier | last identifier |
27
+ | title | name title | 3 | code=[int:1] | code=[int:3] |
28
+ | name | title name | 3 | code=[int:3] | code=[int:1] |
29
+ | code | title | 3 | code=[int:3] | code=[int:1] |
@@ -0,0 +1,29 @@
1
+ Feature: reverse order relation object
2
+ When reverse order by hydra attribute
3
+ Then relation object should reverse order of hydra attribute. ASC to DESC and vise versa
4
+
5
+ Background: create hydra attributes
6
+ Given create hydra attributes for "Product" with role "admin" as "hashes":
7
+ | name | backend_type | white_list |
8
+ | code | integer | [bool:t] |
9
+ | state | integer | [bool:t] |
10
+ | title | string | [bool:t] |
11
+
12
+ Scenario Outline: reverse order
13
+ Given create "Product" model with attributes as "hashes":
14
+ | code | state | title |
15
+ | 1 | 3 | a |
16
+ | 2 | 2 | b |
17
+ | 3 | 1 | c |
18
+ When order "Product" records by "<order>"
19
+ And reverse order records
20
+ Then total records should be "3"
21
+ And "first" record should have "<first>"
22
+ And "last" record should have "<last>"
23
+
24
+ Scenarios: conditions
25
+ | order | first | last |
26
+ | code | code=[int:3] | code=[int:1] |
27
+ | state | code=[int:1] | code=[int:3] |
28
+ | title | code=[int:3] | code=[int:1] |
29
+
@@ -0,0 +1,50 @@
1
+ Feature: select concrete attributes
2
+ When select concrete attribute
3
+ Then model should response only to these attributes
4
+
5
+ Background: create hydra attributes
6
+ Given create hydra attributes for "Product" with role "admin" as "hashes":
7
+ | name | backend_type | white_list |
8
+ | code | integer | [bool:t] |
9
+ | price | float | [bool:t] |
10
+ | title | string | [bool:t] |
11
+ | note | text | [bool:t] |
12
+ | active | boolean | [bool:t] |
13
+ | schedule | datetime | [bool:t] |
14
+ And create "Product" model with attributes as "hashes":
15
+ | name | code | price | title | note | active | schedule |
16
+ | a | 1 | 4 | q | z | 1 | 2012-06-01 |
17
+ | b | 2 | 5 | w | x | 0 | 2012-06-02 |
18
+ | c | 3 | 6 | | c | 1 | 2012-06-03 |
19
+ | d | | 7 | | v | 0 | 2012-06-04 |
20
+
21
+ Scenario Outline: select concrete attributes
22
+ When "Product" select only the following columns "<selected columns>"
23
+ Then records should have only the following "<expected columns>" names
24
+ And records should raise "ActiveModel::MissingAttributeError" when call the following "<methods>"
25
+ And total records should be "4"
26
+
27
+ Scenarios: select attributes
28
+ | selected columns | expected columns | methods |
29
+ | name | id hydra_set_id name | code price title note active schedule |
30
+ | name code | id hydra_set_id name code | price title note active schedule |
31
+ | name code price | id hydra_set_id name code price | title note active schedule |
32
+ | code price title | id hydra_set_id code price title | name note active schedule |
33
+ | title note active | id hydra_set_id title note active | name code price schedule |
34
+ | schedule | id hydra_set_id schedule | name code price title note active |
35
+ | id schedule | id hydra_set_id schedule | name code price title note active |
36
+
37
+ Scenario Outline: filter collection and select concrete attributes
38
+ When "Product" select only the following columns "<selected columns>"
39
+ And filter records by "<filter attributes>"
40
+ Then records should have only the following "<expected columns>" names
41
+ And records should raise "ActiveModel::MissingAttributeError" when call the following "<methods>"
42
+ And total records should be "<total>"
43
+
44
+ Scenarios: filter and select attributes
45
+ | selected columns | expected columns | filter attributes | methods | total |
46
+ | name code | id hydra_set_id name code | name=a | price title note active schedule | 1 |
47
+ | code | id hydra_set_id code | code=[int:1] | name price title note active schedule | 1 |
48
+ | name code | id hydra_set_id name code | code=[int:1] | price title note active schedule | 1 |
49
+ | code title | id hydra_set_id code title | title=[nil:] | name price note active schedule | 2 |
50
+ | code note | id hydra_set_id code note | title=[nil:] | name price title active schedule | 2 |