careacademy-acl9 3.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 (138) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +24 -0
  3. data/.ruby-version +1 -0
  4. data/.travis.yml +26 -0
  5. data/Appraisals +23 -0
  6. data/CHANGELOG.md +122 -0
  7. data/CONTRIBUTING.md +62 -0
  8. data/Gemfile +7 -0
  9. data/Gemfile.lock +167 -0
  10. data/LICENSE +9 -0
  11. data/MIT-LICENSE +20 -0
  12. data/README.md +326 -0
  13. data/Rakefile +20 -0
  14. data/TODO +42 -0
  15. data/acl9.gemspec +27 -0
  16. data/bin/appraisal +16 -0
  17. data/bin/bundler +16 -0
  18. data/bin/cc-tddium-post-worker +16 -0
  19. data/bin/erubis +16 -0
  20. data/bin/rackup +16 -0
  21. data/bin/rails +16 -0
  22. data/bin/rake +16 -0
  23. data/bin/sprockets +16 -0
  24. data/bin/tapout +16 -0
  25. data/bin/thor +16 -0
  26. data/bin/tilt +16 -0
  27. data/bin/yard +16 -0
  28. data/bin/yardoc +16 -0
  29. data/bin/yri +16 -0
  30. data/gemfiles/.bundle/config +2 -0
  31. data/gemfiles/rails_5.0.gemfile +10 -0
  32. data/gemfiles/rails_5.1.gemfile +10 -0
  33. data/gemfiles/rails_5.2.gemfile +9 -0
  34. data/gemfiles/rails_6.0.gemfile +9 -0
  35. data/gemfiles/rails_6.1.gemfile +9 -0
  36. data/gemfiles/rails_7.0.gemfile +9 -0
  37. data/lib/acl9/controller_extensions/dsl_base.rb +212 -0
  38. data/lib/acl9/controller_extensions/generators.rb +166 -0
  39. data/lib/acl9/controller_extensions.rb +85 -0
  40. data/lib/acl9/helpers.rb +49 -0
  41. data/lib/acl9/model_extensions/for_object.rb +74 -0
  42. data/lib/acl9/model_extensions/for_subject.rb +232 -0
  43. data/lib/acl9/model_extensions.rb +136 -0
  44. data/lib/acl9/prepositions.rb +18 -0
  45. data/lib/acl9/version.rb +3 -0
  46. data/lib/acl9.rb +78 -0
  47. data/lib/generators/acl9/setup/USAGE +35 -0
  48. data/lib/generators/acl9/setup/setup_generator.rb +122 -0
  49. data/lib/generators/acl9/setup/templates/create_role_tables.rb +31 -0
  50. data/lib/generators/acl9/setup/templates/role.rb +3 -0
  51. data/test/config_test.rb +55 -0
  52. data/test/controller_extensions/actions_test.rb +199 -0
  53. data/test/controller_extensions/anon_test.rb +39 -0
  54. data/test/controller_extensions/base.rb +96 -0
  55. data/test/controller_extensions/basics_test.rb +44 -0
  56. data/test/controller_extensions/conditions_test.rb +48 -0
  57. data/test/controller_extensions/method_test.rb +70 -0
  58. data/test/controller_extensions/multi_match_test.rb +142 -0
  59. data/test/controller_extensions/multiple_role_arguments_test.rb +136 -0
  60. data/test/controller_extensions/prepositions_test.rb +108 -0
  61. data/test/controller_extensions/pseudo_role_test.rb +26 -0
  62. data/test/controller_extensions/role_test.rb +75 -0
  63. data/test/controllers/acl_action_override_test.rb +24 -0
  64. data/test/controllers/acl_arguments_test.rb +5 -0
  65. data/test/controllers/acl_block_test.rb +5 -0
  66. data/test/controllers/acl_boolean_method_test.rb +5 -0
  67. data/test/controllers/acl_helper_method_test.rb +29 -0
  68. data/test/controllers/acl_ivars_test.rb +15 -0
  69. data/test/controllers/acl_method2_test.rb +6 -0
  70. data/test/controllers/acl_method_test.rb +6 -0
  71. data/test/controllers/acl_object_hash_test.rb +18 -0
  72. data/test/controllers/acl_query_method_named_test.rb +9 -0
  73. data/test/controllers/acl_query_method_test.rb +9 -0
  74. data/test/controllers/acl_query_method_with_lambda_test.rb +9 -0
  75. data/test/controllers/acl_query_mixin.rb +54 -0
  76. data/test/controllers/acl_subject_method_test.rb +15 -0
  77. data/test/controllers/arguments_checking_test.rb +43 -0
  78. data/test/dummy/app/assets/config/manifest.js +0 -0
  79. data/test/dummy/app/controllers/acl_action_override.rb +15 -0
  80. data/test/dummy/app/controllers/acl_arguments.rb +10 -0
  81. data/test/dummy/app/controllers/acl_block.rb +6 -0
  82. data/test/dummy/app/controllers/acl_boolean_method.rb +23 -0
  83. data/test/dummy/app/controllers/acl_helper_method.rb +11 -0
  84. data/test/dummy/app/controllers/acl_ivars.rb +17 -0
  85. data/test/dummy/app/controllers/acl_method.rb +6 -0
  86. data/test/dummy/app/controllers/acl_method2.rb +6 -0
  87. data/test/dummy/app/controllers/acl_objects_hash.rb +10 -0
  88. data/test/dummy/app/controllers/acl_query_method.rb +9 -0
  89. data/test/dummy/app/controllers/acl_query_method_named.rb +15 -0
  90. data/test/dummy/app/controllers/acl_query_method_with_lambda.rb +9 -0
  91. data/test/dummy/app/controllers/acl_subject_method.rb +16 -0
  92. data/test/dummy/app/controllers/application_controller.rb +13 -0
  93. data/test/dummy/app/controllers/empty_controller.rb +5 -0
  94. data/test/dummy/app/helpers/application_helper.rb +2 -0
  95. data/test/dummy/app/helpers/some_helper.rb +8 -0
  96. data/test/dummy/app/models/.keep +0 -0
  97. data/test/dummy/app/models/access.rb +3 -0
  98. data/test/dummy/app/models/account.rb +3 -0
  99. data/test/dummy/app/models/bar.rb +3 -0
  100. data/test/dummy/app/models/concerns/.keep +0 -0
  101. data/test/dummy/app/models/foo.rb +3 -0
  102. data/test/dummy/app/models/foo_bar.rb +3 -0
  103. data/test/dummy/app/models/other/foo.rb +5 -0
  104. data/test/dummy/app/models/other/role.rb +5 -0
  105. data/test/dummy/app/models/other/user.rb +5 -0
  106. data/test/dummy/app/models/role.rb +3 -0
  107. data/test/dummy/app/models/string_object_role.rb +3 -0
  108. data/test/dummy/app/models/string_user.rb +3 -0
  109. data/test/dummy/app/models/user.rb +3 -0
  110. data/test/dummy/app/models/uuid.rb +4 -0
  111. data/test/dummy/config/application.rb +23 -0
  112. data/test/dummy/config/boot.rb +4 -0
  113. data/test/dummy/config/database.yml +25 -0
  114. data/test/dummy/config/environment.rb +5 -0
  115. data/test/dummy/config/environments/development.rb +37 -0
  116. data/test/dummy/config/environments/test.rb +40 -0
  117. data/test/dummy/config/initializers/assets.rb +8 -0
  118. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  119. data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
  120. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  121. data/test/dummy/config/initializers/inflections.rb +16 -0
  122. data/test/dummy/config/initializers/mime_types.rb +4 -0
  123. data/test/dummy/config/initializers/secrets.rb +1 -0
  124. data/test/dummy/config/initializers/session_store.rb +3 -0
  125. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  126. data/test/dummy/config/locales/en.yml +23 -0
  127. data/test/dummy/config/routes.rb +14 -0
  128. data/test/dummy/config.ru +4 -0
  129. data/test/dummy/db/migrate/20141117132218_create_tables.rb +149 -0
  130. data/test/helpers/helper_test.rb +89 -0
  131. data/test/models/roles_test.rb +369 -0
  132. data/test/models/roles_with_custom_association_names_test.rb +28 -0
  133. data/test/models/roles_with_custom_class_names_test.rb +28 -0
  134. data/test/models/system_roles_test.rb +22 -0
  135. data/test/models/users_roles_and_subjects_with_namespaced_class_names_test.rb +30 -0
  136. data/test/test_helper.rb +94 -0
  137. data/test/version_test.rb +7 -0
  138. metadata +321 -0
