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.
- data/LICENSE +674 -0
- data/README.rdoc +29 -0
- data/Rakefile +75 -0
- data/TODO +42 -0
- data/lib/app/models/offroad/group_state.rb +85 -0
- data/lib/app/models/offroad/mirror_info.rb +53 -0
- data/lib/app/models/offroad/model_state.rb +36 -0
- data/lib/app/models/offroad/received_record_state.rb +109 -0
- data/lib/app/models/offroad/sendable_record_state.rb +91 -0
- data/lib/app/models/offroad/system_state.rb +33 -0
- data/lib/cargo_streamer.rb +222 -0
- data/lib/controller_extensions.rb +74 -0
- data/lib/exceptions.rb +16 -0
- data/lib/migrate/20100512164608_create_offroad_tables.rb +72 -0
- data/lib/mirror_data.rb +354 -0
- data/lib/model_extensions.rb +377 -0
- data/lib/module_funcs.rb +94 -0
- data/lib/offroad.rb +30 -0
- data/lib/version.rb +3 -0
- data/lib/view_helper.rb +7 -0
- data/templates/offline.rb +36 -0
- data/templates/offline_database.yml +7 -0
- data/templates/offroad.yml +6 -0
- data/test/app_root/app/controllers/application_controller.rb +2 -0
- data/test/app_root/app/controllers/group_controller.rb +28 -0
- data/test/app_root/app/models/global_record.rb +10 -0
- data/test/app_root/app/models/group.rb +12 -0
- data/test/app_root/app/models/group_owned_record.rb +68 -0
- data/test/app_root/app/models/guest.rb +7 -0
- data/test/app_root/app/models/subrecord.rb +12 -0
- data/test/app_root/app/models/unmirrored_record.rb +4 -0
- data/test/app_root/app/views/group/download_down_mirror.html.erb +4 -0
- data/test/app_root/app/views/group/download_initial_down_mirror.html.erb +4 -0
- data/test/app_root/app/views/group/download_up_mirror.html.erb +6 -0
- data/test/app_root/app/views/group/upload_down_mirror.html.erb +1 -0
- data/test/app_root/app/views/group/upload_up_mirror.html.erb +1 -0
- data/test/app_root/app/views/layouts/mirror.html.erb +9 -0
- data/test/app_root/config/boot.rb +115 -0
- data/test/app_root/config/database.yml +6 -0
- data/test/app_root/config/environment.rb +15 -0
- data/test/app_root/config/environments/test.rb +17 -0
- data/test/app_root/config/offroad.yml +6 -0
- data/test/app_root/config/routes.rb +4 -0
- data/test/app_root/db/migrate/20100529235049_create_tables.rb +64 -0
- data/test/app_root/lib/common_hobo.rb +15 -0
- data/test/app_root/vendor/plugins/offroad/init.rb +2 -0
- data/test/functional/mirror_operations_test.rb +148 -0
- data/test/test_helper.rb +405 -0
- data/test/unit/app_state_tracking_test.rb +275 -0
- data/test/unit/cargo_streamer_test.rb +332 -0
- data/test/unit/global_data_test.rb +102 -0
- data/test/unit/group_controller_test.rb +152 -0
- data/test/unit/group_data_test.rb +435 -0
- data/test/unit/group_single_test.rb +136 -0
- data/test/unit/hobo_permissions_test.rb +57 -0
- data/test/unit/mirror_data_test.rb +1271 -0
- data/test/unit/mirror_info_test.rb +31 -0
- data/test/unit/module_funcs_test.rb +37 -0
- data/test/unit/pathological_model_test.rb +62 -0
- data/test/unit/test_framework_test.rb +86 -0
- data/test/unit/unmirrored_data_test.rb +14 -0
- 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
|