property_sets 2.5.0 → 2.6.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.
data/test/test_casting.rb DELETED
@@ -1,38 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/helper')
2
- require 'property_sets/casting'
3
-
4
- class TestCasting < ActiveSupport::TestCase
5
-
6
- context "Casting#read" do
7
- should "return nil when given value nil regardless of type" do
8
- assert_equal nil, PropertySets::Casting.read(:string, nil)
9
- assert_equal nil, PropertySets::Casting.read(:hello, nil)
10
- end
11
-
12
- should "leave serialized data alone" do
13
- assert_equal [1,2,3], PropertySets::Casting.read(:serialized, [1, 2, 3])
14
- end
15
- end
16
-
17
- context "Casting#write" do
18
- should "return nil when given value nil regardless of type" do
19
- assert_equal nil, PropertySets::Casting.write(:string, nil)
20
- assert_equal nil, PropertySets::Casting.write(:hello, nil)
21
- end
22
-
23
- should "convert time instances to UTC" do
24
- time = Time.now.in_time_zone("CET")
25
- assert PropertySets::Casting.write(:datetime, time) =~ /UTC$/
26
- end
27
-
28
- should "convert integers to strings" do
29
- assert_equal "123", PropertySets::Casting.write(:integer, 123)
30
- end
31
-
32
- should "leave serialized data alone for the record to deal with" do
33
- a = [123]
34
- assert_equal a, PropertySets::Casting.write(:serialized, a)
35
- end
36
- end
37
-
38
- end
@@ -1,78 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/helper')
2
-
3
- class TestDelegator < ActiveSupport::TestCase
4
- context PropertySets::Delegator do
5
- fixtures :accounts, :account_settings, :account_texts
6
-
7
- setup do
8
- @account = Account.create(:name => "Name")
9
- @default = 'skep'
10
- end
11
-
12
- context "read" do
13
- should "not add a property" do
14
- @account.old
15
- assert_equal 0, @account.settings.size
16
- end
17
-
18
- should "delegate read to default" do
19
- assert_equal @default, @account.old
20
- end
21
-
22
- should "delegate read to property value" do
23
- @account.settings.hep = 'new'
24
- assert_equal 'new', @account.old
25
- end
26
- end
27
-
28
- context "write" do
29
- should "add a property" do
30
- @account.old = 'new'
31
- assert_equal 1, @account.settings.size
32
- end
33
-
34
- should "delegate write" do
35
- @account.old = 'new'
36
- assert_equal 'new', @account.settings.hep
37
- assert_equal 'new', @account.old
38
- end
39
- end
40
-
41
- context "changed?" do
42
- should "not add a property" do
43
- @account.old_changed?
44
- assert_equal 0, @account.settings.size
45
- end
46
-
47
- should "not be changed" do
48
- assert_equal false, @account.old_changed?
49
- end
50
-
51
- should "be changed with new value" do
52
- @account.old = "new"
53
- assert_equal true, @account.old_changed?
54
- end
55
-
56
- should "not be changed with default value" do
57
- @account.old = @default
58
- assert_equal false, @account.old_changed?
59
- end
60
- end
61
-
62
- context "before_type_case" do
63
- should "not add a property" do
64
- @account.old_before_type_cast
65
- assert_equal 0, @account.settings.size
66
- end
67
-
68
- should "return default" do
69
- assert_equal @default, @account.old_before_type_cast
70
- end
71
-
72
- should "return setting" do
73
- @account.old = "new"
74
- assert_equal "new", @account.old_before_type_cast
75
- end
76
- end
77
- end
78
- end
@@ -1,408 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/helper')
2
-
3
- class TestPropertySets < ActiveSupport::TestCase
4
-
5
- context "property sets" do
6
- fixtures :accounts, :account_settings, :account_texts
7
-
8
- setup do
9
- @account = Account.create(:name => "Name")
10
- end
11
-
12
- should "construct the container class" do
13
- assert defined?(AccountSetting)
14
- assert defined?(AccountText)
15
- end
16
-
17
- should "register the property sets used on a class" do
18
- [ :settings, :texts, :validations, :typed_data ].each do |name|
19
- assert Account.property_set_index.include?(name)
20
- end
21
- end
22
-
23
- should "allow the owner class to be customized" do
24
- (Flux = Class.new(ActiveRecord::Base)).property_set(:blot, {
25
- :owner_class_name => 'Foobar'
26
- }) { property :test }
27
-
28
- assert defined?(FoobarBlot)
29
- end
30
-
31
- should "pass-through any options from the second parameter" do
32
- Account.expects(:has_many).with { |association, h|
33
- association == :foo && h[:conditions] == "bar"
34
- }
35
- Account.property_set(:foo, :conditions => "bar") {}
36
- end
37
-
38
- should "support protecting attributes" do
39
- assert @account.settings.protected?(:pro)
40
- assert !@account.settings.protected?(:foo)
41
- end
42
-
43
- should "allow enabling/disabling a property" do
44
- assert @account.settings.hep?
45
- @account.settings.disable(:hep)
46
- assert !@account.settings.hep?
47
- @account.settings.enable(:hep)
48
- assert @account.settings.hep?
49
-
50
- account = Account.new
51
- assert !account.settings.foo?
52
- account.settings.enable(:foo)
53
- assert account.settings.foo?
54
- end
55
-
56
- should "be empty on a new account" do
57
- assert @account.settings.empty?
58
- assert @account.texts.empty?
59
-
60
- assert !@account.texts.foo?
61
- assert !@account.texts.bar?
62
- assert @account.texts.foo.nil?
63
- assert @account.texts.bar.nil?
64
- end
65
-
66
- should "respond with defaults" do
67
- assert_equal false, @account.settings.bar?
68
- assert_equal nil, @account.settings.bar
69
- assert_equal true, @account.settings.hep?
70
- assert_equal 'skep', @account.settings.hep
71
- end
72
-
73
- should "be flexible when fetching property data" do
74
- assert_equal 'skep', @account.settings.default(:hep)
75
- assert_equal 'skep', @account.settings.default('hep')
76
- end
77
-
78
- context 'querying for a setting that does not exist' do
79
- setup do
80
- assert_equal([], @account.settings)
81
- assert_equal(true, @account.settings.hep?)
82
- end
83
-
84
- should 'not add a new setting' do
85
- assert_equal([], @account.settings)
86
- end
87
-
88
- should 'give back the default value' do
89
- assert_equal('skep', @account.settings.hep)
90
- end
91
- end
92
-
93
- should "reject settings with an invalid name" do
94
- s = AccountSetting.new(:account => @account)
95
-
96
- [ 'hello', 'hel_lo', 'hell0' ].each do |valid|
97
- s.name = valid
98
- assert s.valid?, "#{valid} is invalid: #{s.errors.inspect}"
99
- end
100
-
101
- [ '_hello', :hello ].each do |invalid|
102
- s.name = invalid
103
- assert !s.valid?, "#{invalid} is valid"
104
- end
105
- end
106
-
107
- should "validate uniqueness of settings" do
108
- @account.settings.create!(:name => "unique")
109
- assert_raise ActiveRecord::RecordInvalid do
110
- @account.settings.create!(:name => "unique")
111
- end
112
- end
113
-
114
- should "be creatable using the = operator" do
115
- assert !@account.settings.foo?
116
- [ "1", "2" ].each do |value|
117
- assert @account.settings.foo = value
118
- assert @account.settings.foo?
119
- assert @account.settings.size == 1
120
- end
121
-
122
- assert @account.texts.empty?
123
- end
124
-
125
- should "coerce everything but nil to string" do
126
- @account.settings.foo = 3
127
- @account.save
128
- assert @account.settings.foo == "3"
129
- @account.settings.foo = nil
130
- @account.save
131
- assert @account.settings.foo.nil?
132
- end
133
-
134
- should "reference the owner instance when constructing a new record" do
135
- record = @account.settings.lookup(:baz)
136
- assert record.new_record?
137
- assert record.account.id == @account.id
138
- end
139
-
140
- should "reference the owner instance when constructing a new record ...on a new record" do
141
- account = Account.new(:name => "New")
142
- record = account.settings.lookup(:baz)
143
-
144
- assert record.new_record?
145
- assert record.account == account
146
- end
147
-
148
- context "validations" do
149
- should "add an error when violated" do
150
- @account.validations.validated = "hello"
151
- assert !@account.valid?
152
- assert_match /BEEP$/, @account.errors.full_messages.first
153
- end
154
- end
155
-
156
- context "#get" do
157
- setup { @account.settings.set(:baz => "456") }
158
-
159
- should "fetch property pairs with string arguments" do
160
- assert @account.settings.lookup_without_default(:baz)
161
- assert_equal({"baz" => "456"}, @account.settings.get(["baz"]))
162
- end
163
-
164
- should "fetch property pairs with symbol arguments" do
165
- assert_equal({"baz" => "456"}, @account.settings.get([:baz]))
166
- end
167
-
168
- should "return all property pairs if no arguments are provided" do
169
- assert_same_elements(
170
- ["foo", "bar", "baz", "hep", "pro"],
171
- @account.settings.get.keys
172
- )
173
- end
174
-
175
- should "ignore non-existent keys" do
176
- assert_equal({"baz" => "456"}, @account.settings.get([:baz, :red]))
177
- end
178
-
179
- should "include default property pairs" do
180
- assert_nil @account.settings.lookup_without_default(:hep)
181
- assert_equal({"hep" => "skep"}, @account.settings.get(["hep"]))
182
- end
183
-
184
- should "return a hash with values that can be fetched by string or symbol" do
185
- assert_equal "456", @account.settings.get(["baz"]).fetch(:baz)
186
- end
187
-
188
- should "return serialized values" do
189
- @account.typed_data.set(:serialized_prop => [1, 2])
190
- assert @account.typed_data.lookup_without_default(:serialized_prop)
191
- assert_equal({"serialized_prop" => [1, 2]}, @account.typed_data.get([:serialized_prop]))
192
- end
193
- end
194
-
195
- context "#set" do
196
- should "support writing multiple values to the association" do
197
- assert !@account.settings.foo?
198
- assert !@account.settings.bar?
199
-
200
- @account.settings.set(:foo => "123", :bar => "456")
201
-
202
- assert @account.settings.foo?
203
- assert @account.settings.bar?
204
- end
205
-
206
- should "convert string keys to symbols to ensure consistent lookup" do
207
- @account.settings.set(:foo => "123")
208
- @account.settings.set("foo" => "456")
209
- assert @account.save!
210
- end
211
-
212
- should "work identically for new and existing owner objects" do
213
- [ @account, Account.new(:name => "Mibble") ].each do |account|
214
- account.settings.set(:foo => "123", :bar => "456")
215
-
216
- assert_equal account.settings.size, 2
217
- assert_equal account.settings.foo, "123"
218
- assert_equal account.settings.bar, "456"
219
-
220
- account.settings.set(:bar => "789", :baz => "012")
221
-
222
- assert_equal account.settings.size, 3
223
- assert_equal account.settings.foo, "123"
224
- assert_equal account.settings.bar, "789"
225
- assert_equal account.settings.baz, "012"
226
- end
227
- end
228
-
229
- should "be updateable as AR nested attributes" do
230
- assert @account.texts_attributes = [{ :name => "foo", :value => "1" }, { :name => "bar", :value => "0" }]
231
- @account.save!
232
-
233
- assert @account.texts.foo == "1"
234
- assert @account.texts.bar == "0"
235
-
236
- @account.update_attributes!(:texts_attributes => [
237
- { :id => @account.texts.lookup(:foo).id, :name => "foo", :value => "0" },
238
- { :id => @account.texts.lookup(:bar).id, :name => "bar", :value => "1" }
239
- ])
240
-
241
- assert @account.texts.foo == "0"
242
- assert @account.texts.bar == "1"
243
- end
244
-
245
- should "be updateable as a nested structure" do
246
- @account.settings.baz = "1"
247
- @account.save!
248
-
249
- assert !@account.settings.foo?
250
- assert !@account.settings.bar?
251
- assert @account.settings.baz?
252
- assert !@account.settings.pro?
253
-
254
- @account.update_attributes!(
255
- :name => "Kim",
256
- :settings => { :foo => "1", :baz => "0", :pro => "1" }
257
- )
258
-
259
- @account.reload
260
-
261
- # set
262
- assert @account.settings.foo?
263
- assert_equal "1", @account.settings.foo
264
-
265
- # kept
266
- assert !@account.settings.bar?
267
- assert_equal nil, @account.settings.bar
268
-
269
- # unset
270
- assert !@account.settings.baz?
271
- assert_equal "0", @account.settings.baz
272
-
273
- # protected -> not set
274
- assert !@account.settings.pro?
275
- assert_equal nil, @account.settings.pro
276
- end
277
- end
278
-
279
- context "lookup" do
280
- context "with data" do
281
- setup { @account.texts.foo = "1" }
282
-
283
- should "return the data" do
284
- assert_equal "1", @account.texts.lookup(:foo).value
285
- end
286
- end
287
-
288
- context "without data" do
289
- should "create a new record, returning the default" do
290
- assert_equal nil, @account.texts.lookup(:foo).value
291
- assert @account.texts.detect { |p| p.name == "foo" }
292
- end
293
- end
294
- end
295
-
296
- context "lookup_without_default" do
297
- should "return the row if it exists" do
298
- @account.texts.foo = "1"
299
- assert_equal "1", @account.texts.lookup_without_default(:foo).value
300
- end
301
-
302
- should "return nil otherwise" do
303
- assert_equal nil, @account.texts.lookup_without_default(:foo)
304
- end
305
- end
306
-
307
- context "save" do
308
- should "call save on all dem records" do
309
- @account.settings.foo = "1"
310
- @account.settings.bar = "2"
311
- @account.settings.save
312
-
313
- @account.reload
314
- assert_equal "1", @account.settings.foo
315
- assert_equal "2", @account.settings.bar
316
- end
317
- end
318
-
319
- context "typed columns" do
320
-
321
- should "typecast the default value" do
322
- assert_equal 123, @account.typed_data.default(:default_prop)
323
- end
324
-
325
- context "string data" do
326
- should "be writable and readable" do
327
- @account.typed_data.string_prop = "foo"
328
- assert_equal "foo", @account.typed_data.string_prop
329
- end
330
- end
331
-
332
- context "floating point data" do
333
- should "be writable and readable" do
334
- @account.typed_data.float_prop = 1.97898
335
- assert_equal 1.97898, @account.typed_data.float_prop
336
- @account.save!
337
- assert_equal 1.97898, @account.typed_data.float_prop
338
- end
339
- end
340
-
341
- context "integer data" do
342
- should "be writable and readable" do
343
- @account.typed_data.int_prop = 25
344
- assert_equal 25, @account.typed_data.int_prop
345
- @account.save!
346
- assert_equal 25, @account.typed_data.int_prop
347
-
348
- assert_equal "25", @account.typed_data.lookup("int_prop").value
349
- end
350
- end
351
-
352
- context "datetime data" do
353
- should "be writable and readable" do
354
- ts = Time.at(Time.now.to_i)
355
- @account.typed_data.datetime_prop = ts
356
-
357
- assert_equal ts, @account.typed_data.datetime_prop
358
- @account.save!
359
- assert_equal ts, @account.typed_data.datetime_prop
360
- end
361
-
362
- should "store data in UTC" do
363
- ts = Time.at(Time.now.to_i)
364
- string_rep = ts.in_time_zone("UTC").to_s
365
- @account.typed_data.datetime_prop = ts
366
- @account.save!
367
- assert_equal string_rep, @account.typed_data.lookup("datetime_prop").value
368
- end
369
- end
370
-
371
- context "serialized data" do
372
- should "store data in json" do
373
- value = {:a => 1, :b => 2}
374
- @account.typed_data.serialized_prop = value
375
- @account.save!
376
- @account.reload
377
- assert_equal({'a' => 1, 'b' => 2}, @account.typed_data.serialized_prop)
378
- end
379
-
380
- should "retrieve default values from JSON" do
381
- assert_equal([], @account.typed_data.serialized_prop_with_default)
382
- end
383
-
384
- should "not overflow the column" do
385
- @account.typed_data.serialized_prop = (1..100_000).to_a
386
- assert !@account.typed_data.lookup(:serialized_prop).valid?
387
- assert !@account.save
388
- end
389
-
390
- should "allow for destructive operators" do
391
- value = {:a => 1, :b => 2}
392
- @account.typed_data.serialized_prop = value
393
- @account.typed_data.serialized_prop[:c] = 3
394
- assert_equal 3, @account.typed_data.serialized_prop[:c]
395
- end
396
-
397
- should "deal with nil values properly going in" do
398
- @account.typed_data.serialized_prop = nil
399
- @account.save!
400
- end
401
-
402
- should "deal with nil values properly coming out" do
403
- assert_equal nil, @account.typed_data.serialized_prop
404
- end
405
- end
406
- end
407
- end
408
- end