hydra_attribute 0.1.0

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.
Files changed (57) hide show
  1. data/.gitignore +20 -0
  2. data/.rspec +2 -0
  3. data/Appraisals +7 -0
  4. data/CHANGELOG.md +6 -0
  5. data/Gemfile +3 -0
  6. data/LICENSE +22 -0
  7. data/README.md +122 -0
  8. data/Rakefile +12 -0
  9. data/features/attribute_methods.feature +151 -0
  10. data/features/define_attributes.feature +61 -0
  11. data/features/load_associations.feature +45 -0
  12. data/features/order_conditions.feature +93 -0
  13. data/features/select_attributes.feature +56 -0
  14. data/features/step_definitions/class_steps.rb +32 -0
  15. data/features/step_definitions/model_steps.rb +31 -0
  16. data/features/step_definitions/record_steps.rb +103 -0
  17. data/features/support/env.rb +24 -0
  18. data/features/support/schema.rb +51 -0
  19. data/features/support/world.rb +31 -0
  20. data/features/typecast_attributes.feature +29 -0
  21. data/features/where_conditions.feature +77 -0
  22. data/gemfiles/3.1.gemfile +7 -0
  23. data/gemfiles/3.1.gemfile.lock +60 -0
  24. data/gemfiles/3.2.gemfile +7 -0
  25. data/gemfiles/3.2.gemfile.lock +60 -0
  26. data/hydra_attribute.gemspec +24 -0
  27. data/lib/generators/hydra_attribute/install/USAGE +8 -0
  28. data/lib/generators/hydra_attribute/install/install_generator.rb +11 -0
  29. data/lib/generators/hydra_attribute/install/templates/hydra_attribute.txt +11 -0
  30. data/lib/hydra_attribute.rb +31 -0
  31. data/lib/hydra_attribute/active_record.rb +7 -0
  32. data/lib/hydra_attribute/active_record/attribute_methods.rb +72 -0
  33. data/lib/hydra_attribute/active_record/attribute_methods/before_type_cast.rb +16 -0
  34. data/lib/hydra_attribute/active_record/attribute_methods/read.rb +13 -0
  35. data/lib/hydra_attribute/active_record/relation.rb +44 -0
  36. data/lib/hydra_attribute/active_record/relation/query_methods.rb +162 -0
  37. data/lib/hydra_attribute/active_record/scoping.rb +15 -0
  38. data/lib/hydra_attribute/association_builder.rb +40 -0
  39. data/lib/hydra_attribute/attribute_builder.rb +57 -0
  40. data/lib/hydra_attribute/attribute_proxy.rb +16 -0
  41. data/lib/hydra_attribute/builder.rb +25 -0
  42. data/lib/hydra_attribute/configuration.rb +47 -0
  43. data/lib/hydra_attribute/migration.rb +27 -0
  44. data/lib/hydra_attribute/railtie.rb +9 -0
  45. data/lib/hydra_attribute/version.rb +3 -0
  46. data/spec/hydra_attribute/active_record/relation/query_methods_spec.rb +286 -0
  47. data/spec/hydra_attribute/active_record/relation_spec.rb +93 -0
  48. data/spec/hydra_attribute/active_record/scoping_spec.rb +19 -0
  49. data/spec/hydra_attribute/active_record_spec.rb +20 -0
  50. data/spec/hydra_attribute/association_builder_spec.rb +95 -0
  51. data/spec/hydra_attribute/attribute_builder_spec.rb +70 -0
  52. data/spec/hydra_attribute/attribute_helpers_spec.rb +70 -0
  53. data/spec/hydra_attribute/builder_spec.rb +39 -0
  54. data/spec/hydra_attribute/configuration_spec.rb +96 -0
  55. data/spec/hydra_attribute_spec.rb +20 -0
  56. data/spec/spec_helper.rb +17 -0
  57. metadata +196 -0
