axle_attributes 1.13.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (119) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +4 -0
  3. data/.travis.yml +16 -0
  4. data/Gemfile +15 -0
  5. data/README.md +10 -0
  6. data/Rakefile +18 -0
  7. data/app/models/attribute_customization.rb +7 -0
  8. data/app/models/attribute_customization/local_cache.rb +28 -0
  9. data/app/models/attribute_mapping.rb +15 -0
  10. data/app/models/attribute_mapping/local_cache.rb +40 -0
  11. data/axle_attributes.gemspec +22 -0
  12. data/bin/rails +8 -0
  13. data/db/migrate/20131118042651_create_attribute_customizations.rb +16 -0
  14. data/db/migrate/20131121013237_create_attribute_mappings.rb +17 -0
  15. data/db/migrate/20151120160522_add_editable_to_attribute_customizations.rb +7 -0
  16. data/lib/axle_attributes.rb +30 -0
  17. data/lib/axle_attributes/child_definition.rb +42 -0
  18. data/lib/axle_attributes/conversions.rb +36 -0
  19. data/lib/axle_attributes/definition.rb +118 -0
  20. data/lib/axle_attributes/definition/callbacks.rb +34 -0
  21. data/lib/axle_attributes/definition/customization.rb +51 -0
  22. data/lib/axle_attributes/definition/formatted.rb +57 -0
  23. data/lib/axle_attributes/definition/indexed.rb +41 -0
  24. data/lib/axle_attributes/definition/mappings.rb +48 -0
  25. data/lib/axle_attributes/dumper.rb +54 -0
  26. data/lib/axle_attributes/engine.rb +4 -0
  27. data/lib/axle_attributes/format.rb +74 -0
  28. data/lib/axle_attributes/has_attributes.rb +104 -0
  29. data/lib/axle_attributes/has_attributes/json_reader.rb +87 -0
  30. data/lib/axle_attributes/model.rb +34 -0
  31. data/lib/axle_attributes/null_definition.rb +11 -0
  32. data/lib/axle_attributes/parent_definition.rb +37 -0
  33. data/lib/axle_attributes/provided.rb +67 -0
  34. data/lib/axle_attributes/regex.rb +4 -0
  35. data/lib/axle_attributes/segmented.rb +30 -0
  36. data/lib/axle_attributes/serializations.rb +147 -0
  37. data/lib/axle_attributes/serializations/builder/serialization.rb +83 -0
  38. data/lib/axle_attributes/serializations/builder/serialize_many.rb +17 -0
  39. data/lib/axle_attributes/serializations/builder/serialize_one.rb +7 -0
  40. data/lib/axle_attributes/serializations/reflection.rb +40 -0
  41. data/lib/axle_attributes/serializations/serialization.rb +88 -0
  42. data/lib/axle_attributes/serializations/serialize_many.rb +88 -0
  43. data/lib/axle_attributes/serializations/serialize_one.rb +34 -0
  44. data/lib/axle_attributes/serialized_child.rb +58 -0
  45. data/lib/axle_attributes/validations.rb +29 -0
  46. data/lib/axle_attributes/versioned.rb +21 -0
  47. data/test/dummy/README.rdoc +6 -0
  48. data/test/dummy/Rakefile +6 -0
  49. data/test/dummy/app/assets/images/.keep +0 -0
  50. data/test/dummy/app/assets/javascripts/application.js +13 -0
  51. data/test/dummy/app/assets/stylesheets/application.css +13 -0
  52. data/test/dummy/app/controllers/application_controller.rb +5 -0
  53. data/test/dummy/app/controllers/concerns/.keep +0 -0
  54. data/test/dummy/app/helpers/application_helper.rb +2 -0
  55. data/test/dummy/app/mailers/.keep +0 -0
  56. data/test/dummy/app/models/.keep +0 -0
  57. data/test/dummy/app/models/concerns/.keep +0 -0
  58. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  59. data/test/dummy/bin/bundle +3 -0
  60. data/test/dummy/bin/rails +4 -0
  61. data/test/dummy/bin/rake +4 -0
  62. data/test/dummy/config.ru +4 -0
  63. data/test/dummy/config/application.rb +12 -0
  64. data/test/dummy/config/boot.rb +5 -0
  65. data/test/dummy/config/database.yml +13 -0
  66. data/test/dummy/config/environment.rb +5 -0
  67. data/test/dummy/config/environments/development.rb +29 -0
  68. data/test/dummy/config/environments/production.rb +80 -0
  69. data/test/dummy/config/environments/test.rb +38 -0
  70. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  71. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  72. data/test/dummy/config/initializers/inflections.rb +16 -0
  73. data/test/dummy/config/initializers/mime_types.rb +5 -0
  74. data/test/dummy/config/initializers/secret_token.rb +12 -0
  75. data/test/dummy/config/initializers/session_store.rb +3 -0
  76. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  77. data/test/dummy/config/locales/en.yml +23 -0
  78. data/test/dummy/config/routes.rb +56 -0
  79. data/test/dummy/db/schema.rb +50 -0
  80. data/test/dummy/lib/assets/.keep +0 -0
  81. data/test/dummy/log/.keep +0 -0
  82. data/test/dummy/public/404.html +58 -0
  83. data/test/dummy/public/422.html +58 -0
  84. data/test/dummy/public/500.html +57 -0
  85. data/test/dummy/public/favicon.ico +0 -0
  86. data/test/factories/all.rb +14 -0
  87. data/test/helper.rb +25 -0
  88. data/test/lib/child_definition_test.rb +43 -0
  89. data/test/lib/conversions_test.rb +39 -0
  90. data/test/lib/definition/customization_test.rb +36 -0
  91. data/test/lib/definition/formatted_test.rb +75 -0
  92. data/test/lib/definition/indexed_test.rb +57 -0
  93. data/test/lib/definition/mappings_test.rb +26 -0
  94. data/test/lib/definition_test.rb +84 -0
  95. data/test/lib/dumper_test.rb +38 -0
  96. data/test/lib/format_test.rb +64 -0
  97. data/test/lib/has_attributes/json_reader_test.rb +46 -0
  98. data/test/lib/has_attributes_test.rb +69 -0
  99. data/test/lib/model_test.rb +44 -0
  100. data/test/lib/null_definition_test.rb +27 -0
  101. data/test/lib/parent_definition_test.rb +75 -0
  102. data/test/lib/provided_test.rb +46 -0
  103. data/test/lib/segmented_test.rb +27 -0
  104. data/test/lib/serializations/reflection_test.rb +24 -0
  105. data/test/lib/serializations/serialize_many_test.rb +194 -0
  106. data/test/lib/serializations/serialize_one_test.rb +122 -0
  107. data/test/lib/serializations_test.rb +24 -0
  108. data/test/lib/serialized_child_test.rb +91 -0
  109. data/test/lib/timestamp_attributes_test.rb +14 -0
  110. data/test/lib/validations_test.rb +8 -0
  111. data/test/lib/versioned_test.rb +35 -0
  112. data/test/models/attribute_customization/local_cache_test.rb +16 -0
  113. data/test/models/attribute_customization_test.rb +8 -0
  114. data/test/models/attribute_mapping/local_cache_test.rb +31 -0
  115. data/test/models/attribute_mapping_test.rb +20 -0
  116. data/test/support/business.rb +22 -0
  117. data/test/support/pg.rb +9 -0
  118. data/test/support/vegetable.rb +8 -0
  119. metadata +215 -0
