strongbolt 0.3.6

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 (145) hide show
  1. checksums.yaml +7 -0
  2. data/.editorconfig +33 -0
  3. data/.gitignore +18 -0
  4. data/.rspec +1 -0
  5. data/.ruby-gemset +1 -0
  6. data/.ruby-version +1 -0
  7. data/Gemfile +4 -0
  8. data/Gemfile.lock +130 -0
  9. data/LICENSE.txt +22 -0
  10. data/README.md +182 -0
  11. data/Rakefile +1 -0
  12. data/app/assets/javascripts/strongbolt.js +1 -0
  13. data/app/assets/javascripts/strongbolt/role-capabilities.js +80 -0
  14. data/app/controllers/strongbolt/capabilities_controller.rb +77 -0
  15. data/app/controllers/strongbolt/roles_controller.rb +92 -0
  16. data/app/controllers/strongbolt/security_controller.rb +8 -0
  17. data/app/controllers/strongbolt/user_groups_controller.rb +76 -0
  18. data/app/controllers/strongbolt/user_groups_users_controller.rb +35 -0
  19. data/app/controllers/strongbolt_controller.rb +2 -0
  20. data/app/views/strongbolt/_menu.html.erb +13 -0
  21. data/app/views/strongbolt/capabilities/index.html.erb +53 -0
  22. data/app/views/strongbolt/capabilities/show.html.erb +53 -0
  23. data/app/views/strongbolt/roles/_capabilities.html.erb +47 -0
  24. data/app/views/strongbolt/roles/_capability.html.erb +21 -0
  25. data/app/views/strongbolt/roles/_form.html.erb +12 -0
  26. data/app/views/strongbolt/roles/edit.html.erb +14 -0
  27. data/app/views/strongbolt/roles/index.html.erb +54 -0
  28. data/app/views/strongbolt/roles/new.html.erb +11 -0
  29. data/app/views/strongbolt/roles/show.html.erb +52 -0
  30. data/app/views/strongbolt/user_groups/_form.html.erb +12 -0
  31. data/app/views/strongbolt/user_groups/edit.html.erb +14 -0
  32. data/app/views/strongbolt/user_groups/index.html.erb +46 -0
  33. data/app/views/strongbolt/user_groups/new.html.erb +13 -0
  34. data/app/views/strongbolt/user_groups/show.html.erb +88 -0
  35. data/lib/generators/strongbolt/fix_generator.rb +23 -0
  36. data/lib/generators/strongbolt/indexes_generator.rb +19 -0
  37. data/lib/generators/strongbolt/install_generator.rb +29 -0
  38. data/lib/generators/strongbolt/templates/fix.rb +5 -0
  39. data/lib/generators/strongbolt/templates/indexes.rb +21 -0
  40. data/lib/generators/strongbolt/templates/migration.rb +73 -0
  41. data/lib/generators/strongbolt/templates/strongbolt.rb +45 -0
  42. data/lib/generators/strongbolt/views_generator.rb +26 -0
  43. data/lib/strongbolt.rb +219 -0
  44. data/lib/strongbolt/base.rb +7 -0
  45. data/lib/strongbolt/bolted.rb +125 -0
  46. data/lib/strongbolt/bolted_controller.rb +297 -0
  47. data/lib/strongbolt/capabilities_role.rb +15 -0
  48. data/lib/strongbolt/capability.rb +165 -0
  49. data/lib/strongbolt/configuration.rb +111 -0
  50. data/lib/strongbolt/controllers/url_helpers.rb +37 -0
  51. data/lib/strongbolt/engine.rb +44 -0
  52. data/lib/strongbolt/errors.rb +38 -0
  53. data/lib/strongbolt/generators/migration.rb +35 -0
  54. data/lib/strongbolt/helpers.rb +18 -0
  55. data/lib/strongbolt/rails/routes.rb +20 -0
  56. data/lib/strongbolt/role.rb +46 -0
  57. data/lib/strongbolt/roles_user_group.rb +15 -0
  58. data/lib/strongbolt/rspec.rb +29 -0
  59. data/lib/strongbolt/rspec/user.rb +90 -0
  60. data/lib/strongbolt/tenantable.rb +304 -0
  61. data/lib/strongbolt/user_abilities.rb +292 -0
  62. data/lib/strongbolt/user_group.rb +24 -0
  63. data/lib/strongbolt/user_groups_user.rb +16 -0
  64. data/lib/strongbolt/users_tenant.rb +12 -0
  65. data/lib/strongbolt/version.rb +3 -0
  66. data/lib/tasks/strongbolt_tasks.rake +29 -0
  67. data/spec/controllers/strongbolt/capabilities_controller_spec.rb +254 -0
  68. data/spec/controllers/strongbolt/roles_controller_spec.rb +228 -0
  69. data/spec/controllers/strongbolt/user_groups_controller_spec.rb +216 -0
  70. data/spec/controllers/strongbolt/user_groups_users_controller_spec.rb +69 -0
  71. data/spec/controllers/without_authorization_controller_spec.rb +20 -0
  72. data/spec/dummy/.rspec +2 -0
  73. data/spec/dummy/README.rdoc +28 -0
  74. data/spec/dummy/Rakefile +6 -0
  75. data/spec/dummy/app/assets/images/.keep +0 -0
  76. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  77. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  78. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  79. data/spec/dummy/app/controllers/concerns/.keep +0 -0
  80. data/spec/dummy/app/controllers/posts_controller.rb +18 -0
  81. data/spec/dummy/app/controllers/test_controller.rb +3 -0
  82. data/spec/dummy/app/controllers/without_authorization_controller.rb +5 -0
  83. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  84. data/spec/dummy/app/mailers/.keep +0 -0
  85. data/spec/dummy/app/models/.keep +0 -0
  86. data/spec/dummy/app/models/concerns/.keep +0 -0
  87. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  88. data/spec/dummy/bin/bundle +3 -0
  89. data/spec/dummy/bin/rails +4 -0
  90. data/spec/dummy/bin/rake +4 -0
  91. data/spec/dummy/config.ru +4 -0
  92. data/spec/dummy/config/application.rb +29 -0
  93. data/spec/dummy/config/boot.rb +5 -0
  94. data/spec/dummy/config/database.yml +25 -0
  95. data/spec/dummy/config/environment.rb +5 -0
  96. data/spec/dummy/config/environments/development.rb +37 -0
  97. data/spec/dummy/config/environments/production.rb +78 -0
  98. data/spec/dummy/config/environments/test.rb +39 -0
  99. data/spec/dummy/config/initializers/assets.rb +8 -0
  100. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  101. data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
  102. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  103. data/spec/dummy/config/initializers/inflections.rb +16 -0
  104. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  105. data/spec/dummy/config/initializers/session_store.rb +3 -0
  106. data/spec/dummy/config/initializers/strongbolt.rb +32 -0
  107. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  108. data/spec/dummy/config/locales/en.yml +23 -0
  109. data/spec/dummy/config/routes.rb +12 -0
  110. data/spec/dummy/config/secrets.yml +22 -0
  111. data/spec/dummy/db/development.sqlite3 +0 -0
  112. data/spec/dummy/db/migrate/20150630212236_create_strongbolt_tables.rb +54 -0
  113. data/spec/dummy/db/migrate/20150630212251_create_strongbolt_tables_indexes.rb +21 -0
  114. data/spec/dummy/db/schema.rb +84 -0
  115. data/spec/dummy/db/test.sqlite3 +0 -0
  116. data/spec/dummy/lib/assets/.keep +0 -0
  117. data/spec/dummy/public/404.html +67 -0
  118. data/spec/dummy/public/422.html +67 -0
  119. data/spec/dummy/public/500.html +66 -0
  120. data/spec/dummy/public/favicon.ico +0 -0
  121. data/spec/fabricators/capability_fabricator.rb +4 -0
  122. data/spec/fabricators/role_fabricator.rb +9 -0
  123. data/spec/fabricators/user_fabricator.rb +3 -0
  124. data/spec/fabricators/user_group_fabricator.rb +9 -0
  125. data/spec/fixtures/application.rb +28 -0
  126. data/spec/fixtures/controllers.rb +5 -0
  127. data/spec/spec_helper.rb +89 -0
  128. data/spec/strongbolt/bolted_controller_spec.rb +706 -0
  129. data/spec/strongbolt/bolted_spec.rb +136 -0
  130. data/spec/strongbolt/capability_spec.rb +251 -0
  131. data/spec/strongbolt/configuration_spec.rb +119 -0
  132. data/spec/strongbolt/controllers/url_helpers_spec.rb +34 -0
  133. data/spec/strongbolt/helpers_spec.rb +43 -0
  134. data/spec/strongbolt/role_spec.rb +90 -0
  135. data/spec/strongbolt/tenantable_spec.rb +281 -0
  136. data/spec/strongbolt/user_abilities_spec.rb +509 -0
  137. data/spec/strongbolt/user_group_spec.rb +37 -0
  138. data/spec/strongbolt/users_tenant_spec.rb +36 -0
  139. data/spec/strongbolt_spec.rb +274 -0
  140. data/spec/support/controller_macros.rb +11 -0
  141. data/spec/support/db_setup.rb +134 -0
  142. data/spec/support/helpers.rb +62 -0
  143. data/spec/support/transactional_specs.rb +17 -0
  144. data/strongbolt.gemspec +32 -0
  145. metadata +407 -0
