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.
- checksums.yaml +7 -0
- data/.editorconfig +33 -0
- data/.gitignore +18 -0
- data/.rspec +1 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +130 -0
- data/LICENSE.txt +22 -0
- data/README.md +182 -0
- data/Rakefile +1 -0
- data/app/assets/javascripts/strongbolt.js +1 -0
- data/app/assets/javascripts/strongbolt/role-capabilities.js +80 -0
- data/app/controllers/strongbolt/capabilities_controller.rb +77 -0
- data/app/controllers/strongbolt/roles_controller.rb +92 -0
- data/app/controllers/strongbolt/security_controller.rb +8 -0
- data/app/controllers/strongbolt/user_groups_controller.rb +76 -0
- data/app/controllers/strongbolt/user_groups_users_controller.rb +35 -0
- data/app/controllers/strongbolt_controller.rb +2 -0
- data/app/views/strongbolt/_menu.html.erb +13 -0
- data/app/views/strongbolt/capabilities/index.html.erb +53 -0
- data/app/views/strongbolt/capabilities/show.html.erb +53 -0
- data/app/views/strongbolt/roles/_capabilities.html.erb +47 -0
- data/app/views/strongbolt/roles/_capability.html.erb +21 -0
- data/app/views/strongbolt/roles/_form.html.erb +12 -0
- data/app/views/strongbolt/roles/edit.html.erb +14 -0
- data/app/views/strongbolt/roles/index.html.erb +54 -0
- data/app/views/strongbolt/roles/new.html.erb +11 -0
- data/app/views/strongbolt/roles/show.html.erb +52 -0
- data/app/views/strongbolt/user_groups/_form.html.erb +12 -0
- data/app/views/strongbolt/user_groups/edit.html.erb +14 -0
- data/app/views/strongbolt/user_groups/index.html.erb +46 -0
- data/app/views/strongbolt/user_groups/new.html.erb +13 -0
- data/app/views/strongbolt/user_groups/show.html.erb +88 -0
- data/lib/generators/strongbolt/fix_generator.rb +23 -0
- data/lib/generators/strongbolt/indexes_generator.rb +19 -0
- data/lib/generators/strongbolt/install_generator.rb +29 -0
- data/lib/generators/strongbolt/templates/fix.rb +5 -0
- data/lib/generators/strongbolt/templates/indexes.rb +21 -0
- data/lib/generators/strongbolt/templates/migration.rb +73 -0
- data/lib/generators/strongbolt/templates/strongbolt.rb +45 -0
- data/lib/generators/strongbolt/views_generator.rb +26 -0
- data/lib/strongbolt.rb +219 -0
- data/lib/strongbolt/base.rb +7 -0
- data/lib/strongbolt/bolted.rb +125 -0
- data/lib/strongbolt/bolted_controller.rb +297 -0
- data/lib/strongbolt/capabilities_role.rb +15 -0
- data/lib/strongbolt/capability.rb +165 -0
- data/lib/strongbolt/configuration.rb +111 -0
- data/lib/strongbolt/controllers/url_helpers.rb +37 -0
- data/lib/strongbolt/engine.rb +44 -0
- data/lib/strongbolt/errors.rb +38 -0
- data/lib/strongbolt/generators/migration.rb +35 -0
- data/lib/strongbolt/helpers.rb +18 -0
- data/lib/strongbolt/rails/routes.rb +20 -0
- data/lib/strongbolt/role.rb +46 -0
- data/lib/strongbolt/roles_user_group.rb +15 -0
- data/lib/strongbolt/rspec.rb +29 -0
- data/lib/strongbolt/rspec/user.rb +90 -0
- data/lib/strongbolt/tenantable.rb +304 -0
- data/lib/strongbolt/user_abilities.rb +292 -0
- data/lib/strongbolt/user_group.rb +24 -0
- data/lib/strongbolt/user_groups_user.rb +16 -0
- data/lib/strongbolt/users_tenant.rb +12 -0
- data/lib/strongbolt/version.rb +3 -0
- data/lib/tasks/strongbolt_tasks.rake +29 -0
- data/spec/controllers/strongbolt/capabilities_controller_spec.rb +254 -0
- data/spec/controllers/strongbolt/roles_controller_spec.rb +228 -0
- data/spec/controllers/strongbolt/user_groups_controller_spec.rb +216 -0
- data/spec/controllers/strongbolt/user_groups_users_controller_spec.rb +69 -0
- data/spec/controllers/without_authorization_controller_spec.rb +20 -0
- data/spec/dummy/.rspec +2 -0
- data/spec/dummy/README.rdoc +28 -0
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/assets/images/.keep +0 -0
- data/spec/dummy/app/assets/javascripts/application.js +13 -0
- data/spec/dummy/app/assets/stylesheets/application.css +15 -0
- data/spec/dummy/app/controllers/application_controller.rb +5 -0
- data/spec/dummy/app/controllers/concerns/.keep +0 -0
- data/spec/dummy/app/controllers/posts_controller.rb +18 -0
- data/spec/dummy/app/controllers/test_controller.rb +3 -0
- data/spec/dummy/app/controllers/without_authorization_controller.rb +5 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/mailers/.keep +0 -0
- data/spec/dummy/app/models/.keep +0 -0
- data/spec/dummy/app/models/concerns/.keep +0 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +29 -0
- data/spec/dummy/config/boot.rb +5 -0
- data/spec/dummy/config/database.yml +25 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +37 -0
- data/spec/dummy/config/environments/production.rb +78 -0
- data/spec/dummy/config/environments/test.rb +39 -0
- data/spec/dummy/config/initializers/assets.rb +8 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/mime_types.rb +4 -0
- data/spec/dummy/config/initializers/session_store.rb +3 -0
- data/spec/dummy/config/initializers/strongbolt.rb +32 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +23 -0
- data/spec/dummy/config/routes.rb +12 -0
- data/spec/dummy/config/secrets.yml +22 -0
- data/spec/dummy/db/development.sqlite3 +0 -0
- data/spec/dummy/db/migrate/20150630212236_create_strongbolt_tables.rb +54 -0
- data/spec/dummy/db/migrate/20150630212251_create_strongbolt_tables_indexes.rb +21 -0
- data/spec/dummy/db/schema.rb +84 -0
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/lib/assets/.keep +0 -0
- data/spec/dummy/public/404.html +67 -0
- data/spec/dummy/public/422.html +67 -0
- data/spec/dummy/public/500.html +66 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/fabricators/capability_fabricator.rb +4 -0
- data/spec/fabricators/role_fabricator.rb +9 -0
- data/spec/fabricators/user_fabricator.rb +3 -0
- data/spec/fabricators/user_group_fabricator.rb +9 -0
- data/spec/fixtures/application.rb +28 -0
- data/spec/fixtures/controllers.rb +5 -0
- data/spec/spec_helper.rb +89 -0
- data/spec/strongbolt/bolted_controller_spec.rb +706 -0
- data/spec/strongbolt/bolted_spec.rb +136 -0
- data/spec/strongbolt/capability_spec.rb +251 -0
- data/spec/strongbolt/configuration_spec.rb +119 -0
- data/spec/strongbolt/controllers/url_helpers_spec.rb +34 -0
- data/spec/strongbolt/helpers_spec.rb +43 -0
- data/spec/strongbolt/role_spec.rb +90 -0
- data/spec/strongbolt/tenantable_spec.rb +281 -0
- data/spec/strongbolt/user_abilities_spec.rb +509 -0
- data/spec/strongbolt/user_group_spec.rb +37 -0
- data/spec/strongbolt/users_tenant_spec.rb +36 -0
- data/spec/strongbolt_spec.rb +274 -0
- data/spec/support/controller_macros.rb +11 -0
- data/spec/support/db_setup.rb +134 -0
- data/spec/support/helpers.rb +62 -0
- data/spec/support/transactional_specs.rb +17 -0
- data/strongbolt.gemspec +32 -0
- metadata +407 -0
|
@@ -0,0 +1,509 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
|
|
3
|
+
describe Strongbolt::UserAbilities do
|
|
4
|
+
|
|
5
|
+
before(:all) do
|
|
6
|
+
#
|
|
7
|
+
# This is a very basic schema that allows having a model,
|
|
8
|
+
# ChildModel, being tenanted by Model
|
|
9
|
+
#
|
|
10
|
+
define_model "TenantModel" do
|
|
11
|
+
self.table_name = "models"
|
|
12
|
+
|
|
13
|
+
has_many :owned_models, foreign_key: :parent_id
|
|
14
|
+
belongs_to :unowned_model, foreign_key: :parent_id
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
define_model "OwnedModel" do
|
|
18
|
+
self.table_name = "child_models"
|
|
19
|
+
|
|
20
|
+
belongs_to :user, foreign_key: :model_id
|
|
21
|
+
belongs_to :tenant_model, foreign_key: :parent_id
|
|
22
|
+
|
|
23
|
+
has_many :child_models, foreign_key: :parent_id
|
|
24
|
+
|
|
25
|
+
validates :tenant_model, presence: true
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
define_model "ChildModel" do
|
|
29
|
+
self.table_name = "model_models"
|
|
30
|
+
|
|
31
|
+
belongs_to :owned_model, foreign_key: :parent_id
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
define_model "UnownedModel" do
|
|
35
|
+
self.table_name = "unowned_models"
|
|
36
|
+
|
|
37
|
+
has_many :tenant_models, foreign_key: :parent_id
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
define_model "OtherModel" do
|
|
41
|
+
self.table_name = "models"
|
|
42
|
+
|
|
43
|
+
authorize_as "UnownedModel"
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
Strongbolt::Configuration.add_tenant TenantModel
|
|
47
|
+
end
|
|
48
|
+
after(:all) do
|
|
49
|
+
undefine_model TenantModel
|
|
50
|
+
Strongbolt::Configuration.tenants = []
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
let(:user) { User.create! }
|
|
54
|
+
|
|
55
|
+
subject { user }
|
|
56
|
+
|
|
57
|
+
it { is_expected.to have_many(:user_groups_users).class_name("Strongbolt::UserGroupsUser")
|
|
58
|
+
.dependent :delete_all }
|
|
59
|
+
it { is_expected.to have_many(:user_groups).through :user_groups_users }
|
|
60
|
+
it { is_expected.to have_many(:roles).through :user_groups }
|
|
61
|
+
it { is_expected.to respond_to(:capabilities) }
|
|
62
|
+
it { is_expected.to have_many(:tenant_models) }
|
|
63
|
+
|
|
64
|
+
it "should let user find itself" do
|
|
65
|
+
expect(user.can? :find, user).to eq true
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
#
|
|
70
|
+
# Creates some fixtures for the tests here
|
|
71
|
+
#
|
|
72
|
+
def create_fixtures
|
|
73
|
+
# An unown model linked to a tenant
|
|
74
|
+
@linked_to_tenant = UnownedModel.create!
|
|
75
|
+
@tenant_model = TenantModel.create! unowned_model: @linked_to_tenant
|
|
76
|
+
@other_tenant_model = TenantModel.create!
|
|
77
|
+
# Add to the user
|
|
78
|
+
user.add_tenant @tenant_model
|
|
79
|
+
|
|
80
|
+
# Another user
|
|
81
|
+
@other_user = User.create!
|
|
82
|
+
# A owned model, owned
|
|
83
|
+
@owned_model = OwnedModel.create! user: user,
|
|
84
|
+
tenant_model: @tenant_model
|
|
85
|
+
# An model not owned
|
|
86
|
+
@unowned_model = OwnedModel.create! user: @other_user,
|
|
87
|
+
tenant_model: @tenant_model
|
|
88
|
+
# Other tenant model
|
|
89
|
+
@unmanaged_model = OwnedModel.create! tenant_model: @other_tenant_model
|
|
90
|
+
# An unownable model
|
|
91
|
+
@model = UnownedModel.create!
|
|
92
|
+
|
|
93
|
+
# Child
|
|
94
|
+
@child_model = @owned_model.child_models.create!
|
|
95
|
+
|
|
96
|
+
# The user belong to a group
|
|
97
|
+
@group = Strongbolt::UserGroup.create! name: "Normal"
|
|
98
|
+
@group.users << user
|
|
99
|
+
|
|
100
|
+
# That has a role
|
|
101
|
+
@guest_role = Strongbolt::Role.create! name: "Guest"
|
|
102
|
+
@parent_role = Strongbolt::Role.create! name: "Basic", parent_id: @guest_role.id
|
|
103
|
+
@other_role = Strongbolt::Role.create! name: "Admin"
|
|
104
|
+
@role = @group.roles.create! name: "Normal", parent_id: @parent_role.id
|
|
105
|
+
|
|
106
|
+
# Which has capabilities
|
|
107
|
+
|
|
108
|
+
# User can update self
|
|
109
|
+
@parent_role.capabilities.create! model: "User", action: "update", require_ownership: true
|
|
110
|
+
|
|
111
|
+
# User can read all owned models
|
|
112
|
+
@parent_role.capabilities.create! model: "OwnedModel", action: "find"
|
|
113
|
+
|
|
114
|
+
# And create some
|
|
115
|
+
@role.capabilities.create! model: "OwnedModel", action: "create", require_ownership: true
|
|
116
|
+
|
|
117
|
+
# But can delete only owned models
|
|
118
|
+
@role.capabilities.create! model: "OwnedModel", action: "destroy", require_ownership: true
|
|
119
|
+
|
|
120
|
+
# User can read any unowned models
|
|
121
|
+
@guest_role.capabilities.create! model: "UnownedModel", action: "find"
|
|
122
|
+
|
|
123
|
+
# But can create setting only the attribute name
|
|
124
|
+
@role.capabilities.create! model: "UnownedModel", action: "create", attr: "name",
|
|
125
|
+
:require_tenant_access => false
|
|
126
|
+
|
|
127
|
+
# Admin can do whatever
|
|
128
|
+
@other_role.capabilities.create! model: "UnownedModel", action: "create"
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
#
|
|
135
|
+
# Adding a tenant to the user
|
|
136
|
+
#
|
|
137
|
+
describe "add_tenant" do
|
|
138
|
+
|
|
139
|
+
context 'when instance is from a tenant' do
|
|
140
|
+
let(:model) { TenantModel.create! }
|
|
141
|
+
|
|
142
|
+
it "should create an association" do
|
|
143
|
+
expect do
|
|
144
|
+
user.add_tenant model
|
|
145
|
+
end.to change(Strongbolt::UsersTenant, :count).by 1
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
it "should add the tenant to users's list" do
|
|
149
|
+
user.add_tenant model
|
|
150
|
+
expect(user.tenant_models).to include model
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
context "when instance is not from a tenant" do
|
|
155
|
+
let(:model) { Model.create! }
|
|
156
|
+
|
|
157
|
+
it "should raise an error" do
|
|
158
|
+
expect do
|
|
159
|
+
user.add_tenant model
|
|
160
|
+
end.to raise_error
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
#
|
|
169
|
+
# Has access to tenants?
|
|
170
|
+
#
|
|
171
|
+
describe "has_access_to_tenants?" do
|
|
172
|
+
before { create_fixtures }
|
|
173
|
+
|
|
174
|
+
context "when same tenant" do
|
|
175
|
+
|
|
176
|
+
it "should be true when model is tenant" do
|
|
177
|
+
expect(user.has_access_to_tenants? @tenant_model).to eq true
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
it "should be true when model is first child" do
|
|
181
|
+
expect(user.has_access_to_tenants? @unowned_model).to eq true
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
it "should be true when grand child" do
|
|
185
|
+
expect(user.has_access_to_tenants? @child_model).to eq true
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
it "should be true for a user defined association" do
|
|
189
|
+
expect(user.has_access_to_tenants? @linked_to_tenant).to eq true
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
context "when different tenant" do
|
|
195
|
+
it "should be false when model is tenant" do
|
|
196
|
+
expect(user.has_access_to_tenants? @other_tenant_model).to eq false
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
it "should be false when model is first child" do
|
|
200
|
+
expect(user.has_access_to_tenants? @unmanaged_model).to eq false
|
|
201
|
+
end
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
context "when model doesn't have link to tenant" do
|
|
205
|
+
it "should return true" do
|
|
206
|
+
expect(user.has_access_to_tenants? @model).to eq true
|
|
207
|
+
end
|
|
208
|
+
end
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
#
|
|
214
|
+
# All Capabilities
|
|
215
|
+
#
|
|
216
|
+
describe 'capabilities' do
|
|
217
|
+
|
|
218
|
+
before { create_fixtures }
|
|
219
|
+
|
|
220
|
+
let(:capabilities) { user.capabilities }
|
|
221
|
+
|
|
222
|
+
subject { capabilities }
|
|
223
|
+
|
|
224
|
+
it "should have 6 capabilities" do
|
|
225
|
+
expect(capabilities.size).to eq 6
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
#
|
|
232
|
+
# CAN?
|
|
233
|
+
#
|
|
234
|
+
|
|
235
|
+
describe "can?" do
|
|
236
|
+
|
|
237
|
+
before { create_fixtures }
|
|
238
|
+
|
|
239
|
+
describe "creating an owned model" do
|
|
240
|
+
|
|
241
|
+
context "when authorized" do
|
|
242
|
+
let(:tenant_model) { TenantModel.create! }
|
|
243
|
+
|
|
244
|
+
before { user.tenant_models << tenant_model }
|
|
245
|
+
|
|
246
|
+
context "when same tenant" do
|
|
247
|
+
let(:instance) { OwnedModel.new tenant_model: tenant_model }
|
|
248
|
+
|
|
249
|
+
it "should return true when passing instance" do
|
|
250
|
+
expect(user.can? :create, instance).to eq true
|
|
251
|
+
end
|
|
252
|
+
end
|
|
253
|
+
|
|
254
|
+
context "when not same tenant" do
|
|
255
|
+
|
|
256
|
+
let(:instance) { OwnedModel.new tenant_model: TenantModel.create! }
|
|
257
|
+
|
|
258
|
+
it "should return false when passing instance" do
|
|
259
|
+
expect(user.can? :create, instance).to eq false
|
|
260
|
+
end
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
it "should return true when passing class" do
|
|
264
|
+
expect(user.can? :create, OwnedModel).to eq true
|
|
265
|
+
end
|
|
266
|
+
end
|
|
267
|
+
|
|
268
|
+
context "when not authorized" do
|
|
269
|
+
it "should return true when passing instance" do
|
|
270
|
+
expect(user.can? :create, User.new).to eq false
|
|
271
|
+
end
|
|
272
|
+
|
|
273
|
+
it "should return true when passing class" do
|
|
274
|
+
expect(user.can? :create, User).to eq false
|
|
275
|
+
end
|
|
276
|
+
end
|
|
277
|
+
|
|
278
|
+
context "when default set of permissions" do
|
|
279
|
+
before do
|
|
280
|
+
Strongbolt.setup do |config|
|
|
281
|
+
config.default_capabilities = [
|
|
282
|
+
{:model => "OwnedModel", :require_ownership => true, :actions => :update},
|
|
283
|
+
{:model => "TenantModel", :require_tenant_access => false, :require_ownership => false, :actions => "find"}
|
|
284
|
+
]
|
|
285
|
+
end
|
|
286
|
+
end
|
|
287
|
+
after do
|
|
288
|
+
Strongbolt.setup do |config|
|
|
289
|
+
config.default_capabilities = []
|
|
290
|
+
end
|
|
291
|
+
end
|
|
292
|
+
|
|
293
|
+
let(:other_user) { User.create! }
|
|
294
|
+
let(:owned_model) { OwnedModel.create! :user => user, :tenant_model => TenantModel.create! }
|
|
295
|
+
let(:unowned_model) { OwnedModel.create! :user => other_user, :tenant_model => TenantModel.create! }
|
|
296
|
+
|
|
297
|
+
it "should let the user update an owned model" do
|
|
298
|
+
expect(user.can? :update, owned_model).to eq true
|
|
299
|
+
end
|
|
300
|
+
|
|
301
|
+
it "should not let the user update an owned model from another user" do
|
|
302
|
+
expect(user.can? :update, unowned_model).to eq false
|
|
303
|
+
end
|
|
304
|
+
end
|
|
305
|
+
|
|
306
|
+
end # Creating an owned model
|
|
307
|
+
|
|
308
|
+
describe "updating an owned model" do
|
|
309
|
+
context "when owning model" do
|
|
310
|
+
it "should return true" do
|
|
311
|
+
expect(user.can? :update, user).to eq true
|
|
312
|
+
end
|
|
313
|
+
end
|
|
314
|
+
|
|
315
|
+
context "when not owning model" do
|
|
316
|
+
it "should return false" do
|
|
317
|
+
expect(user.can? :update, @other_user).to eq false
|
|
318
|
+
end
|
|
319
|
+
end
|
|
320
|
+
end # Updating an owned model
|
|
321
|
+
|
|
322
|
+
describe "creating a model with attribute restriction" do
|
|
323
|
+
|
|
324
|
+
context "when requiring all attributes" do
|
|
325
|
+
it "should return false" do
|
|
326
|
+
expect(user.can? :create, UnownedModel, :all).to eq false
|
|
327
|
+
end
|
|
328
|
+
|
|
329
|
+
it "should return false for other model authorized as it" do
|
|
330
|
+
expect(user.can? :create, OtherModel, :all).to eq false
|
|
331
|
+
end
|
|
332
|
+
end
|
|
333
|
+
|
|
334
|
+
context "when requiring any attribute" do
|
|
335
|
+
it "should return true" do
|
|
336
|
+
expect(user.can? :create, UnownedModel, :any).to eq true
|
|
337
|
+
end
|
|
338
|
+
|
|
339
|
+
it "should return true for other model authorized as it" do
|
|
340
|
+
expect(user.can? :create, OtherModel, :any).to eq true
|
|
341
|
+
end
|
|
342
|
+
end
|
|
343
|
+
|
|
344
|
+
end # Creating a model with restricted attributes
|
|
345
|
+
|
|
346
|
+
describe "creating a non tenanted model" do
|
|
347
|
+
let(:instance) { UnownedModel.new }
|
|
348
|
+
|
|
349
|
+
context "when user has the right" do
|
|
350
|
+
it "should return true" do
|
|
351
|
+
expect(user.can? :create, instance).to eq true
|
|
352
|
+
end
|
|
353
|
+
end
|
|
354
|
+
end
|
|
355
|
+
|
|
356
|
+
describe 'destroying an owned model' do
|
|
357
|
+
context "when owning" do
|
|
358
|
+
it "should be true" do
|
|
359
|
+
expect(user.can? :destroy, @owned_model).to eq true
|
|
360
|
+
end
|
|
361
|
+
end
|
|
362
|
+
|
|
363
|
+
context "when not owning" do
|
|
364
|
+
it "should be false" do
|
|
365
|
+
expect(user.can? :destroy, @unowned_model).to eq false
|
|
366
|
+
end
|
|
367
|
+
end
|
|
368
|
+
end
|
|
369
|
+
|
|
370
|
+
describe "finding model" do
|
|
371
|
+
context "when same tenant" do
|
|
372
|
+
it "should be true" do
|
|
373
|
+
expect(user.can? :find, @unowned_model).to eq true
|
|
374
|
+
end
|
|
375
|
+
end
|
|
376
|
+
|
|
377
|
+
context "when not same tenant" do
|
|
378
|
+
it "should be false" do
|
|
379
|
+
expect(user.can? :find, @unmanaged_model).to eq false
|
|
380
|
+
end
|
|
381
|
+
end
|
|
382
|
+
end
|
|
383
|
+
|
|
384
|
+
end # End can?
|
|
385
|
+
|
|
386
|
+
|
|
387
|
+
|
|
388
|
+
|
|
389
|
+
|
|
390
|
+
#
|
|
391
|
+
# Populate Capabilities Cache
|
|
392
|
+
#
|
|
393
|
+
|
|
394
|
+
describe "Populate Capabilities Cache" do
|
|
395
|
+
|
|
396
|
+
#
|
|
397
|
+
# We create some fixtures for the population of cache to be tested
|
|
398
|
+
#
|
|
399
|
+
before { create_fixtures }
|
|
400
|
+
|
|
401
|
+
let(:cache) { user.populate_capabilities_cache }
|
|
402
|
+
|
|
403
|
+
subject { cache }
|
|
404
|
+
|
|
405
|
+
it "should have the right number of capabilities" do
|
|
406
|
+
expect(cache.size).to eq 4 * 6 + 2
|
|
407
|
+
end
|
|
408
|
+
|
|
409
|
+
[
|
|
410
|
+
"updateUserall-any", "updateUserany-any", # "updateUserall-#{User.first.id}", "updateUserany-#{User.first.id}",
|
|
411
|
+
"findOwnedModelall-any", "findOwnedModelany-any", "findOwnedModelall-tenanted", "findOwnedModelany-tenanted",
|
|
412
|
+
"createOwnedModelall-any", "createOwnedModelany-any", "createOwnedModelall-owned", "createOwnedModelany-owned",
|
|
413
|
+
"destroyOwnedModelall-any", "destroyOwnedModelany-any", "destroyOwnedModelall-owned", "destroyOwnedModelany-owned",
|
|
414
|
+
"findUnownedModelall-any", "findUnownedModelany-any", "findUnownedModelall-tenanted", "findUnownedModelany-tenanted",
|
|
415
|
+
"createUnownedModelname-any", "createUnownedModelany-any", "createUnownedModelname-all", "createUnownedModelany-all"
|
|
416
|
+
].each do |key|
|
|
417
|
+
it "should have set true to #{key}" do
|
|
418
|
+
expect(cache[key]).to eq true
|
|
419
|
+
end
|
|
420
|
+
end
|
|
421
|
+
|
|
422
|
+
end
|
|
423
|
+
|
|
424
|
+
|
|
425
|
+
|
|
426
|
+
|
|
427
|
+
|
|
428
|
+
|
|
429
|
+
#
|
|
430
|
+
# OWNS?
|
|
431
|
+
#
|
|
432
|
+
describe "owns?" do
|
|
433
|
+
|
|
434
|
+
#
|
|
435
|
+
# Another user
|
|
436
|
+
#
|
|
437
|
+
context "when testing against a user" do
|
|
438
|
+
|
|
439
|
+
context 'when other user' do
|
|
440
|
+
|
|
441
|
+
let(:other_user) { User.create! }
|
|
442
|
+
|
|
443
|
+
it "should not own it" do
|
|
444
|
+
expect(user.owns? other_user).to eq false
|
|
445
|
+
end
|
|
446
|
+
|
|
447
|
+
end
|
|
448
|
+
|
|
449
|
+
context "when same user" do
|
|
450
|
+
it "should own it" do
|
|
451
|
+
expect(user.owns? user).to eq true
|
|
452
|
+
end
|
|
453
|
+
end
|
|
454
|
+
|
|
455
|
+
end # End owning user
|
|
456
|
+
|
|
457
|
+
|
|
458
|
+
#
|
|
459
|
+
# Another object
|
|
460
|
+
#
|
|
461
|
+
context "when testing against another model having user_id" do
|
|
462
|
+
|
|
463
|
+
context "when owning it" do
|
|
464
|
+
let(:model) { Model.create! user_id: user.id }
|
|
465
|
+
|
|
466
|
+
it "should own it" do
|
|
467
|
+
expect(user.owns? model).to eq true
|
|
468
|
+
end
|
|
469
|
+
end
|
|
470
|
+
|
|
471
|
+
context "when not owning it" do
|
|
472
|
+
let(:model) { Model.create! user_id: 0 }
|
|
473
|
+
|
|
474
|
+
it "should own it" do
|
|
475
|
+
expect(user.owns? model).to eq false
|
|
476
|
+
end
|
|
477
|
+
end
|
|
478
|
+
|
|
479
|
+
end # End testing against model having user id
|
|
480
|
+
|
|
481
|
+
end
|
|
482
|
+
|
|
483
|
+
|
|
484
|
+
#
|
|
485
|
+
# Another object unowned
|
|
486
|
+
#
|
|
487
|
+
context "when testing against a model not having user id" do
|
|
488
|
+
|
|
489
|
+
let(:model) { UnownedModel.create! }
|
|
490
|
+
|
|
491
|
+
it "should not own it" do
|
|
492
|
+
expect(user.owns? model).to eq false
|
|
493
|
+
end
|
|
494
|
+
|
|
495
|
+
end
|
|
496
|
+
|
|
497
|
+
|
|
498
|
+
#
|
|
499
|
+
# Wrong arguments
|
|
500
|
+
#
|
|
501
|
+
context "when given something else than an object" do
|
|
502
|
+
it "should raise error" do
|
|
503
|
+
expect do
|
|
504
|
+
user.owns? Model
|
|
505
|
+
end.to raise_error ArgumentError
|
|
506
|
+
end
|
|
507
|
+
end
|
|
508
|
+
|
|
509
|
+
end
|