offroad 0.0.1

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 (62) hide show
  1. data/LICENSE +674 -0
  2. data/README.rdoc +29 -0
  3. data/Rakefile +75 -0
  4. data/TODO +42 -0
  5. data/lib/app/models/offroad/group_state.rb +85 -0
  6. data/lib/app/models/offroad/mirror_info.rb +53 -0
  7. data/lib/app/models/offroad/model_state.rb +36 -0
  8. data/lib/app/models/offroad/received_record_state.rb +109 -0
  9. data/lib/app/models/offroad/sendable_record_state.rb +91 -0
  10. data/lib/app/models/offroad/system_state.rb +33 -0
  11. data/lib/cargo_streamer.rb +222 -0
  12. data/lib/controller_extensions.rb +74 -0
  13. data/lib/exceptions.rb +16 -0
  14. data/lib/migrate/20100512164608_create_offroad_tables.rb +72 -0
  15. data/lib/mirror_data.rb +354 -0
  16. data/lib/model_extensions.rb +377 -0
  17. data/lib/module_funcs.rb +94 -0
  18. data/lib/offroad.rb +30 -0
  19. data/lib/version.rb +3 -0
  20. data/lib/view_helper.rb +7 -0
  21. data/templates/offline.rb +36 -0
  22. data/templates/offline_database.yml +7 -0
  23. data/templates/offroad.yml +6 -0
  24. data/test/app_root/app/controllers/application_controller.rb +2 -0
  25. data/test/app_root/app/controllers/group_controller.rb +28 -0
  26. data/test/app_root/app/models/global_record.rb +10 -0
  27. data/test/app_root/app/models/group.rb +12 -0
  28. data/test/app_root/app/models/group_owned_record.rb +68 -0
  29. data/test/app_root/app/models/guest.rb +7 -0
  30. data/test/app_root/app/models/subrecord.rb +12 -0
  31. data/test/app_root/app/models/unmirrored_record.rb +4 -0
  32. data/test/app_root/app/views/group/download_down_mirror.html.erb +4 -0
  33. data/test/app_root/app/views/group/download_initial_down_mirror.html.erb +4 -0
  34. data/test/app_root/app/views/group/download_up_mirror.html.erb +6 -0
  35. data/test/app_root/app/views/group/upload_down_mirror.html.erb +1 -0
  36. data/test/app_root/app/views/group/upload_up_mirror.html.erb +1 -0
  37. data/test/app_root/app/views/layouts/mirror.html.erb +9 -0
  38. data/test/app_root/config/boot.rb +115 -0
  39. data/test/app_root/config/database.yml +6 -0
  40. data/test/app_root/config/environment.rb +15 -0
  41. data/test/app_root/config/environments/test.rb +17 -0
  42. data/test/app_root/config/offroad.yml +6 -0
  43. data/test/app_root/config/routes.rb +4 -0
  44. data/test/app_root/db/migrate/20100529235049_create_tables.rb +64 -0
  45. data/test/app_root/lib/common_hobo.rb +15 -0
  46. data/test/app_root/vendor/plugins/offroad/init.rb +2 -0
  47. data/test/functional/mirror_operations_test.rb +148 -0
  48. data/test/test_helper.rb +405 -0
  49. data/test/unit/app_state_tracking_test.rb +275 -0
  50. data/test/unit/cargo_streamer_test.rb +332 -0
  51. data/test/unit/global_data_test.rb +102 -0
  52. data/test/unit/group_controller_test.rb +152 -0
  53. data/test/unit/group_data_test.rb +435 -0
  54. data/test/unit/group_single_test.rb +136 -0
  55. data/test/unit/hobo_permissions_test.rb +57 -0
  56. data/test/unit/mirror_data_test.rb +1271 -0
  57. data/test/unit/mirror_info_test.rb +31 -0
  58. data/test/unit/module_funcs_test.rb +37 -0
  59. data/test/unit/pathological_model_test.rb +62 -0
  60. data/test/unit/test_framework_test.rb +86 -0
  61. data/test/unit/unmirrored_data_test.rb +14 -0
  62. metadata +140 -0
