trust 0.5.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 (106) hide show
  1. data/MIT-LICENSE +23 -0
  2. data/README.md +244 -0
  3. data/Rakefile +37 -0
  4. data/lib/tasks/trust_tasks.rake +42 -0
  5. data/lib/trust/active_record.rb +65 -0
  6. data/lib/trust/authorization.rb +85 -0
  7. data/lib/trust/controller/properties.rb +134 -0
  8. data/lib/trust/controller/resource.rb +306 -0
  9. data/lib/trust/controller.rb +197 -0
  10. data/lib/trust/exceptions.rb +45 -0
  11. data/lib/trust/inheritable_attribute.rb +91 -0
  12. data/lib/trust/permissions.rb +268 -0
  13. data/lib/trust/test_helper.rb +56 -0
  14. data/lib/trust/version.rb +27 -0
  15. data/lib/trust.rb +39 -0
  16. data/test/dummy/README.rdoc +261 -0
  17. data/test/dummy/Rakefile +7 -0
  18. data/test/dummy/app/assets/javascripts/accounts.js +2 -0
  19. data/test/dummy/app/assets/javascripts/application.js +15 -0
  20. data/test/dummy/app/assets/javascripts/clients.js +2 -0
  21. data/test/dummy/app/assets/javascripts/users.js +2 -0
  22. data/test/dummy/app/assets/stylesheets/accounts.css +4 -0
  23. data/test/dummy/app/assets/stylesheets/application.css +13 -0
  24. data/test/dummy/app/assets/stylesheets/clients.css +4 -0
  25. data/test/dummy/app/assets/stylesheets/scaffold.css +56 -0
  26. data/test/dummy/app/assets/stylesheets/users.css +4 -0
  27. data/test/dummy/app/controllers/accounts_controller.rb +100 -0
  28. data/test/dummy/app/controllers/application_controller.rb +31 -0
  29. data/test/dummy/app/controllers/clients_controller.rb +107 -0
  30. data/test/dummy/app/controllers/savings_accounts_controller.rb +27 -0
  31. data/test/dummy/app/controllers/settlements_controller.rb +26 -0
  32. data/test/dummy/app/controllers/users_controller.rb +107 -0
  33. data/test/dummy/app/helpers/accounts_helper.rb +26 -0
  34. data/test/dummy/app/helpers/application_helper.rb +26 -0
  35. data/test/dummy/app/helpers/clients_helper.rb +26 -0
  36. data/test/dummy/app/helpers/users_helper.rb +26 -0
  37. data/test/dummy/app/models/account/credit.rb +26 -0
  38. data/test/dummy/app/models/account.rb +35 -0
  39. data/test/dummy/app/models/client.rb +35 -0
  40. data/test/dummy/app/models/permissions.rb +68 -0
  41. data/test/dummy/app/models/savings_account.rb +26 -0
  42. data/test/dummy/app/models/user.rb +40 -0
  43. data/test/dummy/app/views/accounts/_form.html.erb +46 -0
  44. data/test/dummy/app/views/accounts/edit.html.erb +31 -0
  45. data/test/dummy/app/views/accounts/index.html.erb +48 -0
  46. data/test/dummy/app/views/accounts/new.html.erb +30 -0
  47. data/test/dummy/app/views/accounts/show.html.erb +35 -0
  48. data/test/dummy/app/views/clients/_form.html.erb +46 -0
  49. data/test/dummy/app/views/clients/edit.html.erb +31 -0
  50. data/test/dummy/app/views/clients/index.html.erb +48 -0
  51. data/test/dummy/app/views/clients/new.html.erb +30 -0
  52. data/test/dummy/app/views/clients/show.html.erb +35 -0
  53. data/test/dummy/app/views/layouts/application.html.erb +39 -0
  54. data/test/dummy/app/views/users/_form.html.erb +46 -0
  55. data/test/dummy/app/views/users/edit.html.erb +31 -0
  56. data/test/dummy/app/views/users/index.html.erb +48 -0
  57. data/test/dummy/app/views/users/new.html.erb +30 -0
  58. data/test/dummy/app/views/users/show.html.erb +35 -0
  59. data/test/dummy/config/application.rb +56 -0
  60. data/test/dummy/config/boot.rb +10 -0
  61. data/test/dummy/config/database.yml +25 -0
  62. data/test/dummy/config/environment.rb +5 -0
  63. data/test/dummy/config/environments/development.rb +37 -0
  64. data/test/dummy/config/environments/production.rb +67 -0
  65. data/test/dummy/config/environments/test.rb +37 -0
  66. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  67. data/test/dummy/config/initializers/inflections.rb +15 -0
  68. data/test/dummy/config/initializers/mime_types.rb +5 -0
  69. data/test/dummy/config/initializers/secret_token.rb +7 -0
  70. data/test/dummy/config/initializers/session_store.rb +8 -0
  71. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  72. data/test/dummy/config/locales/en.yml +5 -0
  73. data/test/dummy/config/routes.rb +38 -0
  74. data/test/dummy/config.ru +4 -0
  75. data/test/dummy/db/migrate/20120522115011_create_accounts.rb +36 -0
  76. data/test/dummy/db/migrate/20120522130322_create_users.rb +33 -0
  77. data/test/dummy/db/migrate/20120523144144_create_clients.rb +34 -0
  78. data/test/dummy/db/schema.rb +38 -0
  79. data/test/dummy/public/404.html +26 -0
  80. data/test/dummy/public/422.html +26 -0
  81. data/test/dummy/public/500.html +25 -0
  82. data/test/dummy/public/favicon.ico +0 -0
  83. data/test/dummy/script/rails +6 -0
  84. data/test/dummy/test/fixtures/accounts.yml +7 -0
  85. data/test/dummy/test/fixtures/clients.yml +7 -0
  86. data/test/dummy/test/fixtures/users.yml +7 -0
  87. data/test/dummy/test/functional/accounts_controller_test.rb +123 -0
  88. data/test/dummy/test/functional/clients_controller_test.rb +74 -0
  89. data/test/dummy/test/functional/users_controller_test.rb +74 -0
  90. data/test/dummy/test/unit/account_test.rb +31 -0
  91. data/test/dummy/test/unit/client_test.rb +31 -0
  92. data/test/dummy/test/unit/helpers/accounts_helper_test.rb +28 -0
  93. data/test/dummy/test/unit/helpers/clients_helper_test.rb +28 -0
  94. data/test/dummy/test/unit/helpers/users_helper_test.rb +28 -0
  95. data/test/dummy/test/unit/permissions_test.rb +171 -0
  96. data/test/dummy/test/unit/user_test.rb +31 -0
  97. data/test/test_helper.rb +45 -0
  98. data/test/trust_test.rb +31 -0
  99. data/test/unit/trust/active_record_test.rb +56 -0
  100. data/test/unit/trust/authorization_test.rb +108 -0
  101. data/test/unit/trust/controller/properties_test.rb +132 -0
  102. data/test/unit/trust/controller/resource_test.rb +251 -0
  103. data/test/unit/trust/controller_test.rb +160 -0
  104. data/test/unit/trust/inheritable_attribute_test.rb +65 -0
  105. data/test/unit/trust/permissions_test.rb +258 -0
  106. metadata +280 -0
