hydra_attribute 0.3.2 → 0.4.0.rc1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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]"
|