trust 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
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