@@ -0,0 +1,171 @@
1
+ # Copyright (c) 2012 Bingo Entreprenøren AS
2
+ # Copyright (c) 2012 Teknobingo Scandinavia AS
3
+ # Copyright (c) 2012 Knut I. Stenmark
4
+ # Copyright (c) 2012 Patrick Hanevold
5
+ #
6
+ # Permission is hereby granted, free of charge, to any person obtaining
7
+ # a copy of this software and associated documentation files (the
8
+ # "Software"), to deal in the Software without restriction, including
9
+ # without limitation the rights to use, copy, modify, merge, publish,
10
+ # distribute, sublicense, and/or sell copies of the Software, and to
11
+ # permit persons to whom the Software is furnished to do so, subject to
12
+ # the following conditions:
13
+ #
14
+ # The above copyright notice and this permission notice shall be
15
+ # included in all copies or substantial portions of the Software.
16
+ #
17
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
21
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24
+
25
+ require 'test_helper'
26
+
27
+ class PermissionsTest < ActiveSupport::TestCase
28
+ setup do
29
+ def login_as(role)
30
+ Trust::Authorization.user = @user = User.find_or_create_by_name(role)
31
+ end
32
+ end
33
+ context 'Client' do
34
+ should 'be managed by system admins' do
35
+ login_as(:system_admin)
36
+ assert Client.permits?(:create)
37
+ assert Client.new.permits?(:create)
38
+ end
39
+ should 'be audited by system admins' do
40
+ login_as(:system_admin)
41
+ assert Client.permits?(:audit)
42
+ assert Client.new.permits?(:audit)
43
+ end
44
+ should 'be managed by accauntants' do
45
+ login_as(:accountant)
46
+ assert Client.permits?(:create)
47
+ assert Client.new.permits?(:create)
48
+ end
49
+ should 'not be managed by guests' do
50
+ login_as(:guest)
51
+ assert !Client.permits?(:create)
52
+ assert !Client.new.permits?(:create)
53
+ end
54
+ should 'be read by all roles' do
55
+ Permissions::Default.all do |role|
56
+ login_as(role)
57
+ assert Client.permits?(:read)
58
+ assert Client.new.permits?(:read)
59
+ end
60
+ end
61
+ should 'not be read by other roles' do
62
+ login_as(:blind_man)
63
+ assert !Client.permits?(:read)
64
+ assert !Client.new.permits?(:read)
65
+ end
66
+ end
67
+ context 'Account' do
68
+ should 'be managed by system admins' do
69
+ login_as(:system_admin)
70
+ assert Account.permits?(:create)
71
+ assert Account.new.permits?(:create)
72
+ end
73
+ should 'be audited by system admins' do
74
+ login_as(:system_admin)
75
+ assert Account.permits?(:audit)
76
+ assert Account.new.permits?(:audit)
77
+ end
78
+ should 'not be managed by accauntants' do
79
+ login_as(:accountant)
80
+ assert !Account.permits?(:destroy)
81
+ assert !Account.new.permits?(:destroy)
82
+ assert !Account.permits?(:create)
83
+ assert !Account.new.permits?(:create)
84
+ end
85
+ should 'be created by accauntants associated to clients' do
86
+ login_as(:accountant)
87
+ parent = Client.new
88
+ parent.expects(:accountant).returns(@user.name).twice
89
+ assert Account.permits?(:create,parent)
90
+ assert Account.new.permits?(:create,parent)
91
+ end
92
+ should 'not be created by accauntants unless associated to clients' do
93
+ login_as(:accountant)
94
+ parent = Client.new
95
+ parent.expects(:accountant).returns(stub('bogus', :accountant => :bogus)).times(4)
96
+ assert !Account.permits?(:create,stub('bogus', :accountant => :bogus))
97
+ assert !Account.new.permits?(:create,stub('bogus', :accountant => :bogus))
98
+ assert !Account.permits?(:create,parent)
99
+ assert !Account.new.permits?(:create,parent)
100
+ end
101
+ should 'be created by department managers if parent is superspecial' do
102
+ login_as(:department_manager)
103
+ parent = Client.new
104
+ parent.expects(:accountant).returns(:superspecial).twice
105
+ assert Account.permits?(:create,parent)
106
+ assert Account.new.permits?(:create,parent)
107
+ end
108
+ should 'be created by accauntants if parent is superspecial' do
109
+ login_as(:accountant)
110
+ parent = Client.new
111
+ parent.expects(:accountant).returns(:superspecial).times(4)
112
+ assert Account.permits?(:create,parent)
113
+ assert Account.new.permits?(:create,parent)
114
+ end
115
+ should 'not be created by department managers unless parent is superspecial' do
116
+ login_as(:department_manager)
117
+ parent = Client.new
118
+ parent.expects(:accountant).returns(:not_so_superspecial).twice
119
+ assert !Account.permits?(:create,parent)
120
+ assert !Account.new.permits?(:create,parent)
121
+ end
122
+ should 'not be created by accauntants unless parent is superspecial' do
123
+ login_as(:accountant)
124
+ parent = Client.new
125
+ parent.expects(:accountant).returns(:not_so_superspecial).times(4)
126
+ assert !Account.permits?(:create,parent)
127
+ assert !Account.new.permits?(:create,parent)
128
+ end
129
+ should 'not be created by guests if parent' do
130
+ login_as(:guest)
131
+ assert !Account.permits?(:create)
132
+ assert !Account.new.permits?(:create)
133
+ end
134
+ should 'be updateable by creator' do
135
+ login_as(:accountant)
136
+ assert Account.create.permits?(:update)
137
+ end
138
+ should 'be not be updateable by others' do
139
+ login_as(:guest)
140
+ account = Account.create
141
+ login_as(:accountant)
142
+ assert !account.permits?(:update)
143
+ end
144
+ end
145
+ context 'Account::Credit' do
146
+ should 'be managed by system admins' do
147
+ login_as(:system_admin)
148
+ assert Account::Credit.permits?(:create)
149
+ assert Account::Credit.new.permits?(:create)
150
+ end
151
+ should 'be audited by system admins' do
152
+ login_as(:system_admin)
153
+ assert Account::Credit.permits?(:audit)
154
+ assert Account::Credit.new.permits?(:audit)
155
+ end
156
+ should 'be created by guests if guest is wife' do
157
+ login_as(:guest)
158
+ User.any_instance.stubs(:role_symbols).returns([:guest])
159
+ User.any_instance.stubs(:name).returns('wife')
160
+ assert Account::Credit.permits?(:create)
161
+ assert Account::Credit.new.permits?(:create)
162
+ end
163
+ should 'not be created by guests unless guest is wife' do
164
+ login_as(:guest)
165
+ User.any_instance.stubs(:role_symbols).returns([:guest])
166
+ User.any_instance.stubs(:name).returns('mistress')
167
+ assert !Account::Credit.permits?(:create)
168
+ assert !Account::Credit.new.permits?(:create)
169
+ end
170
+ end
171
+ end
@@ -0,0 +1,31 @@
1
+ # Copyright (c) 2012 Bingo Entreprenøren AS
2
+ # Copyright (c) 2012 Teknobingo Scandinavia AS
3
+ # Copyright (c) 2012 Knut I. Stenmark
4
+ # Copyright (c) 2012 Patrick Hanevold
5
+ #
6
+ # Permission is hereby granted, free of charge, to any person obtaining
7
+ # a copy of this software and associated documentation files (the
8
+ # "Software"), to deal in the Software without restriction, including
9
+ # without limitation the rights to use, copy, modify, merge, publish,
10
+ # distribute, sublicense, and/or sell copies of the Software, and to
11
+ # permit persons to whom the Software is furnished to do so, subject to
12
+ # the following conditions:
13
+ #
14
+ # The above copyright notice and this permission notice shall be
15
+ # included in all copies or substantial portions of the Software.
16
+ #
17
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
21
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24
+
25
+ require 'test_helper'
26
+
27
+ class UserTest < ActiveSupport::TestCase
28
+ # test "the truth" do
29
+ # assert true
30
+ # end
31
+ end
@@ -0,0 +1,45 @@
1
+ # Copyright (c) 2012 Bingo Entreprenøren AS
2
+ # Copyright (c) 2012 Teknobingo Scandinavia AS
3
+ # Copyright (c) 2012 Knut I. Stenmark
4
+ # Copyright (c) 2012 Patrick Hanevold
5
+ #
6
+ # Permission is hereby granted, free of charge, to any person obtaining
7
+ # a copy of this software and associated documentation files (the
8
+ # "Software"), to deal in the Software without restriction, including
9
+ # without limitation the rights to use, copy, modify, merge, publish,
10
+ # distribute, sublicense, and/or sell copies of the Software, and to
11
+ # permit persons to whom the Software is furnished to do so, subject to
12
+ # the following conditions:
13
+ #
14
+ # The above copyright notice and this permission notice shall be
15
+ # included in all copies or substantial portions of the Software.
16
+ #
17
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
21
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24
+
25
+ # Configure Rails Environment
26
+ ENV["RAILS_ENV"] = "test"
27
+
28
+ require File.expand_path("../dummy/config/environment.rb", __FILE__)
29
+ require "rails/test_help"
30
+
31
+ Rails.backtrace_cleaner.remove_silencers!
32
+
33
+ # Load support files
34
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
35
+
36
+ # Load fixtures from the engine
37
+ if ActiveSupport::TestCase.method_defined?(:fixture_path=)
38
+ ActiveSupport::TestCase.fixture_path = File.expand_path("../fixtures", __FILE__)
39
+ end
40
+
41
+ class ActionController::TestCase
42
+ def login_as(role = :guest)
43
+ User.current = @controller.send(:current_user=, User.find_or_create_by_name(role.to_s))
44
+ end
45
+ end
@@ -0,0 +1,31 @@
1
+ # Copyright (c) 2012 Bingo Entreprenøren AS
2
+ # Copyright (c) 2012 Teknobingo Scandinavia AS
3
+ # Copyright (c) 2012 Knut I. Stenmark
4
+ # Copyright (c) 2012 Patrick Hanevold
5
+ #
6
+ # Permission is hereby granted, free of charge, to any person obtaining
7
+ # a copy of this software and associated documentation files (the
8
+ # "Software"), to deal in the Software without restriction, including
9
+ # without limitation the rights to use, copy, modify, merge, publish,
10
+ # distribute, sublicense, and/or sell copies of the Software, and to
11
+ # permit persons to whom the Software is furnished to do so, subject to
12
+ # the following conditions:
13
+ #
14
+ # The above copyright notice and this permission notice shall be
15
+ # included in all copies or substantial portions of the Software.
16
+ #
17
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
21
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24
+
25
+ require 'test_helper'
26
+
27
+ class TrustTest < ActiveSupport::TestCase
28
+ test "truth" do
29
+ assert_kind_of Module, Trust
30
+ end
31
+ end
@@ -0,0 +1,56 @@
1
+ # Copyright (c) 2012 Bingo Entreprenøren AS
2
+ # Copyright (c) 2012 Teknobingo Scandinavia AS
3
+ # Copyright (c) 2012 Knut I. Stenmark
4
+ # Copyright (c) 2012 Patrick Hanevold
5
+ #
6
+ # Permission is hereby granted, free of charge, to any person obtaining
7
+ # a copy of this software and associated documentation files (the
8
+ # "Software"), to deal in the Software without restriction, including
9
+ # without limitation the rights to use, copy, modify, merge, publish,
10
+ # distribute, sublicense, and/or sell copies of the Software, and to
11
+ # permit persons to whom the Software is furnished to do so, subject to
12
+ # the following conditions:
13
+ #
14
+ # The above copyright notice and this permission notice shall be
15
+ # included in all copies or substantial portions of the Software.
16
+ #
17
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
21
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24
+
25
+ require 'test_helper'
26
+
27
+ class Trust::ActiveRecordTest < ActiveSupport::TestCase
28
+ context 'permits?' do
29
+ setup do
30
+ @user = User.new
31
+ @account = Account.new
32
+ end
33
+ should 'support calls to athorized? on class level' do
34
+ Trust::Authorization.expects(:authorized?).with(:manage,Account,:foo)
35
+ Account.permits? :manage, :foo
36
+ end
37
+ should 'support calls to athorized? on instance' do
38
+ Trust::Authorization.expects(:authorized?).with(:manage,@account,:foo)
39
+ @account.permits? :manage, :foo
40
+ end
41
+ end
42
+ context 'ensure_permitted!' do
43
+ setup do
44
+ @user = User.new
45
+ @account = Account.new
46
+ end
47
+ should 'support calls to athorized? on class level' do
48
+ Trust::Authorization.expects(:authorize!).with(:manage,Account,:foo)
49
+ Account.ensure_permitted! :manage, :foo
50
+ end
51
+ should 'support calls to athorized? on instance' do
52
+ Trust::Authorization.expects(:authorize!).with(:manage,@account,:foo)
53
+ @account.ensure_permitted! :manage, :foo
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,108 @@
1
+ # Copyright (c) 2012 Bingo Entreprenøren AS
2
+ # Copyright (c) 2012 Teknobingo Scandinavia AS
3
+ # Copyright (c) 2012 Knut I. Stenmark
4
+ # Copyright (c) 2012 Patrick Hanevold
5
+ #
6
+ # Permission is hereby granted, free of charge, to any person obtaining
7
+ # a copy of this software and associated documentation files (the
8
+ # "Software"), to deal in the Software without restriction, including
9
+ # without limitation the rights to use, copy, modify, merge, publish,
10
+ # distribute, sublicense, and/or sell copies of the Software, and to
11
+ # permit persons to whom the Software is furnished to do so, subject to
12
+ # the following conditions:
13
+ #
14
+ # The above copyright notice and this permission notice shall be
15
+ # included in all copies or substantial portions of the Software.
16
+ #
17
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
21
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24
+
25
+ require 'test_helper'
26
+
27
+ class Trust::AuthorizationTest < ActiveSupport::TestCase
28
+ context 'user' do
29
+ should 'be set in thread' do
30
+ Trust::Authorization.user = 1
31
+ assert_equal 1, Thread.current["current_user"]
32
+ end
33
+ should 'be retrieved from thread' do
34
+ Thread.current["current_user"] = 2
35
+ assert_equal 2, Trust::Authorization.user
36
+ end
37
+ end
38
+
39
+ context 'authorizing_class' do
40
+ setup do
41
+ class ::TestBase < ActiveRecord::Base
42
+ end
43
+ class ::TestDescendant < TestBase
44
+ end
45
+ def authorizing_class(klass)
46
+ Trust::Authorization.send(:authorizing_class, klass)
47
+ end
48
+ end
49
+ should 'return associated Authorization class if it exists' do
50
+ class ::Permissions::TestBase < Trust::Permissions
51
+ end
52
+ assert_equal ::Permissions::TestBase, authorizing_class(::TestBase)
53
+ end
54
+ should 'return Authorization::Default if no assocated Authorization class' do
55
+ assert_equal ::Permissions::Default, authorizing_class(::TestDescendant)
56
+ end
57
+ should 'return parent Authorization if specified and none exist for the class' do
58
+ class ::Permissions::TestBase < Trust::Permissions
59
+ end
60
+ assert_equal ::Permissions::TestBase, authorizing_class(::TestDescendant)
61
+ end
62
+ end
63
+
64
+ context 'authorize?' do
65
+ setup do
66
+ class Validator
67
+ end
68
+ class TestAuthorizing
69
+ def initialize(user, action, klass, object, parent)
70
+ Validator.values user, action, klass, object, parent
71
+ end
72
+ end
73
+ Trust::Authorization.expects(:user).returns(:user)
74
+ TestAuthorizing.any_instance.expects(:authorized?).returns(true)
75
+ Trust::Authorization.expects(:authorizing_class).with(String).returns(TestAuthorizing)
76
+ end
77
+ should 'instanciate authorizing class and set correct parameters for object' do
78
+ Validator.expects(:values).with(:user, :action, String, 'object_or_class', :parent)
79
+ assert Trust::Authorization.authorized?('action', 'object_or_class', :parent)
80
+ end
81
+ should 'instanciate authorizing class and set correct parameters for class' do
82
+ Validator.expects(:values).with(:user, :action, String, nil, :parent)
83
+ assert Trust::Authorization.authorized?('action', String, :parent)
84
+ end
85
+ end
86
+
87
+ context 'authorize!' do
88
+ should 'call access_denied! unless authorized?' do
89
+ Trust::Authorization.expects(:access_denied!).once
90
+ Trust::Authorization.expects(:authorized?).with(1, 2, 3).returns(false)
91
+ Trust::Authorization.authorize!(1,2,3)
92
+ end
93
+ should 'call access_denied! if authorized?' do
94
+ Trust::Authorization.expects(:access_denied!).never
95
+ Trust::Authorization.expects(:authorized?).with(1, 2, 3).returns(true)
96
+ Trust::Authorization.authorize!(1,2,3)
97
+ end
98
+ end
99
+
100
+ context 'access_denied!' do
101
+ should 'raise exception' do
102
+ assert_raises Trust::AccessDenied do
103
+ Trust::Authorization.access_denied!
104
+ end
105
+ end
106
+ end
107
+
108
+ end
@@ -0,0 +1,132 @@
1
+ # Copyright (c) 2012 Bingo Entreprenøren AS
2
+ # Copyright (c) 2012 Teknobingo Scandinavia AS
3
+ # Copyright (c) 2012 Knut I. Stenmark
4
+ # Copyright (c) 2012 Patrick Hanevold
5
+ #
6
+ # Permission is hereby granted, free of charge, to any person obtaining
7
+ # a copy of this software and associated documentation files (the
8
+ # "Software"), to deal in the Software without restriction, including
9
+ # without limitation the rights to use, copy, modify, merge, publish,
10
+ # distribute, sublicense, and/or sell copies of the Software, and to
11
+ # permit persons to whom the Software is furnished to do so, subject to
12
+ # the following conditions:
13
+ #
14
+ # The above copyright notice and this permission notice shall be
15
+ # included in all copies or substantial portions of the Software.
16
+ #
17
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
21
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24
+
25
+ require 'test_helper'
26
+
27
+ class Trust::Controller::PropertiesTest < ActiveSupport::TestCase
28
+ setup do
29
+ class Controller
30
+ def self.properties
31
+ # traditional new, but controversiol code
32
+ @properties ||= Trust::Controller::Properties.instantiate(self)
33
+ end
34
+ def self.controller_path
35
+ 'controller'
36
+ end
37
+ end
38
+ class PeopleController < Controller
39
+ def self.controller_path
40
+ 'people'
41
+ end
42
+ end
43
+ class ::Person
44
+ end
45
+ end
46
+
47
+ context 'instantiating' do
48
+ should 'make a fresh object' do
49
+ Trust::Controller::Properties.expects(:new).with(PeopleController, nil).once
50
+ assert !Trust::Controller::Properties.instantiate(PeopleController).instance_variable_get(:@controller)
51
+ end
52
+
53
+ should 'clone controllers properties' do
54
+ new_actions = [:new, :create, :confirm]
55
+ parent = Trust::Controller::Properties.new(Controller, nil)
56
+ parent.new_actions = new_actions
57
+ child = Trust::Controller::Properties.new(PeopleController, parent)
58
+ assert_equal PeopleController, child.instance_variable_get(:@controller)
59
+ assert_equal new_actions, child.new_actions
60
+ child.new_actions = [:confirm]
61
+ assert_equal new_actions, parent.new_actions
62
+ assert_equal [:confirm], child.new_actions
63
+ end
64
+ end
65
+
66
+ context 'information' do
67
+ should 'resolve class from model' do
68
+ assert_equal Person, PeopleController.properties.model_class
69
+ end
70
+ end
71
+
72
+ context 'actions' do
73
+ setup do
74
+ @properties = Trust::Controller::Properties.instantiate(Controller)
75
+ end
76
+ should 'accumulate add actions' do
77
+ @properties.actions(:add => {:new => :yes, :member => :no, :collection => :maybe})
78
+ assert_equal [:new, :create, :yes], @properties.new_actions
79
+ assert_equal [:show, :edit, :update, :destroy, :no], @properties.member_actions
80
+ assert_equal [:index, :maybe], @properties.collection_actions
81
+ end
82
+ should 'overide actions on new, member and collection' do
83
+ @properties.actions(:add => {:new => :yes, :member => :no, :collection => :maybe}, :new => :really, :member => :do, :collection => :override)
84
+ assert_equal [:really], @properties.new_actions
85
+ assert_equal [:do], @properties.member_actions
86
+ assert_equal [:override], @properties.collection_actions
87
+ end
88
+ should 'mask with only' do
89
+ @properties.actions(:add => {:new => :yes, :member => :no, :collection => :maybe}, :only => [:yes,:no,:maybe])
90
+ assert_equal [:yes], @properties.new_actions
91
+ assert_equal [:no], @properties.member_actions
92
+ assert_equal [:maybe], @properties.collection_actions
93
+ end
94
+ should 'filter with except' do
95
+ @properties.actions(:add => {:new => :yes, :member => :no, :collection => :maybe}, :except => [:yes, :no, :maybe])
96
+ assert_equal [:new, :create], @properties.new_actions
97
+ assert_equal [:show, :edit, :update, :destroy], @properties.member_actions
98
+ assert_equal [:index], @properties.collection_actions
99
+ end
100
+ end
101
+
102
+ context 'belongs_to' do
103
+ setup do
104
+ @properties = Trust::Controller::Properties.instantiate(Controller)
105
+ end
106
+ should 'affect has_associations?' do
107
+ assert !@properties.has_associations?
108
+ end
109
+ should 'accept simple association' do
110
+ @properties.belongs_to :heaven
111
+ assert @properties.has_associations?
112
+ expected = {:heaven => nil}
113
+ assert_equal expected, @properties.associations
114
+ end
115
+ should 'accept multiple associations' do
116
+ @properties.belongs_to :heaven, :hell
117
+ assert @properties.has_associations?
118
+ expected = {:heaven => nil, :hell => nil}
119
+ assert_equal expected, @properties.associations
120
+ @properties.belongs_to :earth
121
+ expected = {:heaven => nil, :hell => nil, :earth => nil}
122
+ assert_equal expected, @properties.associations
123
+ end
124
+ should 'accept association as' do
125
+ @properties.belongs_to :heaven, :as => :earth
126
+ assert @properties.has_associations?
127
+ expected = {:heaven => :earth}
128
+ assert_equal expected, @properties.associations
129
+ end
130
+ end
131
+
132
+ end