rubycs-declarative_authorization 0.3.0

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 (37) hide show
  1. data/CHANGELOG +70 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.rdoc +9 -0
  4. data/Rakefile +43 -0
  5. data/app/controllers/authorization_rules_controller.rb +114 -0
  6. data/app/controllers/authorization_usages_controller.rb +23 -0
  7. data/app/helpers/authorization_rules_helper.rb +100 -0
  8. data/app/views/authorization_rules/graph.dot.erb +49 -0
  9. data/app/views/authorization_rules/graph.html.erb +39 -0
  10. data/app/views/authorization_rules/index.html.erb +16 -0
  11. data/app/views/authorization_usages/index.html.erb +45 -0
  12. data/authorization_rules.dist.rb +20 -0
  13. data/config/locales/en.declarative_authorization.yml +35 -0
  14. data/config/locales/ro.declarative_authorization.yml +35 -0
  15. data/config/routes.rb +6 -0
  16. data/garlic_example.rb +20 -0
  17. data/init.rb +5 -0
  18. data/lib/declarative_authorization.rb +15 -0
  19. data/lib/declarative_authorization/authorization.rb +578 -0
  20. data/lib/declarative_authorization/authorization_rules_analyzer.rb +138 -0
  21. data/lib/declarative_authorization/helper.rb +56 -0
  22. data/lib/declarative_authorization/in_controller.rb +343 -0
  23. data/lib/declarative_authorization/in_model.rb +125 -0
  24. data/lib/declarative_authorization/maintenance.rb +174 -0
  25. data/lib/declarative_authorization/obligation_scope.rb +292 -0
  26. data/lib/declarative_authorization/rails_legacy.rb +14 -0
  27. data/lib/declarative_authorization/reader.rb +430 -0
  28. data/test/authorization_rules_analyzer_test.rb +123 -0
  29. data/test/authorization_test.rb +779 -0
  30. data/test/controller_test.rb +361 -0
  31. data/test/dsl_reader_test.rb +157 -0
  32. data/test/helper_test.rb +133 -0
  33. data/test/maintenance_test.rb +15 -0
  34. data/test/model_test.rb +1143 -0
  35. data/test/schema.sql +53 -0
  36. data/test/test_helper.rb +99 -0
  37. metadata +97 -0
