slow_your_roles 2.0.2

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.
@@ -0,0 +1,321 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe SlowYourRoles do
6
+ describe 'serialize method' do
7
+ it 'should allow me to set a users role' do
8
+ user = SerializeUser.new
9
+ user.add_role 'admin'
10
+ expect(user.roles).to include('admin')
11
+ end
12
+
13
+ it 'should allow me to set multiple roles at one time' do
14
+ user = SerializeUser.new
15
+ user.add_roles 'admin', 'manager'
16
+ expect(user.roles).to include 'admin'
17
+ expect(user.roles).to include 'manager'
18
+ expect(user.roles.length).to eq 2
19
+ user.add_roles 'admin', 'manager','user'
20
+ expect(user.roles).to include 'user'
21
+ expect(user.roles.length).to eq 3
22
+ end
23
+
24
+ it 'should return true for is_admin? if the admin role is added to the user' do
25
+ user = SerializeUser.new
26
+ user.add_role 'admin'
27
+ expect(user.is_admin?).to eq true
28
+ end
29
+
30
+ it "should return true for has_role? 'admin' if the admin role is added to the user" do
31
+ user = SerializeUser.new
32
+ user.add_role 'admin'
33
+ expect(user.has_role?('admin')).to eq true
34
+ end
35
+
36
+ it "should turn false for has_role? 'manager' if manager role is not added to the user" do
37
+ user = SerializeUser.new
38
+ expect(user.has_role?('manager')).to eq false
39
+ end
40
+
41
+ it 'should turn false for is_manager? if manager role is not added to the user' do
42
+ user = SerializeUser.new
43
+ expect(user.is_manager?).to eq false
44
+ end
45
+
46
+ it 'should return the users role through association' do
47
+ user = BitmaskUser.create(name: 'Bob')
48
+ user.add_role! 'admin'
49
+
50
+ Membership.create(name: 'Test Membership', bitmask_user: user)
51
+
52
+ expect(Membership.last.bitmask_user.is_admin?).to eq true
53
+ end
54
+
55
+ it 'should get no method error if no roles on model' do
56
+ b = Beggar.create(name: 'Ivor')
57
+
58
+ b.is_admin?
59
+ rescue StandardError => e
60
+ expect(e.class).to eq(NoMethodError)
61
+ end
62
+
63
+ it 'should get no method error if no roles on model even through association' do
64
+ b = Beggar.create(name: 'Ivor')
65
+ Membership.create(name: 'Beggars club', beggar: b)
66
+ Membership.last.beggar.is_admin?
67
+
68
+ rescue StandardError => e
69
+ expect(e.class).to eq(NoMethodError)
70
+ end
71
+
72
+ describe 'normal methods' do
73
+ it 'should not save to the database if not implicitly saved' do
74
+ user = SerializeUser.create(name: 'Ryan')
75
+ user.add_role 'admin'
76
+ expect(user.is_admin?).to eq true
77
+ user.reload
78
+
79
+ expect(user.is_admin?).to eq false
80
+ end
81
+
82
+ it 'should save to the database if implicity saved' do
83
+ user = SerializeUser.create(name: 'Ryan')
84
+ user.add_role 'admin'
85
+ expect(user.is_admin?).to eq true
86
+ user.save
87
+ user.reload
88
+
89
+ expect(user.is_admin?).to eq true
90
+ end
91
+
92
+ it 'should clear all roles and not save if not implicitly saved' do
93
+ user = SerializeUser.create(name: 'Ryan')
94
+ user.add_role 'admin'
95
+ expect(user.is_admin?).to eq true
96
+ user.save
97
+ user.reload
98
+ expect(user.is_admin?).to eq true
99
+
100
+ user.clear_roles
101
+ expect(user.is_admin?).to eq false
102
+ user.reload
103
+
104
+ expect(user.is_admin?).to eq true
105
+ end
106
+
107
+ it 'should clear all roles and save if implicitly saved' do
108
+ user = SerializeUser.create(name: 'Ryan')
109
+ user.add_role 'admin'
110
+ expect(user.is_admin?).to eq true
111
+ user.save
112
+ user.reload
113
+ expect(user.is_admin?).to eq true
114
+
115
+ user.clear_roles
116
+ expect(user.is_admin?).to eq false
117
+ user.save
118
+ user.reload
119
+
120
+ expect(user.is_admin?).to eq false
121
+ end
122
+
123
+ it 'should remove a role and not save unless implicitly saved' do
124
+ user = SerializeUser.create(name: 'Ryan')
125
+ user.add_role 'admin'
126
+ expect(user.is_admin?).to eq true
127
+ user.save
128
+ user.reload
129
+
130
+ expect(user.is_admin?).to eq true
131
+ user.remove_role 'admin'
132
+ expect(user.is_admin?).to eq false
133
+ user.reload
134
+
135
+ expect(user.is_admin?).to eq true
136
+ end
137
+
138
+ it 'should remove a role and save if implicitly saved' do
139
+ user = SerializeUser.create(name: 'Ryan')
140
+ user.add_role 'admin'
141
+ expect(user.is_admin?).to eq true
142
+ user.save
143
+ user.reload
144
+
145
+ expect(user.is_admin?).to eq true
146
+ user.remove_role 'admin'
147
+ expect(user.is_admin?).to eq false
148
+ user.save
149
+ user.reload
150
+
151
+ expect(user.is_admin?).to eq false
152
+ end
153
+ end
154
+
155
+ describe 'bang method' do
156
+ it 'should save to the database if the bang method is used' do
157
+ user = SerializeUser.create(name: 'Ryan')
158
+ user.add_role! 'admin'
159
+ expect(user.is_admin?).to eq true
160
+ user.reload
161
+
162
+ expect(user.is_admin?).to eq true
163
+ end
164
+
165
+ it 'should allow me to set multiple roles at one time' do
166
+ user = SerializeUser.new
167
+ user.add_roles! 'admin', 'manager'
168
+ expect(user.roles).to include 'admin'
169
+ expect(user.roles).to include 'manager'
170
+ expect(user.roles.length).to eq 2
171
+ user.add_roles! 'admin', 'manager','user'
172
+ expect(user.roles).to include 'user'
173
+ expect(user.roles.length).to eq 3
174
+ end
175
+
176
+ it 'should remove a role and save' do
177
+ user = SerializeUser.create(name: 'Ryan')
178
+ user.add_role 'admin'
179
+ expect(user.is_admin?).to eq true
180
+ user.save
181
+ user.reload
182
+
183
+ expect(user.is_admin?).to eq true
184
+ user.remove_role! 'admin'
185
+ expect(user.is_admin?).to eq false
186
+ user.reload
187
+
188
+ expect(user.is_admin?).to eq false
189
+ end
190
+ end
191
+
192
+ describe 'scopes' do
193
+ describe 'with_role' do
194
+ describe 'with markers' do
195
+ before do
196
+ @marker_cache = SerializeUser.roles_marker
197
+ end
198
+
199
+ after do
200
+ SerializeUser.roles_marker = @marker_cache
201
+ end
202
+
203
+ it 'should prove that wrapper markers are a necessary strategy by failing without them' do
204
+ SerializeUser.roles_marker = ''
205
+ (morgan = SerializeUser.create(name: 'Mr. Freeman')).add_role!('onrecursionrecursi')
206
+ expect(SerializeUser.with_role('recursion')).to include morgan
207
+ end
208
+
209
+ it 'should not allow roles to be added if they include the roles_marker character' do
210
+ SerializeUser.roles_marker = '!'
211
+ user = SerializeUser.create(name: 'Towelie')
212
+ expect(user.add_role!('funkytown!')).to eq false
213
+ end
214
+ end
215
+
216
+ it 'should implement the `with_role` scope' do
217
+ expect(SerializeUser).to respond_to :without_role
218
+ end
219
+
220
+ it 'should return an ActiveRecord::Relation' do
221
+ expect(SerializeUser.with_role('admin').class).to eq(
222
+ "SerializeUser::ActiveRecord_Relation".constantize
223
+ )
224
+ end
225
+
226
+ it 'should match records for a given role' do
227
+ user = SerializeUser.create(name: 'Daniel')
228
+ expect(SerializeUser.with_role('admin')).not_to include user
229
+
230
+ user.add_role! 'admin'
231
+ expect(SerializeUser.with_role('admin')).to include user
232
+ end
233
+
234
+ it 'should be chainable' do
235
+ (daniel = SerializeUser.create(name: 'Daniel')).add_role! 'user'
236
+ (ryan = SerializeUser.create(name: 'Ryan')).add_role! 'user'
237
+ ryan.add_role! 'admin'
238
+ admin_users = SerializeUser.with_role('user').with_role('admin')
239
+ expect(admin_users).to include ryan
240
+ expect(admin_users).not_to include daniel
241
+ end
242
+
243
+ it "should avoid incorrectly matching roles where the name is a subset of another role's name" do
244
+ (chuck = SerializeUser.create(name: 'Mr. Norris')).add_role!('recursion')
245
+ (morgan = SerializeUser.create(name: 'Mr. Freeman')).add_role!('onrecursionrecursi')
246
+ expect(SerializeUser.with_role('recursion')).to include chuck
247
+ expect(SerializeUser.with_role('recursion')).not_to include morgan
248
+ end
249
+
250
+ it 'should correctly handle markers on failed saves' do
251
+ UniqueSerializeUser.create(name: 'Elvis')
252
+ (imposter = UniqueSerializeUser.create(name: 'Elvisbot')).add_role!('sings-like-a-robot')
253
+ imposter.name = 'Elvis'
254
+ expect(imposter.save).to eq false
255
+ expect(imposter.roles.any? { |r| r.include?(SerializeUser.roles_marker) }).to eq false
256
+ end
257
+ end
258
+
259
+ describe 'without_role' do
260
+ describe 'with markers' do
261
+ before do
262
+ @marker_cache = SerializeUser.roles_marker
263
+ end
264
+
265
+ after do
266
+ SerializeUser.roles_marker = @marker_cache
267
+ end
268
+
269
+ it 'should prove that wrapper markers are a necessary strategy by failing without them' do
270
+ SerializeUser.roles_marker = ''
271
+ (morgan = SerializeUser.create(name: 'Mr. Freeman')).add_role!('onrecursionrecursi')
272
+ expect(SerializeUser.without_role('onrecursionrecursi')).not_to include morgan
273
+ expect(SerializeUser.without_role('recursion')).not_to include morgan
274
+ end
275
+
276
+ it 'should not allow roles to be added if they include the roles_marker character' do
277
+ SerializeUser.roles_marker = '!'
278
+ user = SerializeUser.create(name: 'Towelie')
279
+ expect(user.add_role!('funkytown!')).to eq false
280
+ end
281
+ end
282
+
283
+ it 'should implement the `without_role` scope' do
284
+ expect(SerializeUser).to respond_to :without_role
285
+ end
286
+
287
+ it 'should return an ActiveRecord::Relation' do
288
+ expect(SerializeUser.without_role('admin').class).to eq(
289
+ "SerializeUser::ActiveRecord_Relation".constantize
290
+ )
291
+ end
292
+
293
+ it 'should match records for a given role' do
294
+ user = SerializeUser.create(name: 'Daniel')
295
+ expect(SerializeUser.without_role('admin')).to include user
296
+ user.add_role! 'admin'
297
+ expect(SerializeUser.without_role('admin')).not_to include user
298
+ end
299
+
300
+ it 'should be chainable' do
301
+ (daniel = SerializeUser.create(name: 'Daniel')).add_role! 'user'
302
+ (ryan = SerializeUser.create(name: 'Ryan')).add_role! 'user'
303
+ ryan.add_role! 'admin'
304
+ non_admin_users = SerializeUser.with_role('user').without_role('admin')
305
+ expect(non_admin_users).not_to include ryan
306
+ expect(non_admin_users).to include daniel
307
+ end
308
+
309
+ it "should avoid incorrectly matching roles where the name is a subset of another role's name" do
310
+ (chuck = SerializeUser.create(name: 'Mr. Norris')).add_role!('recursion')
311
+ (morgan = SerializeUser.create(name: 'Mr. Freeman')).add_role!('onrecursionrecursi')
312
+
313
+ expect(SerializeUser.without_role('onrecursionrecursi')).to include chuck
314
+ expect(SerializeUser.without_role('onrecursionrecursi')).not_to include morgan
315
+ expect(SerializeUser.without_role('recursion')).not_to include chuck
316
+ expect(SerializeUser.without_role('recursion')).to include morgan
317
+ end
318
+ end
319
+ end
320
+ end
321
+ end
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
4
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
5
+
6
+ require 'active_record'
7
+ require 'slow_your_roles'
8
+
9
+ RSpec.configure do |config|
10
+ end
11
+
12
+ ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: ':memory:')
13
+
14
+ def setup_db
15
+ ActiveRecord::Schema.define(version: 1) do
16
+ create_table :serialize_users do |t|
17
+ t.string :name
18
+ t.string :roles, default: '--- []'
19
+ end
20
+ create_table :bitmask_users do |t|
21
+ t.string :name
22
+ t.integer :roles_mask, default: 0
23
+ end
24
+
25
+ create_table :memberships do |t|
26
+ t.string :name
27
+ t.integer :bitmask_user_id
28
+ t.integer :beggar_id
29
+ end
30
+
31
+ create_table :beggars do |t|
32
+ t.string :name
33
+ end
34
+ end
35
+ end
36
+
37
+ def teardown_db
38
+ ActiveRecord::Base.connection.tables.each do |table|
39
+ ActiveRecord::Base.connection.drop_table(table)
40
+ end
41
+ end
42
+
43
+ setup_db
44
+
45
+ class SerializeUser < ActiveRecord::Base
46
+ slow_your_roles :roles, method: :serialize
47
+ end
48
+
49
+ class UniqueSerializeUser < SerializeUser
50
+ validates :name, uniqueness: true
51
+ end
52
+
53
+ class BitmaskUser < ActiveRecord::Base
54
+ has_many :memberships
55
+ slow_your_roles :roles_mask, method: :bitmask
56
+
57
+ ROLES_MASK = %w[admin manager user].freeze
58
+ end
59
+
60
+ class Membership < ActiveRecord::Base
61
+ belongs_to :bitmask_user
62
+ belongs_to :beggar
63
+ end
64
+
65
+ class Beggar < ActiveRecord::Base
66
+ has_many :memberships
67
+ end
metadata ADDED
@@ -0,0 +1,152 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: slow_your_roles
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Aaron A
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-04-21 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 6.0.3.1
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 6.0.3.1
27
+ - !ruby/object:Gem::Dependency
28
+ name: activerecord
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 6.0.3.1
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 6.0.3.1
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rubocop
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: sqlite3
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description: Easy role authorization in Rails ported from an unmaintained library
84
+ email: _aaron@tutanota.com
85
+ executables: []
86
+ extensions: []
87
+ extra_rdoc_files:
88
+ - CHANGELOG.md
89
+ - README.md
90
+ - lib/generators/active_record/slow_your_roles_generator.rb
91
+ - lib/generators/active_record/templates/migration_bitmask.rb.erb
92
+ - lib/generators/active_record/templates/migration_serialize.rb.erb
93
+ - lib/generators/active_record/templates/model.rb.erb
94
+ - lib/generators/slow_your_roles/slow_your_roles_generator.rb
95
+ - lib/generators/templates/README
96
+ - lib/generators/install_generator_helpers.rb
97
+ - lib/slow_your_roles.rb
98
+ - lib/methods/bitmask.rb
99
+ - lib/methods/serialize.rb
100
+ files:
101
+ - CHANGELOG.md
102
+ - Gemfile
103
+ - Gemfile.lock
104
+ - README.md
105
+ - Rakefile
106
+ - init.rb
107
+ - lib/generators/active_record/slow_your_roles_generator.rb
108
+ - lib/generators/active_record/templates/migration_bitmask.rb.erb
109
+ - lib/generators/active_record/templates/migration_serialize.rb.erb
110
+ - lib/generators/active_record/templates/model.rb.erb
111
+ - lib/generators/install_generator_helpers.rb
112
+ - lib/generators/slow_your_roles/slow_your_roles_generator.rb
113
+ - lib/generators/templates/README
114
+ - lib/methods/bitmask.rb
115
+ - lib/methods/serialize.rb
116
+ - lib/slow_your_roles.rb
117
+ - slow_your_roles.gemspec
118
+ - spec/methods/bitmask_spec.rb
119
+ - spec/methods/serialize_spec.rb
120
+ - spec/spec_helper.rb
121
+ homepage: http://github.com/aarona/slow_your_roles
122
+ licenses: []
123
+ metadata: {}
124
+ post_install_message:
125
+ rdoc_options:
126
+ - "--line-numbers"
127
+ - "--inline-source"
128
+ - "--title"
129
+ - Slow_your_roles
130
+ - "--main"
131
+ - README.md
132
+ require_paths:
133
+ - lib
134
+ required_ruby_version: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ required_rubygems_version: !ruby/object:Gem::Requirement
140
+ requirements:
141
+ - - ">="
142
+ - !ruby/object:Gem::Version
143
+ version: '0'
144
+ requirements: []
145
+ rubygems_version: 3.0.8
146
+ signing_key:
147
+ specification_version: 4
148
+ summary: Easy role authorization in Rails
149
+ test_files:
150
+ - spec/spec_helper.rb
151
+ - spec/methods/serialize_spec.rb
152
+ - spec/methods/bitmask_spec.rb