pundit-matchers 2.0.0 → 2.2.0
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 +4 -4
- data/lib/pundit/matchers/utils/all_actions/error_message_formatter.rb +1 -1
- data/lib/pundit/matchers/utils/only_actions/actions_matcher.rb +39 -0
- data/lib/pundit/matchers/utils/only_actions/error_message_formatter.rb +54 -0
- data/lib/pundit/matchers/utils/only_actions/forbidden_actions_error_formatter.rb +26 -0
- data/lib/pundit/matchers/utils/only_actions/forbidden_actions_matcher.rb +20 -0
- data/lib/pundit/matchers/utils/only_actions/permitted_actions_error_formatter.rb +26 -0
- data/lib/pundit/matchers/utils/only_actions/permitted_actions_matcher.rb +20 -0
- data/lib/pundit/matchers/utils/policy_info.rb +1 -1
- data/lib/pundit/matchers.rb +103 -93
- metadata +13 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '013960778421a77229a9e50388f5cb7073cae3c60024b482f48c39431de063af'
|
4
|
+
data.tar.gz: 12a70d9a7ffdf1df5a2e584e555f3f934d36a971852605afa611c033a07c14dc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4c00b1be800433a24203f2d964a810eaa7445ed98934598726e568b727db2ad6333886d1d7dffe56196a1bb445a982c6d17ea96cda737cca5a5ca7e801445ada
|
7
|
+
data.tar.gz: 0fb59915496d8b6807b01b84ce6f70c2c350e5dd6db00851c1e013211fb6ab41c6a1cc2f21c11f0a10107f116dadd666ff71228bcf06eee1ed706a90b56d9550
|
@@ -14,7 +14,7 @@ module Pundit
|
|
14
14
|
module ErrorMessageFormatter
|
15
15
|
def message
|
16
16
|
"#{policy_name} expected to have all actions #{expected_kind}, " \
|
17
|
-
|
17
|
+
"but #{mismatches_are(missed_expected_actions)} #{opposite_kind}"
|
18
18
|
end
|
19
19
|
|
20
20
|
private
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Pundit
|
4
|
+
module Matchers
|
5
|
+
module Utils
|
6
|
+
module OnlyActions
|
7
|
+
# Parent class for specific only_action matcher. Should not be used directly.
|
8
|
+
#
|
9
|
+
# Expects methods in child class:
|
10
|
+
# * actual_actions - list of actions which actually matches expected type.
|
11
|
+
class ActionsMatcher
|
12
|
+
attr_reader :policy_info, :expected_actions
|
13
|
+
|
14
|
+
def initialize(policy, expected_actions)
|
15
|
+
@policy_info = PolicyInfo.new(policy)
|
16
|
+
@expected_actions = expected_actions
|
17
|
+
end
|
18
|
+
|
19
|
+
def match?
|
20
|
+
missed_expected_actions.empty? &&
|
21
|
+
actual_actions.sort == expected_actions.sort
|
22
|
+
end
|
23
|
+
|
24
|
+
def unexpected_actions
|
25
|
+
@unexpected_actions ||= actual_actions - expected_actions
|
26
|
+
end
|
27
|
+
|
28
|
+
def missed_expected_actions
|
29
|
+
@missed_expected_actions ||= expected_actions - actual_actions
|
30
|
+
end
|
31
|
+
|
32
|
+
def policy
|
33
|
+
policy_info.policy
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Pundit
|
4
|
+
module Matchers
|
5
|
+
module Utils
|
6
|
+
module OnlyActions
|
7
|
+
# Adds #message method which generates failed assertion message
|
8
|
+
# for *_only_actions matchers.
|
9
|
+
#
|
10
|
+
# Expects methods to be defined:
|
11
|
+
# * matcher - instance which has `OnlyActions::ActionsMatcher` as a parent class
|
12
|
+
# * expected_kind - string with expected actions type (can be "forbidden" or "permitted")
|
13
|
+
# * opposite_kind - string with oposite then expected actions type (can be "permitted" or "forbidden")
|
14
|
+
module ErrorMessageFormatter
|
15
|
+
def message
|
16
|
+
"#{policy_name} expected to have only actions #{matcher.expected_actions} #{expected_kind}, but " \
|
17
|
+
"#{unless missed_expected_actions.empty?
|
18
|
+
"#{mismatches_are(missed_expected_actions)} #{opposite_kind} and "
|
19
|
+
end}" \
|
20
|
+
"#{mismatches_are(unexpected_actions)} #{expected_kind} too"
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
attr_reader :matcher, :expected_kind, :opposite_kind
|
26
|
+
|
27
|
+
def policy
|
28
|
+
matcher.policy
|
29
|
+
end
|
30
|
+
|
31
|
+
def unexpected_actions
|
32
|
+
matcher.unexpected_actions
|
33
|
+
end
|
34
|
+
|
35
|
+
def missed_expected_actions
|
36
|
+
matcher.missed_expected_actions
|
37
|
+
end
|
38
|
+
|
39
|
+
def policy_name
|
40
|
+
policy.class.name
|
41
|
+
end
|
42
|
+
|
43
|
+
def mismatches_are(mismatches)
|
44
|
+
if mismatches.count == 1
|
45
|
+
"#{mismatches} is"
|
46
|
+
else
|
47
|
+
"#{mismatches} are"
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'error_message_formatter'
|
4
|
+
|
5
|
+
module Pundit
|
6
|
+
module Matchers
|
7
|
+
module Utils
|
8
|
+
module OnlyActions
|
9
|
+
# Error message formatter for `forbid_only_actions` matcher.
|
10
|
+
class ForbiddenActionsErrorFormatter
|
11
|
+
include OnlyActions::ErrorMessageFormatter
|
12
|
+
|
13
|
+
def initialize(matcher)
|
14
|
+
@expected_kind = 'forbidden'
|
15
|
+
@opposite_kind = 'permitted'
|
16
|
+
@matcher = matcher
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
attr_reader :matcher, :expected_kind, :opposite_kind
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'actions_matcher'
|
4
|
+
|
5
|
+
module Pundit
|
6
|
+
module Matchers
|
7
|
+
module Utils
|
8
|
+
module OnlyActions
|
9
|
+
# Handles all the checks in `forbid_only_actions` matcher.
|
10
|
+
class ForbiddenActionsMatcher < OnlyActions::ActionsMatcher
|
11
|
+
private
|
12
|
+
|
13
|
+
def actual_actions
|
14
|
+
policy_info.forbidden_actions
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'error_message_formatter'
|
4
|
+
|
5
|
+
module Pundit
|
6
|
+
module Matchers
|
7
|
+
module Utils
|
8
|
+
module OnlyActions
|
9
|
+
# Error message formatter for `permit_only_actions` matcher.
|
10
|
+
class PermittedActionsErrorFormatter
|
11
|
+
include OnlyActions::ErrorMessageFormatter
|
12
|
+
|
13
|
+
def initialize(matcher)
|
14
|
+
@expected_kind = 'permitted'
|
15
|
+
@opposite_kind = 'forbidden'
|
16
|
+
@matcher = matcher
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
attr_reader :matcher, :expected_kind, :opposite_kind
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'actions_matcher'
|
4
|
+
|
5
|
+
module Pundit
|
6
|
+
module Matchers
|
7
|
+
module Utils
|
8
|
+
module OnlyActions
|
9
|
+
# Handles all the checks in `permit_only_actions` matcher.
|
10
|
+
class PermittedActionsMatcher < OnlyActions::ActionsMatcher
|
11
|
+
private
|
12
|
+
|
13
|
+
def actual_actions
|
14
|
+
policy_info.permitted_actions
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -14,7 +14,7 @@ module Pundit
|
|
14
14
|
def actions
|
15
15
|
@actions ||= begin
|
16
16
|
policy_methods = @policy.public_methods - Object.instance_methods
|
17
|
-
policy_methods.grep(/\?$/).map { |policy_method| policy_method.to_s.
|
17
|
+
policy_methods.grep(/\?$/).sort.map { |policy_method| policy_method.to_s.delete_suffix('?').to_sym }
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
data/lib/pundit/matchers.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'rspec/core'
|
2
4
|
|
3
5
|
module Pundit
|
@@ -8,6 +10,11 @@ module Pundit
|
|
8
10
|
require_relative 'matchers/utils/all_actions/permitted_actions_error_formatter'
|
9
11
|
require_relative 'matchers/utils/all_actions/permitted_actions_matcher'
|
10
12
|
|
13
|
+
require_relative 'matchers/utils/only_actions/forbidden_actions_error_formatter'
|
14
|
+
require_relative 'matchers/utils/only_actions/forbidden_actions_matcher'
|
15
|
+
require_relative 'matchers/utils/only_actions/permitted_actions_error_formatter'
|
16
|
+
require_relative 'matchers/utils/only_actions/permitted_actions_matcher'
|
17
|
+
|
11
18
|
class Configuration
|
12
19
|
attr_accessor :user_alias
|
13
20
|
|
@@ -25,27 +32,25 @@ module Pundit
|
|
25
32
|
@configuration ||= Pundit::Matchers::Configuration.new
|
26
33
|
end
|
27
34
|
end
|
35
|
+
end
|
28
36
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
end
|
37
|
+
RSpec::Matchers.define :forbid_action do |action, *args, **kwargs|
|
38
|
+
match do |policy|
|
39
|
+
if args.any?
|
40
|
+
!policy.public_send("#{action}?", *args, **kwargs)
|
41
|
+
else
|
42
|
+
!policy.public_send("#{action}?", **kwargs)
|
36
43
|
end
|
44
|
+
end
|
37
45
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
end
|
46
|
+
failure_message do |policy|
|
47
|
+
"#{policy.class} does not forbid #{action} for " \
|
48
|
+
"#{policy.public_send(Pundit::Matchers.configuration.user_alias).inspect}."
|
49
|
+
end
|
43
50
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
.inspect + '.'
|
48
|
-
end
|
51
|
+
failure_message_when_negated do |policy|
|
52
|
+
"#{policy.class} does not permit #{action} for " \
|
53
|
+
"#{policy.public_send(Pundit::Matchers.configuration.user_alias).inspect}."
|
49
54
|
end
|
50
55
|
end
|
51
56
|
|
@@ -53,6 +58,7 @@ module Pundit
|
|
53
58
|
actions.flatten!
|
54
59
|
match do |policy|
|
55
60
|
return false if actions.count < 1
|
61
|
+
|
56
62
|
@allowed_actions = actions.select do |action|
|
57
63
|
policy.public_send("#{action}?")
|
58
64
|
end
|
@@ -62,16 +68,15 @@ module Pundit
|
|
62
68
|
attr_reader :allowed_actions
|
63
69
|
|
64
70
|
zero_actions_failure_message = 'At least one action must be ' \
|
65
|
-
|
71
|
+
'specified when using the forbid_actions matcher.'
|
66
72
|
|
67
73
|
failure_message do |policy|
|
68
74
|
if actions.count.zero?
|
69
75
|
zero_actions_failure_message
|
70
76
|
else
|
71
|
-
"#{policy.class} expected to forbid #{actions}, but
|
72
|
-
"#{allowed_actions} for "
|
73
|
-
policy.public_send(Pundit::Matchers.configuration.user_alias)
|
74
|
-
.inspect + '.'
|
77
|
+
"#{policy.class} expected to forbid #{actions}, but permitted " \
|
78
|
+
"#{allowed_actions} for " \
|
79
|
+
"#{policy.public_send(Pundit::Matchers.configuration.user_alias).inspect}."
|
75
80
|
end
|
76
81
|
end
|
77
82
|
|
@@ -80,9 +85,8 @@ module Pundit
|
|
80
85
|
zero_actions_failure_message
|
81
86
|
else
|
82
87
|
"#{policy.class} expected to permit #{actions}, but forbade " \
|
83
|
-
"#{allowed_actions} for "
|
84
|
-
policy.public_send(Pundit::Matchers.configuration.user_alias)
|
85
|
-
.inspect + '.'
|
88
|
+
"#{allowed_actions} for " \
|
89
|
+
"#{policy.public_send(Pundit::Matchers.configuration.user_alias).inspect}."
|
86
90
|
end
|
87
91
|
end
|
88
92
|
end
|
@@ -93,21 +97,19 @@ module Pundit
|
|
93
97
|
end
|
94
98
|
|
95
99
|
failure_message do |policy|
|
96
|
-
"#{policy.class} does not forbid the edit or update action for "
|
97
|
-
policy.public_send(Pundit::Matchers.configuration.user_alias)
|
98
|
-
.inspect + '.'
|
100
|
+
"#{policy.class} does not forbid the edit or update action for " \
|
101
|
+
"#{policy.public_send(Pundit::Matchers.configuration.user_alias).inspect}."
|
99
102
|
end
|
100
103
|
|
101
104
|
failure_message_when_negated do |policy|
|
102
|
-
"#{policy.class} does not permit the edit or update action for "
|
103
|
-
policy.public_send(Pundit::Matchers.configuration.user_alias)
|
104
|
-
.inspect + '.'
|
105
|
+
"#{policy.class} does not permit the edit or update action for " \
|
106
|
+
"#{policy.public_send(Pundit::Matchers.configuration.user_alias).inspect}."
|
105
107
|
end
|
106
108
|
end
|
107
109
|
|
108
110
|
RSpec::Matchers.define :forbid_mass_assignment_of do |attributes|
|
109
111
|
# Map single object argument to an array, if necessary
|
110
|
-
attributes = attributes.is_a?(Array)
|
112
|
+
attributes = [attributes] unless attributes.is_a?(Array)
|
111
113
|
|
112
114
|
match do |policy|
|
113
115
|
return false if attributes.count < 1
|
@@ -130,7 +132,7 @@ module Pundit
|
|
130
132
|
end
|
131
133
|
|
132
134
|
zero_attributes_failure_message = 'At least one attribute must be ' \
|
133
|
-
|
135
|
+
'specified when using the forbid_mass_assignment_of matcher.'
|
134
136
|
|
135
137
|
failure_message do |policy|
|
136
138
|
if attributes.count.zero?
|
@@ -138,16 +140,14 @@ module Pundit
|
|
138
140
|
elsif defined? @action
|
139
141
|
"#{policy.class} expected to forbid the mass assignment of the " \
|
140
142
|
"attributes #{attributes} when authorising the #{@action} action, " \
|
141
|
-
'but
|
142
|
-
"#{allowed_attributes} for "
|
143
|
-
policy.public_send(Pundit::Matchers.configuration.user_alias)
|
144
|
-
.inspect + '.'
|
143
|
+
'but permitted the mass assignment of the attributes ' \
|
144
|
+
"#{allowed_attributes} for " \
|
145
|
+
"#{policy.public_send(Pundit::Matchers.configuration.user_alias).inspect}."
|
145
146
|
else
|
146
147
|
"#{policy.class} expected to forbid the mass assignment of the " \
|
147
|
-
"attributes #{attributes}, but
|
148
|
-
"the attributes #{allowed_attributes} for "
|
149
|
-
policy.public_send(Pundit::Matchers.configuration.user_alias)
|
150
|
-
.inspect + '.'
|
148
|
+
"attributes #{attributes}, but permitted the mass assignment of " \
|
149
|
+
"the attributes #{allowed_attributes} for " \
|
150
|
+
"#{policy.public_send(Pundit::Matchers.configuration.user_alias).inspect}."
|
151
151
|
end
|
152
152
|
end
|
153
153
|
|
@@ -158,15 +158,13 @@ module Pundit
|
|
158
158
|
"#{policy.class} expected to permit the mass assignment of the " \
|
159
159
|
"attributes #{attributes} when authorising the #{@action} action, " \
|
160
160
|
'but permitted the mass assignment of the attributes ' \
|
161
|
-
"#{allowed_attributes} for "
|
162
|
-
policy.public_send(Pundit::Matchers.configuration.user_alias)
|
163
|
-
.inspect + '.'
|
161
|
+
"#{allowed_attributes} for " \
|
162
|
+
"#{policy.public_send(Pundit::Matchers.configuration.user_alias).inspect}."
|
164
163
|
else
|
165
164
|
"#{policy.class} expected to permit the mass assignment of the " \
|
166
165
|
"attributes #{attributes}, but permitted the mass assignment of " \
|
167
|
-
"the attributes #{allowed_attributes} for "
|
168
|
-
policy.public_send(Pundit::Matchers.configuration.user_alias)
|
169
|
-
.inspect + '.'
|
166
|
+
"the attributes #{allowed_attributes} for " \
|
167
|
+
"#{policy.public_send(Pundit::Matchers.configuration.user_alias).inspect}."
|
170
168
|
end
|
171
169
|
end
|
172
170
|
end
|
@@ -177,15 +175,13 @@ module Pundit
|
|
177
175
|
end
|
178
176
|
|
179
177
|
failure_message do |policy|
|
180
|
-
"#{policy.class} does not forbid the new or create action for "
|
181
|
-
policy.public_send(Pundit::Matchers.configuration.user_alias)
|
182
|
-
.inspect + '.'
|
178
|
+
"#{policy.class} does not forbid the new or create action for " \
|
179
|
+
"#{policy.public_send(Pundit::Matchers.configuration.user_alias).inspect}."
|
183
180
|
end
|
184
181
|
|
185
182
|
failure_message_when_negated do |policy|
|
186
|
-
"#{policy.class} does not permit the new or create action for "
|
187
|
-
policy.public_send(Pundit::Matchers.configuration.user_alias)
|
188
|
-
.inspect + '.'
|
183
|
+
"#{policy.class} does not permit the new or create action for " \
|
184
|
+
"#{policy.public_send(Pundit::Matchers.configuration.user_alias).inspect}."
|
189
185
|
end
|
190
186
|
end
|
191
187
|
|
@@ -199,15 +195,13 @@ module Pundit
|
|
199
195
|
end
|
200
196
|
|
201
197
|
failure_message do |policy|
|
202
|
-
"#{policy.class} does not permit #{action} for "
|
203
|
-
policy.public_send(Pundit::Matchers.configuration.user_alias)
|
204
|
-
.inspect + '.'
|
198
|
+
"#{policy.class} does not permit #{action} for " \
|
199
|
+
"#{policy.public_send(Pundit::Matchers.configuration.user_alias).inspect}."
|
205
200
|
end
|
206
201
|
|
207
202
|
failure_message_when_negated do |policy|
|
208
|
-
"#{policy.class} does not forbid #{action} for "
|
209
|
-
policy.public_send(Pundit::Matchers.configuration.user_alias)
|
210
|
-
.inspect + '.'
|
203
|
+
"#{policy.class} does not forbid #{action} for " \
|
204
|
+
"#{policy.public_send(Pundit::Matchers.configuration.user_alias).inspect}."
|
211
205
|
end
|
212
206
|
end
|
213
207
|
|
@@ -215,6 +209,7 @@ module Pundit
|
|
215
209
|
actions.flatten!
|
216
210
|
match do |policy|
|
217
211
|
return false if actions.count < 1
|
212
|
+
|
218
213
|
@forbidden_actions = actions.reject do |action|
|
219
214
|
policy.public_send("#{action}?")
|
220
215
|
end
|
@@ -235,6 +230,7 @@ module Pundit
|
|
235
230
|
tests would pass.'
|
236
231
|
|
237
232
|
return true if actions.count < 1
|
233
|
+
|
238
234
|
@forbidden_actions = actions.reject do |action|
|
239
235
|
policy.public_send("#{action}?")
|
240
236
|
end
|
@@ -244,16 +240,15 @@ module Pundit
|
|
244
240
|
attr_reader :forbidden_actions
|
245
241
|
|
246
242
|
zero_actions_failure_message = 'At least one action must be specified ' \
|
247
|
-
|
243
|
+
'when using the permit_actions matcher.'
|
248
244
|
|
249
245
|
failure_message do |policy|
|
250
246
|
if actions.count.zero?
|
251
247
|
zero_actions_failure_message
|
252
248
|
else
|
253
249
|
"#{policy.class} expected to permit #{actions}, but forbade " \
|
254
|
-
"#{forbidden_actions} for "
|
255
|
-
policy.public_send(Pundit::Matchers.configuration.user_alias)
|
256
|
-
.inspect + '.'
|
250
|
+
"#{forbidden_actions} for " \
|
251
|
+
"#{policy.public_send(Pundit::Matchers.configuration.user_alias).inspect}."
|
257
252
|
end
|
258
253
|
end
|
259
254
|
|
@@ -261,10 +256,9 @@ module Pundit
|
|
261
256
|
if actions.count.zero?
|
262
257
|
zero_actions_failure_message
|
263
258
|
else
|
264
|
-
"#{policy.class} expected to forbid #{actions}, but
|
265
|
-
"#{forbidden_actions} for "
|
266
|
-
policy.public_send(Pundit::Matchers.configuration.user_alias)
|
267
|
-
.inspect + '.'
|
259
|
+
"#{policy.class} expected to forbid #{actions}, but permitted " \
|
260
|
+
"#{forbidden_actions} for " \
|
261
|
+
"#{policy.public_send(Pundit::Matchers.configuration.user_alias).inspect}."
|
268
262
|
end
|
269
263
|
end
|
270
264
|
end
|
@@ -275,21 +269,19 @@ module Pundit
|
|
275
269
|
end
|
276
270
|
|
277
271
|
failure_message do |policy|
|
278
|
-
"#{policy.class} does not permit the edit or update action for "
|
279
|
-
policy.public_send(Pundit::Matchers.configuration.user_alias)
|
280
|
-
.inspect + '.'
|
272
|
+
"#{policy.class} does not permit the edit or update action for " \
|
273
|
+
"#{policy.public_send(Pundit::Matchers.configuration.user_alias).inspect}."
|
281
274
|
end
|
282
275
|
|
283
276
|
failure_message_when_negated do |policy|
|
284
|
-
"#{policy.class} does not forbid the edit or update action for "
|
285
|
-
policy.public_send(Pundit::Matchers.configuration.user_alias)
|
286
|
-
.inspect + '.'
|
277
|
+
"#{policy.class} does not forbid the edit or update action for " \
|
278
|
+
"#{policy.public_send(Pundit::Matchers.configuration.user_alias).inspect}."
|
287
279
|
end
|
288
280
|
end
|
289
281
|
|
290
282
|
RSpec::Matchers.define :permit_mass_assignment_of do |attributes|
|
291
283
|
# Map single object argument to an array, if necessary
|
292
|
-
attributes = attributes.is_a?(Array)
|
284
|
+
attributes = [attributes] unless attributes.is_a?(Array)
|
293
285
|
|
294
286
|
match do |policy|
|
295
287
|
return false if attributes.count < 1
|
@@ -312,7 +304,7 @@ module Pundit
|
|
312
304
|
end
|
313
305
|
|
314
306
|
zero_attributes_failure_message = 'At least one attribute must be ' \
|
315
|
-
|
307
|
+
'specified when using the permit_mass_assignment_of matcher.'
|
316
308
|
|
317
309
|
failure_message do |policy|
|
318
310
|
if attributes.count.zero?
|
@@ -321,15 +313,13 @@ module Pundit
|
|
321
313
|
"#{policy.class} expected to permit the mass assignment of the " \
|
322
314
|
"attributes #{attributes} when authorising the #{@action} action, " \
|
323
315
|
'but forbade the mass assignment of the attributes ' \
|
324
|
-
"#{forbidden_attributes} for "
|
325
|
-
policy.public_send(Pundit::Matchers.configuration.user_alias)
|
326
|
-
.inspect + '.'
|
316
|
+
"#{forbidden_attributes} for " \
|
317
|
+
"#{policy.public_send(Pundit::Matchers.configuration.user_alias).inspect}."
|
327
318
|
else
|
328
319
|
"#{policy.class} expected to permit the mass assignment of the " \
|
329
320
|
"attributes #{attributes}, but forbade the mass assignment of the " \
|
330
|
-
"attributes #{forbidden_attributes} for "
|
331
|
-
policy.public_send(Pundit::Matchers.configuration.user_alias)
|
332
|
-
.inspect + '.'
|
321
|
+
"attributes #{forbidden_attributes} for " \
|
322
|
+
"#{policy.public_send(Pundit::Matchers.configuration.user_alias).inspect}."
|
333
323
|
end
|
334
324
|
end
|
335
325
|
|
@@ -340,15 +330,13 @@ module Pundit
|
|
340
330
|
"#{policy.class} expected to forbid the mass assignment of the " \
|
341
331
|
"attributes #{attributes} when authorising the #{@action} action, " \
|
342
332
|
'but forbade the mass assignment of the attributes ' \
|
343
|
-
"#{forbidden_attributes} for "
|
344
|
-
policy.public_send(Pundit::Matchers.configuration.user_alias)
|
345
|
-
.inspect + '.'
|
333
|
+
"#{forbidden_attributes} for " \
|
334
|
+
"#{policy.public_send(Pundit::Matchers.configuration.user_alias).inspect}."
|
346
335
|
else
|
347
336
|
"#{policy.class} expected to forbid the mass assignment of the " \
|
348
337
|
"attributes #{attributes}, but forbade the mass assignment of the " \
|
349
|
-
"attributes #{forbidden_attributes} for "
|
350
|
-
policy.public_send(Pundit::Matchers.configuration.user_alias)
|
351
|
-
.inspect + '.'
|
338
|
+
"attributes #{forbidden_attributes} for " \
|
339
|
+
"#{policy.public_send(Pundit::Matchers.configuration.user_alias).inspect}."
|
352
340
|
end
|
353
341
|
end
|
354
342
|
end
|
@@ -359,15 +347,13 @@ module Pundit
|
|
359
347
|
end
|
360
348
|
|
361
349
|
failure_message do |policy|
|
362
|
-
"#{policy.class} does not permit the new or create action for "
|
363
|
-
policy.public_send(Pundit::Matchers.configuration.user_alias)
|
364
|
-
.inspect + '.'
|
350
|
+
"#{policy.class} does not permit the new or create action for " \
|
351
|
+
"#{policy.public_send(Pundit::Matchers.configuration.user_alias).inspect}."
|
365
352
|
end
|
366
353
|
|
367
354
|
failure_message_when_negated do |policy|
|
368
|
-
"#{policy.class} does not forbid the new or create action for "
|
369
|
-
policy.public_send(Pundit::Matchers.configuration.user_alias)
|
370
|
-
.inspect + '.'
|
355
|
+
"#{policy.class} does not forbid the new or create action for " \
|
356
|
+
"#{policy.public_send(Pundit::Matchers.configuration.user_alias).inspect}."
|
371
357
|
end
|
372
358
|
end
|
373
359
|
|
@@ -383,6 +369,18 @@ module Pundit
|
|
383
369
|
end
|
384
370
|
end
|
385
371
|
|
372
|
+
RSpec::Matchers.define :permit_only_actions do |actions|
|
373
|
+
match do |policy|
|
374
|
+
@matcher = Pundit::Matchers::Utils::OnlyActions::PermittedActionsMatcher.new(policy, actions)
|
375
|
+
@matcher.match?
|
376
|
+
end
|
377
|
+
|
378
|
+
failure_message do
|
379
|
+
formatter = Pundit::Matchers::Utils::OnlyActions::PermittedActionsErrorFormatter.new(@matcher)
|
380
|
+
formatter.message
|
381
|
+
end
|
382
|
+
end
|
383
|
+
|
386
384
|
RSpec::Matchers.define :forbid_all_actions do
|
387
385
|
match do |policy|
|
388
386
|
@matcher = Pundit::Matchers::Utils::AllActions::ForbiddenActionsMatcher.new(policy)
|
@@ -394,6 +392,18 @@ module Pundit
|
|
394
392
|
formatter.message
|
395
393
|
end
|
396
394
|
end
|
395
|
+
|
396
|
+
RSpec::Matchers.define :forbid_only_actions do |actions|
|
397
|
+
match do |policy|
|
398
|
+
@matcher = Pundit::Matchers::Utils::OnlyActions::ForbiddenActionsMatcher.new(policy, actions)
|
399
|
+
@matcher.match?
|
400
|
+
end
|
401
|
+
|
402
|
+
failure_message do
|
403
|
+
formatter = Pundit::Matchers::Utils::OnlyActions::ForbiddenActionsErrorFormatter.new(@matcher)
|
404
|
+
formatter.message
|
405
|
+
end
|
406
|
+
end
|
397
407
|
end
|
398
408
|
|
399
409
|
if defined?(Pundit)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pundit-matchers
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Alley
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-05-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec-rails
|
@@ -57,11 +57,18 @@ files:
|
|
57
57
|
- lib/pundit/matchers/utils/all_actions/forbidden_actions_matcher.rb
|
58
58
|
- lib/pundit/matchers/utils/all_actions/permitted_actions_error_formatter.rb
|
59
59
|
- lib/pundit/matchers/utils/all_actions/permitted_actions_matcher.rb
|
60
|
+
- lib/pundit/matchers/utils/only_actions/actions_matcher.rb
|
61
|
+
- lib/pundit/matchers/utils/only_actions/error_message_formatter.rb
|
62
|
+
- lib/pundit/matchers/utils/only_actions/forbidden_actions_error_formatter.rb
|
63
|
+
- lib/pundit/matchers/utils/only_actions/forbidden_actions_matcher.rb
|
64
|
+
- lib/pundit/matchers/utils/only_actions/permitted_actions_error_formatter.rb
|
65
|
+
- lib/pundit/matchers/utils/only_actions/permitted_actions_matcher.rb
|
60
66
|
- lib/pundit/matchers/utils/policy_info.rb
|
61
|
-
homepage:
|
67
|
+
homepage: https://github.com/punditcommunity/pundit-matchers
|
62
68
|
licenses:
|
63
69
|
- MIT
|
64
|
-
metadata:
|
70
|
+
metadata:
|
71
|
+
rubygems_mfa_required: 'true'
|
65
72
|
post_install_message:
|
66
73
|
rdoc_options: []
|
67
74
|
require_paths:
|
@@ -70,14 +77,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
70
77
|
requirements:
|
71
78
|
- - ">="
|
72
79
|
- !ruby/object:Gem::Version
|
73
|
-
version: '0'
|
80
|
+
version: '3.0'
|
74
81
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
75
82
|
requirements:
|
76
83
|
- - ">="
|
77
84
|
- !ruby/object:Gem::Version
|
78
85
|
version: '0'
|
79
86
|
requirements: []
|
80
|
-
rubygems_version: 3.
|
87
|
+
rubygems_version: 3.4.12
|
81
88
|
signing_key:
|
82
89
|
specification_version: 4
|
83
90
|
summary: RSpec matchers for Pundit policies
|