hydra_attribute 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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 |