offroad 0.0.2 → 0.0.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.
Files changed (61) hide show
  1. data/LICENSE +674 -674
  2. data/README.rdoc +29 -29
  3. data/Rakefile +75 -75
  4. data/TODO +42 -42
  5. data/lib/app/models/offroad/group_state.rb +85 -85
  6. data/lib/app/models/offroad/mirror_info.rb +53 -53
  7. data/lib/app/models/offroad/model_state.rb +36 -36
  8. data/lib/app/models/offroad/received_record_state.rb +115 -115
  9. data/lib/app/models/offroad/sendable_record_state.rb +91 -91
  10. data/lib/app/models/offroad/system_state.rb +33 -33
  11. data/lib/cargo_streamer.rb +222 -222
  12. data/lib/controller_extensions.rb +74 -74
  13. data/lib/exceptions.rb +16 -16
  14. data/lib/migrate/20100512164608_create_offroad_tables.rb +72 -72
  15. data/lib/mirror_data.rb +376 -376
  16. data/lib/model_extensions.rb +378 -377
  17. data/lib/module_funcs.rb +94 -94
  18. data/lib/offroad.rb +41 -41
  19. data/lib/version.rb +3 -3
  20. data/lib/view_helper.rb +7 -7
  21. data/templates/offline.rb +36 -36
  22. data/templates/offline_database.yml +7 -7
  23. data/templates/offroad.yml +6 -6
  24. data/test/app_root/app/controllers/application_controller.rb +2 -2
  25. data/test/app_root/app/controllers/group_controller.rb +28 -28
  26. data/test/app_root/app/models/global_record.rb +10 -10
  27. data/test/app_root/app/models/group.rb +12 -12
  28. data/test/app_root/app/models/group_owned_record.rb +68 -68
  29. data/test/app_root/app/models/guest.rb +7 -7
  30. data/test/app_root/app/models/subrecord.rb +12 -12
  31. data/test/app_root/app/models/unmirrored_record.rb +4 -4
  32. data/test/app_root/app/views/group/download_down_mirror.html.erb +3 -3
  33. data/test/app_root/app/views/group/download_initial_down_mirror.html.erb +3 -3
  34. data/test/app_root/app/views/group/download_up_mirror.html.erb +5 -5
  35. data/test/app_root/app/views/layouts/mirror.html.erb +8 -8
  36. data/test/app_root/config/boot.rb +115 -115
  37. data/test/app_root/config/database-pg.yml +8 -8
  38. data/test/app_root/config/database.yml +5 -5
  39. data/test/app_root/config/environment.rb +24 -24
  40. data/test/app_root/config/environments/test.rb +17 -17
  41. data/test/app_root/config/offroad.yml +6 -6
  42. data/test/app_root/config/routes.rb +4 -4
  43. data/test/app_root/db/migrate/20100529235049_create_tables.rb +64 -64
  44. data/test/app_root/lib/common_hobo.rb +15 -15
  45. data/test/app_root/vendor/plugins/offroad/init.rb +2 -2
  46. data/test/functional/mirror_operations_test.rb +148 -148
  47. data/test/test_helper.rb +453 -453
  48. data/test/unit/app_state_tracking_test.rb +275 -275
  49. data/test/unit/cargo_streamer_test.rb +332 -332
  50. data/test/unit/global_data_test.rb +102 -102
  51. data/test/unit/group_controller_test.rb +152 -152
  52. data/test/unit/group_data_test.rb +442 -435
  53. data/test/unit/group_single_test.rb +136 -136
  54. data/test/unit/hobo_permissions_test.rb +57 -57
  55. data/test/unit/mirror_data_test.rb +1283 -1283
  56. data/test/unit/mirror_info_test.rb +31 -31
  57. data/test/unit/module_funcs_test.rb +37 -37
  58. data/test/unit/pathological_model_test.rb +62 -62
  59. data/test/unit/test_framework_test.rb +86 -86
  60. data/test/unit/unmirrored_data_test.rb +14 -14
  61. metadata +6 -8
