shoulda-matchers 4.4.1 → 4.5.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/LICENSE +22 -0
- data/README.md +7 -9
- data/lib/shoulda/matchers/action_controller/callback_matcher.rb +4 -2
- data/lib/shoulda/matchers/action_controller/filter_param_matcher.rb +3 -2
- data/lib/shoulda/matchers/action_controller/permit_matcher.rb +26 -21
- data/lib/shoulda/matchers/action_controller/redirect_to_matcher.rb +6 -8
- data/lib/shoulda/matchers/action_controller/render_template_matcher.rb +6 -8
- data/lib/shoulda/matchers/action_controller/render_with_layout_matcher.rb +16 -13
- data/lib/shoulda/matchers/action_controller/rescue_from_matcher.rb +2 -1
- data/lib/shoulda/matchers/action_controller/route_matcher.rb +5 -6
- data/lib/shoulda/matchers/action_controller/route_params.rb +1 -1
- data/lib/shoulda/matchers/action_controller/set_session_or_flash_matcher.rb +19 -13
- data/lib/shoulda/matchers/active_model/allow_mass_assignment_of_matcher.rb +18 -16
- data/lib/shoulda/matchers/active_model/allow_value_matcher.rb +29 -27
- data/lib/shoulda/matchers/active_model/allow_value_matcher/attribute_changed_value_error.rb +1 -1
- data/lib/shoulda/matchers/active_model/allow_value_matcher/attribute_setter.rb +5 -5
- data/lib/shoulda/matchers/active_model/allow_value_matcher/attribute_setter_and_validator.rb +2 -2
- data/lib/shoulda/matchers/active_model/allow_value_matcher/attribute_setters.rb +1 -1
- data/lib/shoulda/matchers/active_model/allow_value_matcher/attribute_setters_and_validators.rb +1 -1
- data/lib/shoulda/matchers/active_model/disallow_value_matcher.rb +1 -1
- data/lib/shoulda/matchers/active_model/have_secure_password_matcher.rb +51 -25
- data/lib/shoulda/matchers/active_model/helpers.rb +1 -1
- data/lib/shoulda/matchers/active_model/numericality_matchers/comparison_matcher.rb +32 -34
- data/lib/shoulda/matchers/active_model/numericality_matchers/numeric_type_matcher.rb +1 -1
- data/lib/shoulda/matchers/active_model/qualifiers/ignoring_interference_by_writer.rb +1 -1
- data/lib/shoulda/matchers/active_model/validate_absence_of_matcher.rb +9 -1
- data/lib/shoulda/matchers/active_model/validate_confirmation_of_matcher.rb +2 -2
- data/lib/shoulda/matchers/active_model/validate_exclusion_of_matcher.rb +8 -7
- data/lib/shoulda/matchers/active_model/validate_inclusion_of_matcher.rb +26 -25
- data/lib/shoulda/matchers/active_model/validate_length_of_matcher.rb +6 -6
- data/lib/shoulda/matchers/active_model/validate_numericality_of_matcher.rb +39 -26
- data/lib/shoulda/matchers/active_model/validate_presence_of_matcher.rb +2 -2
- data/lib/shoulda/matchers/active_model/validation_matcher.rb +6 -6
- data/lib/shoulda/matchers/active_model/validation_matcher/build_description.rb +2 -4
- data/lib/shoulda/matchers/active_model/validation_message_finder.rb +2 -4
- data/lib/shoulda/matchers/active_model/validator.rb +3 -3
- data/lib/shoulda/matchers/active_record.rb +26 -26
- data/lib/shoulda/matchers/active_record/accept_nested_attributes_for_matcher.rb +6 -3
- data/lib/shoulda/matchers/active_record/association_matcher.rb +80 -40
- data/lib/shoulda/matchers/active_record/association_matchers/counter_cache_matcher.rb +5 -2
- data/lib/shoulda/matchers/active_record/association_matchers/dependent_matcher.rb +4 -4
- data/lib/shoulda/matchers/active_record/association_matchers/inverse_of_matcher.rb +1 -1
- data/lib/shoulda/matchers/active_record/association_matchers/join_table_matcher.rb +11 -6
- data/lib/shoulda/matchers/active_record/association_matchers/model_reflection.rb +2 -9
- data/lib/shoulda/matchers/active_record/association_matchers/model_reflector.rb +12 -7
- data/lib/shoulda/matchers/active_record/association_matchers/option_verifier.rb +23 -5
- data/lib/shoulda/matchers/active_record/association_matchers/optional_matcher.rb +3 -3
- data/lib/shoulda/matchers/active_record/association_matchers/order_matcher.rb +1 -1
- data/lib/shoulda/matchers/active_record/association_matchers/required_matcher.rb +3 -3
- data/lib/shoulda/matchers/active_record/association_matchers/source_matcher.rb +3 -2
- data/lib/shoulda/matchers/active_record/association_matchers/through_matcher.rb +7 -5
- data/lib/shoulda/matchers/active_record/define_enum_for_matcher.rb +8 -8
- data/lib/shoulda/matchers/active_record/have_attached_matcher.rb +46 -8
- data/lib/shoulda/matchers/active_record/have_db_column_matcher.rb +39 -17
- data/lib/shoulda/matchers/active_record/have_db_index_matcher.rb +1 -1
- data/lib/shoulda/matchers/active_record/have_implicit_order_column.rb +7 -7
- data/lib/shoulda/matchers/active_record/have_readonly_attribute_matcher.rb +12 -10
- data/lib/shoulda/matchers/active_record/have_rich_text_matcher.rb +11 -7
- data/lib/shoulda/matchers/active_record/have_secure_token_matcher.rb +2 -0
- data/lib/shoulda/matchers/active_record/serialize_matcher.rb +13 -9
- data/lib/shoulda/matchers/active_record/uniqueness.rb +1 -1
- data/lib/shoulda/matchers/active_record/uniqueness/test_model_creator.rb +1 -3
- data/lib/shoulda/matchers/active_record/uniqueness/test_models.rb +0 -2
- data/lib/shoulda/matchers/active_record/validate_uniqueness_of_matcher.rb +78 -71
- data/lib/shoulda/matchers/doublespeak.rb +2 -1
- data/lib/shoulda/matchers/doublespeak/double.rb +1 -1
- data/lib/shoulda/matchers/doublespeak/double_collection.rb +3 -3
- data/lib/shoulda/matchers/doublespeak/double_implementation_registry.rb +8 -5
- data/lib/shoulda/matchers/doublespeak/object_double.rb +1 -1
- data/lib/shoulda/matchers/doublespeak/stub_implementation.rb +1 -5
- data/lib/shoulda/matchers/doublespeak/world.rb +2 -2
- data/lib/shoulda/matchers/error.rb +1 -1
- data/lib/shoulda/matchers/independent/delegate_method_matcher.rb +14 -13
- data/lib/shoulda/matchers/integrations/configuration.rb +1 -1
- data/lib/shoulda/matchers/integrations/libraries/action_controller.rb +1 -1
- data/lib/shoulda/matchers/integrations/libraries/rails.rb +2 -2
- data/lib/shoulda/matchers/integrations/test_frameworks/active_support_test_case.rb +1 -1
- data/lib/shoulda/matchers/integrations/test_frameworks/minitest_4.rb +1 -1
- data/lib/shoulda/matchers/integrations/test_frameworks/minitest_5.rb +1 -1
- data/lib/shoulda/matchers/integrations/test_frameworks/missing_test_framework.rb +1 -1
- data/lib/shoulda/matchers/integrations/test_frameworks/test_unit.rb +1 -1
- data/lib/shoulda/matchers/rails_shim.rb +5 -3
- data/lib/shoulda/matchers/util.rb +7 -2
- data/lib/shoulda/matchers/util/word_wrap.rb +7 -7
- data/lib/shoulda/matchers/version.rb +1 -1
- data/lib/shoulda/matchers/warn.rb +3 -3
- data/shoulda-matchers.gemspec +10 -7
- metadata +11 -10
@@ -89,23 +89,24 @@ module Shoulda
|
|
89
89
|
@subject = subject
|
90
90
|
if attr_mass_assignable?
|
91
91
|
if whitelisting?
|
92
|
-
@failure_message_when_negated = "#{@attribute} was made
|
92
|
+
@failure_message_when_negated = "#{@attribute} was made "\
|
93
|
+
'accessible'
|
94
|
+
elsif protected_attributes.empty?
|
95
|
+
@failure_message_when_negated = 'no attributes were protected'
|
93
96
|
else
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
"#{protected_attributes.to_a.to_sentence}, " <<
|
99
|
-
"but not #{@attribute}."
|
100
|
-
end
|
97
|
+
@failure_message_when_negated =
|
98
|
+
"#{class_name} is protecting " <<
|
99
|
+
"#{protected_attributes.to_a.to_sentence}, " <<
|
100
|
+
"but not #{@attribute}."
|
101
101
|
end
|
102
102
|
true
|
103
103
|
else
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
104
|
+
@failure_message =
|
105
|
+
if whitelisting?
|
106
|
+
"Expected #{@attribute} to be accessible"
|
107
|
+
else
|
108
|
+
"Did not expect #{@attribute} to be protected"
|
109
|
+
end
|
109
110
|
false
|
110
111
|
end
|
111
112
|
end
|
@@ -131,15 +132,16 @@ module Shoulda
|
|
131
132
|
end
|
132
133
|
|
133
134
|
def protected_attributes
|
134
|
-
@
|
135
|
+
@_protected_attributes ||= (@subject.class.protected_attributes || [])
|
135
136
|
end
|
136
137
|
|
137
138
|
def accessible_attributes
|
138
|
-
@
|
139
|
+
@_accessible_attributes ||=
|
140
|
+
(@subject.class.accessible_attributes || [])
|
139
141
|
end
|
140
142
|
|
141
143
|
def whitelisting?
|
142
|
-
authorizer.
|
144
|
+
authorizer.is_a?(::ActiveModel::MassAssignmentSecurity::WhiteList)
|
143
145
|
end
|
144
146
|
|
145
147
|
def attr_mass_assignable?
|
@@ -18,14 +18,14 @@ module Shoulda
|
|
18
18
|
#
|
19
19
|
# # RSpec
|
20
20
|
# RSpec.describe UserProfile, type: :model do
|
21
|
-
# it { should allow_value('
|
22
|
-
# it { should allow_value('
|
21
|
+
# it { should allow_value('https://foo.com').for(:website_url) }
|
22
|
+
# it { should allow_value('https://bar.com').for(:website_url) }
|
23
23
|
# end
|
24
24
|
#
|
25
25
|
# # Minitest (Shoulda)
|
26
26
|
# class UserProfileTest < ActiveSupport::TestCase
|
27
|
-
# should allow_value('
|
28
|
-
# should allow_value('
|
27
|
+
# should allow_value('https://foo.com').for(:website_url)
|
28
|
+
# should allow_value('https://bar.com').for(:website_url)
|
29
29
|
# end
|
30
30
|
#
|
31
31
|
# You can also test multiple values in one go, if you like. In the
|
@@ -36,7 +36,7 @@ module Shoulda
|
|
36
36
|
# # RSpec
|
37
37
|
# RSpec.describe UserProfile, type: :model do
|
38
38
|
# it do
|
39
|
-
# should allow_values('
|
39
|
+
# should allow_values('https://foo.com', 'https://bar.com').
|
40
40
|
# for(:website_url)
|
41
41
|
# end
|
42
42
|
#
|
@@ -48,7 +48,7 @@ module Shoulda
|
|
48
48
|
#
|
49
49
|
# # Minitest (Shoulda)
|
50
50
|
# class UserProfileTest < ActiveSupport::TestCase
|
51
|
-
# should allow_values('
|
51
|
+
# should allow_values('https://foo.com', 'https://bar.com/baz').
|
52
52
|
# for(:website_url)
|
53
53
|
#
|
54
54
|
# should_not allow_values('foo', 'buz').
|
@@ -313,7 +313,7 @@ module Shoulda
|
|
313
313
|
:attribute_to_check_message_against,
|
314
314
|
:attribute_to_set,
|
315
315
|
:context,
|
316
|
-
:instance
|
316
|
+
:instance,
|
317
317
|
)
|
318
318
|
|
319
319
|
attr_writer(
|
@@ -423,55 +423,56 @@ module Shoulda
|
|
423
423
|
end
|
424
424
|
|
425
425
|
if include_attribute_changed_value_message?
|
426
|
-
message << "\n\n
|
426
|
+
message << "\n\n#{attribute_changed_value_message.call}"
|
427
427
|
end
|
428
428
|
|
429
429
|
Shoulda::Matchers.word_wrap(message)
|
430
430
|
end
|
431
431
|
|
432
|
-
def failure_message_when_negated
|
432
|
+
def failure_message_when_negated # rubocop:disable Metrics/MethodLength
|
433
433
|
attribute_setter = result.attribute_setter
|
434
434
|
|
435
435
|
if attribute_setter.unsuccessfully_checked?
|
436
436
|
message = attribute_setter.failure_message
|
437
437
|
else
|
438
438
|
validator = result.validator
|
439
|
-
message = failure_message_preface.call
|
439
|
+
message = "#{failure_message_preface.call} invalid"
|
440
440
|
|
441
441
|
if validator.type_of_message_matched?
|
442
442
|
if validator.has_messages?
|
443
443
|
message << ' and to'
|
444
444
|
|
445
|
-
if validator.captured_validation_exception?
|
445
|
+
if validator.captured_validation_exception? # rubocop:disable Metrics/BlockNesting
|
446
446
|
message << ' raise a validation exception with message'
|
447
447
|
else
|
448
448
|
message << ' produce'
|
449
449
|
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
|
450
|
+
message <<
|
451
|
+
if expected_message.is_a?(Regexp) # rubocop:disable Metrics/BlockNesting
|
452
|
+
' a'
|
453
|
+
else
|
454
|
+
' the'
|
455
|
+
end
|
455
456
|
|
456
457
|
message << ' validation error'
|
457
458
|
end
|
458
459
|
|
459
|
-
if expected_message.is_a?(Regexp)
|
460
|
+
if expected_message.is_a?(Regexp) # rubocop:disable Metrics/BlockNesting
|
460
461
|
message << ' matching '
|
461
462
|
message << Shoulda::Matchers::Util.inspect_value(
|
462
|
-
expected_message
|
463
|
+
expected_message,
|
463
464
|
)
|
464
465
|
else
|
465
466
|
message << " #{expected_message.inspect}"
|
466
467
|
end
|
467
468
|
|
468
|
-
unless validator.captured_validation_exception?
|
469
|
+
unless validator.captured_validation_exception? # rubocop:disable Metrics/BlockNesting
|
469
470
|
message << " on :#{attribute_to_check_message_against}"
|
470
471
|
end
|
471
472
|
|
472
473
|
message << '. The record was indeed invalid, but'
|
473
474
|
|
474
|
-
if validator.captured_validation_exception?
|
475
|
+
if validator.captured_validation_exception? # rubocop:disable Metrics/BlockNesting
|
475
476
|
message << ' the exception message was '
|
476
477
|
message << validator.validation_exception_message.inspect
|
477
478
|
message << ' instead.'
|
@@ -492,7 +493,7 @@ module Shoulda
|
|
492
493
|
end
|
493
494
|
|
494
495
|
if include_attribute_changed_value_message?
|
495
|
-
message << "\n\n
|
496
|
+
message << "\n\n#{attribute_changed_value_message.call}"
|
496
497
|
end
|
497
498
|
|
498
499
|
Shoulda::Matchers.word_wrap(message)
|
@@ -531,7 +532,8 @@ module Shoulda
|
|
531
532
|
|
532
533
|
def run(strategy)
|
533
534
|
attribute_setters_for_values_to_preset.first_failing ||
|
534
|
-
attribute_setters_and_validators_for_values_to_set.
|
535
|
+
attribute_setters_and_validators_for_values_to_set.
|
536
|
+
public_send(strategy)
|
535
537
|
end
|
536
538
|
|
537
539
|
def failure_message_preface
|
@@ -597,14 +599,14 @@ pass, or do something else entirely.
|
|
597
599
|
@_attribute_setters_and_validators_for_values_to_set ||=
|
598
600
|
AttributeSettersAndValidators.new(
|
599
601
|
self,
|
600
|
-
values_to_set.map { |value| [attribute_to_set, value] }
|
602
|
+
values_to_set.map { |value| [attribute_to_set, value] },
|
601
603
|
)
|
602
604
|
end
|
603
605
|
|
604
606
|
def inspected_values_to_set
|
605
607
|
Shoulda::Matchers::Util.inspect_values(values_to_set).to_sentence(
|
606
|
-
two_words_connector:
|
607
|
-
last_word_connector:
|
608
|
+
two_words_connector: ' or ',
|
609
|
+
last_word_connector: ', or ',
|
608
610
|
)
|
609
611
|
end
|
610
612
|
|
@@ -619,7 +621,7 @@ pass, or do something else entirely.
|
|
619
621
|
def default_attribute_message
|
620
622
|
default_error_message(
|
621
623
|
options[:expected_message],
|
622
|
-
default_attribute_message_values
|
624
|
+
default_attribute_message_values,
|
623
625
|
)
|
624
626
|
end
|
625
627
|
|
@@ -639,7 +641,7 @@ pass, or do something else entirely.
|
|
639
641
|
|
640
642
|
def human_attribute_name
|
641
643
|
instance.class.human_attribute_name(
|
642
|
-
attribute_to_check_message_against
|
644
|
+
attribute_to_check_message_against,
|
643
645
|
)
|
644
646
|
end
|
645
647
|
end
|
@@ -23,7 +23,7 @@ module Shoulda
|
|
23
23
|
@value_written = args.fetch(:value)
|
24
24
|
@ignore_interference_by_writer = args.fetch(
|
25
25
|
:ignore_interference_by_writer,
|
26
|
-
Qualifiers::IgnoreInterferenceByWriter.new
|
26
|
+
Qualifiers::IgnoreInterferenceByWriter.new,
|
27
27
|
)
|
28
28
|
@after_set_callback = args.fetch(:after_set_callback, -> { })
|
29
29
|
|
@@ -36,9 +36,9 @@ module Shoulda
|
|
36
36
|
description << Shoulda::Matchers::Util.inspect_value(value_written)
|
37
37
|
|
38
38
|
if attribute_changed_value?
|
39
|
-
description <<
|
39
|
+
description << ' -- which was read back as '
|
40
40
|
description << Shoulda::Matchers::Util.inspect_value(value_read)
|
41
|
-
description <<
|
41
|
+
description << ' --'
|
42
42
|
end
|
43
43
|
|
44
44
|
description
|
@@ -206,7 +206,7 @@ module Shoulda
|
|
206
206
|
model: object.class,
|
207
207
|
attribute_name: attribute_name,
|
208
208
|
value_written: value_written,
|
209
|
-
value_read: value_read
|
209
|
+
value_read: value_read,
|
210
210
|
)
|
211
211
|
end
|
212
212
|
|
@@ -218,7 +218,7 @@ module Shoulda
|
|
218
218
|
AttributeDoesNotExistError.create(
|
219
219
|
model: object.class,
|
220
220
|
attribute_name: attribute_name,
|
221
|
-
value: value_written
|
221
|
+
value: value_written,
|
222
222
|
)
|
223
223
|
end
|
224
224
|
|
data/lib/shoulda/matchers/active_model/allow_value_matcher/attribute_setter_and_validator.rb
CHANGED
@@ -34,7 +34,7 @@ module Shoulda
|
|
34
34
|
attribute_name: attribute_name,
|
35
35
|
value: value,
|
36
36
|
ignore_interference_by_writer: ignore_interference_by_writer,
|
37
|
-
after_set_callback: after_setting_value_callback
|
37
|
+
after_set_callback: after_setting_value_callback,
|
38
38
|
)
|
39
39
|
end
|
40
40
|
|
@@ -48,7 +48,7 @@ module Shoulda
|
|
48
48
|
attribute_to_check_message_against,
|
49
49
|
context: context,
|
50
50
|
expects_strict: expects_strict?,
|
51
|
-
expected_message: expected_message
|
51
|
+
expected_message: expected_message,
|
52
52
|
)
|
53
53
|
end
|
54
54
|
|
@@ -10,49 +10,51 @@ module Shoulda
|
|
10
10
|
# include ActiveModel::Model
|
11
11
|
# include ActiveModel::SecurePassword
|
12
12
|
# attr_accessor :password
|
13
|
+
# attr_accessor :reset_password
|
13
14
|
#
|
14
15
|
# has_secure_password
|
16
|
+
# has_secure_password :reset_password
|
15
17
|
# end
|
16
18
|
#
|
17
19
|
# # RSpec
|
18
20
|
# RSpec.describe User, type: :model do
|
19
21
|
# it { should have_secure_password }
|
22
|
+
# it { should have_secure_password(:reset_password) }
|
20
23
|
# end
|
21
24
|
#
|
22
25
|
# # Minitest (Shoulda)
|
23
26
|
# class UserTest < ActiveSupport::TestCase
|
24
27
|
# should have_secure_password
|
28
|
+
# should have_secure_password(:reset_password)
|
25
29
|
# end
|
26
30
|
#
|
27
31
|
# @return [HaveSecurePasswordMatcher]
|
28
32
|
#
|
29
|
-
def have_secure_password
|
30
|
-
HaveSecurePasswordMatcher.new
|
33
|
+
def have_secure_password(attr = :password)
|
34
|
+
HaveSecurePasswordMatcher.new(attr)
|
31
35
|
end
|
32
36
|
|
33
37
|
# @private
|
34
38
|
class HaveSecurePasswordMatcher
|
35
39
|
attr_reader :failure_message
|
36
40
|
|
37
|
-
CORRECT_PASSWORD =
|
38
|
-
INCORRECT_PASSWORD =
|
39
|
-
|
40
|
-
EXPECTED_METHODS = [
|
41
|
-
:authenticate,
|
42
|
-
:password=,
|
43
|
-
:password_confirmation=,
|
44
|
-
:password_digest,
|
45
|
-
:password_digest=,
|
46
|
-
]
|
41
|
+
CORRECT_PASSWORD = 'aBcDe12345'.freeze
|
42
|
+
INCORRECT_PASSWORD = 'password'.freeze
|
47
43
|
|
48
44
|
MESSAGES = {
|
49
|
-
authenticated_incorrect_password:
|
50
|
-
|
51
|
-
|
52
|
-
|
45
|
+
authenticated_incorrect_password: 'expected %{subject} to not'\
|
46
|
+
' authenticate an incorrect %{attribute}',
|
47
|
+
did_not_authenticate_correct_password: 'expected %{subject} to'\
|
48
|
+
' authenticate the correct %{attribute}',
|
49
|
+
method_not_found: 'expected %{subject} to respond to %{methods}',
|
50
|
+
}.freeze
|
51
|
+
|
52
|
+
def initialize(attribute)
|
53
|
+
@attribute = attribute.to_sym
|
54
|
+
end
|
53
55
|
|
54
56
|
def description
|
55
|
-
"have a secure password"
|
57
|
+
"have a secure password, defined on #{@attribute} attribute"
|
56
58
|
end
|
57
59
|
|
58
60
|
def matches?(subject)
|
@@ -60,7 +62,8 @@ module Shoulda
|
|
60
62
|
|
61
63
|
if failure = validate
|
62
64
|
key, params = failure
|
63
|
-
@failure_message =
|
65
|
+
@failure_message =
|
66
|
+
MESSAGES[key] % { subject: subject.class }.merge(params)
|
64
67
|
end
|
65
68
|
|
66
69
|
failure.nil?
|
@@ -71,21 +74,44 @@ module Shoulda
|
|
71
74
|
attr_reader :subject
|
72
75
|
|
73
76
|
def validate
|
74
|
-
missing_methods =
|
77
|
+
missing_methods = expected_methods.reject do |m|
|
78
|
+
subject.respond_to?(m)
|
79
|
+
end
|
75
80
|
|
76
81
|
if missing_methods.present?
|
77
82
|
[:method_not_found, { methods: missing_methods.to_sentence }]
|
78
83
|
else
|
79
|
-
subject.
|
80
|
-
subject.
|
84
|
+
subject.send("#{@attribute}=", CORRECT_PASSWORD)
|
85
|
+
subject.send("#{@attribute}_confirmation=", CORRECT_PASSWORD)
|
81
86
|
|
82
|
-
if not subject.
|
83
|
-
[:did_not_authenticate_correct_password,
|
84
|
-
|
85
|
-
|
87
|
+
if not subject.send(authenticate_method, CORRECT_PASSWORD)
|
88
|
+
[:did_not_authenticate_correct_password,
|
89
|
+
{ attribute: @attribute },]
|
90
|
+
elsif subject.send(authenticate_method, INCORRECT_PASSWORD)
|
91
|
+
[:authenticated_incorrect_password, { attribute: @attribute }]
|
86
92
|
end
|
87
93
|
end
|
88
94
|
end
|
95
|
+
|
96
|
+
private
|
97
|
+
|
98
|
+
def expected_methods
|
99
|
+
@_expected_methods ||= %I[
|
100
|
+
#{authenticate_method}
|
101
|
+
#{@attribute}=
|
102
|
+
#{@attribute}_confirmation=
|
103
|
+
#{@attribute}_digest
|
104
|
+
#{@attribute}_digest=
|
105
|
+
]
|
106
|
+
end
|
107
|
+
|
108
|
+
def authenticate_method
|
109
|
+
if @attribute == :password
|
110
|
+
:authenticate
|
111
|
+
else
|
112
|
+
"authenticate_#{@attribute}".to_sym
|
113
|
+
end
|
114
|
+
end
|
89
115
|
end
|
90
116
|
end
|
91
117
|
end
|