strongbolt 0.3.6
Sign up to get free protection for your applications and to get access to all the features.
- 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,24 @@
|
|
1
|
+
module Strongbolt
|
2
|
+
class UserGroup < Base
|
3
|
+
|
4
|
+
has_many :user_groups_users,
|
5
|
+
:class_name => "Strongbolt::UserGroupsUser",
|
6
|
+
:dependent => :restrict_with_exception,
|
7
|
+
:inverse_of => :user_group
|
8
|
+
has_many :users, :through => :user_groups_users
|
9
|
+
|
10
|
+
has_many :roles_user_groups,
|
11
|
+
:class_name => "Strongbolt::RolesUserGroup",
|
12
|
+
:dependent => :delete_all,
|
13
|
+
:inverse_of => :user_group
|
14
|
+
|
15
|
+
has_many :roles, :through => :roles_user_groups
|
16
|
+
|
17
|
+
has_many :capabilities, through: :roles
|
18
|
+
|
19
|
+
validates_presence_of :name
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
UserGroup = Strongbolt::UserGroup unless defined? UserGroup
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Strongbolt
|
2
|
+
class UserGroupsUser < Base
|
3
|
+
authorize_as "Strongbolt::UserGroup"
|
4
|
+
|
5
|
+
belongs_to :user_group,
|
6
|
+
:class_name => "Strongbolt::UserGroup",
|
7
|
+
:inverse_of => :user_groups_users
|
8
|
+
|
9
|
+
belongs_to :user,
|
10
|
+
:class_name => Configuration.user_class,
|
11
|
+
:foreign_key => :user_id,
|
12
|
+
:inverse_of => :user_groups_users
|
13
|
+
|
14
|
+
validates_presence_of :user_group, :user
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module Strongbolt
|
2
|
+
#
|
3
|
+
# This is a STI model that will have subclasses making links
|
4
|
+
# from users to tenants (if one or more tenants are defined)
|
5
|
+
#
|
6
|
+
class UsersTenant < Base
|
7
|
+
# Required validation for every subclass
|
8
|
+
validates :user, presence: true
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
UsersTenant = Strongbolt::UsersTenant unless defined? UsersTenant
|
@@ -0,0 +1,29 @@
|
|
1
|
+
namespace :strongbolt do
|
2
|
+
#
|
3
|
+
# Create full authorization roles that allows to get started using StrongBolt
|
4
|
+
#
|
5
|
+
task :seed => :environment do
|
6
|
+
ActiveRecord::Base.transaction do
|
7
|
+
#
|
8
|
+
# Creates capabilities for all models/actions
|
9
|
+
#
|
10
|
+
Capability.models.each do |model|
|
11
|
+
Capability::Actions.each do |action|
|
12
|
+
Capability.where(model: model, action: action,
|
13
|
+
require_tenant_access: false).first_or_create
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
# The role
|
18
|
+
role = Role.create! name: "FULL ACCESS (TEMPORARY)"
|
19
|
+
role.capabilities = Capability.all
|
20
|
+
|
21
|
+
# The user group
|
22
|
+
ug = UserGroup.create! name: "FULL ACCESS USERS (TEMPORARY)"
|
23
|
+
ug.roles << role
|
24
|
+
|
25
|
+
# Assign to all users
|
26
|
+
User.all.each { |user| user.user_groups << ug }
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,254 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
module Strongbolt
|
4
|
+
|
5
|
+
describe CapabilitiesController do
|
6
|
+
|
7
|
+
subject { response }
|
8
|
+
|
9
|
+
# #
|
10
|
+
# # GET #index
|
11
|
+
# #
|
12
|
+
# describe "GET #index" do
|
13
|
+
|
14
|
+
# before do
|
15
|
+
# Fabricate :capability
|
16
|
+
# get :index
|
17
|
+
# end
|
18
|
+
|
19
|
+
# it { should be_success }
|
20
|
+
|
21
|
+
# it { should render_template :index }
|
22
|
+
|
23
|
+
# it "should assign capabilities" do
|
24
|
+
# expect(assigns :capabilities).to be_present
|
25
|
+
# expect(assigns(:capabilities).size).to be > 0
|
26
|
+
# end
|
27
|
+
|
28
|
+
# end # End GET #index
|
29
|
+
|
30
|
+
|
31
|
+
# #
|
32
|
+
# # GET #show
|
33
|
+
# #
|
34
|
+
# describe "GET #show" do
|
35
|
+
# let(:capability) { Fabricate :capability }
|
36
|
+
|
37
|
+
# before { get :show, id: capability.id }
|
38
|
+
|
39
|
+
# it { should be_success }
|
40
|
+
|
41
|
+
# it { should render_template :show }
|
42
|
+
|
43
|
+
# it "should assign capability" do
|
44
|
+
# expect(assigns :capability).to be_present
|
45
|
+
# end
|
46
|
+
# end
|
47
|
+
|
48
|
+
#
|
49
|
+
# POST #create
|
50
|
+
#
|
51
|
+
describe "POST #create" do
|
52
|
+
|
53
|
+
let(:create) { post :create, capability: attributes }
|
54
|
+
|
55
|
+
# context "when valid attributes" do
|
56
|
+
# let(:attributes) { Fabricate.attributes_for :capability }
|
57
|
+
|
58
|
+
# it "should redirect to capabilities list" do
|
59
|
+
# create
|
60
|
+
# expect(response).to redirect_to capabilities_path
|
61
|
+
# end
|
62
|
+
|
63
|
+
# it "should create a capability" do
|
64
|
+
# expect do
|
65
|
+
# create
|
66
|
+
# end.to change(Capability, :count).by 1
|
67
|
+
# end
|
68
|
+
# end
|
69
|
+
|
70
|
+
context "when valid attributes and role id present" do
|
71
|
+
|
72
|
+
let(:role) { Fabricate :role }
|
73
|
+
let(:attributes) { Fabricate.attributes_for :capability }
|
74
|
+
|
75
|
+
context "html" do
|
76
|
+
let(:create) { post :create, capability: attributes, role_id: role.id }
|
77
|
+
|
78
|
+
it "should redirect to role" do
|
79
|
+
create
|
80
|
+
expect(response).to redirect_to role_path(role)
|
81
|
+
end
|
82
|
+
|
83
|
+
it "should add a capability to the role" do
|
84
|
+
expect do
|
85
|
+
create
|
86
|
+
end.to change(role.capabilities, :count).by 1
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
context "json" do |variable|
|
91
|
+
let(:create) { post :create, capability: attributes, role_id: role.id, format: :json }
|
92
|
+
|
93
|
+
it "should redirect to role" do
|
94
|
+
create
|
95
|
+
expect(response.code).to eq "200"
|
96
|
+
end
|
97
|
+
|
98
|
+
it "should add a capability to the role" do
|
99
|
+
expect do
|
100
|
+
create
|
101
|
+
end.to change(role.capabilities, :count).by 1
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
# context "when same capability already exist" do
|
107
|
+
# let(:attributes) { Fabricate.attributes_for :capability }
|
108
|
+
|
109
|
+
# before do
|
110
|
+
# Fabricate :capability, attributes
|
111
|
+
# end
|
112
|
+
|
113
|
+
# it "should redirect to index" do
|
114
|
+
# create
|
115
|
+
# expect(response).to redirect_to capabilities_path
|
116
|
+
# end
|
117
|
+
# end
|
118
|
+
|
119
|
+
# context "when invalid attributes" do
|
120
|
+
# let(:attributes) { {} }
|
121
|
+
|
122
|
+
# it "should set flash danger" do
|
123
|
+
# create
|
124
|
+
# expect(flash[:danger]).to be_present
|
125
|
+
# end
|
126
|
+
|
127
|
+
# it "should redirect to index" do
|
128
|
+
# create
|
129
|
+
# expect(response).to redirect_to capabilities_path
|
130
|
+
# end
|
131
|
+
# end
|
132
|
+
|
133
|
+
end # END POST #create
|
134
|
+
|
135
|
+
|
136
|
+
|
137
|
+
#
|
138
|
+
# DELETE #destroy
|
139
|
+
#
|
140
|
+
describe "DELETE #destroy" do
|
141
|
+
|
142
|
+
before do
|
143
|
+
@capability = Fabricate :capability
|
144
|
+
end
|
145
|
+
|
146
|
+
let(:capability) { @capability }
|
147
|
+
|
148
|
+
let(:destroy) { delete :destroy, id: capability.id }
|
149
|
+
|
150
|
+
# context "when no roles" do
|
151
|
+
|
152
|
+
# it "should redirect to capabilities list" do
|
153
|
+
# destroy
|
154
|
+
# expect(response).to redirect_to capabilities_path
|
155
|
+
# end
|
156
|
+
|
157
|
+
# it "should delete a capability" do
|
158
|
+
# expect do
|
159
|
+
# destroy
|
160
|
+
# end.to change(Capability, :count).by -1
|
161
|
+
# end
|
162
|
+
|
163
|
+
# end
|
164
|
+
|
165
|
+
# context "when roles linked" do
|
166
|
+
|
167
|
+
# before do
|
168
|
+
# capability.roles << Fabricate(:role)
|
169
|
+
# end
|
170
|
+
|
171
|
+
# it "should redirect to capabilities list" do
|
172
|
+
# destroy
|
173
|
+
# expect(response).to redirect_to capability_path(capability)
|
174
|
+
# end
|
175
|
+
|
176
|
+
# it "should not delete a capability" do
|
177
|
+
# expect do
|
178
|
+
# destroy
|
179
|
+
# end.not_to change(Capability, :count)
|
180
|
+
# end
|
181
|
+
|
182
|
+
# it "should set flash danger" do
|
183
|
+
# destroy
|
184
|
+
# expect(flash[:danger]).to be_present
|
185
|
+
# end
|
186
|
+
|
187
|
+
# end
|
188
|
+
|
189
|
+
context "when role_id given" do
|
190
|
+
let(:role) { Fabricate :role }
|
191
|
+
|
192
|
+
before do
|
193
|
+
role.capabilities << capability
|
194
|
+
end
|
195
|
+
|
196
|
+
context "when capability id given" do
|
197
|
+
|
198
|
+
let(:destroy) { delete :destroy, id: capability.id, role_id: role.id }
|
199
|
+
|
200
|
+
|
201
|
+
it "should not delete a capability" do
|
202
|
+
expect do
|
203
|
+
destroy
|
204
|
+
end.not_to change(Capability, :count)
|
205
|
+
end
|
206
|
+
|
207
|
+
it "should remove the capability from role" do
|
208
|
+
destroy
|
209
|
+
role.reload
|
210
|
+
expect(role.capabilities).not_to include capability
|
211
|
+
end
|
212
|
+
|
213
|
+
it "should redirect to role" do
|
214
|
+
destroy
|
215
|
+
expect(response).to redirect_to role_path(role)
|
216
|
+
end
|
217
|
+
|
218
|
+
end
|
219
|
+
|
220
|
+
context "when capability data given and format json" do
|
221
|
+
let(:attributes) do
|
222
|
+
{model: capability.model, require_ownership: capability.require_ownership,
|
223
|
+
require_tenant_access: capability.require_tenant_access,
|
224
|
+
action: capability.action}
|
225
|
+
end
|
226
|
+
|
227
|
+
let(:destroy) { delete :destroy, role_id: role.id, capability: capability.attributes, format: :json }
|
228
|
+
|
229
|
+
it "should not delete a capability" do
|
230
|
+
expect do
|
231
|
+
destroy
|
232
|
+
end.not_to change(Capability, :count)
|
233
|
+
end
|
234
|
+
|
235
|
+
it "should remove the capability from role" do
|
236
|
+
destroy
|
237
|
+
role.reload
|
238
|
+
expect(role.capabilities).not_to include capability
|
239
|
+
end
|
240
|
+
|
241
|
+
it "should render 200" do
|
242
|
+
destroy
|
243
|
+
expect(response.code).to eq "200"
|
244
|
+
end
|
245
|
+
end
|
246
|
+
end
|
247
|
+
|
248
|
+
|
249
|
+
end
|
250
|
+
|
251
|
+
|
252
|
+
end
|
253
|
+
|
254
|
+
end
|
@@ -0,0 +1,228 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
module Strongbolt
|
4
|
+
|
5
|
+
describe RolesController do
|
6
|
+
|
7
|
+
let!(:role) { Fabricate :role }
|
8
|
+
|
9
|
+
let(:valid_attributes) { Fabricate.attributes_for :role }
|
10
|
+
|
11
|
+
# login_user
|
12
|
+
|
13
|
+
subject { response }
|
14
|
+
|
15
|
+
#
|
16
|
+
# GET #index
|
17
|
+
#
|
18
|
+
describe "GET #index" do
|
19
|
+
|
20
|
+
before { get :index }
|
21
|
+
|
22
|
+
it { should be_success }
|
23
|
+
|
24
|
+
it { should render_template :index }
|
25
|
+
|
26
|
+
it "should assign roles" do
|
27
|
+
expect(assigns :roles).to eq [role]
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
#
|
33
|
+
# GET #new
|
34
|
+
#
|
35
|
+
describe "GET #new" do
|
36
|
+
|
37
|
+
before { get :new }
|
38
|
+
|
39
|
+
it { should be_success }
|
40
|
+
|
41
|
+
it { should render_template :new }
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
#
|
47
|
+
# GET #show
|
48
|
+
#
|
49
|
+
describe "GET #show" do
|
50
|
+
|
51
|
+
# Some children
|
52
|
+
let(:role2) { Fabricate :role, parent: role }
|
53
|
+
let!(:role3) { Fabricate :role, parent: role2 }
|
54
|
+
|
55
|
+
before { get :show, id: role.id }
|
56
|
+
|
57
|
+
it { should be_success }
|
58
|
+
|
59
|
+
it "should assign role" do
|
60
|
+
expect(assigns :role).to eq role
|
61
|
+
end
|
62
|
+
|
63
|
+
it "should assign children" do
|
64
|
+
expect(assigns :descendants).to eq [role2, role3]
|
65
|
+
end
|
66
|
+
|
67
|
+
it { should render_template :show }
|
68
|
+
|
69
|
+
end
|
70
|
+
|
71
|
+
#
|
72
|
+
# GET #edit
|
73
|
+
#
|
74
|
+
describe "GET #edit" do
|
75
|
+
|
76
|
+
before { get :edit, id: role.id }
|
77
|
+
|
78
|
+
it { should be_success }
|
79
|
+
|
80
|
+
it "should assign role" do
|
81
|
+
expect(assigns :role).to eq role
|
82
|
+
end
|
83
|
+
|
84
|
+
it { should render_template :edit }
|
85
|
+
|
86
|
+
end
|
87
|
+
|
88
|
+
#
|
89
|
+
# POST #create
|
90
|
+
#
|
91
|
+
describe "POST #create" do
|
92
|
+
|
93
|
+
let(:create) { post :create, role: attributes }
|
94
|
+
|
95
|
+
context 'when valid attributes' do
|
96
|
+
|
97
|
+
let(:attributes) { valid_attributes }
|
98
|
+
|
99
|
+
it "should redirect to show" do
|
100
|
+
create
|
101
|
+
expect(response).to redirect_to role_path(Role.last)
|
102
|
+
end
|
103
|
+
|
104
|
+
it "should create an role" do
|
105
|
+
expect do
|
106
|
+
create
|
107
|
+
end.to change(Role, :count).by 1
|
108
|
+
end
|
109
|
+
|
110
|
+
end
|
111
|
+
|
112
|
+
context "when invalid attributes" do
|
113
|
+
|
114
|
+
let(:attributes) { {} }
|
115
|
+
|
116
|
+
it "should redirect_to new" do
|
117
|
+
create
|
118
|
+
expect(response).to redirect_to new_role_path
|
119
|
+
end
|
120
|
+
|
121
|
+
it "should not create a role" do
|
122
|
+
expect do
|
123
|
+
create
|
124
|
+
end.not_to change(Role, :count)
|
125
|
+
end
|
126
|
+
|
127
|
+
it "should set flash danger" do
|
128
|
+
create
|
129
|
+
expect(flash[:danger]).to be_present
|
130
|
+
end
|
131
|
+
|
132
|
+
end
|
133
|
+
|
134
|
+
end
|
135
|
+
|
136
|
+
|
137
|
+
#
|
138
|
+
# PUT #update
|
139
|
+
#
|
140
|
+
describe "PUT #update" do
|
141
|
+
|
142
|
+
before { put :update, id: role.id, role: attributes }
|
143
|
+
|
144
|
+
context 'when valid attributes' do
|
145
|
+
|
146
|
+
let(:attributes) { valid_attributes }
|
147
|
+
|
148
|
+
it { should redirect_to role_path(role) }
|
149
|
+
|
150
|
+
it "should update attributes" do
|
151
|
+
expect(role.reload.name).to eq valid_attributes[:name]
|
152
|
+
end
|
153
|
+
|
154
|
+
end
|
155
|
+
|
156
|
+
context 'when invalid attributes' do
|
157
|
+
|
158
|
+
let(:attributes) { {name: ""} }
|
159
|
+
|
160
|
+
it { should redirect_to edit_role_path(role) }
|
161
|
+
|
162
|
+
it "should not update attributes" do
|
163
|
+
expect(role.reload.name).not_to eq ""
|
164
|
+
end
|
165
|
+
|
166
|
+
it "should set flash danger" do
|
167
|
+
expect(flash[:danger]).to be_present
|
168
|
+
end
|
169
|
+
|
170
|
+
end
|
171
|
+
|
172
|
+
end
|
173
|
+
|
174
|
+
|
175
|
+
#
|
176
|
+
# DELETE #destroy
|
177
|
+
#
|
178
|
+
describe "DELETE #destroy" do
|
179
|
+
|
180
|
+
let(:destroy) { delete :destroy, id: role.id }
|
181
|
+
|
182
|
+
context "when no user" do
|
183
|
+
|
184
|
+
it "should redirect to index" do
|
185
|
+
destroy
|
186
|
+
expect(response).to redirect_to roles_path
|
187
|
+
end
|
188
|
+
|
189
|
+
it "should set flash success" do
|
190
|
+
destroy
|
191
|
+
expect(flash[:success]).to be_present
|
192
|
+
end
|
193
|
+
|
194
|
+
it "should delete a role" do
|
195
|
+
expect do
|
196
|
+
destroy
|
197
|
+
end.to change(Role, :count).by -1
|
198
|
+
end
|
199
|
+
|
200
|
+
end
|
201
|
+
|
202
|
+
context "when has user groups" do
|
203
|
+
|
204
|
+
let(:role) { Fabricate :role_with_user_groups }
|
205
|
+
|
206
|
+
it "should redirect to show" do
|
207
|
+
destroy
|
208
|
+
expect(response).to redirect_to role_path(role)
|
209
|
+
end
|
210
|
+
|
211
|
+
it "should set flash danger" do
|
212
|
+
destroy
|
213
|
+
expect(flash[:danger]).to be_present
|
214
|
+
end
|
215
|
+
|
216
|
+
it "should not delete a role" do
|
217
|
+
expect do
|
218
|
+
destroy
|
219
|
+
end.not_to change(Role, :count)
|
220
|
+
end
|
221
|
+
|
222
|
+
end
|
223
|
+
|
224
|
+
end
|
225
|
+
|
226
|
+
end
|
227
|
+
|
228
|
+
end
|