@@ -1,435 +1,442 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
2
-
3
- # This is a unit test on the ability of model_extensions to handle group data models
4
-
5
- class GroupDataTest < Test::Unit::TestCase
6
- def setup
7
- @guest = Guest.new if HOBO_TEST_MODE
8
- super
9
- end
10
-
11
- online_test "a new group is online by default" do
12
- g = Group.create(:name => "This Should Be Online")
13
- assert g.group_online?
14
- end
15
-
16
- online_test "online group data has expected offline status" do
17
- assert @online_group.group_online?, "Groups which are in online mode should return true to group_online?"
18
- assert_equal false, @online_group.group_offline?, "Groups in online mode should return false to group_offline?"
19
- assert @online_group_data.group_online?, "Data belonging to groups which are in online mode should return true to group_online?"
20
- assert_equal false, @online_group_data.group_offline?, "Data belonging to groups in online mode should return false to group_offline?"
21
- end
22
-
23
- double_test "offline group data has expected offline status" do
24
- assert @offline_group.group_offline?, "Groups which have been set offline should return true to group_offline?"
25
- assert_equal false, @offline_group.group_online?, "Groups which have been set offline should return false to group_online?"
26
- assert @offline_group_data.group_offline?, "Data belonging to groups which have been set offline should return true to group_offline?"
27
- assert_equal false, @offline_group_data.group_online?, "Data belonging to groups which have been set offline should return false to group_online?"
28
- end
29
-
30
- double_test "group data models report being group data" do
31
- assert Group.offroad_group_data?, "Group model should return true to offroad_group_data?"
32
- assert_equal false, Group.offroad_global_data?, "Group model should return false to offroad_global_data?"
33
-
34
- assert GroupOwnedRecord.offroad_group_data?, "Group-owned model should return true to offroad_group_data?"
35
- assert_equal false, GroupOwnedRecord.offroad_global_data?, "Group-owned model should return false to offroad_global_data?"
36
- end
37
-
38
- double_test "group base reports being owned by itself" do
39
- assert_equal @offline_group.id, @offline_group.owning_group.id, "Can get offline group id thru owning_group dot id"
40
- end
41
-
42
- double_test "group-owned data reports proper ownership" do
43
- assert_equal @offline_group.id, @offline_group_data.owning_group.id, "Can get owner id thru owning_group dot id"
44
- end
45
-
46
- double_test "indirectly group-owned data reports proper ownership" do
47
- assert_equal @offline_group.id, @offline_indirect_data.owning_group.id, "Can get owner id through owning_group dot id"
48
- end
49
-
50
- online_test "only offline groups locked and unsaveable" do
51
- assert @offline_group.locked_by_offroad?, "Offline groups should be locked"
52
- assert_raise ActiveRecord::ReadOnlyRecord do
53
- @offline_group.save!
54
- end
55
-
56
- assert_equal false, @online_group.locked_by_offroad?, "Online groups should not be locked"
57
- assert_nothing_raised do
58
- @online_group.save!
59
- end
60
-
61
- if HOBO_TEST_MODE
62
- @offline_group.permissive = true
63
- @online_group.permissive = true
64
- assert !@offline_group.updatable_by?(@guest)
65
- assert @online_group.updatable_by?(@guest)
66
- end
67
- end
68
-
69
- online_test "only offline group owned data locked and unsaveable" do
70
- assert @offline_group_data.locked_by_offroad?, "Offline group data should be locked"
71
- assert_raise ActiveRecord::ReadOnlyRecord do
72
- @offline_group_data.save!
73
- end
74
-
75
- assert_equal false, @online_group_data.locked_by_offroad?, "Online group data should not be locked"
76
- assert_nothing_raised do
77
- @online_group_data.save!
78
- end
79
-
80
- if HOBO_TEST_MODE
81
- @offline_group_data.permissive = true
82
- @online_group_data.permissive = true
83
- assert !@offline_group_data.updatable_by?(@guest)
84
- assert @online_group_data.updatable_by?(@guest)
85
- end
86
- end
87
-
88
- online_test "only offline group indirect data locked and unsaveable" do
89
- assert @offline_indirect_data.locked_by_offroad?, "Offline indirect data should be locked"
90
- assert_raise ActiveRecord::ReadOnlyRecord do
91
- @offline_indirect_data.save!
92
- end
93
-
94
- assert_equal false, @online_indirect_data.locked_by_offroad?, "Online indirect data should not be locked"
95
- assert_nothing_raised do
96
- @online_indirect_data.save!
97
- end
98
-
99
- if HOBO_TEST_MODE
100
- @offline_indirect_data.permissive = true
101
- @online_indirect_data.permissive = true
102
- assert !@offline_indirect_data.updatable_by?(@guest)
103
- assert @online_indirect_data.updatable_by?(@guest)
104
- end
105
- end
106
-
107
- online_test "can find online and offline groups through scope" do
108
- another = Group.create(:name => "Another Online Group")
109
-
110
- offline_groups = Group.offline_groups.all
111
- online_groups = Group.online_groups.all
112
-
113
- assert_equal 2, offline_groups.size
114
- assert_equal 1, offline_groups.select{|r| r.id == @offline_group.id}.size
115
- offline_groups.each do |g|
116
- assert g.group_offline?
117
- end
118
-
119
- assert_equal 3, online_groups.size
120
- assert_equal 1, online_groups.select{|r| r.id == another.id}.size
121
- assert_equal 1, online_groups.select{|r| r.id == @online_group.id}.size
122
- online_groups.each do |g|
123
- assert g.group_online?
124
- end
125
- end
126
-
127
- online_test "offline and online groups can both be destroyed" do
128
- assert_nothing_raised do
129
- @offline_group.destroy
130
- end
131
-
132
- assert_nothing_raised do
133
- @online_group.destroy
134
- end
135
-
136
- if HOBO_TEST_MODE
137
- @offline_group.permissive = true
138
- @online_group.permissive = true
139
- assert @offline_group.destroyable_by?(@guest)
140
- assert @online_group.destroyable_by?(@guest)
141
- end
142
- end
143
-
144
- online_test "only offline group owned data cannot be destroyed" do
145
- assert_raise ActiveRecord::ReadOnlyRecord do
146
- @offline_group_data.destroy
147
- end
148
-
149
- assert_nothing_raised do
150
- @online_group_data.destroy
151
- end
152
-
153
- if HOBO_TEST_MODE
154
- @offline_group_data.permissive = true
155
- @online_group_data.permissive = true
156
- assert !@offline_group_data.destroyable_by?(@guest)
157
- assert @online_group_data.destroyable_by?(@guest)
158
- end
159
- end
160
-
161
- online_test "only offline indirect owned data cannot be destroyed" do
162
- assert_raise ActiveRecord::ReadOnlyRecord do
163
- @offline_indirect_data.destroy
164
- end
165
-
166
- assert_nothing_raised do
167
- @online_indirect_data.destroy
168
- end
169
-
170
- if HOBO_TEST_MODE
171
- @offline_indirect_data.permissive = true
172
- @online_indirect_data.permissive = true
173
- assert !@offline_indirect_data.destroyable_by?(@guest)
174
- assert @online_indirect_data.destroyable_by?(@guest)
175
- end
176
- end
177
-
178
- offline_test "offline groups unlocked and writable" do
179
- assert_equal false, @offline_group.locked_by_offroad?
180
- assert_nothing_raised do
181
- @offline_group.save!
182
- end
183
-
184
- if HOBO_TEST_MODE
185
- @offline_group.permissive = true
186
- assert @offline_group.updatable_by?(@guest)
187
- end
188
- end
189
-
190
- offline_test "offline group owned data unlocked and writable" do
191
- assert_equal false, @offline_group_data.locked_by_offroad?
192
- assert_nothing_raised do
193
- @offline_group_data.save!
194
- end
195
-
196
- if HOBO_TEST_MODE
197
- @offline_group_data.permissive = true
198
- assert @offline_group_data.updatable_by?(@guest)
199
- end
200
- end
201
-
202
- offline_test "offline indirectly owned data unlocked and writable" do
203
- assert_equal false, @offline_indirect_data.locked_by_offroad?
204
- assert_nothing_raised do
205
- @offline_indirect_data.save!
206
- end
207
-
208
- if HOBO_TEST_MODE
209
- @offline_indirect_data.permissive = true
210
- assert @offline_indirect_data.updatable_by?(@guest)
211
- end
212
- end
213
-
214
- offline_test "offline group owned data destroyable" do
215
- assert_nothing_raised do
216
- @offline_group_data.destroy
217
- end
218
-
219
- if HOBO_TEST_MODE
220
- @offline_group_data.permissive = true
221
- assert @offline_group_data.destroyable_by?(@guest)
222
- end
223
- end
224
-
225
- offline_test "offline indirectly owned data destroyable" do
226
- assert_nothing_raised do
227
- @offline_indirect_data.destroy
228
- end
229
-
230
- if HOBO_TEST_MODE
231
- @offline_indirect_data.permissive = true
232
- assert @offline_indirect_data.destroyable_by?(@guest)
233
- end
234
- end
235
-
236
- offline_test "cannot create another group" do
237
- new_group = Group.new(:name => "Another Offline Group?")
238
- assert_raise Offroad::DataError do
239
- new_group.save
240
- end
241
-
242
- if HOBO_TEST_MODE
243
- new_group.permissive = true
244
- assert !new_group.creatable_by?(@guest)
245
- end
246
- end
247
-
248
- offline_test "cannot destroy the group" do
249
- assert_raise ActiveRecord::ReadOnlyRecord do
250
- @offline_group.destroy
251
- end
252
-
253
- if HOBO_TEST_MODE
254
- @offline_group.permissive = true
255
- assert !@offline_group.destroyable_by?(@guest)
256
- end
257
- end
258
-
259
- offline_test "cannot change id of offline group data" do
260
- assert_raise Offroad::DataError do
261
- @offline_group.id += 1
262
- @offline_group.save!
263
- end
264
-
265
- assert_raise Offroad::DataError do
266
- @offline_group_data.id += 1
267
- @offline_group_data.save!
268
- end
269
-
270
- assert_raise Offroad::DataError do
271
- @offline_indirect_data.id += 1
272
- @offline_indirect_data.save!
273
- end
274
- end
275
-
276
- online_test "cannot change id of online group data" do
277
- assert_raise Offroad::DataError do
278
- @online_group.id += 1
279
- @online_group.save!
280
- end
281
-
282
- assert_raise Offroad::DataError do
283
- @online_group_data.id += 1
284
- @online_group_data.save!
285
- end
286
-
287
- assert_raise Offroad::DataError do
288
- @online_indirect_data.id += 1
289
- @online_indirect_data.save!
290
- end
291
- end
292
-
293
- offline_test "cannot set offline group to online" do
294
- assert_raise Offroad::DataError do
295
- @offline_group.group_offline = false
296
- end
297
- end
298
-
299
- online_test "group data cannot hold a foreign key to a record owned by another group" do
300
- # This is an online test because the concept of "another group" doesn't fly in offline mode
301
- @another_group = Group.create(:name => "Another Group")
302
- @another_group_data = GroupOwnedRecord.create(:description => "Another Piece of Data", :group => @another_group)
303
- @another_indirect_data = SubRecord.create(:description => "Yet Another Data Thingie", :group_owned_record => @another_group_data)
304
- assert_raise Offroad::DataError, "Expect exception when putting bad foreign key in group base data" do
305
- @online_group.favorite = @another_group_data
306
- @online_group.save!
307
- end
308
- assert_raise Offroad::DataError, "Expect exception when putting bad foreign key in group owned data" do
309
- @online_group_data.parent = @another_group_data
310
- @online_group_data.save!
311
- end
312
- assert_raise Offroad::DataError, "Expect exception when putting bad foreign key in indirectly group owned data" do
313
- @online_indirect_data.buddy = @another_indirect_data
314
- @online_indirect_data.save!
315
- end
316
- end
317
-
318
- double_test "group data can hold a foreign key to data owned by the same group" do
319
- more_data = GroupOwnedRecord.create(:description => "More Data", :group => @editable_group, :parent => @editable_group_data)
320
- more_indirect_data = SubRecord.create(:description => "Yet More", :group_owned_record => more_data)
321
- assert_nothing_raised do
322
- @editable_group.favorite = more_data
323
- @editable_group.save!
324
- @editable_indirect_data.buddy = more_indirect_data
325
- @editable_indirect_data.save!
326
- end
327
- end
328
-
329
- online_test "group data can hold a foreign key to global data" do
330
- # This is an online test because an offline app cannot create global records
331
- global_data = GlobalRecord.create(:title => "Some Global Data")
332
- assert_nothing_raised "No exception when putting global data key in group base data" do
333
- @editable_group.global_record = global_data
334
- @editable_group.save!
335
- end
336
- assert_nothing_raised "No exception when putting global data key in group owned data" do
337
- @editable_group_data.global_record = global_data
338
- @editable_group_data.save!
339
- end
340
- end
341
-
342
- double_test "group data cannot hold a foreign key to unmirrored data" do
343
- unmirrored_data = UnmirroredRecord.create(:content => "Some Unmirrored Data")
344
- assert_raise Offroad::DataError, "Expect exception when putting bad foreign key in group base data" do
345
- @editable_group.unmirrored_record = unmirrored_data
346
- @editable_group.save!
347
- end
348
- assert_raise Offroad::DataError, "Expect exception when putting bad foreign key in group owned data" do
349
- @editable_group_data.unmirrored_record = unmirrored_data
350
- @editable_group_data.save!
351
- end
352
- assert_raise Offroad::DataError, "Expect exception when putting bad foreign key in indirectly owned data" do
353
- @editable_indirect_data.unmirrored_record = unmirrored_data
354
- @editable_indirect_data.save!
355
- end
356
- end
357
-
358
- online_test "last_known_status is not available for online groups" do
359
- assert_raise Offroad::DataError do
360
- status = @online_group.last_known_status
361
- end
362
- end
363
-
364
- double_test "last_known_status is available for offline groups" do
365
- status = @offline_group.last_known_status
366
- assert status
367
- end
368
-
369
- double_test "group data models return true to acts_as_offroadable?" do
370
- assert Group.acts_as_offroadable?, "Group reports mirrored offline"
371
- assert GroupOwnedRecord.acts_as_offroadable?, "GroupOwnedRecord reports mirrored offline"
372
- end
373
-
374
- online_test "cannot save :group_owned data with an invalid group id" do
375
- assert_raise Offroad::DataError do
376
- @offline_group_data.group_id = Group.maximum(:id)+1
377
- @offline_group_data.save(false) # Have to disable validations or it'll catch this error first
378
- end
379
- end
380
-
381
- online_test "cannot move :group_owned data from one group to another" do
382
- assert_raise Offroad::DataError do
383
- @offline_group_data.group = @online_group
384
- @offline_group_data.save!
385
- end
386
- end
387
-
388
- online_test "cannot move indirectly owned data from one group to another" do
389
- assert_raise Offroad::DataError do
390
- @offline_indirect_data.group_owned_record = @online_group_data
391
- @offline_indirect_data.save!
392
- end
393
- end
394
-
395
- online_test "can move indirectly owned data between parents in the same group" do
396
- another = GroupOwnedRecord.create(:description => "Another", :group => @online_group)
397
- assert another
398
- assert_nothing_raised do
399
- @online_indirect_data.group_owned_record = another
400
- @online_indirect_data.save!
401
- end
402
- end
403
-
404
- online_test "cannot create :group_owned data in an offline group" do
405
- assert_raise ActiveRecord::ReadOnlyRecord do
406
- GroupOwnedRecord.create(:description => "Test", :group => @offline_group)
407
- end
408
- end
409
-
410
- online_test "cannot create indirectly group owned data in an offline group" do
411
- assert_raise ActiveRecord::ReadOnlyRecord do
412
- SubRecord.create(:description => "Test", :group_owned_record => @offline_group_data)
413
- end
414
- end
415
-
416
- offline_test "offline app can lock its group to prevent any further changes" do
417
- @offline_group.offroad_group_lock!
418
- assert_raise ActiveRecord::ReadOnlyRecord do
419
- GroupOwnedRecord.create(:description => "Test", :group => @offline_group)
420
- end
421
- assert_raise ActiveRecord::ReadOnlyRecord do
422
- @offline_group_data.description = "Wev"
423
- @offline_group_data.save!
424
- end
425
- assert_raise ActiveRecord::ReadOnlyRecord do
426
- @offline_group_data.destroy
427
- end
428
- end
429
-
430
- online_test "online app cannot lock groups" do
431
- assert_raise Offroad::DataError do
432
- @offline_group.offroad_group_lock!
433
- end
434
- end
435
- end
1
+ require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
2
+
3
+ # This is a unit test on the ability of model_extensions to handle group data models
4
+
5
+ class GroupDataTest < Test::Unit::TestCase
6
+ def setup
7
+ @guest = Guest.new if HOBO_TEST_MODE
8
+ super
9
+ end
10
+
11
+ online_test "a new group is online by default" do
12
+ g = Group.create(:name => "This Should Be Online")
13
+ assert g.group_online?
14
+ end
15
+
16
+ online_test "online group data has expected offline status" do
17
+ assert @online_group.group_online?, "Groups which are in online mode should return true to group_online?"
18
+ assert_equal false, @online_group.group_offline?, "Groups in online mode should return false to group_offline?"
19
+ assert @online_group_data.group_online?, "Data belonging to groups which are in online mode should return true to group_online?"
20
+ assert_equal false, @online_group_data.group_offline?, "Data belonging to groups in online mode should return false to group_offline?"
21
+ end
22
+
23
+ double_test "offline group data has expected offline status" do
24
+ assert @offline_group.group_offline?, "Groups which have been set offline should return true to group_offline?"
25
+ assert_equal false, @offline_group.group_online?, "Groups which have been set offline should return false to group_online?"
26
+ assert @offline_group_data.group_offline?, "Data belonging to groups which have been set offline should return true to group_offline?"
27
+ assert_equal false, @offline_group_data.group_online?, "Data belonging to groups which have been set offline should return false to group_online?"
28
+ end
29
+
30
+ double_test "group data models report being group data" do
31
+ assert Group.offroad_group_data?, "Group model should return true to offroad_group_data?"
32
+ assert_equal false, Group.offroad_global_data?, "Group model should return false to offroad_global_data?"
33
+
34
+ assert GroupOwnedRecord.offroad_group_data?, "Group-owned model should return true to offroad_group_data?"
35
+ assert_equal false, GroupOwnedRecord.offroad_global_data?, "Group-owned model should return false to offroad_global_data?"
36
+ end
37
+
38
+ double_test "group base reports being owned by itself" do
39
+ assert_equal @offline_group.id, @offline_group.owning_group.id, "Can get offline group id thru owning_group dot id"
40
+ end
41
+
42
+ double_test "group-owned data reports proper ownership" do
43
+ assert_equal @offline_group.id, @offline_group_data.owning_group.id, "Can get owner id thru owning_group dot id"
44
+ end
45
+
46
+ double_test "indirectly group-owned data reports proper ownership" do
47
+ assert_equal @offline_group.id, @offline_indirect_data.owning_group.id, "Can get owner id through owning_group dot id"
48
+ end
49
+
50
+ online_test "only offline groups locked and unsaveable" do
51
+ assert @offline_group.locked_by_offroad?, "Offline groups should be locked"
52
+ assert_raise ActiveRecord::ReadOnlyRecord do
53
+ @offline_group.save!
54
+ end
55
+
56
+ assert_equal false, @online_group.locked_by_offroad?, "Online groups should not be locked"
57
+ assert_nothing_raised do
58
+ @online_group.save!
59
+ end
60
+
61
+ if HOBO_TEST_MODE
62
+ @offline_group.permissive = true
63
+ @online_group.permissive = true
64
+ assert !@offline_group.updatable_by?(@guest)
65
+ assert @online_group.updatable_by?(@guest)
66
+ end
67
+ end
68
+
69
+ online_test "only offline group owned data locked and unsaveable" do
70
+ assert @offline_group_data.locked_by_offroad?, "Offline group data should be locked"
71
+ assert_raise ActiveRecord::ReadOnlyRecord do
72
+ @offline_group_data.save!
73
+ end
74
+
75
+ assert_equal false, @online_group_data.locked_by_offroad?, "Online group data should not be locked"
76
+ assert_nothing_raised do
77
+ @online_group_data.save!
78
+ end
79
+
80
+ if HOBO_TEST_MODE
81
+ @offline_group_data.permissive = true
82
+ @online_group_data.permissive = true
83
+ assert !@offline_group_data.updatable_by?(@guest)
84
+ assert @online_group_data.updatable_by?(@guest)
85
+ end
86
+ end
87
+
88
+ online_test "only offline group indirect data locked and unsaveable" do
89
+ assert @offline_indirect_data.locked_by_offroad?, "Offline indirect data should be locked"
90
+ assert_raise ActiveRecord::ReadOnlyRecord do
91
+ @offline_indirect_data.save!
92
+ end
93
+
94
+ assert_equal false, @online_indirect_data.locked_by_offroad?, "Online indirect data should not be locked"
95
+ assert_nothing_raised do
96
+ @online_indirect_data.save!
97
+ end
98
+
99
+ if HOBO_TEST_MODE
100
+ @offline_indirect_data.permissive = true
101
+ @online_indirect_data.permissive = true
102
+ assert !@offline_indirect_data.updatable_by?(@guest)
103
+ assert @online_indirect_data.updatable_by?(@guest)
104
+ end
105
+ end
106
+
107
+ online_test "can find online and offline groups through scope" do
108
+ another = Group.create(:name => "Another Online Group")
109
+
110
+ offline_groups = Group.offline_groups.all
111
+ online_groups = Group.online_groups.all
112
+
113
+ assert_equal 2, offline_groups.size
114
+ assert_equal 1, offline_groups.select{|r| r.id == @offline_group.id}.size
115
+ offline_groups.each do |g|
116
+ assert g.group_offline?
117
+ end
118
+
119
+ assert_equal 3, online_groups.size
120
+ assert_equal 1, online_groups.select{|r| r.id == another.id}.size
121
+ assert_equal 1, online_groups.select{|r| r.id == @online_group.id}.size
122
+ online_groups.each do |g|
123
+ assert g.group_online?
124
+ end
125
+ end
126
+
127
+ online_test "offline and online groups can both be destroyed" do
128
+ assert_nothing_raised do
129
+ @offline_group.destroy
130
+ end
131
+
132
+ assert_nothing_raised do
133
+ @online_group.destroy
134
+ end
135
+
136
+ if HOBO_TEST_MODE
137
+ @offline_group.permissive = true
138
+ @online_group.permissive = true
139
+ assert @offline_group.destroyable_by?(@guest)
140
+ assert @online_group.destroyable_by?(@guest)
141
+ end
142
+ end
143
+
144
+ online_test "only offline group owned data cannot be destroyed" do
145
+ assert_raise ActiveRecord::ReadOnlyRecord do
146
+ @offline_group_data.destroy
147
+ end
148
+
149
+ assert_nothing_raised do
150
+ @online_group_data.destroy
151
+ end
152
+
153
+ if HOBO_TEST_MODE
154
+ @offline_group_data.permissive = true
155
+ @online_group_data.permissive = true
156
+ assert !@offline_group_data.destroyable_by?(@guest)
157
+ assert @online_group_data.destroyable_by?(@guest)
158
+ end
159
+ end
160
+
161
+ online_test "only offline indirect owned data cannot be destroyed" do
162
+ assert_raise ActiveRecord::ReadOnlyRecord do
163
+ @offline_indirect_data.destroy
164
+ end
165
+
166
+ assert_nothing_raised do
167
+ @online_indirect_data.destroy
168
+ end
169
+
170
+ if HOBO_TEST_MODE
171
+ @offline_indirect_data.permissive = true
172
+ @online_indirect_data.permissive = true
173
+ assert !@offline_indirect_data.destroyable_by?(@guest)
174
+ assert @online_indirect_data.destroyable_by?(@guest)
175
+ end
176
+ end
177
+
178
+ offline_test "offline groups unlocked and writable" do
179
+ assert_equal false, @offline_group.locked_by_offroad?
180
+ assert_nothing_raised do
181
+ @offline_group.save!
182
+ end
183
+
184
+ if HOBO_TEST_MODE
185
+ @offline_group.permissive = true
186
+ assert @offline_group.updatable_by?(@guest)
187
+ end
188
+ end
189
+
190
+ offline_test "offline group owned data unlocked and writable" do
191
+ assert_equal false, @offline_group_data.locked_by_offroad?
192
+ assert_nothing_raised do
193
+ @offline_group_data.save!
194
+ end
195
+
196
+ if HOBO_TEST_MODE
197
+ @offline_group_data.permissive = true
198
+ assert @offline_group_data.updatable_by?(@guest)
199
+ end
200
+ end
201
+
202
+ offline_test "offline indirectly owned data unlocked and writable" do
203
+ assert_equal false, @offline_indirect_data.locked_by_offroad?
204
+ assert_nothing_raised do
205
+ @offline_indirect_data.save!
206
+ end
207
+
208
+ if HOBO_TEST_MODE
209
+ @offline_indirect_data.permissive = true
210
+ assert @offline_indirect_data.updatable_by?(@guest)
211
+ end
212
+ end
213
+
214
+ offline_test "offline group owned data destroyable" do
215
+ assert_nothing_raised do
216
+ @offline_group_data.destroy
217
+ end
218
+
219
+ if HOBO_TEST_MODE
220
+ @offline_group_data.permissive = true
221
+ assert @offline_group_data.destroyable_by?(@guest)
222
+ end
223
+ end
224
+
225
+ offline_test "offline indirectly owned data destroyable" do
226
+ assert_nothing_raised do
227
+ @offline_indirect_data.destroy
228
+ end
229
+
230
+ if HOBO_TEST_MODE
231
+ @offline_indirect_data.permissive = true
232
+ assert @offline_indirect_data.destroyable_by?(@guest)
233
+ end
234
+ end
235
+
236
+ offline_test "cannot create another group" do
237
+ new_group = Group.new(:name => "Another Offline Group?")
238
+ assert_raise Offroad::DataError do
239
+ new_group.save
240
+ end
241
+
242
+ if HOBO_TEST_MODE
243
+ new_group.permissive = true
244
+ assert !new_group.creatable_by?(@guest)
245
+ end
246
+ end
247
+
248
+ offline_test "cannot destroy the group" do
249
+ assert_raise ActiveRecord::ReadOnlyRecord do
250
+ @offline_group.destroy
251
+ end
252
+
253
+ if HOBO_TEST_MODE
254
+ @offline_group.permissive = true
255
+ assert !@offline_group.destroyable_by?(@guest)
256
+ end
257
+ end
258
+
259
+ offline_test "cannot change id of offline group data" do
260
+ assert_raise Offroad::DataError do
261
+ @offline_group.id += 1
262
+ @offline_group.save!
263
+ end
264
+
265
+ assert_raise Offroad::DataError do
266
+ @offline_group_data.id += 1
267
+ @offline_group_data.save!
268
+ end
269
+
270
+ assert_raise Offroad::DataError do
271
+ @offline_indirect_data.id += 1
272
+ @offline_indirect_data.save!
273
+ end
274
+ end
275
+
276
+ online_test "cannot change id of online group data" do
277
+ assert_raise Offroad::DataError do
278
+ @online_group.id += 1
279
+ @online_group.save!
280
+ end
281
+
282
+ assert_raise Offroad::DataError do
283
+ @online_group_data.id += 1
284
+ @online_group_data.save!
285
+ end
286
+
287
+ assert_raise Offroad::DataError do
288
+ @online_indirect_data.id += 1
289
+ @online_indirect_data.save!
290
+ end
291
+ end
292
+
293
+ offline_test "cannot set offline group to online" do
294
+ assert_raise Offroad::DataError do
295
+ @offline_group.group_offline = false
296
+ end
297
+ end
298
+
299
+ online_test "group data cannot hold a foreign key to a record owned by another group" do
300
+ # This is an online test because the concept of "another group" doesn't fly in offline mode
301
+ @another_group = Group.create(:name => "Another Group")
302
+ @another_group_data = GroupOwnedRecord.create(:description => "Another Piece of Data", :group => @another_group)
303
+ @another_indirect_data = SubRecord.create(:description => "Yet Another Data Thingie", :group_owned_record => @another_group_data)
304
+ assert_raise Offroad::DataError, "Expect exception when putting bad foreign key in group base data" do
305
+ @online_group.favorite = @another_group_data
306
+ @online_group.save!
307
+ end
308
+ assert_raise Offroad::DataError, "Expect exception when putting bad foreign key in group owned data" do
309
+ @online_group_data.parent = @another_group_data
310
+ @online_group_data.save!
311
+ end
312
+ assert_raise Offroad::DataError, "Expect exception when putting bad foreign key in indirectly group owned data" do
313
+ @online_indirect_data.buddy = @another_indirect_data
314
+ @online_indirect_data.save!
315
+ end
316
+ end
317
+
318
+ double_test "group data can hold a foreign key to data owned by the same group" do
319
+ more_data = GroupOwnedRecord.create(:description => "More Data", :group => @editable_group, :parent => @editable_group_data)
320
+ more_indirect_data = SubRecord.create(:description => "Yet More", :group_owned_record => more_data)
321
+ assert_nothing_raised do
322
+ @editable_group.favorite = more_data
323
+ @editable_group.save!
324
+ @editable_indirect_data.buddy = more_indirect_data
325
+ @editable_indirect_data.save!
326
+ end
327
+ end
328
+
329
+ online_test "group data can hold a foreign key to global data" do
330
+ # This is an online test because an offline app cannot create global records
331
+ global_data = GlobalRecord.create(:title => "Some Global Data")
332
+ assert_nothing_raised "No exception when putting global data key in group base data" do
333
+ @editable_group.global_record = global_data
334
+ @editable_group.save!
335
+ end
336
+ assert_nothing_raised "No exception when putting global data key in group owned data" do
337
+ @editable_group_data.global_record = global_data
338
+ @editable_group_data.save!
339
+ end
340
+ end
341
+
342
+ double_test "group data cannot hold a foreign key to unmirrored data" do
343
+ unmirrored_data = UnmirroredRecord.create(:content => "Some Unmirrored Data")
344
+ assert_raise Offroad::DataError, "Expect exception when putting bad foreign key in group base data" do
345
+ @editable_group.unmirrored_record = unmirrored_data
346
+ @editable_group.save!
347
+ end
348
+ assert_raise Offroad::DataError, "Expect exception when putting bad foreign key in group owned data" do
349
+ @editable_group_data.unmirrored_record = unmirrored_data
350
+ @editable_group_data.save!
351
+ end
352
+ assert_raise Offroad::DataError, "Expect exception when putting bad foreign key in indirectly owned data" do
353
+ @editable_indirect_data.unmirrored_record = unmirrored_data
354
+ @editable_indirect_data.save!
355
+ end
356
+ end
357
+
358
+ double_test "group data can hold a foreign key to an invalid record" do
359
+ assert_nothing_raised do
360
+ @editable_group.favorite_id = GroupOwnedRecord.maximum("id") + 37
361
+ @editable_group.save!
362
+ end
363
+ end
364
+
365
+ online_test "last_known_status is not available for online groups" do
366
+ assert_raise Offroad::DataError do
367
+ status = @online_group.last_known_status
368
+ end
369
+ end
370
+
371
+ double_test "last_known_status is available for offline groups" do
372
+ status = @offline_group.last_known_status
373
+ assert status
374
+ end
375
+
376
+ double_test "group data models return true to acts_as_offroadable?" do
377
+ assert Group.acts_as_offroadable?, "Group reports mirrored offline"
378
+ assert GroupOwnedRecord.acts_as_offroadable?, "GroupOwnedRecord reports mirrored offline"
379
+ end
380
+
381
+ online_test "cannot save :group_owned data with an invalid group id" do
382
+ assert_raise Offroad::DataError do
383
+ @offline_group_data.group_id = Group.maximum(:id)+1
384
+ @offline_group_data.save(false) # Have to disable validations or it'll catch this error first
385
+ end
386
+ end
387
+
388
+ online_test "cannot move :group_owned data from one group to another" do
389
+ assert_raise Offroad::DataError do
390
+ @offline_group_data.group = @online_group
391
+ @offline_group_data.save!
392
+ end
393
+ end
394
+
395
+ online_test "cannot move indirectly owned data from one group to another" do
396
+ assert_raise Offroad::DataError do
397
+ @offline_indirect_data.group_owned_record = @online_group_data
398
+ @offline_indirect_data.save!
399
+ end
400
+ end
401
+
402
+ online_test "can move indirectly owned data between parents in the same group" do
403
+ another = GroupOwnedRecord.create(:description => "Another", :group => @online_group)
404
+ assert another
405
+ assert_nothing_raised do
406
+ @online_indirect_data.group_owned_record = another
407
+ @online_indirect_data.save!
408
+ end
409
+ end
410
+
411
+ online_test "cannot create :group_owned data in an offline group" do
412
+ assert_raise ActiveRecord::ReadOnlyRecord do
413
+ GroupOwnedRecord.create(:description => "Test", :group => @offline_group)
414
+ end
415
+ end
416
+
417
+ online_test "cannot create indirectly group owned data in an offline group" do
418
+ assert_raise ActiveRecord::ReadOnlyRecord do
419
+ SubRecord.create(:description => "Test", :group_owned_record => @offline_group_data)
420
+ end
421
+ end
422
+
423
+ offline_test "offline app can lock its group to prevent any further changes" do
424
+ @offline_group.offroad_group_lock!
425
+ assert_raise ActiveRecord::ReadOnlyRecord do
426
+ GroupOwnedRecord.create(:description => "Test", :group => @offline_group)
427
+ end
428
+ assert_raise ActiveRecord::ReadOnlyRecord do
429
+ @offline_group_data.description = "Wev"
430
+ @offline_group_data.save!
431
+ end
432
+ assert_raise ActiveRecord::ReadOnlyRecord do
433
+ @offline_group_data.destroy
434
+ end
435
+ end
436
+
437
+ online_test "online app cannot lock groups" do
438
+ assert_raise Offroad::DataError do
439
+ @offline_group.offroad_group_lock!
440
+ end
441
+ end
442
+ end