@@ -0,0 +1,435 @@
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
@@ -0,0 +1,136 @@
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 models in group_single mode
4
+
5
+ class GroupSingleTest < Test::Unit::TestCase
6
+ def setup
7
+ super
8
+ self.class.const_set("GroupSingleRecord", Class.new(ActiveRecord::Base))
9
+ GroupSingleRecord.send(:acts_as_offroadable, :group_single)
10
+ end
11
+
12
+ def teardown
13
+ # Manually remove the group_single model after the test is done.
14
+ # Otherwise no other tests will be able to work with multiple groups
15
+ Offroad.send(:class_variable_set, :@@group_single_models, {})
16
+ self.class.send(:remove_const, "GroupSingleRecord")
17
+ super
18
+ end
19
+
20
+ empty_online_test "can create, alter, and destroy group single records if there are no offline groups" do
21
+ assert_nothing_raised do
22
+ rec = GroupSingleRecord.create(:description => "Foo")
23
+ rec.description = "Bar"
24
+ rec.save!
25
+ rec.destroy
26
+ end
27
+ end
28
+
29
+ empty_online_test "cannot create, alter, or destroy group single records if there are any offline groups" do
30
+ rec = GroupSingleRecord.create(:description => "Foo")
31
+ group = Group.create(:name => "Test Group")
32
+ group.group_offline = true
33
+
34
+ assert_raise ActiveRecord::ReadOnlyRecord do
35
+ GroupSingleRecord.create(:description => "Bar")
36
+ end
37
+
38
+ assert_raise ActiveRecord::ReadOnlyRecord do
39
+ rec.description = "Bar"
40
+ rec.save!
41
+ end
42
+
43
+ assert_raise ActiveRecord::ReadOnlyRecord do
44
+ rec.destroy
45
+ end
46
+ end
47
+
48
+ empty_online_test "group single models are offroad_group_data" do
49
+ GroupSingleRecord.offroad_group_data?
50
+ end
51
+
52
+ empty_online_test "group single records belong to nil if no groups are offline" do
53
+ rec = GroupSingleRecord.create(:description => "Foo")
54
+ group_a = Group.create(:name => "A")
55
+ group_b = Group.create(:name => "B")
56
+ assert_equal nil, rec.owning_group
57
+ assert_equal 0, GroupSingleRecord.owned_by_offroad_group(group_a).count
58
+ assert_equal 0, GroupSingleRecord.owned_by_offroad_group(group_b).count
59
+ end
60
+
61
+ empty_online_test "group single records belong to first offline group" do
62
+ rec = GroupSingleRecord.create(:description => "Foo")
63
+ group_a = Group.create(:name => "A")
64
+ group_b = Group.create(:name => "B")
65
+
66
+ group_a.group_offline = true
67
+ assert_equal group_a, rec.owning_group
68
+ assert_equal 1, GroupSingleRecord.owned_by_offroad_group(group_a).count
69
+ assert_equal 0, GroupSingleRecord.owned_by_offroad_group(group_b).count
70
+
71
+ group_a.group_offline = false
72
+ group_b.group_offline = true
73
+ assert_equal group_b, rec.owning_group
74
+ assert_equal 0, GroupSingleRecord.owned_by_offroad_group(group_a).count
75
+ assert_equal 1, GroupSingleRecord.owned_by_offroad_group(group_b).count
76
+ end
77
+
78
+ empty_online_test "cannot set more than one group offline if any group single models exist" do
79
+ group_a = Group.create(:name => "A")
80
+ group_b = Group.create(:name => "B")
81
+
82
+ group_a.group_offline = true
83
+ assert_raise Offroad::DataError do
84
+ group_b.group_offline = true
85
+ end
86
+ group_a.group_offline = false
87
+ group_b.group_offline = true
88
+ assert_raise Offroad::DataError do
89
+ group_a.group_offline = true
90
+ end
91
+ end
92
+
93
+ cross_test "can insert and update and delete group single data using mirror files" do
94
+ mirror_data = nil
95
+
96
+ in_online_app(false, true) do
97
+ GroupSingleRecord.create(:description => "Foo")
98
+ GroupSingleRecord.create(:description => "Bar")
99
+ group_a = Group.create(:name => "A")
100
+ group_a.group_offline = true
101
+ mirror_data = Offroad::MirrorData.new(group_a, :initial_mode => true).write_downwards_data
102
+ end
103
+
104
+ in_offline_app(false, true) do
105
+ assert_equal 0, GroupSingleRecord.count
106
+ Offroad::MirrorData.new(nil, :initial_mode => true).load_downwards_data(mirror_data)
107
+ assert_equal 2, GroupSingleRecord.count
108
+
109
+ foo_rec = GroupSingleRecord.find_by_description("Foo")
110
+ assert foo_rec
111
+ foo_rec.description = "Fu"
112
+ foo_rec.save!
113
+
114
+ bar_rec = GroupSingleRecord.find_by_description("Bar")
115
+ assert bar_rec
116
+ bar_rec.destroy
117
+
118
+ GroupSingleRecord.create(:description => "One more for the road")
119
+ GroupSingleRecord.create(:description => "Yet another for the road")
120
+
121
+ mirror_data = Offroad::MirrorData.new(Group.first).write_upwards_data
122
+ end
123
+
124
+ in_online_app do
125
+ assert_equal 2, GroupSingleRecord.count
126
+ Offroad::MirrorData.new(Group.first).load_upwards_data(mirror_data)
127
+ assert_equal 3, GroupSingleRecord.count # One record destroyed, two created
128
+
129
+ assert_equal nil, GroupSingleRecord.find_by_description("Foo")
130
+ assert GroupSingleRecord.find_by_description("Fu")
131
+ assert_equal nil, GroupSingleRecord.find_by_description("Bar")
132
+ assert GroupSingleRecord.find_by_description("One more for the road")
133
+ assert GroupSingleRecord.find_by_description("Yet another for the road")
134
+ end
135
+ end
136
+ end
@@ -0,0 +1,57 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
2
+
3
+ # This is a unit test on the ability of model_extensions to override regular Hobo model permissions
4
+
5
+ class HoboPermissionsTest < Test::Unit::TestCase
6
+ if HOBO_TEST_MODE
7
+ def setup
8
+ @guest = Guest.new
9
+ super
10
+ end
11
+
12
+ class HoboPermissionsTestModel < ActiveRecord::Base
13
+ hobo_model
14
+ set_table_name "broken_records"
15
+
16
+ def create_permitted?
17
+ true
18
+ end
19
+
20
+ def update_permitted?
21
+ true
22
+ end
23
+
24
+ def destroy_permitted?
25
+ true
26
+ end
27
+
28
+ acts_as_offroadable :global
29
+ end
30
+ end
31
+
32
+ offline_test "can override hobo permissions" do
33
+ if HOBO_TEST_MODE
34
+ rec = HoboPermissionsTestModel.new
35
+ force_save_and_reload(rec)
36
+
37
+ # We are in offline mode and rec is offroad as global
38
+ # Therefore we should not be able to edit it
39
+ assert !rec.creatable_by?(@guest)
40
+ assert !rec.updatable_by?(@guest)
41
+ assert !rec.destroyable_by?(@guest)
42
+ end
43
+ end
44
+
45
+ online_test "overriding hobo permissions does not block off user specified permissions" do
46
+ if HOBO_TEST_MODE
47
+ rec = HoboPermissionsTestModel.new
48
+ force_save_and_reload(rec)
49
+
50
+ # We are in offline mode and rec is offroad as global
51
+ # Therefore we should be able to edit it
52
+ assert rec.creatable_by?(@guest)
53
+ assert rec.updatable_by?(@guest)
54
+ assert rec.destroyable_by?(@guest)
55
+ end
56
+ end
57
+ end