uhees-declarative_authorization 0.3.1

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