ee_preferences 0.4.3
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.
- checksums.yaml +15 -0
- data/.gitignore +8 -0
- data/.travis.yml +3 -0
- data/CHANGELOG.rdoc +85 -0
- data/Gemfile +3 -0
- data/LICENSE +20 -0
- data/README.rdoc +224 -0
- data/Rakefile +36 -0
- data/app/models/preference.rb +65 -0
- data/generators/preferences/USAGE +5 -0
- data/generators/preferences/preferences_generator.rb +7 -0
- data/generators/preferences/templates/001_create_preferences.rb +16 -0
- data/init.rb +1 -0
- data/lib/preferences/preference_definition.rb +56 -0
- data/lib/preferences/version.rb +3 -0
- data/lib/preferences.rb +616 -0
- data/preferences.gemspec +20 -0
- data/test/app_root/app/models/car.rb +2 -0
- data/test/app_root/app/models/employee.rb +2 -0
- data/test/app_root/app/models/manager.rb +3 -0
- data/test/app_root/app/models/user.rb +8 -0
- data/test/app_root/db/migrate/001_create_users.rb +11 -0
- data/test/app_root/db/migrate/002_create_cars.rb +11 -0
- data/test/app_root/db/migrate/003_create_employees.rb +12 -0
- data/test/app_root/db/migrate/004_migrate_preferences_to_version_1.rb +13 -0
- data/test/factory.rb +65 -0
- data/test/functional/preferences_test.rb +1364 -0
- data/test/test_helper.rb +26 -0
- data/test/unit/preference_definition_test.rb +237 -0
- data/test/unit/preference_test.rb +236 -0
- metadata +122 -0
@@ -0,0 +1,1364 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
|
2
|
+
|
3
|
+
class ModelPreferenceTest < ActiveRecord::TestCase
|
4
|
+
def default_test
|
5
|
+
end
|
6
|
+
|
7
|
+
def teardown
|
8
|
+
User.preference_definitions.clear
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
class ModelWithoutPreferencesTest < ActiveRecord::TestCase
|
13
|
+
def test_should_not_create_preference_definitions
|
14
|
+
assert !Car.respond_to?(:preference_definitions)
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_should_not_create_stored_preferences_association
|
18
|
+
assert !Car.new.respond_to?(:stored_preferences)
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_should_not_create_preference_scopes
|
22
|
+
assert !Car.respond_to?(:with_preferences)
|
23
|
+
assert !Car.respond_to?(:without_preferences)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
class PreferencesAfterFirstBeingDefinedTest < ModelPreferenceTest
|
28
|
+
def setup
|
29
|
+
User.preference :notifications
|
30
|
+
@user = new_user
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_should_create_preference_definitions
|
34
|
+
assert User.respond_to?(:preference_definitions)
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_should_create_preference_scopes
|
38
|
+
assert User.respond_to?(:with_preferences)
|
39
|
+
assert User.respond_to?(:without_preferences)
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_should_create_stored_preferences_associations
|
43
|
+
assert @user.respond_to?(:stored_preferences)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
class PreferencesAfterBeingDefinedTest < ModelPreferenceTest
|
48
|
+
def setup
|
49
|
+
@definition = User.preference :notifications
|
50
|
+
@user = new_user
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_should_raise_exception_if_invalid_options_specified
|
54
|
+
assert_raise(ArgumentError) {User.preference :notifications, :invalid => true}
|
55
|
+
assert_raise(ArgumentError) {User.preference :notifications, :boolean, :invalid => true}
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_should_create_definition
|
59
|
+
assert_not_nil @definition
|
60
|
+
assert_equal 'notifications', @definition.name
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_should_create_preferred_query_method
|
64
|
+
assert @user.respond_to?(:preferred_notifications?)
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_should_create_prefers_query_method
|
68
|
+
assert @user.respond_to?(:prefers_notifications?)
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_should_create_preferred_reader
|
72
|
+
assert @user.respond_to?(:preferred_notifications)
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_should_create_prefers_reader
|
76
|
+
assert @user.respond_to?(:prefers_notifications)
|
77
|
+
end
|
78
|
+
|
79
|
+
def test_should_create_preferred_writer
|
80
|
+
assert @user.respond_to?(:preferred_notifications=)
|
81
|
+
end
|
82
|
+
|
83
|
+
def test_should_create_prefers_writer
|
84
|
+
assert @user.respond_to?(:prefers_notifications=)
|
85
|
+
end
|
86
|
+
|
87
|
+
def test_should_create_preferred_changed_query
|
88
|
+
assert @user.respond_to?(:preferred_notifications_changed?)
|
89
|
+
end
|
90
|
+
|
91
|
+
def test_should_create_prefers_changed_query
|
92
|
+
assert @user.respond_to?(:prefers_notifications_changed?)
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_should_create_preferred_was
|
96
|
+
assert @user.respond_to?(:preferred_notifications_was)
|
97
|
+
end
|
98
|
+
|
99
|
+
def test_should_create_prefers_was
|
100
|
+
assert @user.respond_to?(:prefers_notifications_was)
|
101
|
+
end
|
102
|
+
|
103
|
+
def test_should_create_preferred_change
|
104
|
+
assert @user.respond_to?(:preferred_notifications_change)
|
105
|
+
end
|
106
|
+
|
107
|
+
def test_should_create_prefers_change
|
108
|
+
assert @user.respond_to?(:prefers_notifications_change)
|
109
|
+
end
|
110
|
+
|
111
|
+
def test_should_create_preferred_will_change
|
112
|
+
assert @user.respond_to?(:preferred_notifications_will_change!)
|
113
|
+
end
|
114
|
+
|
115
|
+
def test_should_create_prefers_will_change
|
116
|
+
assert @user.respond_to?(:prefers_notifications_will_change!)
|
117
|
+
end
|
118
|
+
|
119
|
+
def test_should_create_preferred_reset
|
120
|
+
assert @user.respond_to?(:reset_preferred_notifications!)
|
121
|
+
end
|
122
|
+
|
123
|
+
def test_should_create_prefers_reset
|
124
|
+
assert @user.respond_to?(:reset_prefers_notifications!)
|
125
|
+
end
|
126
|
+
|
127
|
+
def test_should_include_new_definitions_in_preference_definitions
|
128
|
+
assert_equal e = {'notifications' => @definition}, User.preference_definitions
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
class PreferencesByDefaultTest < ModelPreferenceTest
|
133
|
+
def setup
|
134
|
+
@definition = User.preference :notifications
|
135
|
+
@user = new_user
|
136
|
+
end
|
137
|
+
|
138
|
+
def test_should_have_boolean_type
|
139
|
+
assert_equal :boolean, @definition.type
|
140
|
+
end
|
141
|
+
|
142
|
+
def test_should_not_have_default_value
|
143
|
+
assert_nil @definition.default_value
|
144
|
+
end
|
145
|
+
|
146
|
+
def test_should_only_have_default_preferences
|
147
|
+
assert_equal e = {'notifications' => nil}, @user.preferences
|
148
|
+
end
|
149
|
+
|
150
|
+
def test_should_not_query_preferences_changed
|
151
|
+
assert_equal false, @user.preferences_changed?
|
152
|
+
end
|
153
|
+
|
154
|
+
def test_should_not_query_group_preferences_changed
|
155
|
+
assert_equal false, @user.preferences_changed?(:chat)
|
156
|
+
end
|
157
|
+
|
158
|
+
def test_should_not_have_preferences_changed
|
159
|
+
assert_equal [], @user.preferences_changed
|
160
|
+
end
|
161
|
+
|
162
|
+
def test_should_not_have_group_preferences_changed
|
163
|
+
assert_equal [], @user.preferences_changed(:chat)
|
164
|
+
end
|
165
|
+
|
166
|
+
def test_should_not_have_preference_changes
|
167
|
+
assert_equal e = {}, @user.preference_changes
|
168
|
+
end
|
169
|
+
|
170
|
+
def test_should_not_have_group_preference_changes
|
171
|
+
assert_equal e = {}, @user.preference_changes(:chat)
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
class PreferencesWithCustomTypeTest < ModelPreferenceTest
|
176
|
+
def setup
|
177
|
+
@definition = User.preference :vehicle_id, :integer
|
178
|
+
@user = new_user
|
179
|
+
end
|
180
|
+
|
181
|
+
def test_should_have_boolean_type
|
182
|
+
assert_equal :integer, @definition.type
|
183
|
+
end
|
184
|
+
|
185
|
+
def test_should_not_have_default_value
|
186
|
+
assert_nil @definition.default_value
|
187
|
+
end
|
188
|
+
|
189
|
+
def test_should_only_have_default_preferences
|
190
|
+
assert_equal e = {'vehicle_id' => nil}, @user.preferences
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
class PreferencesWithCustomDefaultTest < ModelPreferenceTest
|
195
|
+
def setup
|
196
|
+
@definition = User.preference :color, :string, :default => 'red'
|
197
|
+
@user = new_user
|
198
|
+
end
|
199
|
+
|
200
|
+
def test_should_have_boolean_type
|
201
|
+
assert_equal :string, @definition.type
|
202
|
+
end
|
203
|
+
|
204
|
+
def test_should_have_default_value
|
205
|
+
assert_equal 'red', @definition.default_value
|
206
|
+
end
|
207
|
+
|
208
|
+
def test_should_only_have_default_preferences
|
209
|
+
assert_equal e = {'color' => 'red'}, @user.preferences
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
213
|
+
class PreferencesWithMultipleDefinitionsTest < ModelPreferenceTest
|
214
|
+
def setup
|
215
|
+
User.preference :notifications, :default => true
|
216
|
+
User.preference :color, :string, :default => 'red'
|
217
|
+
@user = new_user
|
218
|
+
end
|
219
|
+
|
220
|
+
def test_should_only_have_default_preferences
|
221
|
+
assert_equal e = {'notifications' => true, 'color' => 'red'}, @user.preferences
|
222
|
+
end
|
223
|
+
end
|
224
|
+
|
225
|
+
class PreferencesAfterBeingCreatedTest < ModelPreferenceTest
|
226
|
+
def setup
|
227
|
+
User.preference :notifications, :default => true
|
228
|
+
@user = create_user
|
229
|
+
end
|
230
|
+
|
231
|
+
def test_should_not_have_any_stored_preferences
|
232
|
+
assert @user.stored_preferences.empty?
|
233
|
+
end
|
234
|
+
end
|
235
|
+
|
236
|
+
class PreferencesReaderTest < ModelPreferenceTest
|
237
|
+
def setup
|
238
|
+
User.preference :notifications, :default => true
|
239
|
+
@user = create_user
|
240
|
+
end
|
241
|
+
|
242
|
+
def test_should_raise_exception_if_invalid_preference_read
|
243
|
+
exception = assert_raise(ArgumentError) { @user.preferred(:invalid) }
|
244
|
+
assert_equal 'Unknown preference: invalid', exception.message
|
245
|
+
end
|
246
|
+
|
247
|
+
def test_use_default_value_if_not_stored
|
248
|
+
assert_equal true, @user.preferred(:notifications)
|
249
|
+
end
|
250
|
+
|
251
|
+
def test_should_use_group_default_value_if_not_stored
|
252
|
+
User.preference :language, :string, :default => 'English', :group_defaults => {:chat => 'Latin'}
|
253
|
+
assert_equal 'English', @user.preferred(:language)
|
254
|
+
end
|
255
|
+
|
256
|
+
def test_should_use_stored_value_if_stored
|
257
|
+
create_preference(:owner => @user, :name => 'notifications', :value => false)
|
258
|
+
assert_equal false, @user.preferred(:notifications)
|
259
|
+
end
|
260
|
+
|
261
|
+
def test_should_type_cast_based_on_preference_definition
|
262
|
+
@user.write_preference(:notifications, 'false')
|
263
|
+
assert_equal false, @user.preferred(:notifications)
|
264
|
+
end
|
265
|
+
|
266
|
+
def test_should_cache_stored_values
|
267
|
+
create_preference(:owner => @user, :name => 'notifications', :value => false)
|
268
|
+
assert_queries(1) { @user.preferred(:notifications) }
|
269
|
+
assert_queries(0) { @user.preferred(:notifications) }
|
270
|
+
end
|
271
|
+
|
272
|
+
def test_should_not_query_if_preferences_already_loaded
|
273
|
+
@user.preferences
|
274
|
+
assert_queries(0) { @user.preferred(:notifications) }
|
275
|
+
end
|
276
|
+
|
277
|
+
def test_should_use_value_from_preferences_lookup
|
278
|
+
create_preference(:owner => @user, :name => 'notifications', :value => false)
|
279
|
+
@user.preferences
|
280
|
+
|
281
|
+
assert_queries(0) { assert_equal false, @user.preferred(:notifications) }
|
282
|
+
end
|
283
|
+
|
284
|
+
def test_should_be_able_to_use_prefers_reader
|
285
|
+
assert_equal true, @user.prefers_notifications
|
286
|
+
end
|
287
|
+
|
288
|
+
def test_should_be_able_to_use_preferred_reader
|
289
|
+
assert_equal true, @user.preferred_notifications
|
290
|
+
end
|
291
|
+
end
|
292
|
+
|
293
|
+
class PreferencesGroupReaderTest < ModelPreferenceTest
|
294
|
+
def setup
|
295
|
+
User.preference :notifications, :default => true
|
296
|
+
@user = create_user
|
297
|
+
end
|
298
|
+
|
299
|
+
def test_should_use_default_value_if_not_stored
|
300
|
+
assert_equal true, @user.preferred(:notifications, :chat)
|
301
|
+
end
|
302
|
+
|
303
|
+
def test_should_use_group_default_value_if_not_stored
|
304
|
+
User.preference :language, :string, :default => 'English', :group_defaults => {:chat => 'Latin'}
|
305
|
+
assert_equal 'Latin', @user.preferred(:language, :chat)
|
306
|
+
end
|
307
|
+
|
308
|
+
def test_should_use_stored_value_if_stored
|
309
|
+
create_preference(:owner => @user, :group_type => 'chat', :name => 'notifications', :value => false)
|
310
|
+
assert_equal false, @user.preferred(:notifications, :chat)
|
311
|
+
end
|
312
|
+
|
313
|
+
def test_should_cache_stored_values
|
314
|
+
create_preference(:owner => @user, :group_type => 'chat', :name => 'notifications', :value => false)
|
315
|
+
assert_queries(1) { @user.preferred(:notifications, :chat) }
|
316
|
+
assert_queries(0) { @user.preferred(:notifications, :chat) }
|
317
|
+
end
|
318
|
+
|
319
|
+
def test_should_not_query_if_preferences_already_loaded
|
320
|
+
@user.preferences(:chat)
|
321
|
+
assert_queries(0) { @user.preferred(:notifications, :chat) }
|
322
|
+
end
|
323
|
+
|
324
|
+
def test_should_use_value_from_preferences_lookup
|
325
|
+
create_preference(:owner => @user, :group_type => 'chat', :name => 'notifications', :value => false)
|
326
|
+
@user.preferences(:chat)
|
327
|
+
|
328
|
+
assert_queries(0) { assert_equal false, @user.preferred(:notifications, :chat) }
|
329
|
+
end
|
330
|
+
|
331
|
+
def test_should_be_able_to_use_prefers_reader
|
332
|
+
assert_equal true, @user.prefers_notifications(:chat)
|
333
|
+
end
|
334
|
+
|
335
|
+
def test_should_be_able_to_use_preferred_reader
|
336
|
+
assert_equal true, @user.preferred_notifications(:chat)
|
337
|
+
end
|
338
|
+
end
|
339
|
+
|
340
|
+
class PreferencesARGroupReaderTest < ModelPreferenceTest
|
341
|
+
def setup
|
342
|
+
@car = create_car
|
343
|
+
|
344
|
+
User.preference :notifications, :default => true
|
345
|
+
@user = create_user
|
346
|
+
end
|
347
|
+
|
348
|
+
def test_use_default_value_if_not_stored
|
349
|
+
assert_equal true, @user.preferred(:notifications, @car)
|
350
|
+
end
|
351
|
+
|
352
|
+
def test_should_use_stored_value_if_stored
|
353
|
+
create_preference(:owner => @user, :group_type => 'Car', :group_id => @car.id, :name => 'notifications', :value => false)
|
354
|
+
assert_equal false, @user.preferred(:notifications, @car)
|
355
|
+
end
|
356
|
+
|
357
|
+
def test_should_use_value_from_preferences_lookup
|
358
|
+
create_preference(:owner => @user, :group_type => 'Car', :group_id => @car.id, :name => 'notifications', :value => false)
|
359
|
+
@user.preferences(@car)
|
360
|
+
|
361
|
+
assert_queries(0) { assert_equal false, @user.preferred(:notifications, @car) }
|
362
|
+
end
|
363
|
+
|
364
|
+
def test_should_be_able_to_use_prefers_reader
|
365
|
+
assert_equal true, @user.prefers_notifications(@car)
|
366
|
+
end
|
367
|
+
|
368
|
+
def test_should_be_able_to_use_preferred_reader
|
369
|
+
assert_equal true, @user.preferred_notifications(@car)
|
370
|
+
end
|
371
|
+
end
|
372
|
+
|
373
|
+
class PreferencesQueryTest < ModelPreferenceTest
|
374
|
+
def setup
|
375
|
+
User.preference :language, :string
|
376
|
+
@user = create_user
|
377
|
+
end
|
378
|
+
|
379
|
+
def test_should_raise_exception_if_invalid_preference_queried
|
380
|
+
exception = assert_raise(ArgumentError) { @user.preferred?(:invalid) }
|
381
|
+
assert_equal 'Unknown preference: invalid', exception.message
|
382
|
+
end
|
383
|
+
|
384
|
+
def test_should_be_true_if_present
|
385
|
+
@user.preferred_language = 'English'
|
386
|
+
assert_equal true, @user.preferred?(:language)
|
387
|
+
end
|
388
|
+
|
389
|
+
def test_should_be_false_if_not_present
|
390
|
+
assert_equal false, @user.preferred?(:language)
|
391
|
+
end
|
392
|
+
|
393
|
+
def test_should_use_stored_value_if_stored
|
394
|
+
create_preference(:owner => @user, :name => 'language', :value => 'English')
|
395
|
+
assert_equal true, @user.preferred?(:language)
|
396
|
+
end
|
397
|
+
|
398
|
+
def test_should_cache_stored_values
|
399
|
+
create_preference(:owner => @user, :name => 'language', :value => 'English')
|
400
|
+
assert_queries(1) { @user.preferred?(:language) }
|
401
|
+
assert_queries(0) { @user.preferred?(:language) }
|
402
|
+
end
|
403
|
+
|
404
|
+
def test_should_be_able_to_use_prefers_reader
|
405
|
+
assert_equal false, @user.prefers_language?
|
406
|
+
end
|
407
|
+
|
408
|
+
def test_should_be_able_to_use_preferred_reader
|
409
|
+
assert_equal false, @user.preferred_language?
|
410
|
+
end
|
411
|
+
end
|
412
|
+
|
413
|
+
class PreferencesGroupQueryTest < ModelPreferenceTest
|
414
|
+
def setup
|
415
|
+
User.preference :language, :string
|
416
|
+
@user = create_user
|
417
|
+
end
|
418
|
+
|
419
|
+
def test_should_be_true_if_present
|
420
|
+
@user.preferred_language = 'English', :chat
|
421
|
+
assert_equal true, @user.preferred?(:language, :chat)
|
422
|
+
end
|
423
|
+
|
424
|
+
def test_should_be_false_if_not_present
|
425
|
+
assert_equal false, @user.preferred?(:language, :chat)
|
426
|
+
end
|
427
|
+
|
428
|
+
def test_should_use_stored_value_if_stored
|
429
|
+
create_preference(:owner => @user, :group_type => 'chat', :name => 'language', :value => 'English')
|
430
|
+
assert_equal true, @user.preferred?(:language, :chat)
|
431
|
+
end
|
432
|
+
|
433
|
+
def test_should_cache_stored_values
|
434
|
+
create_preference(:owner => @user, :group_type => 'chat', :name => 'language', :value => 'English')
|
435
|
+
assert_queries(1) { @user.preferred?(:language, :chat) }
|
436
|
+
assert_queries(0) { @user.preferred?(:language, :chat) }
|
437
|
+
end
|
438
|
+
|
439
|
+
def test_should_be_able_to_use_prefers_reader
|
440
|
+
assert_equal false, @user.prefers_language?(:chat)
|
441
|
+
end
|
442
|
+
|
443
|
+
def test_should_be_able_to_use_preferred_reader
|
444
|
+
assert_equal false, @user.preferred_language?(:chat)
|
445
|
+
end
|
446
|
+
end
|
447
|
+
|
448
|
+
class PreferencesARGroupQueryTest < ModelPreferenceTest
|
449
|
+
def setup
|
450
|
+
@car = create_car
|
451
|
+
|
452
|
+
User.preference :language, :string
|
453
|
+
@user = create_user
|
454
|
+
end
|
455
|
+
|
456
|
+
def test_should_be_true_if_present
|
457
|
+
@user.preferred_language = 'English', @car
|
458
|
+
assert_equal true, @user.preferred?(:language, @car)
|
459
|
+
end
|
460
|
+
|
461
|
+
def test_should_be_false_if_not_present
|
462
|
+
assert_equal false, @user.preferred?(:language, @car)
|
463
|
+
end
|
464
|
+
|
465
|
+
def test_should_use_stored_value_if_stored
|
466
|
+
create_preference(:owner => @user, :group_type => 'Car', :group_id => @car.id, :name => 'language', :value => 'English')
|
467
|
+
assert_equal true, @user.preferred?(:language, @car)
|
468
|
+
end
|
469
|
+
|
470
|
+
def test_should_be_able_to_use_prefers_reader
|
471
|
+
assert_equal false, @user.prefers_language?(@car)
|
472
|
+
end
|
473
|
+
|
474
|
+
def test_should_be_able_to_use_preferred_reader
|
475
|
+
assert_equal false, @user.preferred_language?(@car)
|
476
|
+
end
|
477
|
+
end
|
478
|
+
|
479
|
+
class PreferencesWriterTest < ModelPreferenceTest
|
480
|
+
def setup
|
481
|
+
User.preference :notifications, :boolean, :default => true
|
482
|
+
User.preference :language, :string, :default => 'English'
|
483
|
+
@user = create_user(:login => 'admin')
|
484
|
+
end
|
485
|
+
|
486
|
+
def test_should_raise_exception_if_invalid_preference_written
|
487
|
+
exception = assert_raise(ArgumentError) { @user.write_preference(:invalid, true) }
|
488
|
+
assert_equal 'Unknown preference: invalid', exception.message
|
489
|
+
end
|
490
|
+
|
491
|
+
def test_should_have_same_value_if_not_changed
|
492
|
+
@user.write_preference(:notifications, true)
|
493
|
+
assert_equal true, @user.preferred(:notifications)
|
494
|
+
end
|
495
|
+
|
496
|
+
def test_should_use_new_value_if_changed
|
497
|
+
@user.write_preference(:notifications, false)
|
498
|
+
assert_equal false, @user.preferred(:notifications)
|
499
|
+
end
|
500
|
+
|
501
|
+
def test_should_not_save_record_after_changing_preference
|
502
|
+
@user.login = 'test'
|
503
|
+
@user.write_preference(:notifications, false)
|
504
|
+
|
505
|
+
assert_equal 'admin', User.find(@user.id).login
|
506
|
+
end
|
507
|
+
|
508
|
+
def test_should_not_create_stored_preferences_immediately
|
509
|
+
@user.write_preference(:notifications, false)
|
510
|
+
assert @user.stored_preferences.empty?
|
511
|
+
end
|
512
|
+
|
513
|
+
def test_should_not_create_stored_preference_if_value_not_changed
|
514
|
+
@user.write_preference(:notifications, true)
|
515
|
+
@user.save!
|
516
|
+
|
517
|
+
assert_equal 0, @user.stored_preferences.count
|
518
|
+
end
|
519
|
+
|
520
|
+
def test_should_not_create_stored_integer_preference_if_typecast_not_changed
|
521
|
+
User.preference :age, :integer
|
522
|
+
|
523
|
+
@user.write_preference(:age, '')
|
524
|
+
@user.save!
|
525
|
+
|
526
|
+
assert_equal 0, @user.stored_preferences.count
|
527
|
+
end
|
528
|
+
|
529
|
+
def test_should_create_stored_integer_preference_if_typecast_changed
|
530
|
+
User.preference :age, :integer, :default => 0
|
531
|
+
|
532
|
+
@user.write_preference(:age, '')
|
533
|
+
@user.save!
|
534
|
+
|
535
|
+
assert_nil @user.preferred(:age)
|
536
|
+
assert_equal 1, @user.stored_preferences.count
|
537
|
+
end
|
538
|
+
|
539
|
+
def test_should_create_stored_preference_if_value_changed
|
540
|
+
@user.write_preference(:notifications, false)
|
541
|
+
@user.save!
|
542
|
+
|
543
|
+
assert_equal 1, @user.stored_preferences.count
|
544
|
+
end
|
545
|
+
|
546
|
+
def test_should_overwrite_existing_stored_preference_if_value_changed
|
547
|
+
preference = create_preference(:owner => @user, :name => 'notifications', :value => true)
|
548
|
+
|
549
|
+
@user.write_preference(:notifications, false)
|
550
|
+
@user.save!
|
551
|
+
|
552
|
+
preference.reload
|
553
|
+
assert_equal false, preference.value
|
554
|
+
end
|
555
|
+
|
556
|
+
def test_should_not_remove_preference_if_set_to_default
|
557
|
+
create_preference(:owner => @user, :name => 'notifications', :value => false)
|
558
|
+
|
559
|
+
@user.write_preference(:notifications, true)
|
560
|
+
@user.save!
|
561
|
+
@user.reload
|
562
|
+
|
563
|
+
assert_equal 1, @user.stored_preferences.size
|
564
|
+
preference = @user.stored_preferences.first
|
565
|
+
assert_equal true, preference.value
|
566
|
+
end
|
567
|
+
|
568
|
+
def test_should_not_remove_preference_if_set_to_nil
|
569
|
+
create_preference(:owner => @user, :name => 'notifications', :value => false)
|
570
|
+
|
571
|
+
@user.write_preference(:notifications, nil)
|
572
|
+
@user.save!
|
573
|
+
@user.reload
|
574
|
+
|
575
|
+
assert_equal 1, @user.stored_preferences.size
|
576
|
+
preference = @user.stored_preferences.first
|
577
|
+
assert_nil preference.value
|
578
|
+
end
|
579
|
+
|
580
|
+
def test_should_not_query_for_old_value_if_preferences_loaded
|
581
|
+
@user.preferences
|
582
|
+
|
583
|
+
assert_queries(0) { @user.write_preference(:notifications, false) }
|
584
|
+
end
|
585
|
+
end
|
586
|
+
|
587
|
+
class PreferencesGroupWriterTest < ModelPreferenceTest
|
588
|
+
def setup
|
589
|
+
User.preference :notifications, :boolean, :default => true
|
590
|
+
User.preference :language, :string, :default => 'English'
|
591
|
+
@user = create_user(:login => 'admin')
|
592
|
+
end
|
593
|
+
|
594
|
+
def test_should_have_same_value_if_not_changed
|
595
|
+
@user.write_preference(:notifications, true, :chat)
|
596
|
+
assert_equal true, @user.preferred(:notifications, :chat)
|
597
|
+
end
|
598
|
+
|
599
|
+
def test_should_use_new_value_if_changed
|
600
|
+
@user.write_preference(:notifications, false, :chat)
|
601
|
+
assert_equal false, @user.preferred(:notifications, :chat)
|
602
|
+
end
|
603
|
+
|
604
|
+
def test_should_not_create_stored_preference_if_value_not_changed
|
605
|
+
@user.write_preference(:notifications, true, :chat)
|
606
|
+
@user.save!
|
607
|
+
|
608
|
+
assert_equal 0, @user.stored_preferences.count
|
609
|
+
end
|
610
|
+
|
611
|
+
def test_should_create_stored_preference_if_value_changed
|
612
|
+
@user.write_preference(:notifications, false, :chat)
|
613
|
+
@user.save!
|
614
|
+
|
615
|
+
assert_equal 1, @user.stored_preferences.count
|
616
|
+
end
|
617
|
+
|
618
|
+
def test_should_set_group_attributes_on_stored_preferences
|
619
|
+
@user.write_preference(:notifications, false, :chat)
|
620
|
+
@user.save!
|
621
|
+
|
622
|
+
preference = @user.stored_preferences.first
|
623
|
+
assert_equal 'chat', preference.group_type
|
624
|
+
assert_nil preference.group_id
|
625
|
+
end
|
626
|
+
|
627
|
+
def test_should_overwrite_existing_stored_preference_if_value_changed
|
628
|
+
preference = create_preference(:owner => @user, :group_type => 'chat', :name => 'notifications', :value => true)
|
629
|
+
|
630
|
+
@user.write_preference(:notifications, false, :chat)
|
631
|
+
@user.save!
|
632
|
+
|
633
|
+
preference.reload
|
634
|
+
assert_equal false, preference.value
|
635
|
+
end
|
636
|
+
end
|
637
|
+
|
638
|
+
class PreferencesARGroupWriterTest < ModelPreferenceTest
|
639
|
+
def setup
|
640
|
+
@car = create_car
|
641
|
+
|
642
|
+
User.preference :notifications, :boolean, :default => true
|
643
|
+
User.preference :language, :string, :default => 'English'
|
644
|
+
@user = create_user(:login => 'admin')
|
645
|
+
end
|
646
|
+
|
647
|
+
def test_should_have_same_value_if_not_changed
|
648
|
+
@user.write_preference(:notifications, true, @car)
|
649
|
+
assert_equal true, @user.preferred(:notifications, @car)
|
650
|
+
end
|
651
|
+
|
652
|
+
def test_should_use_new_value_if_changed
|
653
|
+
@user.write_preference(:notifications, false, @car)
|
654
|
+
assert_equal false, @user.preferred(:notifications, @car)
|
655
|
+
end
|
656
|
+
|
657
|
+
def test_should_not_create_stored_preference_if_value_not_changed
|
658
|
+
@user.write_preference(:notifications, true, @car)
|
659
|
+
@user.save!
|
660
|
+
|
661
|
+
assert_equal 0, @user.stored_preferences.count
|
662
|
+
end
|
663
|
+
|
664
|
+
def test_should_create_stored_preference_if_value_changed
|
665
|
+
@user.write_preference(:notifications, false, @car)
|
666
|
+
@user.save!
|
667
|
+
|
668
|
+
assert_equal 1, @user.stored_preferences.count
|
669
|
+
end
|
670
|
+
|
671
|
+
def test_should_set_group_attributes_on_stored_preferences
|
672
|
+
@user.write_preference(:notifications, false, @car)
|
673
|
+
@user.save!
|
674
|
+
|
675
|
+
preference = @user.stored_preferences.first
|
676
|
+
assert_equal 'Car', preference.group_type
|
677
|
+
assert_equal @car.id, preference.group_id
|
678
|
+
end
|
679
|
+
end
|
680
|
+
|
681
|
+
class PreferencesAfterChangingPreferenceTest < ModelPreferenceTest
|
682
|
+
def setup
|
683
|
+
User.preference :notifications, :boolean, :default => true
|
684
|
+
User.preference :language, :string, :default => 'English'
|
685
|
+
@user = create_user
|
686
|
+
|
687
|
+
@user.write_preference(:notifications, false)
|
688
|
+
end
|
689
|
+
|
690
|
+
def test_should_query_preferences_changed
|
691
|
+
assert_equal true, @user.preferences_changed?
|
692
|
+
end
|
693
|
+
|
694
|
+
def test_should_query_preference_changed
|
695
|
+
assert_equal true, @user.prefers_notifications_changed?
|
696
|
+
end
|
697
|
+
|
698
|
+
def test_should_not_query_preferences_changed_for_group
|
699
|
+
assert_equal false, @user.preferences_changed?(:chat)
|
700
|
+
end
|
701
|
+
|
702
|
+
def test_should_not_query_preference_changed_for_group
|
703
|
+
assert_equal false, @user.prefers_notifications_changed?(:chat)
|
704
|
+
end
|
705
|
+
|
706
|
+
def test_should_have_preferences_changed
|
707
|
+
assert_equal ['notifications'], @user.preferences_changed
|
708
|
+
end
|
709
|
+
|
710
|
+
def test_should_not_build_same_preferences_changed_result
|
711
|
+
assert_not_same @user.preferences_changed, @user.preferences_changed
|
712
|
+
end
|
713
|
+
|
714
|
+
def test_should_not_have_preferences_changed_for_group
|
715
|
+
assert_equal [], @user.preferences_changed(:chat)
|
716
|
+
end
|
717
|
+
|
718
|
+
def test_should_track_multiple_preferences_changed
|
719
|
+
@user.write_preference(:language, 'Latin')
|
720
|
+
assert_equal ['language', 'notifications'], @user.preferences_changed.sort
|
721
|
+
end
|
722
|
+
|
723
|
+
def test_should_have_preference_changes
|
724
|
+
assert_equal e = {'notifications' => [true, false]}, @user.preference_changes
|
725
|
+
end
|
726
|
+
|
727
|
+
def test_should_not_build_same_preference_changes_result
|
728
|
+
assert_not_same @user.preference_changes, @user.preference_changes
|
729
|
+
end
|
730
|
+
|
731
|
+
def test_should_have_preference_change
|
732
|
+
assert_equal [true, false], @user.prefers_notifications_change
|
733
|
+
end
|
734
|
+
|
735
|
+
def test_should_have_preference_was
|
736
|
+
assert_equal true, @user.prefers_notifications_was
|
737
|
+
end
|
738
|
+
|
739
|
+
def test_should_not_have_preference_changes_for_group
|
740
|
+
assert_equal e = {}, @user.preference_changes(:chat)
|
741
|
+
end
|
742
|
+
|
743
|
+
def test_should_not_have_preference_change_for_group
|
744
|
+
assert_nil @user.prefers_notifications_change(:chat)
|
745
|
+
end
|
746
|
+
|
747
|
+
def test_should_have_preference_was_for_group
|
748
|
+
assert_equal true, @user.prefers_notifications_was(:chat)
|
749
|
+
end
|
750
|
+
|
751
|
+
def test_should_use_latest_value_for_preference_changes
|
752
|
+
@user.write_preference(:notifications, nil)
|
753
|
+
assert_equal e = {'notifications' => [true, nil]}, @user.preference_changes
|
754
|
+
end
|
755
|
+
|
756
|
+
def test_should_use_cloned_old_value_for_preference_changes
|
757
|
+
old_value = @user.preferred(:language)
|
758
|
+
@user.write_preference(:language, 'Latin')
|
759
|
+
|
760
|
+
tracked_old_value = @user.preference_changes['language'][0]
|
761
|
+
assert_equal old_value, tracked_old_value
|
762
|
+
assert_not_same old_value, tracked_old_value
|
763
|
+
end
|
764
|
+
|
765
|
+
def test_should_track_multiple_preference_changes
|
766
|
+
@user.write_preference(:language, 'Latin')
|
767
|
+
assert_equal e = {'notifications' => [true, false], 'language' => ['English', 'Latin']}, @user.preference_changes
|
768
|
+
end
|
769
|
+
end
|
770
|
+
|
771
|
+
class PreferencesAfterChangingGroupPreferenceTest < ModelPreferenceTest
|
772
|
+
def setup
|
773
|
+
User.preference :notifications, :boolean, :default => true
|
774
|
+
User.preference :language, :string, :default => 'English'
|
775
|
+
@user = create_user
|
776
|
+
|
777
|
+
@user.write_preference(:notifications, false, :chat)
|
778
|
+
end
|
779
|
+
|
780
|
+
def test_should_not_query_preferences_changed
|
781
|
+
assert_equal false, @user.preferences_changed?
|
782
|
+
end
|
783
|
+
|
784
|
+
def test_not_should_query_preference_changed
|
785
|
+
assert_equal false, @user.prefers_notifications_changed?
|
786
|
+
end
|
787
|
+
|
788
|
+
def test_should_query_preferences_changed_for_group
|
789
|
+
assert_equal true, @user.preferences_changed?(:chat)
|
790
|
+
end
|
791
|
+
|
792
|
+
def test_should_query_preference_changed_for_group
|
793
|
+
assert_equal true, @user.prefers_notifications_changed?(:chat)
|
794
|
+
end
|
795
|
+
|
796
|
+
def test_should_have_preferences_changed
|
797
|
+
assert_equal [], @user.preferences_changed
|
798
|
+
end
|
799
|
+
|
800
|
+
def test_should_not_have_preferences_changed_for_group
|
801
|
+
assert_equal ['notifications'], @user.preferences_changed(:chat)
|
802
|
+
end
|
803
|
+
|
804
|
+
def test_should_have_preference_changes
|
805
|
+
assert_equal e = {}, @user.preference_changes
|
806
|
+
end
|
807
|
+
|
808
|
+
def test_should_not_have_preference_change
|
809
|
+
assert_nil @user.prefers_notifications_change
|
810
|
+
end
|
811
|
+
|
812
|
+
def test_should_have_preference_was
|
813
|
+
assert_equal true, @user.prefers_notifications_was
|
814
|
+
end
|
815
|
+
|
816
|
+
def test_should_not_have_preference_changes_for_group
|
817
|
+
assert_equal e = {'notifications' => [true, false]}, @user.preference_changes(:chat)
|
818
|
+
end
|
819
|
+
|
820
|
+
def test_should_have_preference_change_for_group
|
821
|
+
assert_equal [true, false], @user.prefers_notifications_change(:chat)
|
822
|
+
end
|
823
|
+
|
824
|
+
def test_should_have_preference_was_for_group
|
825
|
+
assert_equal true, @user.prefers_notifications_was(:chat)
|
826
|
+
end
|
827
|
+
end
|
828
|
+
|
829
|
+
class PreferencesAfterRevertPreferenceChangeTest < ModelPreferenceTest
|
830
|
+
def setup
|
831
|
+
User.preference :notifications, :boolean, :default => true
|
832
|
+
|
833
|
+
@user = create_user
|
834
|
+
@user.write_preference(:notifications, false)
|
835
|
+
@user.write_preference(:notifications, true)
|
836
|
+
end
|
837
|
+
|
838
|
+
def test_should_not_query_preferences_changed
|
839
|
+
assert_equal false, @user.preferences_changed?
|
840
|
+
end
|
841
|
+
|
842
|
+
def test_should_not_have_preferences_changed
|
843
|
+
assert_equal [], @user.preferences_changed
|
844
|
+
end
|
845
|
+
|
846
|
+
def test_should_not_have_preference_changes
|
847
|
+
assert_equal e = {}, @user.preference_changes
|
848
|
+
end
|
849
|
+
end
|
850
|
+
|
851
|
+
class PreferencesAfterForcingChangeTest < ModelPreferenceTest
|
852
|
+
def setup
|
853
|
+
User.preference :notifications, :boolean, :default => true
|
854
|
+
|
855
|
+
@user = create_user
|
856
|
+
@user.prefers_notifications_will_change!
|
857
|
+
@user.save
|
858
|
+
end
|
859
|
+
|
860
|
+
def test_should_store_preference
|
861
|
+
assert_equal 1, @user.stored_preferences.count
|
862
|
+
|
863
|
+
preference = @user.stored_preferences.first
|
864
|
+
assert_equal nil, preference.group_type
|
865
|
+
assert_equal nil, preference.group_id
|
866
|
+
assert_equal true, preference.value
|
867
|
+
end
|
868
|
+
end
|
869
|
+
|
870
|
+
class PreferencesAfterForcingChangeForGroupTest < ModelPreferenceTest
|
871
|
+
def setup
|
872
|
+
User.preference :notifications, :boolean, :default => true
|
873
|
+
User.preference :language, :string, :default => 'English'
|
874
|
+
|
875
|
+
@user = create_user
|
876
|
+
@user.prefers_notifications_will_change!(:chat)
|
877
|
+
@user.save
|
878
|
+
end
|
879
|
+
|
880
|
+
def test_should_store_preference
|
881
|
+
assert_equal 1, @user.stored_preferences.count
|
882
|
+
|
883
|
+
preference = @user.stored_preferences.first
|
884
|
+
assert_equal 'chat', preference.group_type
|
885
|
+
assert_equal nil, preference.group_id
|
886
|
+
assert_equal true, preference.value
|
887
|
+
end
|
888
|
+
|
889
|
+
def test_should_use_cloned_value_for_tracking_old_value
|
890
|
+
old_value = @user.preferred(:language)
|
891
|
+
@user.preferred_language_will_change!
|
892
|
+
|
893
|
+
tracked_old_value = @user.preferred_language_was
|
894
|
+
assert_equal old_value, tracked_old_value
|
895
|
+
assert_not_same old_value, tracked_old_value
|
896
|
+
end
|
897
|
+
end
|
898
|
+
|
899
|
+
class PreferencesAfterResettingPreferenceTest < ModelPreferenceTest
|
900
|
+
def setup
|
901
|
+
User.preference :notifications, :boolean, :default => true
|
902
|
+
|
903
|
+
@user = create_user
|
904
|
+
@user.write_preference(:notifications, false)
|
905
|
+
@user.write_preference(:notifications, false, :chat)
|
906
|
+
@user.reset_prefers_notifications!
|
907
|
+
end
|
908
|
+
|
909
|
+
def test_should_revert_to_original_value
|
910
|
+
assert_equal true, @user.preferred(:notifications)
|
911
|
+
end
|
912
|
+
|
913
|
+
def test_should_not_reset_groups
|
914
|
+
assert_equal true, @user.preferred(:notifications, :chat)
|
915
|
+
end
|
916
|
+
end
|
917
|
+
|
918
|
+
class PreferencesAfterResettingPreferenceTest < ModelPreferenceTest
|
919
|
+
def setup
|
920
|
+
User.preference :notifications, :boolean, :default => true
|
921
|
+
|
922
|
+
@user = create_user
|
923
|
+
@user.write_preference(:notifications, false)
|
924
|
+
@user.write_preference(:notifications, false, :chat)
|
925
|
+
@user.reset_prefers_notifications!(:chat)
|
926
|
+
end
|
927
|
+
|
928
|
+
def test_should_revert_to_original_value
|
929
|
+
assert_equal true, @user.preferred(:notifications, :chat)
|
930
|
+
end
|
931
|
+
|
932
|
+
def test_should_not_reset_default_group
|
933
|
+
assert_equal false, @user.preferred(:notifications)
|
934
|
+
end
|
935
|
+
end
|
936
|
+
|
937
|
+
class PreferencesLookupTest < ModelPreferenceTest
|
938
|
+
def setup
|
939
|
+
User.preference :notifications, :boolean, :default => true
|
940
|
+
User.preference :language, :string, :default => 'English', :group_defaults => {:chat => 'Latin'}
|
941
|
+
|
942
|
+
@user = create_user
|
943
|
+
end
|
944
|
+
|
945
|
+
def test_should_only_have_defaults_if_nothing_customized
|
946
|
+
assert_equal e = {'notifications' => true, 'language' => 'English'}, @user.preferences
|
947
|
+
end
|
948
|
+
|
949
|
+
def test_should_merge_defaults_with_unsaved_changes
|
950
|
+
@user.write_preference(:notifications, false)
|
951
|
+
assert_equal e = {'notifications' => false, 'language' => 'English'}, @user.preferences
|
952
|
+
end
|
953
|
+
|
954
|
+
def test_should_merge_defaults_with_saved_changes
|
955
|
+
create_preference(:owner => @user, :name => 'notifications', :value => false)
|
956
|
+
assert_equal e = {'notifications' => false, 'language' => 'English'}, @user.preferences
|
957
|
+
end
|
958
|
+
|
959
|
+
def test_should_merge_stored_preferences_with_unsaved_changes
|
960
|
+
create_preference(:owner => @user, :name => 'notifications', :value => false)
|
961
|
+
@user.write_preference(:language, 'Latin')
|
962
|
+
assert_equal e = {'notifications' => false, 'language' => 'Latin'}, @user.preferences
|
963
|
+
end
|
964
|
+
|
965
|
+
def test_should_use_unsaved_changes_over_stored_preferences
|
966
|
+
create_preference(:owner => @user, :name => 'notifications', :value => true)
|
967
|
+
@user.write_preference(:notifications, false)
|
968
|
+
assert_equal e = {'notifications' => false, 'language' => 'English'}, @user.preferences
|
969
|
+
end
|
970
|
+
|
971
|
+
def test_should_typecast_unsaved_changes
|
972
|
+
@user.write_preference(:notifications, 'true')
|
973
|
+
assert_equal e = {'notifications' => true, 'language' => 'English'}, @user.preferences
|
974
|
+
end
|
975
|
+
|
976
|
+
def test_should_cache_results
|
977
|
+
assert_queries(1) { @user.preferences }
|
978
|
+
assert_queries(0) { @user.preferences }
|
979
|
+
end
|
980
|
+
|
981
|
+
def test_should_not_query_if_stored_preferences_eager_loaded
|
982
|
+
create_preference(:owner => @user, :name => 'notifications', :value => false)
|
983
|
+
user = User.find(@user.id, :include => :stored_preferences)
|
984
|
+
|
985
|
+
assert_queries(0) do
|
986
|
+
assert_equal e = {'notifications' => false, 'language' => 'English'}, user.preferences
|
987
|
+
end
|
988
|
+
end
|
989
|
+
|
990
|
+
def test_should_not_generate_same_object_twice
|
991
|
+
assert_not_same @user.preferences, @user.preferences
|
992
|
+
end
|
993
|
+
|
994
|
+
def test_should_use_preferences_for_prefs
|
995
|
+
assert_equal @user.preferences, @user.prefs
|
996
|
+
end
|
997
|
+
end
|
998
|
+
|
999
|
+
class PreferencesGroupLookupTest < ModelPreferenceTest
|
1000
|
+
def setup
|
1001
|
+
User.preference :notifications, :boolean, :default => true
|
1002
|
+
User.preference :language, :string, :default => 'English', :group_defaults => {:chat => 'Latin'}
|
1003
|
+
|
1004
|
+
@user = create_user
|
1005
|
+
end
|
1006
|
+
|
1007
|
+
def test_should_only_have_defaults_if_nothing_customized
|
1008
|
+
assert_equal e = {'notifications' => true, 'language' => 'Latin'}, @user.preferences(:chat)
|
1009
|
+
end
|
1010
|
+
|
1011
|
+
def test_should_merge_defaults_with_unsaved_changes
|
1012
|
+
@user.write_preference(:notifications, false, :chat)
|
1013
|
+
assert_equal e = {'notifications' => false, 'language' => 'Latin'}, @user.preferences(:chat)
|
1014
|
+
end
|
1015
|
+
|
1016
|
+
def test_should_merge_defaults_with_saved_changes
|
1017
|
+
create_preference(:owner => @user, :group_type => 'chat', :name => 'notifications', :value => false)
|
1018
|
+
assert_equal e = {'notifications' => false, 'language' => 'Latin'}, @user.preferences(:chat)
|
1019
|
+
end
|
1020
|
+
|
1021
|
+
def test_should_merge_stored_preferences_with_unsaved_changes
|
1022
|
+
create_preference(:owner => @user, :group_type => 'chat', :name => 'notifications', :value => false)
|
1023
|
+
@user.write_preference(:language, 'Spanish', :chat)
|
1024
|
+
assert_equal e = {'notifications' => false, 'language' => 'Spanish'}, @user.preferences(:chat)
|
1025
|
+
end
|
1026
|
+
|
1027
|
+
def test_should_typecast_unsaved_changes
|
1028
|
+
@user.write_preference(:notifications, 'true', :chat)
|
1029
|
+
assert_equal e = {'notifications' => true, 'language' => 'English'}, @user.preferences
|
1030
|
+
end
|
1031
|
+
|
1032
|
+
def test_should_cache_results
|
1033
|
+
assert_queries(1) { @user.preferences(:chat) }
|
1034
|
+
assert_queries(0) { @user.preferences(:chat) }
|
1035
|
+
end
|
1036
|
+
|
1037
|
+
def test_should_not_query_if_all_preferences_individually_loaded
|
1038
|
+
@user.preferred(:notifications, :chat)
|
1039
|
+
@user.preferred(:language, :chat)
|
1040
|
+
|
1041
|
+
assert_queries(0) { @user.preferences(:chat) }
|
1042
|
+
end
|
1043
|
+
|
1044
|
+
def test_should_not_generate_same_object_twice
|
1045
|
+
assert_not_same @user.preferences(:chat), @user.preferences(:chat)
|
1046
|
+
end
|
1047
|
+
end
|
1048
|
+
|
1049
|
+
class PreferencesARGroupLookupTest < ModelPreferenceTest
|
1050
|
+
def setup
|
1051
|
+
@car = create_car
|
1052
|
+
|
1053
|
+
User.preference :notifications, :boolean, :default => true
|
1054
|
+
User.preference :language, :string, :default => 'English'
|
1055
|
+
|
1056
|
+
@user = create_user
|
1057
|
+
end
|
1058
|
+
|
1059
|
+
def test_should_only_have_defaults_if_nothing_customized
|
1060
|
+
assert_equal e = {'notifications' => true, 'language' => 'English'}, @user.preferences(@car)
|
1061
|
+
end
|
1062
|
+
|
1063
|
+
def test_should_merge_defaults_with_unsaved_changes
|
1064
|
+
@user.write_preference(:notifications, false, @car)
|
1065
|
+
assert_equal e = {'notifications' => false, 'language' => 'English'}, @user.preferences(@car)
|
1066
|
+
end
|
1067
|
+
|
1068
|
+
def test_should_merge_defaults_with_saved_changes
|
1069
|
+
create_preference(:owner => @user, :group_type => 'Car', :group_id => @car.id, :name => 'notifications', :value => false)
|
1070
|
+
assert_equal e = {'notifications' => false, 'language' => 'English'}, @user.preferences(@car)
|
1071
|
+
end
|
1072
|
+
|
1073
|
+
def test_should_merge_stored_preferences_with_unsaved_changes
|
1074
|
+
create_preference(:owner => @user, :group_type => 'Car', :group_id => @car.id, :name => 'notifications', :value => false)
|
1075
|
+
@user.write_preference(:language, 'Latin', @car)
|
1076
|
+
assert_equal e = {'notifications' => false, 'language' => 'Latin'}, @user.preferences(@car)
|
1077
|
+
end
|
1078
|
+
end
|
1079
|
+
|
1080
|
+
class PreferencesNilGroupLookupTest < ModelPreferenceTest
|
1081
|
+
def setup
|
1082
|
+
@car = create_car
|
1083
|
+
|
1084
|
+
User.preference :notifications, :boolean, :default => true
|
1085
|
+
User.preference :language, :string, :default => 'English'
|
1086
|
+
|
1087
|
+
@user = create_user
|
1088
|
+
end
|
1089
|
+
|
1090
|
+
def test_should_only_have_defaults_if_nothing_customized
|
1091
|
+
assert_equal e = {'notifications' => true, 'language' => 'English'}, @user.preferences(nil)
|
1092
|
+
end
|
1093
|
+
|
1094
|
+
def test_should_merge_defaults_with_unsaved_changes
|
1095
|
+
@user.write_preference(:notifications, false)
|
1096
|
+
assert_equal e = {'notifications' => false, 'language' => 'English'}, @user.preferences(nil)
|
1097
|
+
end
|
1098
|
+
|
1099
|
+
def test_should_merge_defaults_with_saved_changes
|
1100
|
+
create_preference(:owner => @user, :name => 'notifications', :value => false)
|
1101
|
+
assert_equal e = {'notifications' => false, 'language' => 'English'}, @user.preferences(nil)
|
1102
|
+
end
|
1103
|
+
|
1104
|
+
def test_should_merge_stored_preferences_with_unsaved_changes
|
1105
|
+
create_preference(:owner => @user, :name => 'notifications', :value => false)
|
1106
|
+
@user.write_preference(:language, 'Latin')
|
1107
|
+
assert_equal e = {'notifications' => false, 'language' => 'Latin'}, @user.preferences(nil)
|
1108
|
+
end
|
1109
|
+
end
|
1110
|
+
|
1111
|
+
class PreferencesLookupWithGroupsTest < ModelPreferenceTest
|
1112
|
+
def setup
|
1113
|
+
User.preference :notifications, :boolean, :default => true
|
1114
|
+
User.preference :language, :string, :default => 'English'
|
1115
|
+
|
1116
|
+
@user = create_user
|
1117
|
+
create_preference(:owner => @user, :group_type => 'chat', :name => 'notifications', :value => false)
|
1118
|
+
end
|
1119
|
+
|
1120
|
+
def test_not_include_group_preferences_by_default
|
1121
|
+
assert_equal e = {'notifications' => true, 'language' => 'English'}, @user.preferences
|
1122
|
+
end
|
1123
|
+
end
|
1124
|
+
|
1125
|
+
class PreferencesAfterBeingReloadedTest < ModelPreferenceTest
|
1126
|
+
def setup
|
1127
|
+
User.preference :notifications, :boolean, :default => true
|
1128
|
+
|
1129
|
+
@user = create_user
|
1130
|
+
@user.write_preference(:notifications, false)
|
1131
|
+
@user.reload
|
1132
|
+
end
|
1133
|
+
|
1134
|
+
def test_should_reset_unsaved_preferences
|
1135
|
+
assert_equal true, @user.preferred(:notifications)
|
1136
|
+
end
|
1137
|
+
|
1138
|
+
def test_should_not_save_reset_preferences
|
1139
|
+
@user.save!
|
1140
|
+
assert @user.stored_preferences.empty?
|
1141
|
+
end
|
1142
|
+
|
1143
|
+
def test_should_reset_preferences
|
1144
|
+
assert_equal e = {'notifications' => true}, @user.preferences
|
1145
|
+
end
|
1146
|
+
|
1147
|
+
def test_should_clear_query_cache_for_preferences
|
1148
|
+
assert_queries(1) { @user.preferences }
|
1149
|
+
end
|
1150
|
+
|
1151
|
+
def test_should_reset_preferences_changed_query
|
1152
|
+
assert_equal false, @user.preferences_changed?
|
1153
|
+
end
|
1154
|
+
|
1155
|
+
def test_should_reset_preferences_changed
|
1156
|
+
assert_equal [], @user.preferences_changed
|
1157
|
+
end
|
1158
|
+
|
1159
|
+
def test_should_reset_preference_changes
|
1160
|
+
assert_equal e = {}, @user.preference_changes
|
1161
|
+
end
|
1162
|
+
end
|
1163
|
+
|
1164
|
+
class PreferencesForGroupAfterBeingReloadedTest < ModelPreferenceTest
|
1165
|
+
def setup
|
1166
|
+
User.preference :notifications, :boolean, :default => true
|
1167
|
+
|
1168
|
+
@user = create_user
|
1169
|
+
@user.write_preference(:notifications, false, :chat)
|
1170
|
+
@user.reload
|
1171
|
+
end
|
1172
|
+
|
1173
|
+
def test_should_reset_unsaved_preferences
|
1174
|
+
assert_equal true, @user.preferred(:notifications, :chat)
|
1175
|
+
end
|
1176
|
+
|
1177
|
+
def test_should_reset_preferences
|
1178
|
+
assert_equal e = {'notifications' => true}, @user.preferences(:chat)
|
1179
|
+
end
|
1180
|
+
|
1181
|
+
def test_should_clear_query_cache_for_preferences
|
1182
|
+
assert_queries(1) { @user.preferences(:chat) }
|
1183
|
+
end
|
1184
|
+
|
1185
|
+
def test_should_reset_preferences_changed_query
|
1186
|
+
assert_equal false, @user.preferences_changed?(:chat)
|
1187
|
+
end
|
1188
|
+
|
1189
|
+
def test_should_reset_preferences_changed
|
1190
|
+
assert_equal [], @user.preferences_changed(:chat)
|
1191
|
+
end
|
1192
|
+
|
1193
|
+
def test_should_reset_preference_changes
|
1194
|
+
assert_equal e = {}, @user.preference_changes(:chat)
|
1195
|
+
end
|
1196
|
+
end
|
1197
|
+
|
1198
|
+
class PreferencesWithScopeTest < ModelPreferenceTest
|
1199
|
+
def setup
|
1200
|
+
User.preference :notifications
|
1201
|
+
User.preference :language, :string, :default => 'English'
|
1202
|
+
User.preference :color, :string, :default => 'red'
|
1203
|
+
|
1204
|
+
@user = create_user
|
1205
|
+
@customized_user = create_user(:login => 'customized',
|
1206
|
+
:prefers_notifications => false,
|
1207
|
+
:preferred_language => 'Latin'
|
1208
|
+
)
|
1209
|
+
@customized_user.prefers_notifications = false, :chat
|
1210
|
+
@customized_user.preferred_language = 'Latin', :chat
|
1211
|
+
@customized_user.save!
|
1212
|
+
end
|
1213
|
+
|
1214
|
+
def test_should_not_find_if_no_preference_matched
|
1215
|
+
assert_equal [], User.with_preferences(:language => 'Italian')
|
1216
|
+
end
|
1217
|
+
|
1218
|
+
def test_should_find_with_null_preference
|
1219
|
+
assert_equal [@user], User.with_preferences(:notifications => nil)
|
1220
|
+
end
|
1221
|
+
|
1222
|
+
def test_should_find_with_default_preference
|
1223
|
+
assert_equal [@user], User.with_preferences(:language => 'English')
|
1224
|
+
end
|
1225
|
+
|
1226
|
+
def test_should_find_with_multiple_default_preferences
|
1227
|
+
assert_equal [@user], User.with_preferences(:notifications => nil, :language => 'English')
|
1228
|
+
end
|
1229
|
+
|
1230
|
+
def test_should_find_with_custom_preference
|
1231
|
+
assert_equal [@customized_user], User.with_preferences(:language => 'Latin')
|
1232
|
+
end
|
1233
|
+
|
1234
|
+
def test_should_find_with_multiple_custom_preferences
|
1235
|
+
assert_equal [@customized_user], User.with_preferences(:notifications => false, :language => 'Latin')
|
1236
|
+
end
|
1237
|
+
|
1238
|
+
def test_should_find_with_mixed_default_and_custom_preferences
|
1239
|
+
assert_equal [@customized_user], User.with_preferences(:color => 'red', :language => 'Latin')
|
1240
|
+
end
|
1241
|
+
|
1242
|
+
def test_should_find_with_default_group_preference
|
1243
|
+
assert_equal [@user], User.with_preferences(:chat => {:language => 'English'})
|
1244
|
+
end
|
1245
|
+
|
1246
|
+
def test_should_find_with_customized_default_group_preference
|
1247
|
+
User.preference :country, :string, :default => 'US', :group_defaults => {:chat => 'UK'}
|
1248
|
+
@customized_user.preferred_country = 'US', :chat
|
1249
|
+
@customized_user.save!
|
1250
|
+
|
1251
|
+
assert_equal [@user], User.with_preferences(:chat => {:country => 'UK'})
|
1252
|
+
end
|
1253
|
+
|
1254
|
+
def test_should_find_with_multiple_default_group_preferences
|
1255
|
+
assert_equal [@user], User.with_preferences(:chat => {:notifications => nil, :language => 'English'})
|
1256
|
+
end
|
1257
|
+
|
1258
|
+
def test_should_find_with_custom_group_preference
|
1259
|
+
assert_equal [@customized_user], User.with_preferences(:chat => {:language => 'Latin'})
|
1260
|
+
end
|
1261
|
+
|
1262
|
+
def test_should_find_with_multiple_custom_group_preferences
|
1263
|
+
assert_equal [@customized_user], User.with_preferences(:chat => {:notifications => false, :language => 'Latin'})
|
1264
|
+
end
|
1265
|
+
|
1266
|
+
def test_should_find_with_mixed_default_and_custom_group_preferences
|
1267
|
+
assert_equal [@customized_user], User.with_preferences(:chat => {:color => 'red', :language => 'Latin'})
|
1268
|
+
end
|
1269
|
+
|
1270
|
+
def test_should_find_with_mixed_basic_and_group_preferences
|
1271
|
+
@customized_user.preferred_language = 'English'
|
1272
|
+
@customized_user.save!
|
1273
|
+
|
1274
|
+
assert_equal [@customized_user], User.with_preferences(:language => 'English', :chat => {:language => 'Latin'})
|
1275
|
+
end
|
1276
|
+
|
1277
|
+
def test_should_allow_chaining
|
1278
|
+
assert_equal [@user], User.with_preferences(:language => 'English').with_preferences(:color => 'red')
|
1279
|
+
end
|
1280
|
+
end
|
1281
|
+
|
1282
|
+
class PreferencesWithoutScopeTest < ModelPreferenceTest
|
1283
|
+
def setup
|
1284
|
+
User.preference :notifications
|
1285
|
+
User.preference :language, :string, :default => 'English'
|
1286
|
+
User.preference :color, :string, :default => 'red'
|
1287
|
+
|
1288
|
+
@user = create_user
|
1289
|
+
@customized_user = create_user(:login => 'customized',
|
1290
|
+
:prefers_notifications => false,
|
1291
|
+
:preferred_language => 'Latin'
|
1292
|
+
)
|
1293
|
+
@customized_user.prefers_notifications = false, :chat
|
1294
|
+
@customized_user.preferred_language = 'Latin', :chat
|
1295
|
+
@customized_user.save!
|
1296
|
+
end
|
1297
|
+
|
1298
|
+
def test_should_not_find_if_no_preference_matched
|
1299
|
+
assert_equal [], User.without_preferences(:color => 'red')
|
1300
|
+
end
|
1301
|
+
|
1302
|
+
def test_should_find_with_null_preference
|
1303
|
+
assert_equal [@user], User.without_preferences(:notifications => false)
|
1304
|
+
end
|
1305
|
+
|
1306
|
+
def test_should_find_with_default_preference
|
1307
|
+
assert_equal [@user], User.without_preferences(:language => 'Latin')
|
1308
|
+
end
|
1309
|
+
|
1310
|
+
def test_should_find_with_multiple_default_preferences
|
1311
|
+
assert_equal [@user], User.without_preferences(:language => 'Latin', :notifications => false)
|
1312
|
+
end
|
1313
|
+
|
1314
|
+
def test_should_find_with_custom_preference
|
1315
|
+
assert_equal [@customized_user], User.without_preferences(:language => 'English')
|
1316
|
+
end
|
1317
|
+
|
1318
|
+
def test_should_find_with_multiple_custom_preferences
|
1319
|
+
assert_equal [@customized_user], User.without_preferences(:language => 'English', :notifications => nil)
|
1320
|
+
end
|
1321
|
+
|
1322
|
+
def test_should_find_with_mixed_default_and_custom_preferences
|
1323
|
+
assert_equal [@customized_user], User.without_preferences(:language => 'English', :color => 'blue')
|
1324
|
+
end
|
1325
|
+
|
1326
|
+
def test_should_find_with_default_group_preference
|
1327
|
+
assert_equal [@user], User.without_preferences(:chat => {:language => 'Latin'})
|
1328
|
+
end
|
1329
|
+
|
1330
|
+
def test_should_find_with_customized_default_group_preference
|
1331
|
+
User.preference :country, :string, :default => 'US', :group_defaults => {:chat => 'UK'}
|
1332
|
+
@customized_user.preferred_country = 'US', :chat
|
1333
|
+
@customized_user.save!
|
1334
|
+
|
1335
|
+
assert_equal [@user], User.without_preferences(:chat => {:country => 'US'})
|
1336
|
+
end
|
1337
|
+
|
1338
|
+
def test_should_find_with_multiple_default_group_preferences
|
1339
|
+
assert_equal [@user], User.without_preferences(:chat => {:language => 'Latin', :notifications => false})
|
1340
|
+
end
|
1341
|
+
|
1342
|
+
def test_should_find_with_custom_group_preference
|
1343
|
+
assert_equal [@customized_user], User.without_preferences(:chat => {:language => 'English'})
|
1344
|
+
end
|
1345
|
+
|
1346
|
+
def test_should_find_with_multiple_custom_group_preferences
|
1347
|
+
assert_equal [@customized_user], User.without_preferences(:chat => {:language => 'English', :notifications => nil})
|
1348
|
+
end
|
1349
|
+
|
1350
|
+
def test_should_find_with_mixed_default_and_custom_group_preferences
|
1351
|
+
assert_equal [@customized_user], User.without_preferences(:chat => {:language => 'English', :color => 'blue'})
|
1352
|
+
end
|
1353
|
+
|
1354
|
+
def test_should_find_with_mixed_basic_and_group_preferences
|
1355
|
+
@customized_user.preferred_language = 'English'
|
1356
|
+
@customized_user.save!
|
1357
|
+
|
1358
|
+
assert_equal [@customized_user], User.without_preferences(:language => 'Latin', :chat => {:language => 'English'})
|
1359
|
+
end
|
1360
|
+
|
1361
|
+
def test_should_allow_chaining
|
1362
|
+
assert_equal [@user], User.without_preferences(:language => 'Latin').without_preferences(:color => 'blue')
|
1363
|
+
end
|
1364
|
+
end
|