@@ -0,0 +1,136 @@
1
+ require_relative 'base'
2
+
3
+ module ControllerExtensions
4
+ class MultipleRoleArgumentsTest < Base
5
+ test "#allow should be able to receive a role list (global roles)" do
6
+ assert ( bzz = User.create ).has_role! :bzz
7
+ assert ( whoa = User.create ).has_role! :whoa
8
+
9
+ @tester.acl_block! do
10
+ allow :bzz, :whoa
11
+ end
12
+ assert_permitted bzz
13
+ assert_permitted whoa
14
+ assert_forbidden nil
15
+ assert_forbidden User.create
16
+ end
17
+
18
+ test "#allow should be able to receive a role list (object roles)" do
19
+ assert foo = Foo.create
20
+ assert foo_too = Foo.create
21
+
22
+ assert ( maker = User.create ).has_role! :maker, foo
23
+ assert ( faker = User.create ).has_role! :faker, foo_too
24
+
25
+ @tester.acl_block! do
26
+ allow :maker, :faker, :of => :foo
27
+ end
28
+
29
+ assert_permitted maker, :foo => foo
30
+ assert_forbidden maker, :foo => foo_too
31
+ assert_permitted faker, :foo => foo_too
32
+ assert_forbidden faker, :foo => foo
33
+
34
+ assert other = User.create
35
+ assert_forbidden other, :foo => foo
36
+ assert_forbidden other, :foo => foo_too
37
+ assert_forbidden nil
38
+ end
39
+
40
+ test "#allow should be able to receive a role list (class roles)" do
41
+ assert ( frooble = User.create ).has_role! :frooble, Foo
42
+ assert ( oombigle = User.create ).has_role! :oombigle, Foo
43
+ assert ( lame_frooble = User.create ).has_role! :frooble
44
+
45
+ @tester.acl_block! do
46
+ allow :frooble, :oombigle, :by => Foo
47
+ end
48
+ assert_permitted frooble
49
+ assert_permitted oombigle
50
+ assert_forbidden lame_frooble
51
+ assert_forbidden nil
52
+ end
53
+
54
+ test "#deny should be able to receive a role list (global roles)" do
55
+ assert ( bzz = User.create ).has_role! :bzz
56
+ assert ( whoa = User.create ).has_role! :whoa
57
+
58
+ @tester.acl_block! do
59
+ default :allow
60
+ deny :bzz, :whoa
61
+ end
62
+
63
+ assert_forbidden bzz
64
+ assert_forbidden whoa
65
+ assert_permitted nil
66
+ assert_permitted User.create
67
+ end
68
+
69
+ test "#deny should be able to receive a role list (object roles)" do
70
+ assert foo = Foo.create
71
+ assert foo_too = Foo.create
72
+
73
+ assert ( maker = User.create ).has_role! :maker, foo
74
+ assert ( faker = User.create ).has_role! :faker, foo_too
75
+
76
+ @tester.acl_block! do
77
+ default :allow
78
+ deny :maker, :faker, :of => :foo
79
+ end
80
+
81
+ assert_forbidden maker, :foo => foo
82
+ assert_permitted maker, :foo => foo_too
83
+ assert_forbidden faker, :foo => foo_too
84
+ assert_permitted faker, :foo => foo
85
+
86
+ assert other = User.create
87
+ assert_permitted other, :foo => foo
88
+ assert_permitted other, :foo => foo_too
89
+ assert_permitted nil
90
+ end
91
+
92
+ test "#deny should be able to receive a role list (class roles)" do
93
+ assert ( frooble = User.create ).has_role! :frooble, Foo
94
+ assert ( oombigle = User.create ).has_role! :oombigle, Foo
95
+ assert ( lame_frooble = User.create ).has_role! :frooble
96
+
97
+ @tester.acl_block! do
98
+ default :allow
99
+ deny :frooble, :oombigle, :by => Foo
100
+ end
101
+
102
+ assert_forbidden frooble
103
+ assert_forbidden oombigle
104
+ assert_permitted lame_frooble
105
+ assert_permitted nil
106
+ end
107
+
108
+ test "should also respect :to and :except" do
109
+ assert foo = Foo.create
110
+ assert too = Foo.create
111
+
112
+ assert ( goo = User.create ).has_role! :goo
113
+ assert ( joo = User.create ).has_role! :joo, foo
114
+ assert ( qoo = User.create ).has_role! :qoo, Bar
115
+
116
+ @tester.acl_block! do
117
+ allow :goo, :boo, :to => [:index, :show]
118
+ allow :zoo, :joo, :by => :foo, :to => [:edit, :update]
119
+ allow :qoo, :woo, :of => Bar
120
+ deny :qoo, :woo, :of => Bar, :except => [:delete, :destroy]
121
+ end
122
+
123
+ assert_permitted goo, 'index'
124
+ assert_permitted goo, 'show'
125
+ assert_forbidden goo, 'edit', foo: too
126
+ assert_permitted joo, 'edit', :foo => foo
127
+ assert_permitted joo, 'update', :foo => foo
128
+ assert_forbidden joo, 'show', :foo => foo
129
+ assert_forbidden joo, 'show', foo: foo
130
+ assert_permitted qoo, 'delete', foo: too
131
+ assert_permitted qoo, 'destroy', foo: too
132
+ assert_forbidden qoo, 'edit', foo: too
133
+ assert_forbidden qoo, 'show', foo: too
134
+ end
135
+ end
136
+ end
@@ -0,0 +1,108 @@
1
+ require_relative 'base'
2
+
3
+ module ControllerExtensions
4
+ class PrepositionsTest < Base
5
+
6
+ %i[of for in on at by].each do |prep|
7
+ test "allow :#{prep} => :foo checks @foo" do
8
+ assert @foo = Foo.first_or_create
9
+ assert ( user = User.create ).has_role! :manager, @foo
10
+
11
+ @tester.acl_block! do
12
+ allow :manager, prep => :foo
13
+ end
14
+
15
+ assert other_foo = Foo.create
16
+
17
+ assert_permitted user, :foo => @foo
18
+ assert_forbidden user, :foo => other_foo
19
+ assert_forbidden user, :foo => Foo
20
+ assert_forbidden nil, :foo => @foo
21
+ assert_forbidden User.create, :foo => @foo
22
+ end
23
+
24
+ test "invalid allow :#{prep} arg raises ArgumentError" do
25
+ assert_raise ArgumentError do
26
+ @tester.acl_block! { allow :hom, :by => 1 }
27
+ end
28
+ end
29
+ end
30
+
31
+ test "invalid option raises ArgumentError" do
32
+ assert @foo = Foo.first_or_create
33
+ assert ( user = User.create).has_role! :manager, of: @foo
34
+
35
+ assert_raise ArgumentError do
36
+ @tester.acl_block! { allow :manager, of: :foo, something_bad: :foo }
37
+ end
38
+ end
39
+
40
+ test "allow class role allowed" do
41
+ assert ( user = User.create ).has_role! :owner, Foo
42
+
43
+ @tester.acl_block! do
44
+ allow :owner, :of => Foo
45
+ end
46
+
47
+ assert_permitted user
48
+ assert_forbidden nil
49
+ assert_forbidden User.create
50
+ end
51
+
52
+ %i[of for in on at by].each do |prep|
53
+ test "deny :#{prep} => :foo checks @foo" do
54
+ assert @foo = Foo.first_or_create
55
+ assert ( user = User.create ).has_role! :thief, @foo
56
+
57
+ @tester.acl_block! do
58
+ default :allow
59
+ deny :thief, prep => :foo
60
+ end
61
+
62
+ assert_forbidden user, :foo => @foo
63
+ assert_permitted user, :foo => Foo.create
64
+ assert_permitted user, :foo => Foo
65
+ assert_permitted nil, :foo => @foo
66
+ assert_permitted User.create, :foo => @foo
67
+ end
68
+
69
+ test "invalid deny :#{prep} arg raises ArgumentError" do
70
+ assert_raise ArgumentError do
71
+ @tester.acl_block! { deny :her, :for => "him" }
72
+ end
73
+ end
74
+ end
75
+
76
+ test "deny class role denied" do
77
+ assert ( user = User.create ).has_role! :ignorant, Foo
78
+
79
+ @tester.acl_block! do
80
+ default :allow
81
+ deny :ignorant, :of => Foo
82
+ end
83
+
84
+ assert_forbidden user, Foo
85
+ assert_permitted nil
86
+ assert_permitted User.create
87
+ end
88
+
89
+ test "> 1 allow prepositions raises ArgumentError" do
90
+ assert_raise ArgumentError do
91
+ @tester.acl_block! { allow :some, :by => :one, :for => :another }
92
+ end
93
+ end
94
+
95
+ test "> 1 deny prepositions raises ArgumentError" do
96
+ assert_raise ArgumentError do
97
+ @tester.acl_block! { deny :some, :in => :here, :on => :today }
98
+ end
99
+ end
100
+
101
+ test "should raise an ArgumentError when both :to and :except are specified" do
102
+ assert_raise ArgumentError do
103
+ @tester.acl_block! { allow all, :to => :index, :except => ['show', 'edit'] }
104
+ end
105
+ end
106
+
107
+ end
108
+ end
@@ -0,0 +1,26 @@
1
+ require_relative 'base'
2
+
3
+ module ControllerExtensions
4
+ class PseudoRoleTest < Base
5
+ %i[all everyone everybody anyone].each do |pseudorole|
6
+ test "allow #{pseudorole} allows all" do
7
+ @tester.acl_block! do
8
+ allow send pseudorole
9
+ end
10
+
11
+ assert_equal :deny, @tester.default_action
12
+ assert_all_permitted
13
+ end
14
+
15
+ test "deny #{pseudorole} denies all" do
16
+ @tester.acl_block! do
17
+ default :allow
18
+ deny send pseudorole
19
+ end
20
+
21
+ assert_equal :allow, @tester.default_action
22
+ assert_all_forbidden
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,75 @@
1
+ require_relative 'base'
2
+
3
+ module ControllerExtensions
4
+ class RoleTest < Base
5
+ test "allows admin implicit default" do
6
+ @tester.acl_block! { allow :admin }
7
+
8
+ assert_admins_permitted
9
+ assert_forbidden nil
10
+
11
+ assert ( user = User.create ).has_role! :cool
12
+ assert_forbidden user
13
+ end
14
+
15
+ test "allow plural admins implicit default" do
16
+ @tester.acl_block! do
17
+ allow :admins
18
+ end
19
+
20
+ assert_admins_permitted
21
+ assert_forbidden nil
22
+
23
+ assert ( user = User.create ).has_role! :cool
24
+ assert_forbidden user
25
+ end
26
+
27
+ test "allow with several roles" do
28
+ assert ( cool1_user = User.create ).has_role! :cool
29
+ assert ( cool2_user = User.create ).has_role! :cool
30
+ assert ( super_user = User.create ).has_role! :super
31
+
32
+ @tester.acl_block! do
33
+ allow :admin
34
+ allow :cool
35
+ end
36
+
37
+ assert_admins_permitted
38
+
39
+ assert_permitted cool1_user
40
+ assert_permitted cool2_user
41
+
42
+ assert_forbidden nil
43
+ assert_forbidden super_user
44
+ end
45
+
46
+ test "deny plural admins" do
47
+ @tester.acl_block! do
48
+ default :allow
49
+ deny :admins
50
+ end
51
+
52
+ assert_permitted nil
53
+ assert_permitted User.create
54
+ assert_admins_forbidden
55
+ end
56
+
57
+ test "deny several roles" do
58
+ assert ( cool1_user = User.create ).has_role! :cool
59
+ assert ( cool2_user = User.create ).has_role! :cool
60
+ assert ( super_user = User.create ).has_role! :super
61
+
62
+ @tester.acl_block! do
63
+ default :allow
64
+ deny :admin
65
+ deny :cool
66
+ end
67
+
68
+ assert_permitted nil
69
+ assert_admins_forbidden
70
+ assert_forbidden cool1_user
71
+ assert_forbidden cool2_user
72
+ assert_permitted super_user
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,24 @@
1
+ require 'test_helper'
2
+
3
+ class ACLActionOverrideTest < ActionController::TestCase
4
+ test "anon can index" do
5
+ assert get :check_allow, params: { _action: :index }
6
+ assert_response :ok
7
+ end
8
+
9
+ test "anon can't show" do
10
+ assert get :check_allow, params: { _action: :show }
11
+ assert_response :unauthorized
12
+ end
13
+
14
+ test "normal user can't edit" do
15
+ assert get :check_allow_with_foo, params: { _action: :edit, user_id: User.create.id }
16
+ assert_response :unauthorized
17
+ end
18
+
19
+ test "foo owner can edit" do
20
+ assert ( user = User.create ).has_role! :owner, Foo.first_or_create
21
+ assert get :check_allow_with_foo, params: { _action: :edit, user_id: user.id }
22
+ assert_response :ok
23
+ end
24
+ end
@@ -0,0 +1,5 @@
1
+ require 'test_helper'
2
+
3
+ class ACLArgumentsTest < ActionController::TestCase
4
+ include BaseTests
5
+ end
@@ -0,0 +1,5 @@
1
+ require 'test_helper'
2
+
3
+ class ACLBlockTest < ActionController::TestCase
4
+ include BaseTests
5
+ end
@@ -0,0 +1,5 @@
1
+ require 'test_helper'
2
+
3
+ class ACLBooleanMethodTest < ActionController::TestCase
4
+ include BaseTests
5
+ end
@@ -0,0 +1,29 @@
1
+ require 'test_helper'
2
+
3
+ class ACLHelperMethodTest < ActionController::TestCase
4
+ setup do
5
+ assert @user = User.create
6
+ end
7
+
8
+ test "foo owner allowed" do
9
+ assert @user.has_role! :owner, Foo.first_or_create
10
+
11
+ assert get :allow, params: { user_id: @user.id }
12
+ assert_select 'div', 'OK'
13
+ end
14
+
15
+ test "another user denied" do
16
+ assert @another = User.create
17
+ assert @another.has_role! :owner, Foo.first_or_create
18
+
19
+ assert @user.has_role! :owner
20
+
21
+ assert get :allow, params: { user_id: @user.id }
22
+ assert_select 'div', 'AccessDenied'
23
+ end
24
+
25
+ test "anon denied" do
26
+ assert get :allow
27
+ assert_select 'div', 'AccessDenied'
28
+ end
29
+ end
@@ -0,0 +1,15 @@
1
+ require 'test_helper'
2
+
3
+ class ACLIvarsTest < ActionController::TestCase
4
+ test "owner of foo destroys" do
5
+ assert ( user = User.create ).has_role! :owner, Bar
6
+ assert delete :destroy, params: { id: 1, user_id: user.id }
7
+ assert_response :ok
8
+ end
9
+
10
+ test "bartender at Foo destroys" do
11
+ assert ( user = User.create ).has_role! :bartender, Foo
12
+ assert delete :destroy, params: { id: 1, user_id: user.id }
13
+ assert_response :ok
14
+ end
15
+ end
@@ -0,0 +1,6 @@
1
+ require 'test_helper'
2
+
3
+ class ACLMethod2Test < ActionController::TestCase
4
+ include BaseTests
5
+ include ShouldRespondToAcl
6
+ end
@@ -0,0 +1,6 @@
1
+ require 'test_helper'
2
+
3
+ class ACLMethodTest < ActionController::TestCase
4
+ include BaseTests
5
+ include ShouldRespondToAcl
6
+ end
@@ -0,0 +1,18 @@
1
+ require 'test_helper'
2
+
3
+ class ACLObjectsHashTest < ActionController::TestCase
4
+ setup do
5
+ assert @user = User.create
6
+ assert @user.has_role! :owner, Foo.first_or_create
7
+ end
8
+
9
+ test "objects hash preferred to @ivar" do
10
+ assert get :allow, params: { user_id: @user.id }
11
+ assert_response :ok
12
+ end
13
+
14
+ test "unauthed for no user" do
15
+ assert get :allow
16
+ assert_response :unauthorized
17
+ end
18
+ end
@@ -0,0 +1,9 @@
1
+ require_relative 'acl_query_mixin'
2
+
3
+ class ACLQueryMethodNamedTest < ActionController::TestCase
4
+ test "should respond to :allow_ay" do
5
+ assert @controller.respond_to? :allow_ay
6
+ end
7
+
8
+ include ACLQueryMixin
9
+ end
@@ -0,0 +1,9 @@
1
+ require_relative 'acl_query_mixin'
2
+
3
+ class ACLQueryMethodTest < ActionController::TestCase
4
+ test "should respond to :acl?" do
5
+ assert @controller.respond_to? :acl?
6
+ end
7
+
8
+ include ACLQueryMixin
9
+ end
@@ -0,0 +1,9 @@
1
+ require_relative 'acl_query_mixin'
2
+
3
+ class ACLQueryMethodWithLambdaTest < ActionController::TestCase
4
+ test "should respond to :acl?" do
5
+ assert @controller.respond_to? :acl?
6
+ end
7
+
8
+ include ACLQueryMixin
9
+ end
@@ -0,0 +1,54 @@
1
+ require 'test_helper'
2
+
3
+ module ACLQueryMixin
4
+ def self.included base
5
+ base.class_eval do
6
+ setup do
7
+ assert ( @editor = User.create ).has_role! :editor
8
+ assert ( @viewer = User.create ).has_role! :viewer
9
+ assert ( @foo = Foo.first_or_create )
10
+ assert ( @owneroffoo = User.create ).has_role! :owner, @foo
11
+
12
+ @controller.before_action
13
+ end
14
+
15
+ %i[edit update destroy].each do |meth|
16
+ test "should return true for editor/#{meth}" do
17
+ assert @controller.current_user = @editor
18
+ assert @controller.acl? meth
19
+ assert @controller.acl? meth.to_s
20
+ end
21
+
22
+ test "should return false for viewer/#{meth}" do
23
+ assert @controller.current_user = @viewer
24
+ refute @controller.acl? meth
25
+ refute @controller.acl? meth.to_s
26
+ end
27
+ end
28
+
29
+ %i[index show].each do |meth|
30
+ test "should return false for editor/#{meth}" do
31
+ assert @controller.current_user = @editor
32
+ refute @controller.acl? meth
33
+ refute @controller.acl? meth.to_s
34
+ end
35
+
36
+ test "should return true for viewer/#{meth}" do
37
+ assert @controller.current_user = @viewer
38
+ assert @controller.acl? meth
39
+ assert @controller.acl? meth.to_s
40
+ end
41
+ end
42
+
43
+ test "should return false for editor/fooize" do
44
+ assert @controller.current_user = @editor
45
+ refute @controller.acl? :fooize
46
+ end
47
+
48
+ test "should return true for foo owner" do
49
+ assert @controller.current_user = @owneroffoo
50
+ assert @controller.acl? :fooize, foo: Foo.first
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,15 @@
1
+ require 'test_helper'
2
+
3
+ class ACLSubjectMethodTest < ActionController::TestCase
4
+ test "allow the only user to index" do
5
+ assert ( user = User.create ).has_role! :the_only_one
6
+ assert get :index, params: { user_id: user.id }
7
+ assert_response :ok
8
+ end
9
+
10
+ test "deny anonymous to index" do
11
+ assert_raises Acl9::AccessDenied do
12
+ assert get :index
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,43 @@
1
+ require 'test_helper'
2
+
3
+ class ArgumentsCheckingTest < ActionController::TestCase
4
+ test "raise ArgumentError without a block" do
5
+ assert_raise ArgumentError do
6
+ class FailureController < ApplicationController
7
+ access_control
8
+ end
9
+ end
10
+ end
11
+
12
+ test "raise ArgumentError with 1st argument which is not a symbol" do
13
+ assert_raise ArgumentError do
14
+ class FailureController < ApplicationController
15
+ access_control 123 do end
16
+ end
17
+ end
18
+ end
19
+
20
+ test "raise ArgumentError with more than 1 positional argument" do
21
+ assert_raise ArgumentError do
22
+ class FailureController < ApplicationController
23
+ access_control :foo, :bar do end
24
+ end
25
+ end
26
+ end
27
+
28
+ test "raise ArgumentError with helper: true and no method name" do
29
+ assert_raise ArgumentError do
30
+ class FailureController < ApplicationController
31
+ access_control helper: true do end
32
+ end
33
+ end
34
+ end
35
+
36
+ test "raise ArgumentError with helper: :method and a method name" do
37
+ assert_raise ArgumentError do
38
+ class FailureController < ApplicationController
39
+ access_control :meth, helper: :another_meth do end
40
+ end
41
+ end
42
+ end
43
+ end
File without changes
@@ -0,0 +1,15 @@
1
+ class ACLActionOverride < ApplicationController
2
+ access_control :allowed?, filter: false do
3
+ allow all, to: :index
4
+ deny all, to: :show
5
+ allow :owner, of: :foo, to: :edit
6
+ end
7
+
8
+ def check_allow
9
+ head allowed?(params[:_action]) ? :ok : :unauthorized
10
+ end
11
+
12
+ def check_allow_with_foo
13
+ head allowed?(params[:_action], foo: Foo.first) ? :ok : :unauthorized
14
+ end
15
+ end
@@ -0,0 +1,10 @@
1
+ class ACLArguments < EmptyController
2
+ access_control :except => [:index, :show] do
3
+ allow :admin, :if => :true_meth, :unless => :false_meth
4
+ end
5
+
6
+ private
7
+
8
+ def true_meth; true end
9
+ def false_meth; false end
10
+ end
@@ -0,0 +1,6 @@
1
+ class ACLBlock < EmptyController
2
+ access_control :debug => true do
3
+ allow all, :to => [:index, :show]
4
+ allow :admin
5
+ end
6
+ end
@@ -0,0 +1,23 @@
1
+ class ACLBooleanMethod < EmptyController
2
+ access_control :acl, filter: false do
3
+ allow all, to: [:index, :show], if: :true_meth
4
+ allow :admin, unless: :false_meth
5
+ allow all, if: :false_meth
6
+ allow all, unless: :true_meth
7
+ end
8
+
9
+ before_action :check_acl
10
+
11
+ def check_acl
12
+ if self.acl
13
+ true
14
+ else
15
+ raise Acl9::AccessDenied
16
+ end
17
+ end
18
+
19
+ private
20
+
21
+ def true_meth; true end
22
+ def false_meth; false end
23
+ end