data/.gitignore ADDED
@@ -0,0 +1,20 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ .idea
19
+ .rvmrc
20
+ bin/
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format d
data/Appraisals ADDED
@@ -0,0 +1,7 @@
1
+ appraise '3.1' do
2
+ gem "activerecord", '~> 3.1.0'
3
+ end
4
+
5
+ appraise '3.2' do
6
+ gem 'activerecord', '~> 3.2.0'
7
+ end
data/CHANGELOG.md ADDED
@@ -0,0 +1,6 @@
1
+ **0.1.0 (June 6, 2012)** (initial release)
2
+ * define EAV attributes
3
+ * "where" condition
4
+ * "order" condition
5
+ * "reverse_order" condition
6
+ * "select" condition
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source :rubygems
2
+
3
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 Kostyantyn Stepanyuk
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,122 @@
1
+ # hydra_attribute
2
+
3
+ hydra_attribute is an implementation of
4
+ [EAV pattern](http://en.wikipedia.org/wiki/Entity–attribute–value_model) for ActiveRecord models.
5
+
6
+ ## Requirements
7
+ * ruby >= 1.9.2
8
+ * active_record >= 3.1
9
+
10
+ ## Installation
11
+
12
+ Add the following line to Gemfile:
13
+ ```ruby
14
+ gem 'hydra_attribute'
15
+ ```
16
+ and run `bundle install` from your shell.
17
+
18
+ After successful installation run rails generator:
19
+ ```shell
20
+ rails generate hydra_attribute:install
21
+ ```
22
+
23
+ This command generates hydra_attribute initializer:
24
+ ```ruby
25
+ HydraAttribute.setup do |config|
26
+ # Add prefix for all attribute tables
27
+ # config.table_prefix = 'hydra_'
28
+
29
+ # Add prefix for has_many associations
30
+ # config.association_prefix = 'hydra_'
31
+
32
+ # Wrap all associated models in HydraAttribute module
33
+ # config.use_module_for_associated_models = true
34
+ end
35
+ ```
36
+
37
+ And the last step is to generate db:migration:
38
+ ```shell
39
+ rails generate migration create_hydra_attrubute_tables
40
+ ```
41
+ Migration should look like this:
42
+ ```ruby
43
+ class CreateHydraAttributeTables < ActiveRecord::Migration
44
+ def up
45
+ HydraAttribute::Migration.new(self).migrate
46
+ end
47
+
48
+ def down
49
+ HydraAttribute::Migration.new(self).rollback
50
+ end
51
+ end
52
+ ```
53
+ ## Usage
54
+
55
+ ##### Generate model
56
+ ```shell
57
+ rails generate model Product type:string name:string
58
+ rails generate model SimpleProduct --migration=false --parent=Product
59
+ rake db:migrate
60
+ ```
61
+
62
+ ##### Describe EAV attributes
63
+ ```ruby
64
+ class SimpleProduct < Product
65
+ attr_accessible :name, :title, :code, :quantity, :price, :active, :description
66
+
67
+ define_hydra_attributes do |hydra|
68
+ hydra.string :title, :code
69
+ hydra.integer :quantity
70
+ hydra.float :price
71
+ hydra.boolean :active
72
+ hydra.text :description
73
+ end
74
+ end
75
+ ```
76
+
77
+ ##### Create some products
78
+ ```shell
79
+ SimpleProduct.create(name: 'Book', title: 'book', code: '100', quantity: 5, price: 2.75, active: true, description: '...')
80
+ SimpleProduct.create(name: 'Book', title: 'book', code: '101', quantity: 5, price: 3.75, active: true, description: '...')
81
+ SimpleProduct.create(name: 'Book', title: 'book', code: '102', quantity: 4, price: 4.50, active: false, description: '...')
82
+ SimpleProduct.create(name: 'Book', title: nil, code: '103', quantity: 3, price: 4.50, active: true, description: '...')
83
+ SimpleProduct.create(name: 'Book', code: '104', quantity: 2, price: 5.00, active: true, description: '...')
84
+ ```
85
+
86
+ ##### "where"
87
+ ```shell
88
+ SimpleProduct.where(name: 'Book', quantity: 5, price: 2.75).first.attributes
89
+ => {"id"=>1, "type"=>"SimpleProduct", "name"=>"Book", "created_at"=>Tue, 05 Jun 2012 23:13:21 UTC +00:00, "updated_at"=>Tue, 05 Jun 2012 23:13:21 UTC +00:00, "title"=>"book", "code"=>"100", "quantity"=>5, "price"=>2.75, "active"=>true, "description"=>"..."}
90
+
91
+ SimpleProduct.where(title: 'book', active: false).first.attributes
92
+ => {"id"=>3, "type"=>"SimpleProduct", "name"=>"Book", "created_at"=>Tue, 05 Jun 2012 23:13:50 UTC +00:00, "updated_at"=>Tue, 05 Jun 2012 23:13:50 UTC +00:00, "title"=>"book", "code"=>"102", "quantity"=>4, "price"=>4.5, "active"=>false, "description"=>"..."}
93
+
94
+ SimpleProduct.where(title: nil).first.attributes
95
+ => {"id"=>4, "type"=>"SimpleProduct", "name"=>"Book", "created_at"=>Tue, 05 Jun 2012 23:13:50 UTC +00:00, "updated_at"=>Tue, 05 Jun 2012 23:13:50 UTC +00:00, "title"=>nil, "code"=>"103", "quantity"=>3, "price"=>4.5, "active"=>true, "description"=>"..."}
96
+
97
+ SimpleProduct.where(title: nil).last.attributes
98
+ => {"id"=>5, "type"=>"SimpleProduct", "name"=>"Book", "created_at"=>Tue, 05 Jun 2012 23:13:51 UTC +00:00, "updated_at"=>Tue, 05 Jun 2012 23:13:51 UTC +00:00, "title"=>nil, "code"=>"104", "quantity"=>2, "price"=>5.0, "active"=>true, "description"=>"..."}
99
+ ```
100
+
101
+ ##### "order" and "reverse_order"
102
+ ```shell
103
+ SimpleProduct.order(:code).first.attributes
104
+ => {"id"=>1, "type"=>"SimpleProduct", "name"=>"Book", "created_at"=>Tue, 05 Jun 2012 23:30:48 UTC +00:00, "updated_at"=>Tue, 05 Jun 2012 23:30:49 UTC +00:00, "title"=>"book", "code"=>"100", "quantity"=>5, "price"=>2.75, "active"=>true, "description"=>"..."}
105
+
106
+ SimpleProduct.order(:code).reverse_order.first.attributes
107
+ => {"id"=>5, "type"=>"SimpleProduct", "name"=>"Book", "created_at"=>Tue, 05 Jun 2012 23:30:51 UTC +00:00, "updated_at"=>Tue, 05 Jun 2012 23:30:51 UTC +00:00, "title"=>nil, "code"=>"104", "quantity"=>2, "price"=>5.0, "active"=>true, "description"=>"..."}
108
+ ```
109
+
110
+ ##### "select"
111
+ ```shell
112
+ SimpleProduct.select([:code, :price]).map(&:attributes)
113
+ => [{"code"=>"100", "price"=>2.75}, {"code"=>"101", "price"=>3.75}, {"code"=>"102", "price"=>4.5}, {"code"=>"103", "price"=>4.5}, {"code"=>"104", "price"=>5.0}]
114
+ ```
115
+
116
+ ## Contributing
117
+
118
+ 1. Fork it
119
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
120
+ 3. Commit your changes (`git commit -am 'Added some feature'`)
121
+ 4. Push to the branch (`git push origin my-new-feature`)
122
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env rake
2
+ require 'bundler/gem_tasks'
3
+ require 'appraisal'
4
+ require 'rspec/core/rake_task'
5
+ require 'cucumber/rake/task'
6
+
7
+ RSpec::Core::RakeTask.new('spec')
8
+ Cucumber::Rake::Task.new(:features) do |t|
9
+ t.cucumber_opts = '--format pretty'
10
+ end
11
+
12
+ task default: :spec
@@ -0,0 +1,151 @@
1
+ Feature: helper methods for hydra attributes
2
+ When class calls hydra_attributes
3
+ Then symbolize hash with hydra attribute names and their types should be returned
4
+
5
+ When class calls hydra_attribute_names
6
+ Then array with symbolize hydra attribute names should be returned
7
+
8
+ When class calls hydra_attribute_types
9
+ Then array with symbolize hydra attribute types should be returned
10
+
11
+ When model calls hydra_attributes
12
+ Then stringify hash with hydra attribute names and their values should be returned
13
+
14
+ When model calls attributes
15
+ Then stringify hash with both native and hydra attributes should be returned
16
+
17
+ When model calls attributes_before_type_cast
18
+ Then stringify hash with both native and hydra attributes should be returned with values before type cast
19
+
20
+ When model calls read_attribute on hydra attribute
21
+ Then hydra attribute value should be returned
22
+
23
+ When model calls read_attribute_before_type_cast
24
+ Then hydra attribute value before type cast should be returned
25
+
26
+ Background: create models and describe hydra attributes
27
+ Given removed constants if they exist:
28
+ | name |
29
+ | GroupProduct |
30
+ | SimpleProduct |
31
+ | Product |
32
+ And create model class "Product"
33
+ And create model class "SimpleProduct" as "Product" with hydra attributes:
34
+ | type | name |
35
+ | string | code |
36
+ | float | price |
37
+ | text | note |
38
+ And create model class "GroupProduct" as "Product" with hydra attributes:
39
+ | type | name |
40
+ | integer | price |
41
+ | string | title |
42
+ | boolean | active |
43
+ | datetime | launch |
44
+
45
+ Scenario Outline: class hydra_attributes
46
+ Then class "<class>"::"<method>" "<behavior>" have "<param>" hash
47
+
48
+ Scenarios: hydra attributes
49
+ | class | method | behavior | param |
50
+ | SimpleProduct | hydra_attributes | should | code=string price=float note=text |
51
+ | GroupProduct | hydra_attributes | should | price=integer title=string active=boolean launch=datetime |
52
+
53
+ Scenario Outline: class hydra_attribute_names
54
+ Then class "<class>"::"<method>" "<behavior>" have string "<params>" in array
55
+
56
+ Scenarios: hydra attribute names
57
+ | class | method | behavior | params |
58
+ | SimpleProduct | hydra_attribute_names | should | code price note |
59
+ | SimpleProduct | hydra_attribute_names | should_not | title active launch |
60
+ | GroupProduct | hydra_attribute_names | should | price title active launch |
61
+ | GroupProduct | hydra_attribute_names | should_not | code note |
62
+
63
+ Scenario Outline: class hydra_attribute_types
64
+ Then class "<class>"::"<method>" "<behavior>" have symbol "<params>" in array
65
+
66
+ Scenarios: hydra attribute types
67
+ | class | method | behavior | params |
68
+ | SimpleProduct | hydra_attribute_types | should | string float text |
69
+ | SimpleProduct | hydra_attribute_types | should_not | integer boolean datetime |
70
+ | GroupProduct | hydra_attribute_types | should | integer string boolean datetime |
71
+ | GroupProduct | hydra_attribute_types | should_not | text float |
72
+
73
+ Scenario Outline: model hydra_attributes
74
+ Given create models:
75
+ | model | attributes |
76
+ | SimpleProduct | name=[string:a] info=[string:i] code=[string:c] price=[float:2] note=[string:n] |
77
+ | GroupProduct | name=[string:a] info=[string:i] price=[float:2] title=[string:t] active=[boolean:true] launch=[string:2012-06-03] |
78
+ When select "first" "<model>" record
79
+ Then model "<model>" should have only the following hydra attributes "<attributes>"
80
+ And record should have the following hydra attributes "<values>" in attribute hash
81
+
82
+ Scenarios: required hydra attributes
83
+ | model | attributes | values |
84
+ | SimpleProduct | code price note | code=[string:c] price=[float:2] note=[string:n] |
85
+ | GroupProduct | price title active launch | price=[float:2] title=[string:t] active=[boolean:true] launch=[string:2012-06-03] |
86
+
87
+ Scenario Outline: model attributes
88
+ Given create models:
89
+ | model | attributes |
90
+ | SimpleProduct | name=[string:a] info=[string:i] code=[string:c] price=[float:2] note=[string:n] |
91
+ | GroupProduct | name=[string:a] info=[string:i] price=[float:2] title=[string:t] active=[boolean:true] launch=[string:2012-06-03] |
92
+ When select "first" "<model>" record
93
+ Then model "<model>" should have only the following attributes "<attributes>"
94
+ And record should have the following attributes "<values>" in attribute hash
95
+
96
+ Scenarios: required attributes
97
+ | model | attributes | values |
98
+ | SimpleProduct | id type name info created_at updated_at code price note | name=[string:a] info=[string:i] code=[string:c] price=[float:2] note=[string:n] |
99
+ | GroupProduct | id type name info created_at updated_at price title active launch | name=[string:a] info=[string:i] price=[float:2] title=[string:t] active=[boolean:true] launch=[string:2012-06-03] |
100
+
101
+ Scenario Outline: model attributes_before_type_cast
102
+ Given create models:
103
+ | model | attributes |
104
+ | SimpleProduct | name=[string:a] info=[string:i] code=[string:c] price=[float:2] note=[string:n] |
105
+ | GroupProduct | name=[string:a] info=[string:i] price=[float:2] title=[string:t] active=[boolean:true] launch=[string:2012-06-07] |
106
+ When select "first" "<model>" record
107
+ Then model "<model>" should have only the following attributes before type cast "<attributes>"
108
+ And record should have the following attributes before type cast "<before type cast values>" in attribute hash
109
+
110
+ Scenarios: required before type cast attributes
111
+ | model | attributes | before type cast values |
112
+ | SimpleProduct | id type name info created_at updated_at code price note | name=[string:a] info=[string:i] code=[string:c] price=[float:2] note=[string:n] |
113
+ | GroupProduct | id type name info created_at updated_at price title active launch | name=[string:a] info=[string:i] price=[float:2] title=[string:t] active=[string:t] launch=[string:2012-06-07 00:00:00.000000] |
114
+
115
+ Scenario Outline: model read_attributes
116
+ Given create models:
117
+ | model | attributes |
118
+ | SimpleProduct | name=[string:a] info=[string:i] code=[string:c] price=[nil:] |
119
+ | GroupProduct | name=[string:a] info=[string:i] price=[nil:] active=[boolean:true] launch=[string:2012-06-03] |
120
+ When select "first" "<model>" record
121
+ Then record read attribute "<attribute>" and value should be "<value>"
122
+
123
+ Scenarios: read attributes
124
+ | model | attribute | value |
125
+ | SimpleProduct | name | [string:a] |
126
+ | SimpleProduct | info | [string:i] |
127
+ | SimpleProduct | code | [string:c] |
128
+ | SimpleProduct | price | [nil:] |
129
+ | SimpleProduct | note | [nil:] |
130
+ | GroupProduct | name | [string:a] |
131
+ | GroupProduct | info | [string:i] |
132
+ | GroupProduct | price | [nil:] |
133
+ | GroupProduct | title | [nil:] |
134
+ | GroupProduct | active | [boolean:true] |
135
+ | GroupProduct | launch | [datetime:2012-06-03] |
136
+
137
+ Scenario Outline: model read_attributes_before_type_cast
138
+ Given create models:
139
+ | model | attributes |
140
+ | SimpleProduct | name=[string:a] price=[float:2] |
141
+ | GroupProduct | name=[string:a] active=[boolean:false] launch=[string:2012-06-03] |
142
+ When select "first" "<model>" record
143
+ Then record read attribute before type cast "<attribute>" and value should be "<value>"
144
+
145
+ Scenarios: read attributes
146
+ | model | attribute | value |
147
+ | SimpleProduct | name | [string:a] |
148
+ | SimpleProduct | price | [float:2] |
149
+ | GroupProduct | name | [string:a] |
150
+ | GroupProduct | active | [string:f] |
151
+ | GroupProduct | launch | [string:2012-06-03 00:00:00.000000] |
@@ -0,0 +1,61 @@
1
+ Feature: define hydra attributes
2
+ Models should respond to hydra attributes
3
+
4
+ Model should respond to hydra attributes if they are described in the class.
5
+ Model should not respond to hydra attribute if it isn't described in it class.
6
+
7
+ Background: create models and describe hydra attributes
8
+ Given removed constants if they exist:
9
+ | name |
10
+ | GroupProduct |
11
+ | SimpleProduct |
12
+ | Product |
13
+ And create model class "Product"
14
+ And create model class "SimpleProduct" as "Product" with hydra attributes:
15
+ | type | name |
16
+ | string | code |
17
+ And create model class "GroupProduct" as "Product" with hydra attributes:
18
+ | type | name |
19
+ | float | price |
20
+
21
+ Scenario Outline: models should respond to hydra attributes
22
+ Then model "<model>" should "<respond>" to "<attributes>"
23
+
24
+ Scenarios: model should respond to own hydra attributes
25
+ | model | respond | attributes |
26
+ | SimpleProduct | should | code |
27
+ | SimpleProduct | should | code= |
28
+ | SimpleProduct | should | code? |
29
+ | SimpleProduct | should | code_before_type_cast |
30
+ | SimpleProduct | should | code_changed? |
31
+ | SimpleProduct | should | code_change |
32
+ | SimpleProduct | should | code_will_change! |
33
+ | SimpleProduct | should | code_was |
34
+ | SimpleProduct | should | reset_code! |
35
+ | SimpleProduct | should_not | price |
36
+ | SimpleProduct | should_not | price= |
37
+ | SimpleProduct | should_not | price? |
38
+ | SimpleProduct | should_not | price_before_type_cast |
39
+ | SimpleProduct | should_not | price_changed? |
40
+ | SimpleProduct | should_not | price_change |
41
+ | SimpleProduct | should_not | price_will_change! |
42
+ | SimpleProduct | should_not | price_was |
43
+ | SimpleProduct | should_not | reset_price! |
44
+ | GroupProduct | should | price |
45
+ | GroupProduct | should | price= |
46
+ | GroupProduct | should | price? |
47
+ | GroupProduct | should | price_before_type_cast |
48
+ | GroupProduct | should | price_changed? |
49
+ | GroupProduct | should | price_change |
50
+ | GroupProduct | should | price_will_change! |
51
+ | GroupProduct | should | price_was |
52
+ | GroupProduct | should | reset_price! |
53
+ | GroupProduct | should_not | code |
54
+ | GroupProduct | should_not | code= |
55
+ | GroupProduct | should_not | code? |
56
+ | GroupProduct | should_not | code_before_type_cast |
57
+ | GroupProduct | should_not | code_changed? |
58
+ | GroupProduct | should_not | code_change |
59
+ | GroupProduct | should_not | code_will_change! |
60
+ | GroupProduct | should_not | code_was |
61
+ | GroupProduct | should_not | reset_code! |
@@ -0,0 +1,45 @@
1
+ Feature: hydra attribute associations
2
+ When loaded collection has more than one record
3
+ Then all hydra attribute associations should be loaded
4
+
5
+ When loaded collection hasn't records or has only one
6
+ Then hydra attribute association should not be loaded automatically
7
+
8
+ Background: create models and describe hydra attributes
9
+ Given removed constants if they exist:
10
+ | name |
11
+ | GroupProduct |
12
+ | SimpleProduct |
13
+ | Product |
14
+ And create model class "Product"
15
+ And create model class "SimpleProduct" as "Product" with hydra attributes:
16
+ | type | name |
17
+ | string | code |
18
+ | float | price |
19
+ And create model class "GroupProduct" as "Product" with hydra attributes:
20
+ | type | name |
21
+ | float | price |
22
+ | string | title |
23
+ | boolean | active |
24
+
25
+ Scenario: hydra attribute associations should be included for collection with more then one record
26
+ Given create models:
27
+ | model | attributes |
28
+ | SimpleProduct | code=[integer:1] |
29
+ | SimpleProduct | code=[integer:2] |
30
+ When load all "SimpleProduct" records
31
+ Then records "should" have loaded associations:
32
+ | association |
33
+ | hydra_string_attributes |
34
+ | hydra_float_attributes |
35
+
36
+ Scenario: hydra attribute associations should not be included for collection with one record
37
+ Given create models:
38
+ | model | attributes |
39
+ | GroupProduct | price=[float:2.75] |
40
+ When load all "GroupProduct" records
41
+ Then records "should_not" have loaded associations:
42
+ | association |
43
+ | hydra_float_attributes |
44
+ | hydra_string_attributes |
45
+ | hydra_boolean_attributes |