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.
- data/CHANGELOG.md +1 -1
- data/README.md +7 -0
- data/features/entity/create.feature +128 -0
- data/features/entity/destroy.feature +111 -0
- data/features/entity/new.feature +121 -0
- data/features/entity/update.feature +147 -0
- data/features/{attributes → hydra_attribute}/create.feature +7 -7
- data/features/{attributes → hydra_attribute}/destroy.feature +2 -4
- data/features/{attributes → hydra_attribute}/update.feature +10 -10
- data/features/hydra_set/destroy.feature +31 -0
- data/features/migrations/create_and_drop.feature +165 -0
- data/features/migrations/migrate_and_rollback.feature +211 -0
- data/features/relation/query_methods/group.feature +42 -0
- data/features/relation/query_methods/order.feature +67 -0
- data/features/relation/query_methods/reorder.feature +29 -0
- data/features/relation/query_methods/reverse_order.feature +29 -0
- data/features/relation/query_methods/select.feature +50 -0
- data/features/relation/query_methods/where.feature +70 -0
- data/features/step_definitions/connections.rb +65 -0
- data/features/step_definitions/model_steps.rb +79 -6
- data/features/step_definitions/query_methods.rb +3 -3
- data/features/step_definitions/record_steps.rb +3 -4
- data/features/support/env.rb +17 -3
- data/features/support/world.rb +15 -10
- data/gemfiles/3.1.gemfile.lock +15 -15
- data/gemfiles/3.2.gemfile.lock +15 -15
- data/lib/hydra_attribute/active_record/association.rb +74 -38
- data/lib/hydra_attribute/active_record/association_preloader.rb +49 -49
- data/lib/hydra_attribute/active_record/attribute_methods.rb +37 -85
- data/lib/hydra_attribute/active_record/migration.rb +2 -2
- data/lib/hydra_attribute/active_record/reflection.rb +1 -1
- data/lib/hydra_attribute/active_record/relation/query_methods.rb +8 -7
- data/lib/hydra_attribute/active_record/relation.rb +1 -0
- data/lib/hydra_attribute/active_record.rb +20 -12
- data/lib/hydra_attribute/association_builder.rb +1 -2
- data/lib/hydra_attribute/builder.rb +7 -8
- data/lib/hydra_attribute/entity_callbacks.rb +12 -32
- data/lib/hydra_attribute/hydra_attribute.rb +25 -16
- data/lib/hydra_attribute/hydra_attribute_methods.rb +85 -0
- data/lib/hydra_attribute/hydra_methods.rb +123 -0
- data/lib/hydra_attribute/hydra_set.rb +36 -0
- data/lib/hydra_attribute/hydra_set_methods.rb +39 -0
- data/lib/hydra_attribute/hydra_value_methods.rb +14 -0
- data/lib/hydra_attribute/memoize.rb +37 -0
- data/lib/hydra_attribute/migrator.rb +100 -51
- data/lib/hydra_attribute/railtie.rb +1 -3
- data/lib/hydra_attribute/version.rb +1 -1
- data/lib/hydra_attribute.rb +7 -1
- data/spec/hydra_attribute_methods_spec.rb +458 -0
- data/spec/hydra_attribute_spec.rb +19 -0
- data/spec/hydra_methods_spec.rb +457 -0
- data/spec/hydra_set_methods_spec.rb +203 -0
- data/spec/hydra_set_spec.rb +19 -0
- data/spec/memoize_spec.rb +95 -0
- data/spec/spec_helper.rb +42 -2
- metadata +71 -43
- data/features/create.feature +0 -47
- data/features/define.feature +0 -38
- data/features/destroy.feature +0 -102
- data/features/query_methods/group.feature +0 -42
- data/features/query_methods/order.feature +0 -99
- data/features/query_methods/select.feature +0 -50
- data/features/query_methods/where.feature +0 -70
- data/features/support/schema.rb +0 -79
- data/features/update.feature +0 -114
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
**0.3.2 (July 31, 2012)**
|
2
|
-
* Add `white_list` option which
|
2
|
+
* Add `white_list` option which allows to add attribute to white list for entity during creation
|
3
3
|
|
4
4
|
**0.3.1 (July 28, 2012)**
|
5
5
|
* Fix bug "ActiveModel::MassAssignmentSecurity::Error: Can't mass-assign protected attributes: name, backend_type, default_value" during creation hydra attributes
|
data/README.md
CHANGED
@@ -64,6 +64,13 @@ class Product < ActiveRecord::Base
|
|
64
64
|
end
|
65
65
|
```
|
66
66
|
|
67
|
+
**Starting from version 0.4.0 `use_hydra_attributes` method will be removed.**
|
68
|
+
```ruby
|
69
|
+
class Product < ActiveRecord::Base
|
70
|
+
include HydraAttribute::ActiveRecord
|
71
|
+
end
|
72
|
+
```
|
73
|
+
|
67
74
|
##### Create some hydra attributes from `rails console`
|
68
75
|
```ruby
|
69
76
|
Product.hydra_attributes.create(name: 'color', backend_type: 'string', default_value: 'green')
|
@@ -0,0 +1,128 @@
|
|
1
|
+
Feature: create models with hydra attributes
|
2
|
+
When create model with hydra attributes
|
3
|
+
Then hydra attributes should be saved with default values
|
4
|
+
|
5
|
+
When hydra set is specified
|
6
|
+
Then only attributes from this hydra set should be saved
|
7
|
+
|
8
|
+
Background: create hydra attributes
|
9
|
+
Given create hydra attributes for "Product" with role "admin" as "hashes":
|
10
|
+
| name | backend_type | default_value | white_list |
|
11
|
+
| code | string | [nil:] | [bool:t] |
|
12
|
+
| info | text | [str:] | [bool:t] |
|
13
|
+
| total | integer | 0 | [bool:t] |
|
14
|
+
| price | float | 0 | [bool:t] |
|
15
|
+
| active | boolean | 0 | [bool:t] |
|
16
|
+
| started | datetime | 2012-01-01 | [bool:t] |
|
17
|
+
|
18
|
+
Scenario: don't pass any hydra attributes
|
19
|
+
Given create "Product" model
|
20
|
+
Then last created "Product" should have the following attributes:
|
21
|
+
| code | [nil:] |
|
22
|
+
| info | [str:] |
|
23
|
+
| price | [float:0] |
|
24
|
+
| total | [int:0] |
|
25
|
+
| active | [bool:f] |
|
26
|
+
| started | [date:2012-01-01] |
|
27
|
+
|
28
|
+
Scenario: pass two hydra attributes
|
29
|
+
Given create "Product" model with attributes as "rows_hash":
|
30
|
+
| code | a |
|
31
|
+
| price | [nil:] |
|
32
|
+
Then last created "Product" should have the following attributes:
|
33
|
+
| code | a |
|
34
|
+
| info | [str:] |
|
35
|
+
| total | [int:0] |
|
36
|
+
| price | [nil:] |
|
37
|
+
| active | [bool:f] |
|
38
|
+
| started | [date:2012-01-01] |
|
39
|
+
|
40
|
+
Scenario: pass all hydra attributes
|
41
|
+
Given create "Product" model with attributes as "rows_hash":
|
42
|
+
| code | a |
|
43
|
+
| info | b |
|
44
|
+
| total | 0 |
|
45
|
+
| price | 2 |
|
46
|
+
| active | 1 |
|
47
|
+
| started | 2012-05-05 |
|
48
|
+
|
49
|
+
Then last created "Product" should have the following attributes:
|
50
|
+
| code | a |
|
51
|
+
| price | [float:2] |
|
52
|
+
| active | [bool:t] |
|
53
|
+
| info | b |
|
54
|
+
| started | [date:2012-05-05] |
|
55
|
+
|
56
|
+
Scenario: pass only hydra_set_id
|
57
|
+
Given create hydra sets for "Product" as "hashes":
|
58
|
+
| name |
|
59
|
+
| Default |
|
60
|
+
| General |
|
61
|
+
And add "Product" hydra attributes to hydra set:
|
62
|
+
| hydra attribute name | hydra set name |
|
63
|
+
| code | [array:Default] |
|
64
|
+
| price | [array:Default] |
|
65
|
+
| active | [array:Default,General] |
|
66
|
+
| info | [array:General] |
|
67
|
+
|
68
|
+
When create "Product" model with attributes as "rows_hash":
|
69
|
+
| hydra_set_id | [eval:Product.hydra_sets.find_by_name('Default').id] |
|
70
|
+
Then table "hydra_string_products" should have 1 record:
|
71
|
+
| entity_id | hydra_attribute_id |
|
72
|
+
| [eval:Product.last.id] | [eval:Product.hydra_attributes.find_by_name('code').id] |
|
73
|
+
And table "hydra_float_products" should have 1 record:
|
74
|
+
| entity_id | hydra_attribute_id |
|
75
|
+
| [eval:Product.last.id] | [eval:Product.hydra_attributes.find_by_name('price').id] |
|
76
|
+
And table "hydra_boolean_products" should have 1 record:
|
77
|
+
| entity_id | hydra_attribute_id |
|
78
|
+
| [eval:Product.last.id] | [eval:Product.hydra_attributes.find_by_name('active').id] |
|
79
|
+
And table "hydra_text_products" should have 0 records
|
80
|
+
And table "hydra_integer_products" should have 0 records
|
81
|
+
And table "hydra_datetime_products" should have 0 records
|
82
|
+
|
83
|
+
When create "Product" model with attributes as "rows_hash":
|
84
|
+
| hydra_set_id | [eval:Product.hydra_sets.find_by_name('General').id] |
|
85
|
+
And table "hydra_boolean_products" should have 2 records:
|
86
|
+
| entity_id | hydra_attribute_id |
|
87
|
+
| [eval:Product.last.id] | [eval:Product.hydra_attributes.find_by_name('active').id] |
|
88
|
+
And table "hydra_text_products" should have 1 record:
|
89
|
+
| entity_id | hydra_attribute_id |
|
90
|
+
| [eval:Product.last.id] | [eval:Product.hydra_attributes.find_by_name('info').id] |
|
91
|
+
And table "hydra_string_products" should have 1 record:
|
92
|
+
| entity_id | hydra_attribute_id |
|
93
|
+
| [eval:Product.first.id] | [eval:Product.hydra_attributes.find_by_name('code').id] |
|
94
|
+
And table "hydra_float_products" should have 1 record:
|
95
|
+
| entity_id | hydra_attribute_id |
|
96
|
+
| [eval:Product.first.id] | [eval:Product.hydra_attributes.find_by_name('price').id] |
|
97
|
+
And table "hydra_integer_products" should have 0 records
|
98
|
+
And table "hydra_datetime_products" should have 0 records
|
99
|
+
|
100
|
+
Scenario: build model with all attributes, set hydra_set_id and save it
|
101
|
+
Given create hydra sets for "Product" as "hashes":
|
102
|
+
| name |
|
103
|
+
| Default |
|
104
|
+
| General |
|
105
|
+
And add "Product" hydra attributes to hydra set:
|
106
|
+
| hydra attribute name | hydra set name |
|
107
|
+
| code | [array:Default] |
|
108
|
+
| price | [array:Default] |
|
109
|
+
| active | [array:Default,General] |
|
110
|
+
| info | [array:General] |
|
111
|
+
When build "Product" model:
|
112
|
+
| code | #123 |
|
113
|
+
| price | 2.50 |
|
114
|
+
| active | 1 |
|
115
|
+
| info | desc |
|
116
|
+
| started | 2012-08-20 |
|
117
|
+
And set "hydra_set_id" to "[eval:Product.hydra_sets.find_by_name('General').id]"
|
118
|
+
And save model
|
119
|
+
Then table "hydra_text_products" should have 1 record:
|
120
|
+
| entity_id | hydra_attribute_id |
|
121
|
+
| [eval:Product.last.id] | [eval:Product.hydra_attributes.find_by_name('info').id] |
|
122
|
+
And table "hydra_boolean_products" should have 1 record:
|
123
|
+
| entity_id | hydra_attribute_id |
|
124
|
+
| [eval:Product.last.id] | [eval:Product.hydra_attributes.find_by_name('active').id] |
|
125
|
+
And table "hydra_float_products" should have 0 records
|
126
|
+
And table "hydra_string_products" should have 0 records
|
127
|
+
And table "hydra_integer_products" should have 0 records
|
128
|
+
And table "hydra_datetime_products" should have 0 records
|
@@ -0,0 +1,111 @@
|
|
1
|
+
Feature: destroy model
|
2
|
+
When destroy model
|
3
|
+
Then all associated values should be deleted too
|
4
|
+
|
5
|
+
Background: create hydra attributes
|
6
|
+
Given create hydra attributes for "Product" with role "admin" as "hashes":
|
7
|
+
| name | backend_type | default_value | white_list |
|
8
|
+
| code | string | | [bool:t] |
|
9
|
+
| info | text | [str:] | [bool:t] |
|
10
|
+
| total | integer | 0 | [bool:t] |
|
11
|
+
| price | float | 0 | [bool:t] |
|
12
|
+
| active | boolean | 0 | [bool:t] |
|
13
|
+
| started | datetime | 2012-01-01 | [bool:t] |
|
14
|
+
|
15
|
+
Scenario: destroy model
|
16
|
+
Given create "Product" model with attributes as "hashes":
|
17
|
+
| code | info | total | price | active | started |
|
18
|
+
| 1 | a | 1 | 1.10 | 1 | 2012-01-01 |
|
19
|
+
| 2 | b | 2 | 1.20 | 1 | 2012-01-02 |
|
20
|
+
| 3 | c | 3 | 1.30 | 0 | 2012-01-03 |
|
21
|
+
|
22
|
+
Then table "hydra_string_products" should have 3 records:
|
23
|
+
| entity_id | hydra_attribute_id | value |
|
24
|
+
| 1 | [eval:Product.hydra_attribute('code').id] | 1 |
|
25
|
+
| 2 | [eval:Product.hydra_attribute('code').id] | 2 |
|
26
|
+
| 3 | [eval:Product.hydra_attribute('code').id] | 3 |
|
27
|
+
And table "hydra_text_products" should have 3 records:
|
28
|
+
| entity_id | hydra_attribute_id | value |
|
29
|
+
| 1 | [eval:Product.hydra_attribute('info').id] | a |
|
30
|
+
| 2 | [eval:Product.hydra_attribute('info').id] | b |
|
31
|
+
| 3 | [eval:Product.hydra_attribute('info').id] | c |
|
32
|
+
And table "hydra_integer_products" should have 3 records:
|
33
|
+
| entity_id | hydra_attribute_id | value |
|
34
|
+
| 1 | [eval:Product.hydra_attribute('total').id] | 1 |
|
35
|
+
| 2 | [eval:Product.hydra_attribute('total').id] | 2 |
|
36
|
+
| 3 | [eval:Product.hydra_attribute('total').id] | 3 |
|
37
|
+
And table "hydra_float_products" should have 3 records:
|
38
|
+
| entity_id | hydra_attribute_id | value |
|
39
|
+
| 1 | [eval:Product.hydra_attribute('price').id] | 1.10 |
|
40
|
+
| 2 | [eval:Product.hydra_attribute('price').id] | 1.20 |
|
41
|
+
| 3 | [eval:Product.hydra_attribute('price').id] | 1.30 |
|
42
|
+
And table "hydra_boolean_products" should have 3 records:
|
43
|
+
| entity_id | hydra_attribute_id | value |
|
44
|
+
| 1 | [eval:Product.hydra_attribute('active').id] | [bool:t] |
|
45
|
+
| 2 | [eval:Product.hydra_attribute('active').id] | [bool:t] |
|
46
|
+
| 3 | [eval:Product.hydra_attribute('active').id] | [bool:f] |
|
47
|
+
And table "hydra_datetime_products" should have 3 records:
|
48
|
+
| entity_id | hydra_attribute_id | value |
|
49
|
+
| 1 | [eval:Product.hydra_attribute('started').id] | [date:2012-01-01] |
|
50
|
+
| 2 | [eval:Product.hydra_attribute('started').id] | [date:2012-01-02] |
|
51
|
+
| 3 | [eval:Product.hydra_attribute('started').id] | [date:2012-01-03] |
|
52
|
+
|
53
|
+
Given select first "Product" record
|
54
|
+
And destroy record
|
55
|
+
|
56
|
+
Then table "hydra_string_products" should have 2 records:
|
57
|
+
| entity_id | hydra_attribute_id | value |
|
58
|
+
| 2 | [eval:Product.hydra_attribute('code').id] | 2 |
|
59
|
+
| 3 | [eval:Product.hydra_attribute('code').id] | 3 |
|
60
|
+
And table "hydra_text_products" should have 2 records:
|
61
|
+
| entity_id | hydra_attribute_id | value |
|
62
|
+
| 2 | [eval:Product.hydra_attribute('info').id] | b |
|
63
|
+
| 3 | [eval:Product.hydra_attribute('info').id] | c |
|
64
|
+
And table "hydra_integer_products" should have 2 records:
|
65
|
+
| entity_id | hydra_attribute_id | value |
|
66
|
+
| 2 | [eval:Product.hydra_attribute('total').id] | 2 |
|
67
|
+
| 3 | [eval:Product.hydra_attribute('total').id] | 3 |
|
68
|
+
And table "hydra_float_products" should have 2 records:
|
69
|
+
| entity_id | hydra_attribute_id | value |
|
70
|
+
| 2 | [eval:Product.hydra_attribute('price').id] | 1.20 |
|
71
|
+
| 3 | [eval:Product.hydra_attribute('price').id] | 1.30 |
|
72
|
+
And table "hydra_boolean_products" should have 2 records:
|
73
|
+
| entity_id | hydra_attribute_id | value |
|
74
|
+
| 2 | [eval:Product.hydra_attribute('active').id] | [bool:t] |
|
75
|
+
| 3 | [eval:Product.hydra_attribute('active').id] | [bool:f] |
|
76
|
+
And table "hydra_datetime_products" should have 2 records:
|
77
|
+
| entity_id | hydra_attribute_id | value |
|
78
|
+
| 2 | [eval:Product.hydra_attribute('started').id] | [date:2012-01-02] |
|
79
|
+
| 3 | [eval:Product.hydra_attribute('started').id] | [date:2012-01-03] |
|
80
|
+
|
81
|
+
Given select first "Product" record
|
82
|
+
And destroy record
|
83
|
+
|
84
|
+
Then table "hydra_string_products" should have 1 record:
|
85
|
+
| entity_id | hydra_attribute_id | value |
|
86
|
+
| 3 | [eval:Product.hydra_attribute('code').id] | 3 |
|
87
|
+
And table "hydra_text_products" should have 1 record:
|
88
|
+
| entity_id | hydra_attribute_id | value |
|
89
|
+
| 3 | [eval:Product.hydra_attribute('info').id] | c |
|
90
|
+
And table "hydra_integer_products" should have 1 record:
|
91
|
+
| entity_id | hydra_attribute_id | value |
|
92
|
+
| 3 | [eval:Product.hydra_attribute('total').id] | 3 |
|
93
|
+
And table "hydra_float_products" should have 1 record:
|
94
|
+
| entity_id | hydra_attribute_id | value |
|
95
|
+
| 3 | [eval:Product.hydra_attribute('price').id] | 1.30 |
|
96
|
+
And table "hydra_boolean_products" should have 1 record:
|
97
|
+
| entity_id | hydra_attribute_id | value |
|
98
|
+
| 3 | [eval:Product.hydra_attribute('active').id] | [bool:f] |
|
99
|
+
And table "hydra_datetime_products" should have 1 record:
|
100
|
+
| entity_id | hydra_attribute_id | value |
|
101
|
+
| 3 | [eval:Product.hydra_attribute('started').id] | [date:2012-01-03] |
|
102
|
+
|
103
|
+
Given select first "Product" record
|
104
|
+
And destroy record
|
105
|
+
|
106
|
+
Then table "hydra_string_products" should have 0 records
|
107
|
+
And table "hydra_text_products" should have 0 records
|
108
|
+
And table "hydra_integer_products" should have 0 records
|
109
|
+
And table "hydra_float_products" should have 0 records
|
110
|
+
And table "hydra_boolean_products" should have 0 records
|
111
|
+
And table "hydra_datetime_products" should have 0 records
|
@@ -0,0 +1,121 @@
|
|
1
|
+
Feature: new entity
|
2
|
+
Given new entity should respond to hydra attributes which are saved in hydra_attributes table
|
3
|
+
|
4
|
+
When hydra attribute was created with white_list flag
|
5
|
+
Then it should be allowed through mass-assignment for new entity
|
6
|
+
|
7
|
+
When hydra_set_id was passed to the new entity
|
8
|
+
Then entity should respond only to hydra attributes which were added to this hydra set
|
9
|
+
And entity attribute list should include only attributes from hydra set
|
10
|
+
And HydraAttribute::MissingAttributeInHydraSetError error should be risen when we call attribute method and this attribute doesn't exist in hydra set
|
11
|
+
|
12
|
+
Scenario Outline: models should respond to hydra attributes
|
13
|
+
Given create hydra attributes for "Product" with role "admin" as "hashes":
|
14
|
+
| name | backend_type | white_list |
|
15
|
+
| code | string | [bool:t] |
|
16
|
+
| price | float | [bool:f] |
|
17
|
+
Then model "<model>" <action> respond to "<attributes>"
|
18
|
+
|
19
|
+
Scenarios: hydra attributes
|
20
|
+
| model | action | attributes |
|
21
|
+
| Product | should | code |
|
22
|
+
| Product | should | code= |
|
23
|
+
| Product | should | code? |
|
24
|
+
| Product | should | code_before_type_cast |
|
25
|
+
| Product | should | code_changed? |
|
26
|
+
| Product | should | code_change |
|
27
|
+
| Product | should | code_will_change! |
|
28
|
+
| Product | should | code_was |
|
29
|
+
| Product | should | reset_code! |
|
30
|
+
| Product | should | price |
|
31
|
+
| Product | should | price= |
|
32
|
+
| Product | should | price? |
|
33
|
+
| Product | should | price_before_type_cast |
|
34
|
+
| Product | should | price_changed? |
|
35
|
+
| Product | should | price_change |
|
36
|
+
| Product | should | price_will_change! |
|
37
|
+
| Product | should | price_was |
|
38
|
+
| Product | should | reset_price! |
|
39
|
+
|
40
|
+
Scenario: model should have appropriate hydra attributes in white list
|
41
|
+
Given create hydra attributes for "Product" with role "admin" as "hashes":
|
42
|
+
| name | backend_type | white_list |
|
43
|
+
| code | string | [bool:t] |
|
44
|
+
| price | float | [bool:f] |
|
45
|
+
# imitate initialization model class with already created hydra attributes
|
46
|
+
When redefine "Product" class to use hydra attributes
|
47
|
+
Then class "Product" should have "code" in white list
|
48
|
+
And class "Product" should not have "price" in white list
|
49
|
+
|
50
|
+
Scenario: set hydra_set_id to the new entity
|
51
|
+
Given create hydra sets for "Product" as "hashes":
|
52
|
+
| name |
|
53
|
+
| Default |
|
54
|
+
| General |
|
55
|
+
And create hydra attributes for "Product" with role "admin" as "hashes":
|
56
|
+
| name | backend_type | white_list |
|
57
|
+
| code | string | [bool:t] |
|
58
|
+
| title | string | [bool:t] |
|
59
|
+
| price | float | [bool:t] |
|
60
|
+
| total | integer | [bool:t] |
|
61
|
+
And add "Product" hydra attributes to hydra set:
|
62
|
+
| hydra attribute name | hydra set name |
|
63
|
+
| code | [array:Default] |
|
64
|
+
| title | [array:Default,General] |
|
65
|
+
| price | [array:General] |
|
66
|
+
|
67
|
+
When build "Product" model:
|
68
|
+
| hydra_set_id | [str:[eval:Product.hydra_sets.find_by_name('Default').id]] |
|
69
|
+
Then model should respond to "code title"
|
70
|
+
And model should not respond to "price total"
|
71
|
+
|
72
|
+
When build "Product" model:
|
73
|
+
| hydra_set_id | [str:[eval:Product.hydra_sets.find_by_name('General').id]] |
|
74
|
+
Then model should not respond to "code total"
|
75
|
+
And model should respond to "title price"
|
76
|
+
|
77
|
+
When build "Product" model
|
78
|
+
Then model should respond to "code title price total"
|
79
|
+
|
80
|
+
Scenario: attach and detach hydra set to the same entity
|
81
|
+
Given create hydra sets for "Product" as "hashes":
|
82
|
+
| name |
|
83
|
+
| Default |
|
84
|
+
| General |
|
85
|
+
And create hydra attributes for "Product" with role "admin" as "hashes":
|
86
|
+
| name | backend_type | white_list |
|
87
|
+
| title | string | [bool:t] |
|
88
|
+
| code | string | [bool:t] |
|
89
|
+
| total | integer | [bool:t] |
|
90
|
+
| price | float | [bool:t] |
|
91
|
+
And add "Product" hydra attributes to hydra set:
|
92
|
+
| hydra attribute name | hydra set name |
|
93
|
+
| title | [array:Default] |
|
94
|
+
| code | [array:Default,General] |
|
95
|
+
| total | [array:General] |
|
96
|
+
|
97
|
+
When build "Product" model
|
98
|
+
Then model should respond to "title code total price"
|
99
|
+
And model attributes should include "title code total price"
|
100
|
+
And error "HydraAttribute::MissingAttributeInHydraSetError" should not be risen when methods "title code total price" are called
|
101
|
+
|
102
|
+
When set "hydra_set_id" to "[eval:Product.hydra_sets.find_by_name('Default').id]"
|
103
|
+
Then model should respond to "title code"
|
104
|
+
And model should not respond to "total price"
|
105
|
+
And model attributes should include "title code"
|
106
|
+
And model attributes should not include "total price"
|
107
|
+
And error "HydraAttribute::MissingAttributeInHydraSetError" should be risen when methods "total price" are called
|
108
|
+
And error "HydraAttribute::MissingAttributeInHydraSetError" should not be risen when methods "title code" are called
|
109
|
+
|
110
|
+
When set "hydra_set_id" to "[eval:Product.hydra_sets.find_by_name('General').id]"
|
111
|
+
Then model should respond to "code total"
|
112
|
+
And model should not respond to "title price"
|
113
|
+
And model attributes should include "code total"
|
114
|
+
And model attributes should not include "title price"
|
115
|
+
And error "HydraAttribute::MissingAttributeInHydraSetError" should be risen when methods "title price" are called
|
116
|
+
And error "HydraAttribute::MissingAttributeInHydraSetError" should not be risen when methods "code total" are called
|
117
|
+
|
118
|
+
When set "hydra_set_id" to "[nil:]"
|
119
|
+
Then model should respond to "title code total price"
|
120
|
+
And model attributes should include "title code total price"
|
121
|
+
And error "HydraAttribute::MissingAttributeInHydraSetError" should not be risen when methods "title code total price" are called
|
@@ -0,0 +1,147 @@
|
|
1
|
+
Feature: update hydra attributes
|
2
|
+
When update hydra attribute
|
3
|
+
Then updated_at for entity should be updated
|
4
|
+
|
5
|
+
When update hydra_set_id
|
6
|
+
Then entity should have hydra attributes from this hydra set
|
7
|
+
|
8
|
+
Background: create hydra attributes
|
9
|
+
Given create hydra attributes for "Product" with role "admin" as "hashes":
|
10
|
+
| name | backend_type | default_value | white_list |
|
11
|
+
| code | string | ### | [bool:t] |
|
12
|
+
| title | string | | [bool:t] |
|
13
|
+
| info | text | | [bool:t] |
|
14
|
+
| total | integer | 1 | [bool:t] |
|
15
|
+
| price | float | | [bool:t] |
|
16
|
+
| launch | datetime | | [bool:t] |
|
17
|
+
And create "Product" model
|
18
|
+
|
19
|
+
Scenario Outline: update attributes
|
20
|
+
Given select last "Product" record
|
21
|
+
When assign attributes as "rows_hash":
|
22
|
+
| code | <set code> |
|
23
|
+
| title | <set title> |
|
24
|
+
| total | <set total> |
|
25
|
+
And save record
|
26
|
+
Then last created "Product" should have the following attributes:
|
27
|
+
| code | <code> |
|
28
|
+
| title | <title> |
|
29
|
+
| total | <total> |
|
30
|
+
|
31
|
+
Scenarios: attributes
|
32
|
+
| set code | set title | set total | code | title | total |
|
33
|
+
| a | b | [int:2] | a | b | [int:2] |
|
34
|
+
| [str:] | [str:] | [nil:] | [str:] | [str:] | [nil:] |
|
35
|
+
| | | 3 | ### | [nil:] | [int:3] |
|
36
|
+
|
37
|
+
Scenario: update the same model several times to test touch method
|
38
|
+
Given select first "Product" record
|
39
|
+
And save record
|
40
|
+
Then last created "Product" should have the following attributes:
|
41
|
+
| code | ### |
|
42
|
+
| title | [nil:] |
|
43
|
+
| total | [int:1] |
|
44
|
+
|
45
|
+
When assign attributes as "rows_hash":
|
46
|
+
| title | [str:] |
|
47
|
+
| total | [nil:] |
|
48
|
+
And save record
|
49
|
+
Then last created "Product" should have the following attributes:
|
50
|
+
| code | ### |
|
51
|
+
| title | [str:] |
|
52
|
+
| total | [nil:] |
|
53
|
+
|
54
|
+
When assign attributes as "rows_hash":
|
55
|
+
| code | a |
|
56
|
+
| total | 2 |
|
57
|
+
And save record
|
58
|
+
Then last created "Product" should have the following attributes:
|
59
|
+
| code | a |
|
60
|
+
| title | [str:] |
|
61
|
+
| total | [int:2] |
|
62
|
+
|
63
|
+
When assign attributes as "rows_hash":
|
64
|
+
| title | b |
|
65
|
+
And save record
|
66
|
+
Then last created "Product" should have the following attributes:
|
67
|
+
| code | a |
|
68
|
+
| title | b |
|
69
|
+
| total | [int:2] |
|
70
|
+
|
71
|
+
Scenario: touch entity when attribute is updated
|
72
|
+
Given select last "Product" record
|
73
|
+
And keep "updated_at" attribute
|
74
|
+
And save record
|
75
|
+
Then attribute "updated_at" should be the same
|
76
|
+
|
77
|
+
Given select last "Product" record
|
78
|
+
And keep "updated_at" attribute
|
79
|
+
When assign attributes as "rows_hash":
|
80
|
+
| code | ### |
|
81
|
+
| total | [int:1] |
|
82
|
+
And save record
|
83
|
+
Then attribute "updated_at" should be the same
|
84
|
+
|
85
|
+
Given select last "Product" record
|
86
|
+
And keep "updated_at" attribute
|
87
|
+
When assign attributes as "rows_hash":
|
88
|
+
| code | [nil:] |
|
89
|
+
And save record
|
90
|
+
Then attribute "updated_at" should not be the same
|
91
|
+
|
92
|
+
Given select last "Product" record
|
93
|
+
And keep "updated_at" attribute
|
94
|
+
When assign attributes as "rows_hash":
|
95
|
+
| code | [nil:] |
|
96
|
+
And save record
|
97
|
+
Then attribute "updated_at" should be the same
|
98
|
+
|
99
|
+
Given select last "Product" record
|
100
|
+
And keep "updated_at" attribute
|
101
|
+
When assign attributes as "rows_hash":
|
102
|
+
| total | [nil:] |
|
103
|
+
And save record
|
104
|
+
Then attribute "updated_at" should not be the same
|
105
|
+
|
106
|
+
Given select last "Product" record
|
107
|
+
And keep "updated_at" attribute
|
108
|
+
When assign attributes as "rows_hash":
|
109
|
+
| code | [str:] |
|
110
|
+
And save record
|
111
|
+
Then attribute "updated_at" should not be the same
|
112
|
+
|
113
|
+
Given select last "Product" record
|
114
|
+
And keep "updated_at" attribute
|
115
|
+
When assign attributes as "rows_hash":
|
116
|
+
| title | [str:] |
|
117
|
+
| total | [int:0] |
|
118
|
+
And save record
|
119
|
+
Then attribute "updated_at" should not be the same
|
120
|
+
|
121
|
+
Scenario: update hydra_set_id
|
122
|
+
Given create hydra sets for "Product" as "hashes":
|
123
|
+
| name |
|
124
|
+
| Default |
|
125
|
+
| General |
|
126
|
+
And add "Product" hydra attributes to hydra set:
|
127
|
+
| hydra attribute name | hydra set name |
|
128
|
+
| code | [array:Default] |
|
129
|
+
| title | [array:Default] |
|
130
|
+
| info | [array:Default,General] |
|
131
|
+
| total | [array:General] |
|
132
|
+
| price | [array:General] |
|
133
|
+
And create "Product" model
|
134
|
+
And find last "Product" model
|
135
|
+
|
136
|
+
When set "hydra_set_id" to "[eval:Product.hydra_sets.find_by_name('Default').id]"
|
137
|
+
And reload model
|
138
|
+
Then model attributes should include "code title info"
|
139
|
+
|
140
|
+
When set "hydra_set_id" to "[eval:Product.hydra_sets.find_by_name('General').id]"
|
141
|
+
And reload model
|
142
|
+
Then model attributes should include "info total price"
|
143
|
+
|
144
|
+
When set "hydra_set_id" to "[nil:]"
|
145
|
+
And reload model
|
146
|
+
Then model attributes should include "code title info total price launch"
|
147
|
+
|
@@ -4,8 +4,8 @@ Feature: create hydra attributes
|
|
4
4
|
|
5
5
|
Background: create hydra attributes
|
6
6
|
Given create hydra attributes for "Product" with role "admin" as "hashes":
|
7
|
-
| name
|
8
|
-
|
|
7
|
+
| name | backend_type | white_list |
|
8
|
+
| price | float | [bool:t] |
|
9
9
|
|
10
10
|
Scenario: create hydra attribute
|
11
11
|
# Important: when respond_to? is called the hydra attributes are being loaded for entity class
|
@@ -17,14 +17,14 @@ Feature: create hydra attributes
|
|
17
17
|
|
18
18
|
Scenario: create attribute but don't add it to white list
|
19
19
|
Given create hydra attributes for "Product" with role "admin" as "hashes":
|
20
|
-
| name
|
21
|
-
|
|
22
|
-
|
|
20
|
+
| name | backend_type | white_list |
|
21
|
+
| code | string | |
|
22
|
+
| total | integer | [bool:f] |
|
23
23
|
Then class "Product" should not have "code" in white list
|
24
24
|
And class "Product" should not have "total" in white list
|
25
25
|
|
26
26
|
Scenario: create attribute and add it to white list
|
27
27
|
Given create hydra attributes for "Product" with role "admin" as "hashes":
|
28
|
-
| name
|
29
|
-
|
|
28
|
+
| name | backend_type | white_list |
|
29
|
+
| code | string | [bool:t] |
|
30
30
|
Then class "Product" should have "code" in white list
|
@@ -5,16 +5,14 @@ Feature: destroy hydra attributes
|
|
5
5
|
|
6
6
|
Background: create hydra attributes
|
7
7
|
Given create hydra attributes for "Product" with role "admin" as "hashes":
|
8
|
-
| name
|
9
|
-
|
|
10
|
-
|
8
|
+
| name | backend_type | white_list |
|
9
|
+
| price | float | [bool:t] |
|
11
10
|
|
12
11
|
Scenario: entity should not respond to removed attribute
|
13
12
|
When destroy all "HydraAttribute::HydraAttribute" models with attributes as "rows_hash":
|
14
13
|
|name | price |
|
15
14
|
Then model "Product" should not respond to "price"
|
16
15
|
|
17
|
-
|
18
16
|
Scenario: remove all values from appropriate table
|
19
17
|
Given create "Product" model with attributes as "rows_hash":
|
20
18
|
| price | 10 |
|
@@ -4,8 +4,8 @@ Feature: update hydra attribute
|
|
4
4
|
|
5
5
|
Background: create hydra attributes
|
6
6
|
Given create hydra attributes for "Product" with role "admin" as "hashes":
|
7
|
-
| name
|
8
|
-
|
|
7
|
+
| name | backend_type | default_value | white_list |
|
8
|
+
| code | integer | 1 | [bool:t] |
|
9
9
|
|
10
10
|
Scenario: update default value
|
11
11
|
Given create "Product" model
|
@@ -13,24 +13,24 @@ Feature: update hydra attribute
|
|
13
13
|
| default_value | 2 |
|
14
14
|
And create "Product" model
|
15
15
|
Then first created "Product" should have the following attributes:
|
16
|
-
| code | [
|
16
|
+
| code | [int:1] |
|
17
17
|
And last created "Product" should have the following attributes:
|
18
|
-
| code | [
|
18
|
+
| code | [int:2] |
|
19
19
|
|
20
20
|
Scenario: update white list attribute to true
|
21
21
|
Given create hydra attributes for "Product" with role "admin" as "hashes":
|
22
|
-
| name
|
23
|
-
|
|
22
|
+
| name | backend_type | white_list |
|
23
|
+
| title | string | [bool:f] |
|
24
24
|
And select last "HydraAttribute::HydraAttribute" record
|
25
25
|
When update attributes as "admin":
|
26
|
-
| white_list | [
|
26
|
+
| white_list | [bool:t] |
|
27
27
|
Then class "Product" should have "title" in white list
|
28
28
|
|
29
29
|
Scenario: update white list attribute to false
|
30
30
|
Given create hydra attributes for "Product" with role "admin" as "hashes":
|
31
|
-
| name
|
32
|
-
|
|
31
|
+
| name | backend_type | white_list |
|
32
|
+
| info | string | [bool:t] |
|
33
33
|
And select last "HydraAttribute::HydraAttribute" record
|
34
34
|
When update attributes as "admin":
|
35
|
-
| white_list | [
|
35
|
+
| white_list | [bool:f] |
|
36
36
|
Then class "Product" should not have "info" in white list
|
@@ -0,0 +1,31 @@
|
|
1
|
+
Feature: destroy hydra set
|
2
|
+
When destroy hydra set
|
3
|
+
Then column hydra_set_id should be set to NULL for entity table
|
4
|
+
|
5
|
+
Background: create hydra set and add hydra attributes to it
|
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
|
+
And create hydra set "Default" for "Product"
|
12
|
+
And add "Product" hydra attributes to hydra set:
|
13
|
+
| hydra attribute name | hydra set name |
|
14
|
+
| code | [array:Default] |
|
15
|
+
| state | [array:Default] |
|
16
|
+
And create "Product" model with attributes as "rows_hash":
|
17
|
+
| hydra_set_id | [eval:Product.hydra_sets.find_by_name('Default').id] |
|
18
|
+
|
19
|
+
Scenario: after removing hydra set the hydra_set_id for entity should be NULL
|
20
|
+
When destroy all "HydraAttribute::HydraSet" models with attributes as "rows_hash":
|
21
|
+
| name | Default|
|
22
|
+
Then table "products" should have 1 record:
|
23
|
+
| hydra_set_id |
|
24
|
+
| [nil:] |
|
25
|
+
And last created "Product" should have attribute "hydra_set_id" with value "[nil:]"
|
26
|
+
|
27
|
+
Scenario: after removing hydra set entity should respond to all hydra attributes
|
28
|
+
Given destroy all "HydraAttribute::HydraSet" models with attributes as "rows_hash":
|
29
|
+
| name | Default|
|
30
|
+
When find last "Product" model
|
31
|
+
Then model attributes should match "[array:id,hydra_set_id,name,created_at,updated_at,code,state,title]"
|