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.
- data/LICENSE +674 -674
- data/README.rdoc +29 -29
- data/Rakefile +75 -75
- data/TODO +42 -42
- data/lib/app/models/offroad/group_state.rb +85 -85
- data/lib/app/models/offroad/mirror_info.rb +53 -53
- data/lib/app/models/offroad/model_state.rb +36 -36
- data/lib/app/models/offroad/received_record_state.rb +115 -115
- data/lib/app/models/offroad/sendable_record_state.rb +91 -91
- data/lib/app/models/offroad/system_state.rb +33 -33
- data/lib/cargo_streamer.rb +222 -222
- data/lib/controller_extensions.rb +74 -74
- data/lib/exceptions.rb +16 -16
- data/lib/migrate/20100512164608_create_offroad_tables.rb +72 -72
- data/lib/mirror_data.rb +376 -376
- data/lib/model_extensions.rb +378 -377
- data/lib/module_funcs.rb +94 -94
- data/lib/offroad.rb +41 -41
- data/lib/version.rb +3 -3
- data/lib/view_helper.rb +7 -7
- data/templates/offline.rb +36 -36
- data/templates/offline_database.yml +7 -7
- data/templates/offroad.yml +6 -6
- data/test/app_root/app/controllers/application_controller.rb +2 -2
- data/test/app_root/app/controllers/group_controller.rb +28 -28
- data/test/app_root/app/models/global_record.rb +10 -10
- data/test/app_root/app/models/group.rb +12 -12
- data/test/app_root/app/models/group_owned_record.rb +68 -68
- data/test/app_root/app/models/guest.rb +7 -7
- data/test/app_root/app/models/subrecord.rb +12 -12
- data/test/app_root/app/models/unmirrored_record.rb +4 -4
- data/test/app_root/app/views/group/download_down_mirror.html.erb +3 -3
- data/test/app_root/app/views/group/download_initial_down_mirror.html.erb +3 -3
- data/test/app_root/app/views/group/download_up_mirror.html.erb +5 -5
- data/test/app_root/app/views/layouts/mirror.html.erb +8 -8
- data/test/app_root/config/boot.rb +115 -115
- data/test/app_root/config/database-pg.yml +8 -8
- data/test/app_root/config/database.yml +5 -5
- data/test/app_root/config/environment.rb +24 -24
- data/test/app_root/config/environments/test.rb +17 -17
- data/test/app_root/config/offroad.yml +6 -6
- data/test/app_root/config/routes.rb +4 -4
- data/test/app_root/db/migrate/20100529235049_create_tables.rb +64 -64
- data/test/app_root/lib/common_hobo.rb +15 -15
- data/test/app_root/vendor/plugins/offroad/init.rb +2 -2
- data/test/functional/mirror_operations_test.rb +148 -148
- data/test/test_helper.rb +453 -453
- data/test/unit/app_state_tracking_test.rb +275 -275
- data/test/unit/cargo_streamer_test.rb +332 -332
- data/test/unit/global_data_test.rb +102 -102
- data/test/unit/group_controller_test.rb +152 -152
- data/test/unit/group_data_test.rb +442 -435
- data/test/unit/group_single_test.rb +136 -136
- data/test/unit/hobo_permissions_test.rb +57 -57
- data/test/unit/mirror_data_test.rb +1283 -1283
- data/test/unit/mirror_info_test.rb +31 -31
- data/test/unit/module_funcs_test.rb +37 -37
- data/test/unit/pathological_model_test.rb +62 -62
- data/test/unit/test_framework_test.rb +86 -86
- data/test/unit/unmirrored_data_test.rb +14 -14
- 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
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
end
|
380
|
-
|
381
|
-
online_test "cannot
|
382
|
-
assert_raise Offroad::DataError do
|
383
|
-
@offline_group_data.
|
384
|
-
@offline_group_data.save
|
385
|
-
end
|
386
|
-
end
|
387
|
-
|
388
|
-
online_test "cannot move
|
389
|
-
assert_raise Offroad::DataError do
|
390
|
-
@
|
391
|
-
@
|
392
|
-
end
|
393
|
-
end
|
394
|
-
|
395
|
-
online_test "
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
assert_raise ActiveRecord::ReadOnlyRecord do
|
419
|
-
|
420
|
-
end
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
assert_raise ActiveRecord::ReadOnlyRecord do
|
426
|
-
@
|
427
|
-
end
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
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
|