@@ -0,0 +1,111 @@
1
+ module Strongbolt
2
+
3
+ module Configuration
4
+
5
+ #
6
+ # A placeholder class for logger when not defined
7
+ # Just print what's given
8
+ #
9
+ class DefaultLogger
10
+ def method_missing method_name, text = nil, &block
11
+ puts "[#{method_name}] #{block.present? ? block.call : text}"
12
+ end
13
+ end
14
+
15
+ #
16
+ # Sets the class name of the user if different then default 'User'
17
+ #
18
+ mattr_accessor :user_class
19
+ @@user_class = 'User'
20
+
21
+ #
22
+ # Returns the constantize version of user class
23
+ #
24
+ def self.user_class_constant() self.user_class.constantize; end
25
+
26
+ #
27
+ # Sets the logger used by Strongbolt
28
+ #
29
+ mattr_accessor :logger
30
+ @@logger = DefaultLogger.new
31
+
32
+ #
33
+ # Sets the tenants of the application
34
+ #
35
+ @@tenants = []
36
+ def self.tenants= tenants
37
+ @@tenants = []
38
+ [*tenants].each {|t| add_tenant t}
39
+ end
40
+
41
+ #
42
+ # Returns the tenants
43
+ #
44
+ def self.tenants() @@tenants; end
45
+
46
+ #
47
+ # Adds a tenant if not in the list
48
+ #
49
+ def self.add_tenant tenant
50
+ tenant = tenant.constantize if tenant.is_a? String
51
+ unless @@tenants.any? { |m| m.name == tenant.name }
52
+ tenant.send :tenant
53
+ @@tenants << tenant
54
+ end
55
+ end
56
+
57
+
58
+ #
59
+ # Allows to configure what happens when the access is denied,
60
+ # or call the block that has been given
61
+ #
62
+ # The block access denied receives as arguments:
63
+ # user, instance, action, request_path
64
+ #
65
+ def self.access_denied *args, &block
66
+ if block.present?
67
+ @@access_denied_block = block
68
+ else
69
+ @@access_denied_block.call(*args) if defined?(@@access_denied_block)
70
+ end
71
+ end
72
+
73
+ #
74
+ # Allows to set Capability Models list
75
+ #
76
+ def self.models= models
77
+ Strongbolt::Capability.add_models models
78
+ end
79
+
80
+ #
81
+ # Controllers to skip controller authorization check ups
82
+ #
83
+ def self.skip_controller_authorization_for *controllers
84
+ ActiveSupport.on_load :action_controller do
85
+ controllers.each do |controller|
86
+ begin
87
+ "#{controller.camelize}Controller".constantize.send :skip_controller_authorization
88
+ rescue NameError => e
89
+ raise NameError, "Controller #{controller} doesn't correspond to a valid controller name"
90
+ end
91
+ end
92
+ end
93
+ end
94
+
95
+ #
96
+ # Default permissions
97
+ #
98
+ @@default_capabilities = []
99
+ def self.default_capabilities= list
100
+ @@default_capabilities = list.inject([]) do |capabilities, hash|
101
+ capabilities.concat Capability.from_hash(hash)
102
+ end
103
+ end
104
+
105
+ def self.default_capabilities
106
+ @@default_capabilities
107
+ end
108
+
109
+ end
110
+
111
+ end
@@ -0,0 +1,37 @@
1
+ require 'active_support/inflector'
2
+
3
+ module Strongbolt
4
+ module Controllers
5
+ #
6
+ # Creates the url helpers without the 'strongbolt_' prefix,
7
+ # that both Strongbolt views and the app views can use
8
+ #
9
+ # It's not very nice like that but would be too complicated to do like Devise for now...
10
+ #
11
+ module UrlHelpers
12
+ URLS = %w{role user_group user_group_user role_capability}
13
+
14
+ #
15
+ # Creates the url helpers for the specific url and scope
16
+ #
17
+ def self.create_url_helper url, scope=nil
18
+ [:path, :url].each do |path_or_url|
19
+ class_eval <<-URL_HELPERS
20
+ def #{scope.present? ? "#{scope}_" : ''}#{url}_#{path_or_url} *args
21
+ send(:main_app).send("#{scope.present? ? "#{scope}_" : ''}strongbolt_#{url}_#{path_or_url}", *args)
22
+ end
23
+ URL_HELPERS
24
+ end
25
+ end
26
+
27
+ #
28
+ # Loads all the required helpers
29
+ #
30
+ URLS.each do |url|
31
+ create_url_helper url
32
+ create_url_helper url.pluralize
33
+ [:new, :edit].each { |scope| create_url_helper url, scope }
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,44 @@
1
+ require "strongbolt/rails/routes"
2
+
3
+ require "strongbolt/helpers"
4
+ require "strongbolt/controllers/url_helpers"
5
+
6
+ module Strongbolt
7
+ class Engine < ::Rails::Engine
8
+
9
+ initializer 'strongbolt.assets.precompile' do |app|
10
+ %w(javascripts).each do |sub|
11
+ app.config.assets.paths << root.join('app', 'assets', sub).to_s
12
+ end
13
+ end
14
+
15
+ initializer "strongbolt.helpers" do
16
+ ActionView::Base.send :include, Strongbolt::Helpers
17
+ end
18
+
19
+ #
20
+ # Session Store should be accessible anytime
21
+ #
22
+ initializer "strongbolt.session" do
23
+ if defined? ActiveRecord::SessionStore::Session
24
+ ActiveRecord::SessionStore::Session.grant(:find, :create, :update, :destroy) { true }
25
+ end
26
+ end
27
+
28
+ #
29
+ # Avoids authorization checking in the middleware
30
+ #
31
+ initializer "strongbolt.devise_integration" do
32
+ if defined?(Warden) && defined?(Warden::SessionSerializer)
33
+ Warden::SessionSerializer.perform_without_authorization :store, :fetch, :delete
34
+ end
35
+ end
36
+
37
+ #
38
+ # Initialize our custom url helpers
39
+ #
40
+ initializer "strongbolt.url_helpers" do
41
+ Strongbolt.include_helpers Strongbolt::Controllers
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,38 @@
1
+ module Strongbolt
2
+ StrongboltError = Class.new StandardError
3
+
4
+ #
5
+ # Copy & Paste of Grant Error
6
+ #
7
+ class Unauthorized < StrongboltError
8
+ attr_reader :user, :action, :model
9
+
10
+ def initialize(*args)
11
+ if args.size == 3
12
+ @user, @action, @model = args
13
+ else
14
+ @message = args[0]
15
+ end
16
+ end
17
+
18
+ def to_s
19
+ if @message
20
+ @message
21
+ else
22
+ user_str = user == nil ? 'Anonymous' : "#{user.try(:class).try(:name)}:#{user.try :id}"
23
+ model_str = model.is_a?(Class) ? "#{model.try :name}" : "#{model.try(:class).try(:name)}:#{model.try :id}"
24
+ "#{action} permission not granted to #{user_str} for resource #{model_str}"
25
+ end
26
+ end
27
+ end
28
+
29
+ ModelNotFound = Class.new StrongboltError
30
+ ActionNotConfigured = Class.new StrongboltError
31
+
32
+ WrongUserClass = Class.new StrongboltError
33
+ ModelNotOwned = Class.new StrongboltError
34
+
35
+ TenantError = Class.new StrongboltError
36
+ InverseAssociationNotConfigured = Class.new TenantError
37
+ DirectAssociationNotConfigured = Class.new TenantError
38
+ end
@@ -0,0 +1,35 @@
1
+ require 'rails/generators/active_record'
2
+
3
+ module Strongbolt
4
+ module Generators
5
+ module Migration
6
+ def self.included receiver
7
+ receiver.send :include, Rails::Generators::Migration
8
+ receiver.send :include, InstanceMethods
9
+ receiver.extend ClassMethods
10
+ end
11
+
12
+ module ClassMethods
13
+ #
14
+ # Need to add this here... Don't know why it's not in a Rails module
15
+ #
16
+ def next_migration_number(dirname)
17
+ next_migration_number = current_migration_number(dirname) + 1
18
+ ActiveRecord::Migration.next_migration_number(next_migration_number)
19
+ end
20
+
21
+ end
22
+
23
+ module InstanceMethods
24
+
25
+ def copy_migration(source, target)
26
+ if self.class.migration_exists?("db/migrate", "#{target}")
27
+ say_status "skipped", "Migration #{target}.rb already exists"
28
+ else
29
+ migration_template "#{source}.rb", "db/migrate/#{target}.rb"
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,18 @@
1
+ module Strongbolt
2
+ module Helpers
3
+ def can? *args, &block
4
+ # Block can be used when testing an instance
5
+ Strongbolt.without_authorization do
6
+ if block.present?
7
+ args.insert 1, block.call
8
+ end
9
+
10
+ return current_user.can? *args
11
+ end
12
+ end
13
+
14
+ def cannot? *args, &block
15
+ ! can? *args, &block
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,20 @@
1
+ module ActionDispatch::Routing
2
+ #
3
+ # Creates the strongbolt route helper method
4
+ #
5
+ class Mapper
6
+ def strongbolt
7
+ scope :module => :strongbolt do
8
+ resources :user_groups do
9
+ resources :user_groups_users, as: :users, path: 'users', only: [:create, :destroy]
10
+ end
11
+
12
+ resources :roles do
13
+ resources :capabilities, only: [:create, :destroy] do
14
+ delete :destroy, on: :collection
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,46 @@
1
+ module Strongbolt
2
+ class Role < Base
3
+
4
+ acts_as_nested_set
5
+
6
+ validates :name, presence: true
7
+
8
+ has_many :roles_user_groups,
9
+ :class_name => "Strongbolt::RolesUserGroup",
10
+ :dependent => :restrict_with_exception,
11
+ :inverse_of => :role
12
+ has_many :user_groups, :through => :roles_user_groups
13
+
14
+ has_many :users, through: :user_groups
15
+
16
+ has_many :capabilities_roles,
17
+ :class_name => "Strongbolt::CapabilitiesRole",
18
+ :dependent => :delete_all,
19
+ :inverse_of => :role
20
+ has_many :capabilities, :through => :capabilities_roles
21
+
22
+ before_destroy :should_not_have_children
23
+
24
+ # We SHOULD NOT destroy descendants in our case
25
+ skip_callback :destroy, :before, :destroy_descendants
26
+
27
+ #
28
+ # Returns inherited capabilities
29
+ #
30
+ def inherited_capabilities
31
+ Strongbolt::Capability.joins(:roles)
32
+ .where("strongbolt_roles.lft < :lft AND strongbolt_roles.rgt > :rgt", lft: lft, rgt: rgt)
33
+ .distinct
34
+ end
35
+
36
+ private
37
+
38
+ def should_not_have_children
39
+ if children.count > 0
40
+ raise ActiveRecord::DeleteRestrictionError.new :children
41
+ end
42
+ end
43
+ end
44
+ end
45
+
46
+ Role = Strongbolt::Role unless defined? Role
@@ -0,0 +1,15 @@
1
+ module Strongbolt
2
+ class RolesUserGroup < Base
3
+ authorize_as "Strongbolt::UserGroup"
4
+
5
+ belongs_to :user_group,
6
+ :class_name => "Strongbolt::UserGroup",
7
+ :inverse_of => :roles_user_groups
8
+
9
+ belongs_to :role,
10
+ :class_name => "Strongbolt::Role",
11
+ :inverse_of => :roles_user_groups
12
+
13
+ validates_presence_of :user_group, :role
14
+ end
15
+ end
@@ -0,0 +1,29 @@
1
+ #
2
+ # Setups Rspec related stuff to handle correctly Strongbolt
3
+ #
4
+ require 'strongbolt'
5
+
6
+ Strongbolt.switch_to_multithread
7
+
8
+ if defined?(RSpec)
9
+ # We load the class that overrides user behavior,
10
+ # more convenient for tests
11
+ require 'strongbolt/rspec/user'
12
+
13
+ RSpec.configure do |config|
14
+ #
15
+ # When creating stuff in before :all, avoid leaks
16
+ #
17
+ config.before(:all) do
18
+ Strongbolt.current_user = nil
19
+ end
20
+
21
+ config.around(:each) do |example|
22
+ Strongbolt.without_authorization &example
23
+ # Clear all the User authorizations that could have been defined
24
+ User.clear_authorizations
25
+ # Removes the user from current_user to avoid leaks
26
+ Strongbolt.current_user = nil
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,90 @@
1
+ require 'rspec/mocks'
2
+ #
3
+ # We define a can! that allows to quickly stub a user authorization
4
+ #
5
+ Strongbolt.user_class_constant.class_eval do
6
+ #
7
+ # Best to use a class context and use class instance variables
8
+ #
9
+ class << self
10
+
11
+ def authorizations
12
+ @authorizations ||= {}
13
+ end
14
+
15
+ def set_authorization_for user, authorized, *args
16
+ return if user.new_record?
17
+
18
+ self.authorizations[user.id] ||= {}
19
+ self.authorizations[user.id][key_for(*args)] = authorized
20
+ end
21
+
22
+ def clear_authorizations
23
+ @authorizations = {}
24
+ end
25
+
26
+ def authorized? user, *args
27
+ # Cannot do if user not saved
28
+ return false if user.new_record?
29
+ key = key_for(*args)
30
+ if self.authorizations[user.id].present? && self.authorizations[user.id][key].present?
31
+ return self.authorizations[user.id][key]
32
+ else
33
+ user._can? *args
34
+ end
35
+ end
36
+
37
+ def key_for *args
38
+ action = args[0]
39
+ instance = args[1]
40
+ attrs = args[2] || :any
41
+ all_instances = (args[3] || false) ? "all" : "tenanted"
42
+ if instance.is_a?(ActiveRecord::Base)
43
+ model = instance.class.name
44
+ if instance.new_record?
45
+ "#{action}-#{model}-#{attrs}-#{all_instances}"
46
+ else
47
+ "#{action}-#{model}-#{attrs}-#{instance.id}"
48
+ end
49
+ else
50
+ model = instance.class.name
51
+ "#{action}-#{model}-#{attrs}-#{all_instances}"
52
+ end
53
+ end
54
+
55
+ end
56
+
57
+ #
58
+ # 2 methods to setup mocking and stubs
59
+ #
60
+ def init
61
+ if RSpec::Mocks::Version::STRING >= "3.0"
62
+ require "rspec/mocks/standalone"
63
+ else
64
+ RSpec::Mocks::setup(self) unless self.respond_to? :allow
65
+ end
66
+ end
67
+
68
+ def setup_stub authorized, arguments
69
+ init
70
+ # Set the authorizations on a class level
71
+ self.class.set_authorization_for self, authorized, *arguments
72
+ end
73
+
74
+ #
75
+ # Mocked methods
76
+ #
77
+ alias_method :_can?, :can?
78
+
79
+ def can? *args
80
+ self.class.authorized? self, *args
81
+ end
82
+
83
+ def can! *args
84
+ setup_stub true, args
85
+ end
86
+
87
+ def cannot! *args
88
+ setup_stub false, args
89
+ end
90
+ end