@@ -0,0 +1,133 @@
1
+ require File.join(File.dirname(__FILE__), 'test_helper.rb')
2
+ require File.join(File.dirname(__FILE__), %w{.. lib declarative_authorization helper})
3
+
4
+
5
+ class HelperMocksController < MocksController
6
+ filter_access_to :action, :require => :show, :context => :mocks
7
+ define_action_methods :action
8
+ end
9
+ class HelperTest < ActionController::TestCase
10
+ tests HelperMocksController
11
+ include Authorization::AuthorizationHelper
12
+ attr_reader :controller
13
+
14
+ def test_permit
15
+ reader = Authorization::Reader::DSLReader.new
16
+ reader.parse %{
17
+ authorization do
18
+ role :test_role do
19
+ has_permission_on :mocks, :to => :show
20
+ end
21
+ role :test_role_2 do
22
+ has_permission_on :mocks, :to => :update
23
+ end
24
+ end
25
+ }
26
+ user = MockUser.new(:test_role)
27
+ request!(user, :action, reader)
28
+
29
+ assert permitted_to?(:show, :mocks)
30
+ assert !permitted_to?(:update, :mocks)
31
+
32
+ block_evaled = false
33
+ permitted_to?(:show, :mocks) do
34
+ block_evaled = true
35
+ end
36
+ assert block_evaled
37
+
38
+ block_evaled = false
39
+ permitted_to?(:update, :mocks) do
40
+ block_evaled = true
41
+ end
42
+ assert !block_evaled
43
+ end
44
+
45
+ def test_permit_with_object
46
+ reader = Authorization::Reader::DSLReader.new
47
+ reader.parse %{
48
+ authorization do
49
+ role :test_role do
50
+ has_permission_on :mocks do
51
+ to :show
52
+ if_attribute :test_attr => is {user.test_attr}
53
+ end
54
+ end
55
+ end
56
+ }
57
+ user = MockUser.new(:test_role, :test_attr => 1)
58
+ mock = MockDataObject.new(:test_attr => 1)
59
+ mock_2 = MockDataObject.new(:test_attr => 2)
60
+ request!(user, :action, reader)
61
+
62
+ assert permitted_to?(:show, mock)
63
+ assert permitted_to?(:show, :mocks)
64
+ assert !permitted_to?(:show, mock_2)
65
+ end
66
+
67
+ def test_has_role
68
+ reader = Authorization::Reader::DSLReader.new
69
+ reader.parse %{
70
+ authorization do
71
+ role :test_role do
72
+ has_permission_on :mocks, :to => :show
73
+ end
74
+ end
75
+ }
76
+ user = MockUser.new(:test_role)
77
+ request!(user, :action, reader)
78
+
79
+ assert has_role?(:test_role)
80
+ assert !has_role?(:test_role2)
81
+
82
+ block_evaled = false
83
+ has_role?(:test_role) do
84
+ block_evaled = true
85
+ end
86
+ assert block_evaled
87
+
88
+ block_evaled = false
89
+ has_role?(:test_role2) do
90
+ block_evaled = true
91
+ end
92
+ assert !block_evaled
93
+ end
94
+
95
+ def test_has_role_with_hierarchy
96
+ reader = Authorization::Reader::DSLReader.new
97
+ reader.parse %{
98
+ authorization do
99
+ role :test_role do
100
+ has_permission_on :mocks, :to => :show
101
+ end
102
+ role :other_role do
103
+ has_permission_on :another_mocks, :to => :show
104
+ end
105
+
106
+ role :root do
107
+ includes :test_role
108
+ end
109
+ end
110
+ }
111
+
112
+ user = MockUser.new(:root)
113
+ request!(user, :action, reader)
114
+
115
+ assert has_role_with_hierarchy?(:test_role)
116
+ assert !has_role_with_hierarchy?(:other_role)
117
+
118
+ block_evaled = false
119
+ has_role_with_hierarchy?(:test_role) do
120
+ block_evaled = true
121
+ end
122
+ assert block_evaled
123
+
124
+ block_evaled = false
125
+ has_role_with_hierarchy?(:test_role2) do
126
+ block_evaled = true
127
+ end
128
+ assert !block_evaled
129
+
130
+ end
131
+
132
+
133
+ end
@@ -0,0 +1,15 @@
1
+ require File.join(File.dirname(__FILE__), 'test_helper.rb')
2
+ require File.join(File.dirname(__FILE__), %w{.. lib declarative_authorization maintenance})
3
+
4
+ class MaintenanceTest < Test::Unit::TestCase
5
+
6
+ def test_usages_by_controllers
7
+ usage_test_controller = Class.new(ActionController::Base)
8
+ usage_test_controller.send(:define_method, :an_action) {}
9
+ usage_test_controller.filter_access_to :an_action
10
+
11
+ assert Authorization::Maintenance::Usage::usages_by_controller.
12
+ include?(usage_test_controller)
13
+ end
14
+
15
+ end
@@ -0,0 +1,1143 @@
1
+ require File.join(File.dirname(__FILE__), 'test_helper.rb')
2
+ require File.join(File.dirname(__FILE__), %w{.. lib declarative_authorization in_model})
3
+
4
+ ActiveRecord::Base.send :include, Authorization::AuthorizationInModel
5
+ #ActiveRecord::Base.logger = Logger.new(STDOUT)
6
+
7
+ options = {:adapter => 'sqlite3', :timeout => 500, :database => ':memory:'}
8
+ ActiveRecord::Base.establish_connection(options)
9
+ ActiveRecord::Base.configurations = { 'sqlite3_ar_integration' => options }
10
+ ActiveRecord::Base.connection
11
+
12
+ File.read(File.dirname(__FILE__) + "/schema.sql").split(';').each do |sql|
13
+ ActiveRecord::Base.connection.execute(sql) unless sql.blank?
14
+ end
15
+
16
+ class TestModel < ActiveRecord::Base
17
+ has_many :test_attrs
18
+ has_many :test_attr_throughs, :through => :test_attrs
19
+ has_many :test_attrs_with_attr, :class_name => "TestAttr", :conditions => {:attr => 1}
20
+ has_many :test_attr_throughs_with_attr, :through => :test_attrs,
21
+ :class_name => "TestAttrThrough", :source => :test_attr_throughs,
22
+ :conditions => "test_attrs.attr = 1"
23
+ has_one :test_attr_has_one, :class_name => "TestAttr"
24
+ has_one :test_attr_throughs_with_attr_and_has_one, :through => :test_attrs,
25
+ :class_name => "TestAttrThrough", :source => :test_attr_throughs,
26
+ :conditions => "test_attrs.attr = 1"
27
+
28
+ has_and_belongs_to_many :test_attr_throughs_habtm, :join_table => :test_attrs,
29
+ :class_name => "TestAttrThrough"
30
+
31
+ # Primary key test
32
+ # take this out for Rails prior to 2.2
33
+ if ([Rails::VERSION::MAJOR, Rails::VERSION::MINOR] <=> [2, 2]) > -1
34
+ has_many :test_attrs_with_primary_id, :class_name => "TestAttr",
35
+ :primary_key => :test_attr_through_id, :foreign_key => :test_attr_through_id
36
+ has_many :test_attr_throughs_with_primary_id,
37
+ :through => :test_attrs_with_primary_id, :class_name => "TestAttrThrough",
38
+ :source => :n_way_join_item
39
+ end
40
+ end
41
+
42
+ class NWayJoinItem < ActiveRecord::Base
43
+ has_many :test_attrs
44
+ has_many :others, :through => :test_attrs, :source => :n_way_join_item
45
+ end
46
+
47
+ class TestAttr < ActiveRecord::Base
48
+ belongs_to :test_model
49
+ belongs_to :test_another_model, :class_name => "TestModel", :foreign_key => :test_another_model_id
50
+ belongs_to :test_a_third_model, :class_name => "TestModel", :foreign_key => :test_a_third_model_id
51
+ belongs_to :n_way_join_item
52
+ belongs_to :test_attr
53
+ belongs_to :branch
54
+ belongs_to :company
55
+ has_many :test_attr_throughs
56
+ attr_reader :role_symbols
57
+ def initialize (*args)
58
+ @role_symbols = []
59
+ super(*args)
60
+ end
61
+ end
62
+
63
+ class TestAttrThrough < ActiveRecord::Base
64
+ belongs_to :test_attr
65
+ end
66
+
67
+ class TestModelSecurityModel < ActiveRecord::Base
68
+ has_many :test_attrs
69
+ using_access_control
70
+ end
71
+ class TestModelSecurityModelWithFind < ActiveRecord::Base
72
+ set_table_name "test_model_security_models"
73
+ has_many :test_attrs
74
+ using_access_control :include_read => true,
75
+ :context => :test_model_security_models
76
+ end
77
+
78
+ class Branch < ActiveRecord::Base
79
+ has_many :test_attrs
80
+ belongs_to :company
81
+ end
82
+ class Company < ActiveRecord::Base
83
+ has_many :test_attrs
84
+ has_many :branches
85
+ belongs_to :country
86
+ end
87
+ class Country < ActiveRecord::Base
88
+ has_many :test_models
89
+ has_many :companies
90
+ end
91
+
92
+ class ModelTest < Test::Unit::TestCase
93
+ def test_named_scope_multiple_deep_ored_belongs_to
94
+ reader = Authorization::Reader::DSLReader.new
95
+ reader.parse %{
96
+ authorization do
97
+ role :test_role do
98
+ has_permission_on :test_attrs, :to => :read do
99
+ if_attribute :test_model => {:test_attrs => contains {user}}
100
+ if_attribute :test_another_model => {:test_attrs => contains {user}}
101
+ end
102
+ end
103
+ end
104
+ }
105
+ Authorization::Engine.instance(reader)
106
+
107
+ test_model_1 = TestModel.create!
108
+ test_model_2 = TestModel.create!
109
+ test_attr_1 = TestAttr.create! :test_model_id => test_model_1.id,
110
+ :test_another_model_id => test_model_2.id
111
+
112
+ user = MockUser.new(:test_role, :id => test_attr_1)
113
+ assert_equal 1, TestAttr.with_permissions_to(:read, :user => user).length
114
+ TestAttr.delete_all
115
+ TestModel.delete_all
116
+ end
117
+
118
+ def test_named_scope_with_belongs_to_and_has_many_with_contains
119
+ reader = Authorization::Reader::DSLReader.new
120
+ reader.parse %{
121
+ authorization do
122
+ role :test_role do
123
+ has_permission_on :test_attrs, :to => :read do
124
+ if_attribute :test_model => { :test_attrs => contains { user.test_attr_value } }
125
+ end
126
+ end
127
+ end
128
+ }
129
+ Authorization::Engine.instance(reader)
130
+
131
+ test_attr_1 = TestAttr.create!
132
+ test_model_1 = TestModel.create!
133
+ test_model_1.test_attrs.create!
134
+
135
+ user = MockUser.new(:test_role, :test_attr_value => test_model_1.test_attrs.first.id )
136
+ assert_equal 1, TestAttr.with_permissions_to( :read, :context => :test_attrs, :user => user ).length
137
+ assert_equal 1, TestAttr.with_permissions_to( :read, :user => user ).length
138
+ assert_raise Authorization::NotAuthorized do
139
+ TestAttr.with_permissions_to( :update_test_attrs, :user => user )
140
+ end
141
+ TestAttr.delete_all
142
+ TestModel.delete_all
143
+ end
144
+
145
+ def test_named_scope_with_is
146
+ reader = Authorization::Reader::DSLReader.new
147
+ reader.parse %{
148
+ authorization do
149
+ role :test_role do
150
+ has_permission_on :test_models, :to => :read do
151
+ if_attribute :id => is { user.test_attr_value }
152
+ end
153
+ end
154
+ end
155
+ }
156
+ Authorization::Engine.instance(reader)
157
+
158
+ test_model_1 = TestModel.create!
159
+ TestModel.create!
160
+
161
+ user = MockUser.new(:test_role, :test_attr_value => test_model_1.id)
162
+ assert_equal 1, TestModel.with_permissions_to(:read,
163
+ :context => :test_models, :user => user).length
164
+ assert_equal 1, TestModel.with_permissions_to(:read, :user => user).length
165
+ assert_raise Authorization::NotAuthorized do
166
+ TestModel.with_permissions_to(:update_test_models, :user => user)
167
+ end
168
+ TestModel.delete_all
169
+ end
170
+
171
+ def test_named_scope_with_not_is
172
+ reader = Authorization::Reader::DSLReader.new
173
+ reader.parse %{
174
+ authorization do
175
+ role :test_role do
176
+ has_permission_on :test_models, :to => :read do
177
+ if_attribute :id => is_not { user.test_attr_value }
178
+ end
179
+ end
180
+ end
181
+ }
182
+ Authorization::Engine.instance(reader)
183
+
184
+ test_model_1 = TestModel.create!
185
+ TestModel.create!
186
+
187
+ user = MockUser.new(:test_role, :test_attr_value => test_model_1.id)
188
+ assert_equal 1, TestModel.with_permissions_to(:read, :user => user).length
189
+ TestModel.delete_all
190
+ end
191
+
192
+ def test_named_scope_with_empty_obligations
193
+ reader = Authorization::Reader::DSLReader.new
194
+ reader.parse %{
195
+ authorization do
196
+ role :test_role do
197
+ has_permission_on :test_models, :to => :read
198
+ end
199
+ end
200
+ }
201
+ Authorization::Engine.instance(reader)
202
+
203
+ TestModel.create!
204
+
205
+ user = MockUser.new(:test_role)
206
+ assert_equal 1, TestModel.with_permissions_to(:read, :user => user).length
207
+ assert_raise Authorization::NotAuthorized do
208
+ TestModel.with_permissions_to(:update, :user => user)
209
+ end
210
+ TestModel.delete_all
211
+ end
212
+
213
+ def test_named_scope_multiple_obligations
214
+ reader = Authorization::Reader::DSLReader.new
215
+ reader.parse %{
216
+ authorization do
217
+ role :test_role do
218
+ has_permission_on :test_models, :to => :read do
219
+ if_attribute :id => is { user.test_attr_value }
220
+ end
221
+ has_permission_on :test_models, :to => :read do
222
+ if_attribute :id => is { user.test_attr_value_2 }
223
+ end
224
+ end
225
+ end
226
+ }
227
+ Authorization::Engine.instance(reader)
228
+
229
+ test_model_1 = TestModel.create!
230
+ test_model_2 = TestModel.create!
231
+
232
+ user = MockUser.new(:test_role, :test_attr_value => test_model_1.id,
233
+ :test_attr_value_2 => test_model_2.id)
234
+ assert_equal 2, TestModel.with_permissions_to(:read, :user => user).length
235
+ TestModel.delete_all
236
+ end
237
+
238
+ def test_named_scope_multiple_roles
239
+ reader = Authorization::Reader::DSLReader.new
240
+ reader.parse %{
241
+ authorization do
242
+ role :test_role do
243
+ has_permission_on :test_attrs, :to => :read do
244
+ if_attribute :attr => [1,2]
245
+ end
246
+ end
247
+
248
+ role :test_role_2 do
249
+ has_permission_on :test_attrs, :to => :read do
250
+ if_attribute :attr => [2,3]
251
+ end
252
+ end
253
+ end
254
+ }
255
+ Authorization::Engine.instance(reader)
256
+
257
+ TestAttr.create! :attr => 1
258
+ TestAttr.create! :attr => 2
259
+ TestAttr.create! :attr => 3
260
+
261
+ user = MockUser.new(:test_role)
262
+ assert_equal 2, TestAttr.with_permissions_to(:read, :user => user).length
263
+ TestAttr.delete_all
264
+ end
265
+
266
+ def test_named_scope_multiple_and_empty_obligations
267
+ reader = Authorization::Reader::DSLReader.new
268
+ reader.parse %{
269
+ authorization do
270
+ role :test_role do
271
+ has_permission_on :test_models, :to => :read do
272
+ if_attribute :id => is { user.test_attr_value }
273
+ end
274
+ has_permission_on :test_models, :to => :read
275
+ end
276
+ end
277
+ }
278
+ Authorization::Engine.instance(reader)
279
+
280
+ test_model_1 = TestModel.create!
281
+ TestModel.create!
282
+
283
+ user = MockUser.new(:test_role, :test_attr_value => test_model_1.id)
284
+ assert_equal 2, TestModel.with_permissions_to(:read, :user => user).length
285
+ TestModel.delete_all
286
+ end
287
+
288
+ def test_named_scope_multiple_attributes
289
+ reader = Authorization::Reader::DSLReader.new
290
+ reader.parse %{
291
+ authorization do
292
+ role :test_role do
293
+ has_permission_on :test_models, :to => :read do
294
+ if_attribute :id => is { user.test_attr_value }, :content => "bla"
295
+ end
296
+ end
297
+ end
298
+ }
299
+ Authorization::Engine.instance(reader)
300
+
301
+ test_model_1 = TestModel.create! :content => 'bla'
302
+ TestModel.create! :content => 'bla'
303
+ TestModel.create!
304
+
305
+ user = MockUser.new(:test_role, :test_attr_value => test_model_1.id)
306
+ assert_equal 1, TestModel.with_permissions_to(:read, :user => user).length
307
+ TestModel.delete_all
308
+ end
309
+
310
+ def test_named_scope_multiple_belongs_to
311
+ reader = Authorization::Reader::DSLReader.new
312
+ reader.parse %{
313
+ authorization do
314
+ role :test_role do
315
+ has_permission_on :test_attrs, :to => :read do
316
+ if_attribute :test_model => is {user}
317
+ if_attribute :test_another_model => is {user}
318
+ end
319
+ end
320
+ end
321
+ }
322
+ Authorization::Engine.instance(reader)
323
+
324
+ test_attr_1 = TestAttr.create! :test_model_id => 1, :test_another_model_id => 2
325
+
326
+ user = MockUser.new(:test_role, :id => 1)
327
+ assert_equal 1, TestAttr.with_permissions_to(:read, :user => user).length
328
+ TestAttr.delete_all
329
+ end
330
+
331
+ def test_named_scope_with_is_and_priv_hierarchy
332
+ reader = Authorization::Reader::DSLReader.new
333
+ reader.parse %{
334
+ privileges do
335
+ privilege :read do
336
+ includes :list, :show
337
+ end
338
+ end
339
+ authorization do
340
+ role :test_role do
341
+ has_permission_on :test_models, :to => :read do
342
+ if_attribute :id => is { user.test_attr_value }
343
+ end
344
+ end
345
+ end
346
+ }
347
+ Authorization::Engine.instance(reader)
348
+
349
+ test_model_1 = TestModel.create!
350
+ TestModel.create!
351
+
352
+ user = MockUser.new(:test_role, :test_attr_value => test_model_1.id)
353
+ assert_equal 1, TestModel.with_permissions_to(:list,
354
+ :context => :test_models, :user => user).length
355
+ assert_equal 1, TestModel.with_permissions_to(:list, :user => user).length
356
+
357
+ TestModel.delete_all
358
+ end
359
+
360
+ def test_named_scope_with_is_and_belongs_to
361
+ reader = Authorization::Reader::DSLReader.new
362
+ reader.parse %{
363
+ authorization do
364
+ role :test_role do
365
+ has_permission_on :test_attrs, :to => :read do
366
+ if_attribute :test_model => is { user.test_model }
367
+ end
368
+ end
369
+ end
370
+ }
371
+ Authorization::Engine.instance(reader)
372
+
373
+ test_model_1 = TestModel.create!
374
+ test_model_1.test_attrs.create!
375
+ TestModel.create!.test_attrs.create!
376
+
377
+ user = MockUser.new(:test_role, :test_model => test_model_1)
378
+ assert_equal 1, TestAttr.with_permissions_to(:read,
379
+ :context => :test_attrs, :user => user).length
380
+
381
+ TestModel.delete_all
382
+ TestAttr.delete_all
383
+ end
384
+
385
+ def test_named_scope_with_deep_attribute
386
+ reader = Authorization::Reader::DSLReader.new
387
+ reader.parse %{
388
+ authorization do
389
+ role :test_role do
390
+ has_permission_on :test_attrs, :to => :read do
391
+ if_attribute :test_model => {:id => is { user.test_model_id } }
392
+ end
393
+ end
394
+ end
395
+ }
396
+ Authorization::Engine.instance(reader)
397
+
398
+ test_model_1 = TestModel.create!
399
+ test_model_1.test_attrs.create!
400
+ TestModel.create!.test_attrs.create!
401
+
402
+ user = MockUser.new(:test_role, :test_model_id => test_model_1.id)
403
+ assert_equal 1, TestAttr.with_permissions_to(:read,
404
+ :context => :test_attrs, :user => user).length
405
+
406
+ TestModel.delete_all
407
+ TestAttr.delete_all
408
+ end
409
+
410
+ def test_named_scope_with_anded_rules
411
+ reader = Authorization::Reader::DSLReader.new
412
+ reader.parse %{
413
+ authorization do
414
+ role :test_role do
415
+ has_permission_on :test_attrs, :to => :read, :join_by => :and do
416
+ if_attribute :test_model => is { user.test_model }
417
+ if_attribute :attr => 1
418
+ end
419
+ end
420
+ end
421
+ }
422
+ Authorization::Engine.instance(reader)
423
+
424
+ test_model_1 = TestModel.create!
425
+ test_model_1.test_attrs.create!(:attr => 1)
426
+ TestModel.create!.test_attrs.create!(:attr => 1)
427
+ TestModel.create!.test_attrs.create!
428
+
429
+ user = MockUser.new(:test_role, :test_model => test_model_1)
430
+ assert_equal 1, TestAttr.with_permissions_to(:read,
431
+ :context => :test_attrs, :user => user).length
432
+
433
+ TestModel.delete_all
434
+ TestAttr.delete_all
435
+ end
436
+
437
+ def test_named_scope_with_contains
438
+ reader = Authorization::Reader::DSLReader.new
439
+ reader.parse %{
440
+ authorization do
441
+ role :test_role do
442
+ has_permission_on :test_models, :to => :read do
443
+ if_attribute :test_attrs => contains { user }
444
+ end
445
+ end
446
+ end
447
+ }
448
+ Authorization::Engine.instance(reader)
449
+
450
+ test_model_1 = TestModel.create!
451
+ test_model_2 = TestModel.create!
452
+ test_model_1.test_attrs.create!
453
+ test_model_1.test_attrs.create!
454
+ test_model_2.test_attrs.create!
455
+
456
+ user = MockUser.new(:test_role,
457
+ :id => test_model_1.test_attrs.first.id)
458
+ assert_equal 1, TestModel.with_permissions_to(:read, :user => user).length
459
+ assert_equal 1, TestModel.with_permissions_to(:read, :user => user).find(:all, :conditions => {:id => test_model_1.id}).length
460
+
461
+ TestModel.delete_all
462
+ TestAttr.delete_all
463
+ end
464
+
465
+ def test_named_scope_with_does_not_contain
466
+ reader = Authorization::Reader::DSLReader.new
467
+ reader.parse %{
468
+ authorization do
469
+ role :test_role do
470
+ has_permission_on :test_models, :to => :read do
471
+ if_attribute :test_attrs => does_not_contain { user }
472
+ end
473
+ end
474
+ end
475
+ }
476
+ Authorization::Engine.instance(reader)
477
+
478
+ test_model_1 = TestModel.create!
479
+ test_model_2 = TestModel.create!
480
+ test_model_1.test_attrs.create!
481
+ test_model_2.test_attrs.create!
482
+
483
+ user = MockUser.new(:test_role,
484
+ :id => test_model_1.test_attrs.first.id)
485
+ assert_equal 1, TestModel.with_permissions_to(:read, :user => user).length
486
+
487
+ TestModel.delete_all
488
+ TestAttr.delete_all
489
+ end
490
+
491
+ def test_named_scope_with_contains_conditions
492
+ reader = Authorization::Reader::DSLReader.new
493
+ reader.parse %{
494
+ authorization do
495
+ role :test_role do
496
+ has_permission_on :test_models, :to => :read do
497
+ if_attribute :test_attrs_with_attr => contains { user }
498
+ end
499
+ end
500
+ end
501
+ }
502
+ Authorization::Engine.instance(reader)
503
+
504
+ test_model_1 = TestModel.create!
505
+ test_model_2 = TestModel.create!
506
+ test_model_1.test_attrs_with_attr.create!
507
+ test_model_1.test_attrs.create!(:attr => 2)
508
+ test_model_2.test_attrs_with_attr.create!
509
+ test_model_2.test_attrs.create!(:attr => 2)
510
+
511
+ #assert_equal 1, test_model_1.test_attrs_with_attr.length
512
+ user = MockUser.new(:test_role,
513
+ :id => test_model_1.test_attrs.first.id)
514
+ assert_equal 1, TestModel.with_permissions_to(:read, :user => user).length
515
+ user = MockUser.new(:test_role,
516
+ :id => test_model_1.test_attrs.last.id)
517
+ assert_equal 0, TestModel.with_permissions_to(:read, :user => user).length
518
+
519
+ TestModel.delete_all
520
+ TestAttr.delete_all
521
+ end
522
+
523
+ def test_named_scope_with_contains_through_conditions
524
+ reader = Authorization::Reader::DSLReader.new
525
+ reader.parse %{
526
+ authorization do
527
+ role :test_role do
528
+ has_permission_on :test_models, :to => :read do
529
+ if_attribute :test_attr_throughs_with_attr => contains { user }
530
+ end
531
+ end
532
+ end
533
+ }
534
+ Authorization::Engine.instance(reader)
535
+
536
+ test_model_1 = TestModel.create!
537
+ test_model_2 = TestModel.create!
538
+ test_model_1.test_attrs.create!(:attr => 1).test_attr_throughs.create!
539
+ test_model_1.test_attrs.create!(:attr => 2).test_attr_throughs.create!
540
+ test_model_2.test_attrs.create!(:attr => 1).test_attr_throughs.create!
541
+ test_model_2.test_attrs.create!(:attr => 2).test_attr_throughs.create!
542
+
543
+ #assert_equal 1, test_model_1.test_attrs_with_attr.length
544
+ user = MockUser.new(:test_role,
545
+ :id => test_model_1.test_attr_throughs.first.id)
546
+ assert_equal 1, TestModel.with_permissions_to(:read, :user => user).length
547
+ user = MockUser.new(:test_role,
548
+ :id => test_model_1.test_attr_throughs.last.id)
549
+ assert_equal 0, TestModel.with_permissions_to(:read, :user => user).length
550
+
551
+ TestModel.delete_all
552
+ TestAttrThrough.delete_all
553
+ TestAttr.delete_all
554
+ end
555
+
556
+ def test_named_scope_with_contains_habtm
557
+ reader = Authorization::Reader::DSLReader.new
558
+ reader.parse %{
559
+ authorization do
560
+ role :test_role do
561
+ has_permission_on :test_models, :to => :read do
562
+ if_attribute :test_attr_throughs_habtm => contains { user.test_attr_through_id }
563
+ end
564
+ end
565
+ end
566
+ }
567
+ Authorization::Engine.instance(reader)
568
+
569
+ test_model_1 = TestModel.create!
570
+ test_model_2 = TestModel.create!
571
+ test_attr_through_1 = TestAttrThrough.create!
572
+ test_attr_through_2 = TestAttrThrough.create!
573
+ TestAttr.create! :test_model_id => test_model_1.id, :test_attr_through_id => test_attr_through_1.id
574
+ TestAttr.create! :test_model_id => test_model_2.id, :test_attr_through_id => test_attr_through_2.id
575
+
576
+ user = MockUser.new(:test_role,
577
+ :test_attr_through_id => test_model_1.test_attr_throughs_habtm.first.id)
578
+ assert_equal 1, TestModel.with_permissions_to(:read, :user => user).length
579
+ assert_equal test_model_1, TestModel.with_permissions_to(:read, :user => user)[0]
580
+
581
+ TestModel.delete_all
582
+ TestAttrThrough.delete_all
583
+ TestAttr.delete_all
584
+ end
585
+
586
+ # take this out for Rails prior to 2.2
587
+ if ([Rails::VERSION::MAJOR, Rails::VERSION::MINOR] <=> [2, 2]) > -1
588
+ def test_named_scope_with_contains_through_primary_key
589
+ reader = Authorization::Reader::DSLReader.new
590
+ reader.parse %{
591
+ authorization do
592
+ role :test_role do
593
+ has_permission_on :test_models, :to => :read do
594
+ if_attribute :test_attr_throughs_with_primary_id => contains { user }
595
+ end
596
+ end
597
+ end
598
+ }
599
+ Authorization::Engine.instance(reader)
600
+
601
+ test_attr_through_1 = TestAttrThrough.create!
602
+ test_item = NWayJoinItem.create!
603
+ test_model_1 = TestModel.create!(:test_attr_through_id => test_attr_through_1.id)
604
+ test_attr_1 = TestAttr.create!(:test_attr_through_id => test_attr_through_1.id,
605
+ :n_way_join_item_id => test_item.id)
606
+
607
+ user = MockUser.new(:test_role,
608
+ :id => test_attr_through_1.id)
609
+ assert_equal 1, TestModel.with_permissions_to(:read, :user => user).length
610
+
611
+ TestModel.delete_all
612
+ TestAttrThrough.delete_all
613
+ TestAttr.delete_all
614
+ end
615
+ end
616
+
617
+ def test_named_scope_with_intersects_with
618
+ reader = Authorization::Reader::DSLReader.new
619
+ reader.parse %{
620
+ authorization do
621
+ role :test_role do
622
+ has_permission_on :test_models, :to => :read do
623
+ if_attribute :test_attrs => intersects_with { user.test_attrs }
624
+ end
625
+ end
626
+ end
627
+ }
628
+ Authorization::Engine.instance(reader)
629
+
630
+ test_model_1 = TestModel.create!
631
+ test_model_2 = TestModel.create!
632
+ test_model_1.test_attrs.create!
633
+ test_model_1.test_attrs.create!
634
+ test_model_1.test_attrs.create!
635
+ test_model_2.test_attrs.create!
636
+
637
+ user = MockUser.new(:test_role,
638
+ :test_attrs => [test_model_1.test_attrs.first, TestAttr.create!])
639
+ assert_equal 1, TestModel.with_permissions_to(:read, :user => user).length
640
+
641
+ user = MockUser.new(:test_role,
642
+ :test_attrs => [TestAttr.create!])
643
+ assert_equal 0, TestModel.with_permissions_to(:read, :user => user).length
644
+
645
+ TestModel.delete_all
646
+ TestAttr.delete_all
647
+ end
648
+
649
+ def test_named_scope_with_is_and_has_one
650
+ reader = Authorization::Reader::DSLReader.new
651
+ reader.parse %{
652
+ authorization do :test_attr_has_one
653
+ role :test_role do
654
+ has_permission_on :test_models, :to => :read do
655
+ if_attribute :test_attr_has_one => is { user.test_attr }
656
+ end
657
+ end
658
+ end
659
+ }
660
+ Authorization::Engine.instance(reader)
661
+
662
+ test_model_1 = TestModel.create!
663
+ test_attr_1 = test_model_1.test_attrs.create!
664
+ TestModel.create!.test_attrs.create!
665
+
666
+ user = MockUser.new(:test_role, :test_attr => test_attr_1)
667
+ assert_equal 1, TestModel.with_permissions_to(:read,
668
+ :context => :test_models, :user => user).length
669
+
670
+ TestModel.delete_all
671
+ TestAttr.delete_all
672
+ end
673
+
674
+ def test_permit_with_has_one_raises_no_name_error
675
+ reader = Authorization::Reader::DSLReader.new
676
+ reader.parse %{
677
+ authorization do :test_attr_has_one
678
+ role :test_role do
679
+ has_permission_on :test_attrs, :to => :update do
680
+ if_attribute :id => is { user.test_attr.id }
681
+ end
682
+ end
683
+ end
684
+ }
685
+ instance = Authorization::Engine.instance(reader)
686
+
687
+ test_model = TestModel.create!
688
+ test_attr = test_model.create_test_attr_has_one
689
+ assert !test_attr.new_record?
690
+
691
+ user = MockUser.new(:test_role, :test_attr => test_attr)
692
+
693
+ assert_nothing_raised do
694
+ assert instance.permit?(:update, :user => user, :object => test_model.test_attr_has_one)
695
+ end
696
+
697
+ TestModel.delete_all
698
+ TestAttr.delete_all
699
+ end
700
+
701
+ def test_named_scope_with_is_and_has_one_through_conditions
702
+ reader = Authorization::Reader::DSLReader.new
703
+ reader.parse %{
704
+ authorization do
705
+ role :test_role do
706
+ has_permission_on :test_models, :to => :read do
707
+ if_attribute :test_attr_throughs_with_attr_and_has_one => contains { user }
708
+ end
709
+ end
710
+ end
711
+ }
712
+ Authorization::Engine.instance(reader)
713
+
714
+ test_model_1 = TestModel.create!
715
+ test_model_2 = TestModel.create!
716
+ test_model_1.test_attrs.create!(:attr => 1).test_attr_throughs.create!
717
+ test_model_1.test_attrs.create!(:attr => 2).test_attr_throughs.create!
718
+ test_model_2.test_attrs.create!(:attr => 1).test_attr_throughs.create!
719
+ test_model_2.test_attrs.create!(:attr => 2).test_attr_throughs.create!
720
+
721
+ #assert_equal 1, test_model_1.test_attrs_with_attr.length
722
+ user = MockUser.new(:test_role,
723
+ :id => test_model_1.test_attr_throughs.first.id)
724
+ assert_equal 1, TestModel.with_permissions_to(:read, :user => user).length
725
+ user = MockUser.new(:test_role,
726
+ :id => test_model_1.test_attr_throughs.last.id)
727
+ assert_equal 0, TestModel.with_permissions_to(:read, :user => user).length
728
+
729
+ TestModel.delete_all
730
+ TestAttr.delete_all
731
+ end
732
+
733
+ def test_named_scope_with_is_in
734
+ reader = Authorization::Reader::DSLReader.new
735
+ reader.parse %{
736
+ authorization do
737
+ role :test_role do
738
+ has_permission_on :test_attrs, :to => :read do
739
+ if_attribute :test_model => is_in { [user.test_model, user.test_model_2] }
740
+ end
741
+ end
742
+ end
743
+ }
744
+ Authorization::Engine.instance(reader)
745
+
746
+ test_model_1 = TestModel.create!
747
+ test_model_2 = TestModel.create!
748
+ test_model_1.test_attrs.create!
749
+ TestModel.create!.test_attrs.create!
750
+
751
+ user = MockUser.new(:test_role, :test_model => test_model_1,
752
+ :test_model_2 => test_model_2)
753
+ assert_equal 1, TestAttr.with_permissions_to(:read,
754
+ :context => :test_attrs, :user => user).length
755
+
756
+ TestModel.delete_all
757
+ TestAttr.delete_all
758
+ end
759
+
760
+ def test_named_scope_with_not_is_in
761
+ reader = Authorization::Reader::DSLReader.new
762
+ reader.parse %{
763
+ authorization do
764
+ role :test_role do
765
+ has_permission_on :test_attrs, :to => :read do
766
+ if_attribute :test_model => is_not_in { [user.test_model, user.test_model_2] }
767
+ end
768
+ end
769
+ end
770
+ }
771
+ Authorization::Engine.instance(reader)
772
+
773
+ test_model_1 = TestModel.create!
774
+ test_model_2 = TestModel.create!
775
+ test_model_1.test_attrs.create!
776
+ TestModel.create!.test_attrs.create!
777
+
778
+ user = MockUser.new(:test_role, :test_model => test_model_1,
779
+ :test_model_2 => test_model_2)
780
+ assert_equal 1, TestAttr.with_permissions_to(:read,
781
+ :context => :test_attrs, :user => user).length
782
+
783
+ TestModel.delete_all
784
+ TestAttr.delete_all
785
+ end
786
+
787
+ def test_named_scope_with_if_permitted_to
788
+ reader = Authorization::Reader::DSLReader.new
789
+ reader.parse %{
790
+ authorization do
791
+ role :test_role do
792
+ has_permission_on :test_models, :to => :read do
793
+ if_attribute :test_attrs => contains { user }
794
+ end
795
+ has_permission_on :test_attrs, :to => :read do
796
+ if_permitted_to :read, :test_model
797
+ end
798
+ end
799
+ end
800
+ }
801
+ Authorization::Engine.instance(reader)
802
+
803
+ test_model_1 = TestModel.create!
804
+ test_attr_1 = test_model_1.test_attrs.create!
805
+
806
+ user = MockUser.new(:test_role, :id => test_attr_1.id)
807
+ assert_equal 1, TestAttr.with_permissions_to(:read, :user => user).length
808
+ TestModel.delete_all
809
+ TestAttr.delete_all
810
+ end
811
+
812
+ def test_named_scope_with_if_permitted_to_and_empty_obligations
813
+ reader = Authorization::Reader::DSLReader.new
814
+ reader.parse %{
815
+ authorization do
816
+ role :test_role do
817
+ has_permission_on :test_models, :to => :read
818
+ has_permission_on :test_attrs, :to => :read do
819
+ if_permitted_to :read, :test_model
820
+ end
821
+ end
822
+ end
823
+ }
824
+ Authorization::Engine.instance(reader)
825
+
826
+ test_model_1 = TestModel.create!
827
+ test_attr_1 = test_model_1.test_attrs.create!
828
+
829
+ user = MockUser.new(:test_role)
830
+ assert_equal 1, TestAttr.with_permissions_to(:read, :user => user).length
831
+ TestModel.delete_all
832
+ TestAttr.delete_all
833
+ end
834
+
835
+ def test_named_scope_with_if_permitted_to_nil
836
+ reader = Authorization::Reader::DSLReader.new
837
+ reader.parse %{
838
+ authorization do
839
+ role :test_role do
840
+ has_permission_on :test_models, :to => :read do
841
+ if_attribute :test_attrs => contains { user }
842
+ end
843
+ has_permission_on :test_attrs, :to => :read do
844
+ if_permitted_to :read, :test_model
845
+ end
846
+ end
847
+ end
848
+ }
849
+ Authorization::Engine.instance(reader)
850
+
851
+ test_attr_1 = TestAttr.create!
852
+
853
+ user = MockUser.new(:test_role, :id => test_attr_1.id)
854
+ assert_equal 0, TestAttr.with_permissions_to(:read, :user => user).length
855
+ TestAttr.delete_all
856
+ end
857
+
858
+ def test_named_scope_with_if_permitted_to_self
859
+ reader = Authorization::Reader::DSLReader.new
860
+ reader.parse %{
861
+ authorization do
862
+ role :test_role do
863
+ has_permission_on :test_models, :to => :read do
864
+ if_attribute :test_attrs => contains { user }
865
+ end
866
+ has_permission_on :test_models, :to => :update do
867
+ if_permitted_to :read
868
+ end
869
+ end
870
+ end
871
+ }
872
+ Authorization::Engine.instance(reader)
873
+
874
+ test_model_1 = TestModel.create!
875
+ test_attr_1 = test_model_1.test_attrs.create!
876
+ test_attr_2 = TestAttr.create!
877
+
878
+ user = MockUser.new(:test_role, :id => test_attr_1.id)
879
+ assert_equal 1, TestModel.with_permissions_to(:update, :user => user).length
880
+ TestAttr.delete_all
881
+ TestModel.delete_all
882
+ end
883
+
884
+ def test_model_security
885
+ reader = Authorization::Reader::DSLReader.new
886
+ reader.parse %{
887
+ authorization do
888
+ role :test_role_unrestricted do
889
+ has_permission_on :test_model_security_models do
890
+ to :read, :create, :update, :delete
891
+ end
892
+ end
893
+ role :test_role do
894
+ has_permission_on :test_model_security_models do
895
+ to :read, :create, :update, :delete
896
+ if_attribute :attr => is { 1 }
897
+ end
898
+ end
899
+ role :test_role_restricted do
900
+ end
901
+ end
902
+ }
903
+ Authorization::Engine.instance(reader)
904
+
905
+ Authorization.current_user = MockUser.new(:test_role)
906
+ assert(object = TestModelSecurityModel.create)
907
+ Authorization.current_user = MockUser.new(:test_role_restricted)
908
+ assert_raise Authorization::NotAuthorized do
909
+ object.update_attributes(:attr_2 => 2)
910
+ end
911
+ Authorization.current_user = MockUser.new(:test_role)
912
+ assert_nothing_raised { object.update_attributes(:attr_2 => 2) }
913
+ object.reload
914
+ assert_equal 2, object.attr_2
915
+ object.destroy
916
+ assert_raise ActiveRecord::RecordNotFound do
917
+ TestModelSecurityModel.find(object.id)
918
+ end
919
+
920
+ assert_raise Authorization::AttributeAuthorizationError do
921
+ TestModelSecurityModel.create :attr => 2
922
+ end
923
+ object = TestModelSecurityModel.create
924
+ assert_raise Authorization::AttributeAuthorizationError do
925
+ object.update_attributes(:attr => 2)
926
+ end
927
+ Authorization.current_user = MockUser.new(:test_role_unrestricted)
928
+ object = TestModelSecurityModel.create :attr => 2
929
+ object_with_find = TestModelSecurityModelWithFind.create :attr => 2
930
+ Authorization.current_user = MockUser.new(:test_role)
931
+ assert_nothing_raised do
932
+ object.class.find(object.id)
933
+ end
934
+ assert_raise Authorization::AttributeAuthorizationError do
935
+ object_with_find.class.find(object_with_find.id)
936
+ end
937
+ assert_raise Authorization::AttributeAuthorizationError do
938
+ object.update_attributes(:attr_2 => 2)
939
+ end
940
+ # TODO test this:
941
+ #assert_raise Authorization::AuthorizationError do
942
+ # object.update_attributes(:attr => 1)
943
+ #end
944
+ assert_raise Authorization::AttributeAuthorizationError do
945
+ object.destroy
946
+ end
947
+
948
+ Authorization.current_user = MockUser.new(:test_role_2)
949
+ assert_raise Authorization::NotAuthorized do
950
+ TestModelSecurityModel.create
951
+ end
952
+ end
953
+
954
+ def test_model_security_with_assoc
955
+ reader = Authorization::Reader::DSLReader.new
956
+ reader.parse %{
957
+ authorization do
958
+ role :test_role do
959
+ has_permission_on :test_model_security_models do
960
+ to :create, :update, :delete
961
+ if_attribute :test_attrs => contains { user }
962
+ end
963
+ end
964
+ end
965
+ }
966
+ Authorization::Engine.instance(reader)
967
+
968
+ test_attr = TestAttr.create
969
+ test_attr.role_symbols << :test_role
970
+ Authorization.current_user = test_attr
971
+ assert(object = TestModelSecurityModel.create(:test_attrs => [test_attr]))
972
+ assert_nothing_raised do
973
+ object.update_attributes(:attr_2 => 2)
974
+ end
975
+ object.reload
976
+ assert_equal 2, object.attr_2
977
+ object.destroy
978
+ assert_raise ActiveRecord::RecordNotFound do
979
+ TestModelSecurityModel.find(object.id)
980
+ end
981
+ end
982
+
983
+ def test_using_access_control
984
+ assert !TestModel.using_access_control?
985
+ assert TestModelSecurityModel.using_access_control?
986
+ end
987
+
988
+ def test_authorization_permit_association_proxy
989
+ reader = Authorization::Reader::DSLReader.new
990
+ reader.parse %{
991
+ authorization do
992
+ role :test_role do
993
+ has_permission_on :test_attrs, :to => :read do
994
+ if_attribute :test_model => {:content => "content" }
995
+ end
996
+ end
997
+ end
998
+ }
999
+ engine = Authorization::Engine.instance(reader)
1000
+
1001
+ test_model = TestModel.create(:content => "content")
1002
+ assert engine.permit?(:read, :object => test_model.test_attrs,
1003
+ :user => MockUser.new(:test_role))
1004
+ assert !engine.permit?(:read, :object => TestAttr.new,
1005
+ :user => MockUser.new(:test_role))
1006
+ TestModel.delete_all
1007
+ end
1008
+
1009
+ def test_multiple_roles_with_has_many_through
1010
+ reader = Authorization::Reader::DSLReader.new
1011
+ reader.parse %{
1012
+ authorization do
1013
+ role :test_role_1 do
1014
+ has_permission_on :test_models, :to => :read do
1015
+ if_attribute :test_attr_throughs => contains {user.test_attr_through_id},
1016
+ :content => 'test_1'
1017
+ end
1018
+ end
1019
+
1020
+ role :test_role_2 do
1021
+ has_permission_on :test_models, :to => :read do
1022
+ if_attribute :test_attr_throughs_2 => contains {user.test_attr_through_2_id},
1023
+ :content => 'test_2'
1024
+ end
1025
+ end
1026
+ end
1027
+ }
1028
+ Authorization::Engine.instance(reader)
1029
+
1030
+ test_model_1 = TestModel.create! :content => 'test_1'
1031
+ test_model_2 = TestModel.create! :content => 'test_2'
1032
+ test_model_1.test_attrs.create!.test_attr_throughs.create!
1033
+ test_model_2.test_attrs.create!.test_attr_throughs.create!
1034
+
1035
+ user = MockUser.new(:test_role_1, :test_role_2,
1036
+ :test_attr_through_id => test_model_1.test_attr_throughs.first.id,
1037
+ :test_attr_through_2_id => test_model_2.test_attr_throughs.first.id)
1038
+ assert_equal 2, TestModel.with_permissions_to(:read, :user => user).length
1039
+ TestModel.delete_all
1040
+ TestAttr.delete_all
1041
+ TestAttrThrough.delete_all
1042
+ end
1043
+
1044
+ def test_named_scope_with_has_many_and_reoccuring_tables
1045
+ reader = Authorization::Reader::DSLReader.new
1046
+ reader.parse %{
1047
+ authorization do
1048
+ role :test_role do
1049
+ has_permission_on :test_attrs, :to => :read do
1050
+ if_attribute :test_another_model => { :content => 'test_1_2' },
1051
+ :test_model => { :content => 'test_1_1' }
1052
+ end
1053
+ end
1054
+ end
1055
+ }
1056
+ Authorization::Engine.instance(reader)
1057
+
1058
+ test_attr_1 = TestAttr.create!(
1059
+ :test_model => TestModel.create!(:content => 'test_1_1'),
1060
+ :test_another_model => TestModel.create!(:content => 'test_1_2')
1061
+ )
1062
+ test_attr_2 = TestAttr.create!(
1063
+ :test_model => TestModel.create!(:content => 'test_2_1'),
1064
+ :test_another_model => TestModel.create!(:content => 'test_2_2')
1065
+ )
1066
+
1067
+ user = MockUser.new(:test_role)
1068
+ assert_equal 1, TestAttr.with_permissions_to(:read, :user => user).length
1069
+ TestModel.delete_all
1070
+ TestAttr.delete_all
1071
+ end
1072
+
1073
+ def test_named_scope_with_ored_rules_and_reoccuring_tables
1074
+ reader = Authorization::Reader::DSLReader.new
1075
+ reader.parse %{
1076
+ authorization do
1077
+ role :test_role do
1078
+ has_permission_on :test_attrs, :to => :read do
1079
+ if_attribute :test_another_model => { :content => 'test_1_2' },
1080
+ :test_model => { :content => 'test_1_1' }
1081
+ end
1082
+ has_permission_on :test_attrs, :to => :read do
1083
+ if_attribute :test_another_model => { :content => 'test_2_2' },
1084
+ :test_model => { :test_attrs => contains {user.test_attr} }
1085
+ end
1086
+ end
1087
+ end
1088
+ }
1089
+ Authorization::Engine.instance(reader)
1090
+
1091
+ test_attr_1 = TestAttr.create!(
1092
+ :test_model => TestModel.create!(:content => 'test_1_1'),
1093
+ :test_another_model => TestModel.create!(:content => 'test_1_2')
1094
+ )
1095
+ test_attr_2 = TestAttr.create!(
1096
+ :test_model => TestModel.create!(:content => 'test_2_1'),
1097
+ :test_another_model => TestModel.create!(:content => 'test_2_2')
1098
+ )
1099
+ test_attr_2.test_model.test_attrs.create!
1100
+
1101
+ user = MockUser.new(:test_role, :test_attr => test_attr_2.test_model.test_attrs.last)
1102
+ assert_equal 2, TestAttr.with_permissions_to(:read, :user => user).length
1103
+ TestModel.delete_all
1104
+ TestAttr.delete_all
1105
+ end
1106
+
1107
+ def test_named_scope_with_many_ored_rules_and_reoccuring_tables
1108
+ reader = Authorization::Reader::DSLReader.new
1109
+ reader.parse %{
1110
+ authorization do
1111
+ role :test_role do
1112
+ has_permission_on :test_attrs, :to => :read do
1113
+ if_attribute :branch => { :company => { :country => {
1114
+ :test_models => contains { user.test_model }
1115
+ }} }
1116
+ if_attribute :company => { :country => {
1117
+ :test_models => contains { user.test_model }
1118
+ }}
1119
+ end
1120
+ end
1121
+ end
1122
+ }
1123
+ Authorization::Engine.instance(reader)
1124
+
1125
+ country = Country.create!(:name => 'country_1')
1126
+ country.test_models.create!
1127
+ test_attr_1 = TestAttr.create!(
1128
+ :branch => Branch.create!(:name => 'branch_1',
1129
+ :company => Company.create!(:name => 'company_1',
1130
+ :country => country))
1131
+ )
1132
+ test_attr_2 = TestAttr.create!(
1133
+ :company => Company.create!(:name => 'company_2',
1134
+ :country => country)
1135
+ )
1136
+
1137
+ user = MockUser.new(:test_role, :test_model => country.test_models.first)
1138
+
1139
+ assert_equal 2, TestAttr.with_permissions_to(:read, :user => user).length
1140
+ TestModel.delete_all
1141
+ TestAttr.delete_all
1142
+ end
1143
+ end