@@ -0,0 +1,46 @@
1
+ require 'helper'
2
+
3
+ class AxleAttributes::ProvidedTest < ActiveSupport::TestCase
4
+ test 'provided on write' do
5
+ business = Business.new
6
+ assert_equal [], business.provided
7
+
8
+ business.name = "foo"
9
+ assert_equal ['name'].to_set, business.provided_set
10
+ assert_equal ['name'], business.provided
11
+ assert business.name_provided?
12
+ assert business.provided?('name')
13
+ refute business.street_provided?
14
+ refute business.provided?('street')
15
+ end
16
+
17
+ test 'without_provided_tracking' do
18
+ business = Business.new
19
+
20
+ Business.without_provided_tracking do
21
+ business.name = "foo"
22
+ end
23
+
24
+ refute business.name_provided?
25
+ end
26
+
27
+ test 'provided cleared' do
28
+ Business.new(name: 'foo').tap do |business|
29
+ business.name = 'bar'
30
+ business.save
31
+ assert_equal [], business.provided
32
+ end
33
+
34
+ Business.new(name: 'foo').tap do |business|
35
+ business.name = 'bar'
36
+ business.save!
37
+ assert_equal [], business.provided
38
+ end
39
+
40
+ Business.create(name: 'foo').tap do |business|
41
+ business.name = 'bar'
42
+ business.reload
43
+ assert_equal [], business.provided
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,27 @@
1
+ require 'helper'
2
+
3
+ class AxleAttributes::SegmentedTest < ActiveSupport::TestCase
4
+ class TestModel < Superstore::Base
5
+ include AxleAttributes::Model
6
+ end
7
+
8
+ test 'segment_exists' do
9
+ record = TestModel.new
10
+
11
+ assert record.respond_to? :segment_id
12
+ assert record.respond_to? :segment_id=
13
+ end
14
+
15
+ test 'segment_range' do
16
+ assert_equal 0..1023, TestModel.segment_range
17
+ end
18
+
19
+ test 'segment_populated' do
20
+ record = TestModel.new(id: 'poop')
21
+ assert_nil record.segment_id
22
+
23
+ record.run_callbacks :create
24
+
25
+ assert_equal 260, record.segment_id
26
+ end
27
+ end
@@ -0,0 +1,24 @@
1
+ require 'helper'
2
+
3
+ class AxleAttributes::Serializations::ReflectionTest < ActiveSupport::TestCase
4
+ test 'collection' do
5
+ assert reflection_class.new(:serialize_many, :doggies, {}).collection?
6
+ refute reflection_class.new(:serialize_one, :doggy, {}).collection?
7
+ end
8
+
9
+ test 'counter_cache_column' do
10
+ assert_equal 'doggies_count', reflection_class.new(:serialize_many, :doggies, {}).counter_cache_column
11
+ assert_nil reflection_class.new(:serialize_many, :doggies, counter_cache: false).counter_cache_column
12
+ end
13
+
14
+ test 'klass' do
15
+
16
+ end
17
+
18
+ private
19
+
20
+ def reflection_class
21
+ AxleAttributes::Serializations::Reflection
22
+ end
23
+
24
+ end
@@ -0,0 +1,194 @@
1
+ require 'helper'
2
+
3
+ class AxleAttributes::Serializations::SerializeManyTest < ActiveSupport::TestCase
4
+ class Girlfriend < Superstore::Base
5
+ include AxleAttributes::SerializedChild
6
+
7
+ has_attribute :color, type: :string, index: true
8
+ has_attribute :height, type: :integer, index: false
9
+
10
+ validates :color, inclusion: {in: ['red', 'blue']}
11
+ end
12
+
13
+ class TestModel < Business
14
+ serialize_many :girlfriends, class_name: 'AxleAttributes::Serializations::SerializeManyTest::Girlfriend'
15
+ end
16
+
17
+ test 'attributes' do
18
+ assert_nil TestModel.attributes['girlfriends_json']
19
+ refute_nil TestModel.attributes['girlfriends_count']
20
+
21
+ refute_nil TestModel.attributes['girlfriends.color']
22
+ refute_nil TestModel.attributes['girlfriends.height']
23
+
24
+ assert_equal 'girlfriends', TestModel.attributes['girlfriends.height'].nested_path
25
+
26
+ assert TestModel.new.respond_to?(:girlfriends)
27
+ assert TestModel.new.respond_to?(:girlfriends=)
28
+ end
29
+
30
+ test 'index mapping' do
31
+ contacts_mapping = TestModel.elastic_index.mapping[:properties]['girlfriends']
32
+
33
+ refute_nil contacts_mapping
34
+ assert_equal :nested, contacts_mapping[:type]
35
+ assert_equal Girlfriend.attributes['color'].index_mapping, contacts_mapping[:properties]['color']
36
+ end
37
+
38
+ test 'serialization_reflections' do
39
+ refute_nil TestModel.serialization_reflections[:girlfriends]
40
+ end
41
+
42
+ test 'writer on empty' do
43
+ girlfriend = Girlfriend.new(color: 'blue')
44
+ record = TestModel.new
45
+
46
+ record.girlfriends = [girlfriend]
47
+
48
+ assert_equal 1, record.girlfriends_count
49
+ assert_equal [girlfriend], record.girlfriends
50
+ assert_equal 'blue', record[:girlfriends].first['color']
51
+ assert_kind_of String, record[:girlfriends].first['created_at']
52
+ assert_equal record.child_serialization(:girlfriends), record.girlfriends.first.serialization_instance
53
+ end
54
+
55
+ test 'writer on existing record' do
56
+ original_girlfriend = Girlfriend.new(id: '5', color: 'blue')
57
+ updated_girlfriend = Girlfriend.new(id: '5', color: 'green')
58
+ record = TestModel.new girlfriends: [original_girlfriend]
59
+
60
+ record.girlfriends = [updated_girlfriend]
61
+
62
+ assert_equal 1, record.girlfriends_count
63
+ assert_equal 'green', record.girlfriends.first.color
64
+ assert_equal original_girlfriend.created_at, record.girlfriends.first.created_at
65
+ end
66
+
67
+ test 'writer on record replacement' do
68
+ original_girlfriend = Girlfriend.new(id: '5', color: 'blue')
69
+ new_girlfriend = Girlfriend.new(id: '10', color: 'green')
70
+ record = TestModel.new girlfriends: [original_girlfriend]
71
+
72
+ record.girlfriends = [new_girlfriend]
73
+
74
+ assert_equal 1, record.girlfriends_count
75
+ assert_equal 'green', record.girlfriends.first.color
76
+ assert_equal new_girlfriend, record.girlfriends.first
77
+ end
78
+
79
+ test 'writer with nil' do
80
+ record = TestModel.new girlfriends: nil
81
+ assert_equal Set.new, record.provided_set
82
+ assert_equal Hash.new, record.changes
83
+ end
84
+
85
+ test 'attributes_writer updates existing' do
86
+ girlfriend = Girlfriend.new(id: 'abc', height: 60)
87
+ record = TestModel.new girlfriends: [girlfriend]
88
+
89
+ record.girlfriends_attributes = [
90
+ {'id' => 'abc', height: 68}
91
+ ]
92
+
93
+ assert_equal [girlfriend.object_id], record.girlfriends.map(&:object_id)
94
+ assert_equal 68, girlfriend.height
95
+ end
96
+
97
+ test 'attributes_writer partial write' do
98
+ keeper_girlfriend = Girlfriend.new(id: 'abc', height: 60)
99
+ loser_girlfriend = Girlfriend.new(id: 'xyz', height: 48)
100
+ record = TestModel.new girlfriends: [keeper_girlfriend, loser_girlfriend]
101
+
102
+ record.girlfriends_attributes = [
103
+ {'id' => 'xyz', '_destroy' => '1'},
104
+ {'id' => 'mno', height: 68}
105
+ ]
106
+
107
+ assert_equal ['abc', 'mno'].to_set, record.girlfriends.map(&:id).to_set
108
+
109
+ assert record.girlfriends.include?(keeper_girlfriend)
110
+ assert record.girlfriends.exclude?(loser_girlfriend)
111
+ new_girlfriend = record.girlfriends.detect { |gf| gf.id == 'mno' }
112
+ assert_equal 68, new_girlfriend.height
113
+ end
114
+
115
+ test 'attributes_writer with empty collection' do
116
+ record = TestModel.new girlfriends_attributes: []
117
+ assert_equal Set.new, record.provided_set
118
+ assert_equal Hash.new, record.changes
119
+ end
120
+
121
+ test 'read when nil' do
122
+ record = TestModel.new
123
+
124
+ assert_equal [], record.girlfriends
125
+ end
126
+
127
+ test 'reader' do
128
+ record = TestModel.new
129
+ record[:girlfriends] = [{'id' => '5', 'color' => 'red'}]
130
+
131
+ assert_equal [Girlfriend.new(id: '5')], record.girlfriends
132
+ assert_equal record.child_serialization(:girlfriends), record.girlfriends.first.serialization_instance
133
+ end
134
+
135
+ test 'reader_was' do
136
+ record = TestModel.new
137
+ record.girlfriends = [{'id' => '5', 'color' => 'red'}]
138
+
139
+ assert_equal [], record.girlfriends_was
140
+
141
+ record.changed_attributes.clear
142
+
143
+ record.girlfriends = [{'id' => '5', 'color' => 'blue'}]
144
+ assert_equal 1, record.girlfriends_was.size
145
+ assert_equal 'red', record.girlfriends_was.first.color
146
+ assert_equal '5', record.girlfriends_was.first.id
147
+ end
148
+
149
+ test 'validation' do
150
+ TestModel.new(girlfriends: [Girlfriend.new(color: 'red')]).tap do |record|
151
+ assert record.valid?
152
+ end
153
+
154
+ TestModel.new(girlfriends: [Girlfriend.new(color: 'green')]).tap do |record|
155
+ assert record.invalid?
156
+ assert_equal ["is not included in the list"], record.errors['girlfriends.color']
157
+ end
158
+ end
159
+
160
+ test 'dirty changed' do
161
+ girlfriends = [Girlfriend.new(color: 'red', id: '6')]
162
+ record = TestModel.create! girlfriends: girlfriends
163
+
164
+ record = TestModel.find record.id
165
+ record.girlfriends = girlfriends
166
+
167
+ refute record.changed?
168
+ end
169
+
170
+ test 'dirty restore_attributes' do
171
+ girlfriends = [Girlfriend.new(color: 'red', id: '6')]
172
+ record = TestModel.create! girlfriends: girlfriends
173
+ record = TestModel.find record.id
174
+
175
+ record.girlfriends = [{height: 6, id: '6'}]
176
+ assert_equal 6, record.girlfriends.first.height
177
+ assert_nil record.girlfriends.first.color
178
+
179
+ record.restore_attributes
180
+
181
+ assert_equal 'red', record.girlfriends.first.color
182
+ assert_nil record.girlfriends.first.height
183
+ end
184
+
185
+ test 'reload' do
186
+ record = TestModel.create! girlfriends: [Girlfriend.new(color: 'red')]
187
+
188
+ record = TestModel.find record.id
189
+ record.girlfriends = [Girlfriend.new(color: 'blue'), Girlfriend.new(color: 'red')]
190
+
191
+ record.reload
192
+ assert_equal 1, record.girlfriends.size
193
+ end
194
+ end
@@ -0,0 +1,122 @@
1
+ require 'helper'
2
+
3
+ class AxleAttributes::Serializations::SerializeOneTest < ActiveSupport::TestCase
4
+ class Mommy < Superstore::Base
5
+ include AxleAttributes::SerializedChild
6
+
7
+ has_attribute :eye_color, type: :string, index: true
8
+ has_attribute :age, type: :integer, index: false
9
+
10
+ validates :eye_color, inclusion: {in: ['red', 'blue']}
11
+ end
12
+
13
+ class TestModel < Superstore::Base
14
+ include AxleAttributes::Model
15
+
16
+ serialize_one :mommy, class_name: 'AxleAttributes::Serializations::SerializeOneTest::Mommy'
17
+ end
18
+
19
+ test 'attributes' do
20
+ refute_nil TestModel.attributes['mommy.eye_color']
21
+ refute_nil TestModel.attributes['mommy.age']
22
+
23
+ assert TestModel.new.respond_to?(:mommy)
24
+ assert TestModel.new.respond_to?(:mommy=)
25
+ end
26
+
27
+ test 'index mapping' do
28
+ mommy_mapping = TestModel.elastic_index.mapping[:properties]['mommy']
29
+
30
+ refute_nil mommy_mapping
31
+ assert_equal :object, mommy_mapping[:type]
32
+ assert_equal Mommy.attributes['eye_color'].index_mapping, mommy_mapping[:properties]['eye_color']
33
+ assert_nil mommy_mapping[:properties]['age']
34
+ end
35
+
36
+ test 'serialization_reflections' do
37
+ refute_nil TestModel.serialization_reflections[:mommy]
38
+ end
39
+
40
+ test 'writer' do
41
+ mommy = Mommy.new(eye_color: 'blue')
42
+ record = TestModel.new
43
+
44
+ record.mommy = mommy
45
+
46
+ assert_equal mommy, record.mommy
47
+ assert_equal mommy.object_id, record.mommy.object_id
48
+ assert_equal 'blue', record[:mommy]['eye_color']
49
+ assert_kind_of String, record[:mommy]['created_at']
50
+ assert_equal record.child_serialization(:mommy), record.mommy.serialization_instance
51
+ end
52
+
53
+ test 'writer with hash' do
54
+ record = TestModel.new
55
+
56
+ record.mommy = {eye_color: 'blue'}
57
+
58
+ assert_equal 'blue', record.mommy.eye_color
59
+ end
60
+
61
+ test 'writer with hash and existing target' do
62
+ record = TestModel.new mommy: {id: 'abc', eye_color: 'red'}
63
+
64
+ record.mommy = {eye_color: 'blue'}
65
+
66
+ assert_equal 'blue', record.mommy.eye_color
67
+ assert_equal 'abc', record.mommy.id
68
+ end
69
+
70
+ test 'attributes_writer' do
71
+ record = TestModel.new mommy_attributes: {eye_color: 'blue'}
72
+
73
+ refute_nil record.mommy
74
+ assert_equal 'blue', record.mommy.eye_color
75
+ end
76
+
77
+ test 'attributes_writer delete' do
78
+ record = TestModel.new mommy: Mommy.new(eye_color: 'blue')
79
+
80
+ record.mommy_attributes = {'_destroy' => '1'}
81
+
82
+ assert_nil record.mommy
83
+ end
84
+
85
+ test 'reader' do
86
+ record = TestModel.new
87
+ record[:mommy] = {'id' => '5', 'eye_color' => 'red'}
88
+
89
+ refute_nil record.mommy
90
+ assert_equal 'red', record.mommy.eye_color
91
+ assert_equal record.child_serialization(:mommy), record.mommy.serialization_instance
92
+ end
93
+
94
+ test 'read when nil' do
95
+ record = TestModel.new
96
+
97
+ assert_nil record.mommy
98
+ end
99
+
100
+ test 'reader_was' do
101
+ record = TestModel.new
102
+ record.mommy = {'id' => '5', 'eye_color' => 'red'}
103
+
104
+ assert_nil record.mommy_was
105
+
106
+ record.changed_attributes.clear
107
+
108
+ record.mommy = {'id' => '5', 'eye_color' => 'blue'}
109
+ assert_equal 'red', record.mommy_was.eye_color
110
+ end
111
+
112
+ test 'validation' do
113
+ TestModel.new(mommy: Mommy.new(eye_color: 'red')).tap do |record|
114
+ assert record.valid?
115
+ end
116
+
117
+ TestModel.new(mommy: Mommy.new(color: 'green')).tap do |record|
118
+ assert record.invalid?
119
+ assert_equal ["is not included in the list"], record.errors['mommy.eye_color']
120
+ end
121
+ end
122
+ end
@@ -0,0 +1,24 @@
1
+ require 'helper'
2
+
3
+ class AxleAttributes::SerializationsTest < ActiveSupport::TestCase
4
+ class Pet < Superstore::Base
5
+ include AxleAttributes::SerializedChild
6
+
7
+ has_attribute :color, type: :string
8
+ end
9
+
10
+ class Person < Business
11
+ serialize_many :pets, class_name: 'AxleAttributes::SerializationsTest::Pet'
12
+ serialize_one :favorite, class_name: 'AxleAttributes::SerializationsTest::Pet'
13
+ end
14
+
15
+ test 'serialized_many' do
16
+ assert Person.serialized_many? 'pets'
17
+ assert Person.serialized_many? :pets
18
+ refute Person.serialized_many? :favorite
19
+ refute Person.serialized_many? :unknown
20
+ end
21
+
22
+ test 'reload' do
23
+ end
24
+ end
@@ -0,0 +1,91 @@
1
+ require 'helper'
2
+
3
+ class AxleAttributes::SerializedChildTest < ActiveSupport::TestCase
4
+ class TestModel < Superstore::Base
5
+ include AxleAttributes::SerializedChild
6
+
7
+ has_attributes(
8
+ color: {type: :string, index: true, version: true},
9
+ price: {type: :integer, index: false, version: false}
10
+ )
11
+ end
12
+
13
+ def test_id
14
+ record = TestModel.new
15
+
16
+ refute_nil record.id
17
+ assert_equal :string, TestModel.attributes['id'].type
18
+ assert_equal true, TestModel.attributes['id'].indexed?
19
+ end
20
+
21
+ test 'equality' do
22
+ same_1 = TestModel.new id: '5'
23
+ same_2 = TestModel.new id: '5'
24
+ different = TestModel.new id: '6'
25
+
26
+ assert_equal same_1, same_2
27
+ refute_equal different, same_1
28
+ end
29
+
30
+ test 'created_at' do
31
+ record = TestModel.new
32
+
33
+ assert_in_delta Time.now, record.created_at, 1
34
+ end
35
+
36
+ test 'attributes' do
37
+ refute_nil TestModel.new.attributes['id']
38
+
39
+ assert_equal({'color' => 'green'}, TestModel.new(color: 'green').attributes.except('id', 'created_at'))
40
+ assert_equal({'color' => 'green'}, TestModel.new(color: 'green', price: nil).attributes.except('id', 'created_at'))
41
+ assert_equal({'color' => 'green', 'price' => 25}, TestModel.new(color: 'green', price: 25).attributes.except('id', 'created_at'))
42
+ end
43
+
44
+ test 'attributes with unknown method' do
45
+ record = Class.new(TestModel) do
46
+ has_attribute :bad, type: false
47
+ end.new(bad: '1')
48
+
49
+ assert_equal({}, record.attributes.except('id', 'created_at'))
50
+ end
51
+
52
+ test 'attributes with unknown attribute' do
53
+ record = Class.new(TestModel) do
54
+ def bad=(v)
55
+ @attributes['bad'] = v
56
+ end
57
+
58
+ def bad
59
+ @attributes['bad']
60
+ end
61
+ end.new(bad: '1')
62
+
63
+ assert_equal({}, record.attributes.except('id', 'created_at'))
64
+ end
65
+
66
+ test 'as_json' do
67
+ record = TestModel.new(color: 'green', price: 25)
68
+
69
+ assert_equal record.attributes, record.as_json
70
+ end
71
+
72
+ test 'versioned_attributes' do
73
+ record = TestModel.new(color: 'green', price: 25)
74
+
75
+ search = record.versioned_attributes
76
+
77
+ assert_equal 'green', search['color']
78
+ refute search.key?('created_at')
79
+ refute search.key?('price')
80
+ end
81
+
82
+ test 'as_search' do
83
+ record = TestModel.new(color: 'green', price: 25)
84
+
85
+ search = record.as_search
86
+
87
+ assert_equal 'green', search['color']
88
+ refute_nil search['created_at']
89
+ refute search.key?('price')
90
+ end
91
+ end