shoulda-matchers 3.1.0 → 5.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 +5 -5
- data/{MIT-LICENSE → LICENSE} +1 -1
- data/README.md +407 -232
- data/docs/errors/NonCaseSwappableValueError.md +2 -2
- data/lib/shoulda/matchers/action_controller/callback_matcher.rb +7 -80
- data/lib/shoulda/matchers/action_controller/filter_param_matcher.rb +4 -3
- data/lib/shoulda/matchers/action_controller/flash_store.rb +2 -4
- data/lib/shoulda/matchers/action_controller/permit_matcher.rb +36 -30
- data/lib/shoulda/matchers/action_controller/redirect_to_matcher.rb +8 -10
- data/lib/shoulda/matchers/action_controller/render_template_matcher.rb +7 -9
- data/lib/shoulda/matchers/action_controller/render_with_layout_matcher.rb +18 -15
- data/lib/shoulda/matchers/action_controller/rescue_from_matcher.rb +3 -2
- data/lib/shoulda/matchers/action_controller/respond_with_matcher.rb +3 -3
- data/lib/shoulda/matchers/action_controller/route_matcher.rb +88 -29
- data/lib/shoulda/matchers/action_controller/route_params.rb +2 -2
- data/lib/shoulda/matchers/action_controller/set_flash_matcher.rb +4 -4
- data/lib/shoulda/matchers/action_controller/set_session_matcher.rb +3 -3
- data/lib/shoulda/matchers/action_controller/set_session_or_flash_matcher.rb +19 -13
- data/lib/shoulda/matchers/action_controller.rb +2 -0
- 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 -9
- 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/allow_value_matcher.rb +42 -39
- data/lib/shoulda/matchers/active_model/disallow_value_matcher.rb +1 -1
- data/lib/shoulda/matchers/active_model/have_secure_password_matcher.rb +52 -26
- data/lib/shoulda/matchers/active_model/helpers.rb +2 -2
- data/lib/shoulda/matchers/active_model/numericality_matchers/comparison_matcher.rb +32 -30
- data/lib/shoulda/matchers/active_model/numericality_matchers/numeric_type_matcher.rb +2 -1
- data/lib/shoulda/matchers/active_model/qualifiers/allow_blank.rb +26 -0
- data/lib/shoulda/matchers/active_model/qualifiers/allow_nil.rb +26 -0
- data/lib/shoulda/matchers/active_model/qualifiers/ignoring_interference_by_writer.rb +1 -1
- data/lib/shoulda/matchers/active_model/qualifiers.rb +2 -0
- data/lib/shoulda/matchers/active_model/validate_absence_of_matcher.rb +30 -6
- data/lib/shoulda/matchers/active_model/validate_acceptance_of_matcher.rb +8 -3
- data/lib/shoulda/matchers/active_model/validate_confirmation_of_matcher.rb +31 -16
- data/lib/shoulda/matchers/active_model/validate_exclusion_of_matcher.rb +52 -16
- data/lib/shoulda/matchers/active_model/validate_inclusion_of_matcher.rb +137 -84
- data/lib/shoulda/matchers/active_model/validate_length_of_matcher.rb +159 -46
- data/lib/shoulda/matchers/active_model/validate_numericality_of_matcher.rb +130 -66
- data/lib/shoulda/matchers/active_model/validate_presence_of_matcher.rb +251 -24
- data/lib/shoulda/matchers/active_model/validation_matcher/build_description.rb +12 -9
- data/lib/shoulda/matchers/active_model/validation_matcher.rb +38 -6
- data/lib/shoulda/matchers/active_model/validation_message_finder.rb +2 -4
- data/lib/shoulda/matchers/active_model/validator.rb +4 -9
- data/lib/shoulda/matchers/active_model.rb +3 -5
- data/lib/shoulda/matchers/active_record/accept_nested_attributes_for_matcher.rb +10 -7
- data/lib/shoulda/matchers/active_record/association_matcher.rb +386 -111
- 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 +14 -15
- data/lib/shoulda/matchers/active_record/association_matchers/model_reflector.rb +30 -8
- data/lib/shoulda/matchers/active_record/association_matchers/option_verifier.rb +34 -11
- data/lib/shoulda/matchers/active_record/association_matchers/optional_matcher.rb +69 -0
- data/lib/shoulda/matchers/active_record/association_matchers/order_matcher.rb +1 -1
- data/lib/shoulda/matchers/active_record/association_matchers/required_matcher.rb +74 -0
- 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 +458 -42
- data/lib/shoulda/matchers/active_record/have_attached_matcher.rb +185 -0
- data/lib/shoulda/matchers/active_record/have_db_column_matcher.rb +63 -23
- data/lib/shoulda/matchers/active_record/have_db_index_matcher.rb +164 -48
- data/lib/shoulda/matchers/active_record/have_implicit_order_column.rb +106 -0
- data/lib/shoulda/matchers/active_record/have_readonly_attribute_matcher.rb +13 -11
- data/lib/shoulda/matchers/active_record/have_rich_text_matcher.rb +83 -0
- data/lib/shoulda/matchers/active_record/have_secure_token_matcher.rb +132 -0
- data/lib/shoulda/matchers/active_record/serialize_matcher.rb +18 -18
- 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/uniqueness.rb +1 -1
- data/lib/shoulda/matchers/active_record/validate_uniqueness_of_matcher.rb +430 -200
- data/lib/shoulda/matchers/active_record.rb +28 -20
- data/lib/shoulda/matchers/configuration.rb +12 -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 +6 -2
- data/lib/shoulda/matchers/doublespeak/stub_implementation.rb +1 -5
- data/lib/shoulda/matchers/doublespeak/world.rb +2 -2
- data/lib/shoulda/matchers/doublespeak.rb +2 -1
- data/lib/shoulda/matchers/error.rb +1 -1
- data/lib/shoulda/matchers/independent/delegate_method_matcher.rb +109 -29
- data/lib/shoulda/matchers/independent.rb +2 -2
- data/lib/shoulda/matchers/integrations/configuration.rb +8 -4
- 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 +172 -51
- data/lib/shoulda/matchers/routing.rb +2 -2
- data/lib/shoulda/matchers/util/word_wrap.rb +17 -12
- data/lib/shoulda/matchers/util.rb +39 -5
- data/lib/shoulda/matchers/version.rb +1 -1
- data/lib/shoulda/matchers/warn.rb +4 -3
- data/shoulda-matchers.gemspec +33 -15
- metadata +31 -338
- data/.gitignore +0 -12
- data/.hound.yml +0 -3
- data/.hound_config/ruby.yml +0 -12
- data/.travis.yml +0 -19
- data/.yardopts +0 -10
- data/Appraisals +0 -73
- data/CONTRIBUTING.md +0 -101
- data/Gemfile +0 -15
- data/Gemfile.lock +0 -70
- data/NEWS.md +0 -986
- data/Rakefile +0 -39
- data/custom_plan.rb +0 -88
- data/doc_config/gh-pages/index.html.erb +0 -9
- data/doc_config/yard/setup.rb +0 -22
- data/doc_config/yard/templates/default/fulldoc/html/css/bootstrap.css +0 -5967
- data/doc_config/yard/templates/default/fulldoc/html/css/full_list.css +0 -12
- data/doc_config/yard/templates/default/fulldoc/html/css/global.css +0 -62
- data/doc_config/yard/templates/default/fulldoc/html/css/solarized.css +0 -69
- data/doc_config/yard/templates/default/fulldoc/html/css/style.css +0 -312
- data/doc_config/yard/templates/default/fulldoc/html/full_list.erb +0 -32
- data/doc_config/yard/templates/default/fulldoc/html/full_list_class.erb +0 -1
- data/doc_config/yard/templates/default/fulldoc/html/full_list_method.erb +0 -8
- data/doc_config/yard/templates/default/fulldoc/html/js/app.js +0 -298
- data/doc_config/yard/templates/default/fulldoc/html/js/full_list.js +0 -1
- data/doc_config/yard/templates/default/fulldoc/html/js/jquery.stickyheaders.js +0 -289
- data/doc_config/yard/templates/default/fulldoc/html/js/underscore.min.js +0 -6
- data/doc_config/yard/templates/default/fulldoc/html/setup.rb +0 -8
- data/doc_config/yard/templates/default/layout/html/breadcrumb.erb +0 -14
- data/doc_config/yard/templates/default/layout/html/fonts.erb +0 -1
- data/doc_config/yard/templates/default/layout/html/footer.erb +0 -6
- data/doc_config/yard/templates/default/layout/html/layout.erb +0 -23
- data/doc_config/yard/templates/default/layout/html/search.erb +0 -13
- data/doc_config/yard/templates/default/layout/html/setup.rb +0 -40
- data/doc_config/yard/templates/default/method_details/html/source.erb +0 -10
- data/doc_config/yard/templates/default/module/html/box_info.erb +0 -31
- data/gemfiles/4.0.0.gemfile +0 -38
- data/gemfiles/4.0.0.gemfile.lock +0 -223
- data/gemfiles/4.0.1.gemfile +0 -38
- data/gemfiles/4.0.1.gemfile.lock +0 -225
- data/gemfiles/4.1.gemfile +0 -38
- data/gemfiles/4.1.gemfile.lock +0 -220
- data/gemfiles/4.2.gemfile +0 -38
- data/gemfiles/4.2.gemfile.lock +0 -243
- data/lib/shoulda/matchers/active_model/allow_mass_assignment_of_matcher.rb +0 -159
- data/lib/shoulda/matchers/independent/delegate_method_matcher/stubbed_target.rb +0 -37
- data/script/SUPPORTED_VERSIONS +0 -1
- data/script/install_gems_in_all_appraisals +0 -14
- data/script/run_all_tests +0 -14
- data/script/update_gem_in_all_appraisals +0 -15
- data/script/update_gems_in_all_appraisals +0 -14
- data/spec/acceptance/active_model_integration_spec.rb +0 -23
- data/spec/acceptance/independent_matchers_spec.rb +0 -125
- data/spec/acceptance/multiple_libraries_integration_spec.rb +0 -55
- data/spec/acceptance/rails_integration_spec.rb +0 -156
- data/spec/acceptance_spec_helper.rb +0 -23
- data/spec/doublespeak_spec_helper.rb +0 -2
- data/spec/report_warnings.rb +0 -7
- data/spec/spec_helper.rb +0 -21
- data/spec/support/acceptance/adds_shoulda_matchers_to_project.rb +0 -133
- data/spec/support/acceptance/helpers/active_model_helpers.rb +0 -11
- data/spec/support/acceptance/helpers/array_helpers.rb +0 -13
- data/spec/support/acceptance/helpers/base_helpers.rb +0 -19
- data/spec/support/acceptance/helpers/command_helpers.rb +0 -55
- data/spec/support/acceptance/helpers/file_helpers.rb +0 -19
- data/spec/support/acceptance/helpers/gem_helpers.rb +0 -31
- data/spec/support/acceptance/helpers/minitest_helpers.rb +0 -11
- data/spec/support/acceptance/helpers/n_unit_helpers.rb +0 -25
- data/spec/support/acceptance/helpers/pluralization_helpers.rb +0 -13
- data/spec/support/acceptance/helpers/rails_version_helpers.rb +0 -11
- data/spec/support/acceptance/helpers/rspec_helpers.rb +0 -24
- data/spec/support/acceptance/helpers/ruby_version_helpers.rb +0 -9
- data/spec/support/acceptance/helpers/step_helpers.rb +0 -127
- data/spec/support/acceptance/helpers.rb +0 -31
- data/spec/support/acceptance/matchers/have_output.rb +0 -31
- data/spec/support/acceptance/matchers/indicate_number_of_tests_was_run_matcher.rb +0 -55
- data/spec/support/acceptance/matchers/indicate_that_tests_were_run_matcher.rb +0 -103
- data/spec/support/tests/bundle.rb +0 -94
- data/spec/support/tests/command_runner.rb +0 -230
- data/spec/support/tests/current_bundle.rb +0 -61
- data/spec/support/tests/database.rb +0 -28
- data/spec/support/tests/database_adapters/postgresql.rb +0 -25
- data/spec/support/tests/database_adapters/sqlite3.rb +0 -26
- data/spec/support/tests/database_configuration.rb +0 -33
- data/spec/support/tests/database_configuration_registry.rb +0 -28
- data/spec/support/tests/filesystem.rb +0 -100
- data/spec/support/tests/version.rb +0 -45
- data/spec/support/unit/active_record/create_table.rb +0 -54
- data/spec/support/unit/attribute.rb +0 -47
- data/spec/support/unit/capture.rb +0 -40
- data/spec/support/unit/change_value.rb +0 -111
- data/spec/support/unit/create_model_arguments/basic.rb +0 -135
- data/spec/support/unit/create_model_arguments/has_many.rb +0 -15
- data/spec/support/unit/create_model_arguments/uniqueness_matcher.rb +0 -74
- data/spec/support/unit/helpers/active_model_helpers.rb +0 -27
- data/spec/support/unit/helpers/active_model_versions.rb +0 -28
- data/spec/support/unit/helpers/active_record_versions.rb +0 -24
- data/spec/support/unit/helpers/active_resource_builder.rb +0 -27
- data/spec/support/unit/helpers/allow_value_matcher_helpers.rb +0 -15
- data/spec/support/unit/helpers/class_builder.rb +0 -90
- data/spec/support/unit/helpers/column_type_helpers.rb +0 -26
- data/spec/support/unit/helpers/confirmation_matcher_helpers.rb +0 -17
- data/spec/support/unit/helpers/controller_builder.rb +0 -63
- data/spec/support/unit/helpers/database_helpers.rb +0 -20
- data/spec/support/unit/helpers/i18n_faker.rb +0 -15
- data/spec/support/unit/helpers/mailer_builder.rb +0 -12
- data/spec/support/unit/helpers/model_builder.rb +0 -114
- data/spec/support/unit/helpers/rails_versions.rb +0 -28
- data/spec/support/unit/helpers/validation_matcher_scenario_helpers.rb +0 -44
- data/spec/support/unit/i18n.rb +0 -7
- data/spec/support/unit/load_environment.rb +0 -12
- data/spec/support/unit/matchers/deprecate.rb +0 -60
- data/spec/support/unit/matchers/fail_with_message_including_matcher.rb +0 -51
- data/spec/support/unit/matchers/fail_with_message_matcher.rb +0 -62
- data/spec/support/unit/matchers/print_warning_including.rb +0 -59
- data/spec/support/unit/model_creation_strategies/active_model.rb +0 -111
- data/spec/support/unit/model_creation_strategies/active_record.rb +0 -77
- data/spec/support/unit/model_creators/active_model.rb +0 -39
- data/spec/support/unit/model_creators/active_record/has_and_belongs_to_many.rb +0 -95
- data/spec/support/unit/model_creators/active_record/has_many.rb +0 -67
- data/spec/support/unit/model_creators/active_record/uniqueness_matcher.rb +0 -42
- data/spec/support/unit/model_creators/active_record.rb +0 -43
- data/spec/support/unit/model_creators/basic.rb +0 -97
- data/spec/support/unit/model_creators.rb +0 -19
- data/spec/support/unit/rails_application.rb +0 -126
- data/spec/support/unit/record_builder_with_i18n_validation_message.rb +0 -69
- data/spec/support/unit/record_validating_confirmation_builder.rb +0 -51
- data/spec/support/unit/record_with_different_error_attribute_builder.rb +0 -92
- data/spec/support/unit/shared_examples/ignoring_interference_by_writer.rb +0 -79
- data/spec/support/unit/shared_examples/numerical_submatcher.rb +0 -17
- data/spec/support/unit/shared_examples/set_session_or_flash.rb +0 -360
- data/spec/support/unit/validation_matcher_scenario.rb +0 -62
- data/spec/unit/shoulda/matchers/action_controller/callback_matcher_spec.rb +0 -82
- data/spec/unit/shoulda/matchers/action_controller/filter_param_matcher_spec.rb +0 -28
- data/spec/unit/shoulda/matchers/action_controller/permit_matcher_spec.rb +0 -592
- data/spec/unit/shoulda/matchers/action_controller/redirect_to_matcher_spec.rb +0 -42
- data/spec/unit/shoulda/matchers/action_controller/render_template_matcher_spec.rb +0 -76
- data/spec/unit/shoulda/matchers/action_controller/render_with_layout_matcher_spec.rb +0 -62
- data/spec/unit/shoulda/matchers/action_controller/rescue_from_matcher_spec.rb +0 -90
- data/spec/unit/shoulda/matchers/action_controller/respond_with_matcher_spec.rb +0 -31
- data/spec/unit/shoulda/matchers/action_controller/route_matcher_spec.rb +0 -330
- data/spec/unit/shoulda/matchers/action_controller/route_params_spec.rb +0 -30
- data/spec/unit/shoulda/matchers/action_controller/set_flash_matcher_spec.rb +0 -67
- data/spec/unit/shoulda/matchers/action_controller/set_session_matcher_spec.rb +0 -17
- data/spec/unit/shoulda/matchers/action_controller/set_session_or_flash_matcher_spec.rb +0 -562
- data/spec/unit/shoulda/matchers/active_model/allow_mass_assignment_of_matcher_spec.rb +0 -115
- data/spec/unit/shoulda/matchers/active_model/allow_value_matcher_spec.rb +0 -823
- data/spec/unit/shoulda/matchers/active_model/disallow_value_matcher_spec.rb +0 -86
- data/spec/unit/shoulda/matchers/active_model/have_secure_password_matcher_spec.rb +0 -20
- data/spec/unit/shoulda/matchers/active_model/helpers_spec.rb +0 -162
- data/spec/unit/shoulda/matchers/active_model/validate_absence_of_matcher_spec.rb +0 -266
- data/spec/unit/shoulda/matchers/active_model/validate_acceptance_of_matcher_spec.rb +0 -91
- data/spec/unit/shoulda/matchers/active_model/validate_confirmation_of_matcher_spec.rb +0 -149
- data/spec/unit/shoulda/matchers/active_model/validate_exclusion_of_matcher_spec.rb +0 -207
- data/spec/unit/shoulda/matchers/active_model/validate_inclusion_of_matcher_spec.rb +0 -1015
- data/spec/unit/shoulda/matchers/active_model/validate_length_of_matcher_spec.rb +0 -288
- data/spec/unit/shoulda/matchers/active_model/validate_numericality_of_matcher_spec.rb +0 -1837
- data/spec/unit/shoulda/matchers/active_model/validate_presence_of_matcher_spec.rb +0 -380
- data/spec/unit/shoulda/matchers/active_record/accept_nested_attributes_for_matcher_spec.rb +0 -107
- data/spec/unit/shoulda/matchers/active_record/association_matcher_spec.rb +0 -1242
- data/spec/unit/shoulda/matchers/active_record/association_matchers/model_reflection_spec.rb +0 -251
- data/spec/unit/shoulda/matchers/active_record/define_enum_for_matcher_spec.rb +0 -168
- data/spec/unit/shoulda/matchers/active_record/have_db_column_matcher_spec.rb +0 -111
- data/spec/unit/shoulda/matchers/active_record/have_db_index_matcher_spec.rb +0 -85
- data/spec/unit/shoulda/matchers/active_record/have_readonly_attributes_matcher_spec.rb +0 -41
- data/spec/unit/shoulda/matchers/active_record/serialize_matcher_spec.rb +0 -86
- data/spec/unit/shoulda/matchers/active_record/validate_uniqueness_of_matcher_spec.rb +0 -1418
- data/spec/unit/shoulda/matchers/doublespeak/double_collection_spec.rb +0 -190
- data/spec/unit/shoulda/matchers/doublespeak/double_implementation_registry_spec.rb +0 -21
- data/spec/unit/shoulda/matchers/doublespeak/double_spec.rb +0 -271
- data/spec/unit/shoulda/matchers/doublespeak/object_double_spec.rb +0 -77
- data/spec/unit/shoulda/matchers/doublespeak/proxy_implementation_spec.rb +0 -72
- data/spec/unit/shoulda/matchers/doublespeak/stub_implementation_spec.rb +0 -101
- data/spec/unit/shoulda/matchers/doublespeak/world_spec.rb +0 -80
- data/spec/unit/shoulda/matchers/doublespeak_spec.rb +0 -27
- data/spec/unit/shoulda/matchers/independent/delegate_method_matcher/stubbed_target_spec.rb +0 -43
- data/spec/unit/shoulda/matchers/independent/delegate_method_matcher_spec.rb +0 -517
- data/spec/unit/shoulda/matchers/routing/route_matcher_spec.rb +0 -242
- data/spec/unit/shoulda/matchers/util/word_wrap_spec.rb +0 -252
- data/spec/unit_spec_helper.rb +0 -46
- data/spec/warnings_spy/filesystem.rb +0 -45
- data/spec/warnings_spy/partitioner.rb +0 -36
- data/spec/warnings_spy/reader.rb +0 -53
- data/spec/warnings_spy/reporter.rb +0 -88
- data/spec/warnings_spy.rb +0 -64
- data/tasks/documentation.rb +0 -199
- data/zeus.json +0 -11
@@ -1,149 +0,0 @@
|
|
1
|
-
require 'unit_spec_helper'
|
2
|
-
|
3
|
-
describe Shoulda::Matchers::ActiveModel::ValidateConfirmationOfMatcher, type: :model do
|
4
|
-
include UnitTests::ConfirmationMatcherHelpers
|
5
|
-
|
6
|
-
context '#description' do
|
7
|
-
it 'states that the confirmation must match its base attribute' do
|
8
|
-
builder = builder_for_record_validating_confirmation
|
9
|
-
message = "validate that :#{builder.confirmation_attribute} matches :#{builder.attribute_to_confirm}"
|
10
|
-
matcher = described_class.new(builder.attribute_to_confirm)
|
11
|
-
expect(matcher.description).to eq(message)
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
context 'when the model has a confirmation validation' do
|
16
|
-
it 'passes' do
|
17
|
-
builder = builder_for_record_validating_confirmation
|
18
|
-
expect(builder.record).
|
19
|
-
to validate_confirmation_of(builder.attribute_to_confirm)
|
20
|
-
end
|
21
|
-
|
22
|
-
context 'when a nil message is specified' do
|
23
|
-
it 'ignores it' do
|
24
|
-
builder = builder_for_record_validating_confirmation
|
25
|
-
expect(builder.record).
|
26
|
-
to validate_confirmation_of(builder.attribute_to_confirm).
|
27
|
-
with_message(nil)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
it_supports(
|
32
|
-
'ignoring_interference_by_writer',
|
33
|
-
tests: {
|
34
|
-
reject_if_qualified_but_changing_value_interferes: {
|
35
|
-
model_name: 'Example',
|
36
|
-
attribute_name: :password,
|
37
|
-
changing_values_with: :next_value,
|
38
|
-
expected_message: <<-MESSAGE.strip
|
39
|
-
Example did not properly validate that :password_confirmation matches
|
40
|
-
:password.
|
41
|
-
After setting :password_confirmation to ‹"same value"›, then setting
|
42
|
-
:password to ‹"same value"› -- which was read back as ‹"same valuf"›
|
43
|
-
-- the matcher expected the Example to be valid, but it was invalid
|
44
|
-
instead, producing these validation errors:
|
45
|
-
|
46
|
-
* password_confirmation: ["doesn't match Password"]
|
47
|
-
|
48
|
-
As indicated in the message above, :password seems to be changing
|
49
|
-
certain values as they are set, and this could have something to do
|
50
|
-
with why this test is failing. If you've overridden the writer method
|
51
|
-
for this attribute, then you may need to change it to make this test
|
52
|
-
pass, or do something else entirely.
|
53
|
-
MESSAGE
|
54
|
-
},
|
55
|
-
},
|
56
|
-
model_creator: :active_model
|
57
|
-
)
|
58
|
-
end
|
59
|
-
|
60
|
-
context 'when the model does not have a confirmation attribute' do
|
61
|
-
it 'raises an AttributeDoesNotExistError' do
|
62
|
-
model = define_model(:example)
|
63
|
-
|
64
|
-
assertion = lambda do
|
65
|
-
expect(model.new).to validate_confirmation_of(:attribute_to_confirm)
|
66
|
-
end
|
67
|
-
|
68
|
-
message = <<-MESSAGE.rstrip
|
69
|
-
The matcher attempted to set :attribute_to_confirm_confirmation on the
|
70
|
-
Example to "some value", but that attribute does not exist.
|
71
|
-
MESSAGE
|
72
|
-
|
73
|
-
expect(&assertion).to raise_error(
|
74
|
-
Shoulda::Matchers::ActiveModel::AllowValueMatcher::AttributeDoesNotExistError,
|
75
|
-
message
|
76
|
-
)
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
context 'when the model does not have the attribute under test' do
|
81
|
-
it 'raises an AttributeDoesNotExistError' do
|
82
|
-
model = define_model(:example, attribute_to_confirm_confirmation: :string)
|
83
|
-
|
84
|
-
assertion = lambda do
|
85
|
-
expect(model.new).to validate_confirmation_of(:attribute_to_confirm)
|
86
|
-
end
|
87
|
-
|
88
|
-
message = <<-MESSAGE.rstrip
|
89
|
-
The matcher attempted to set :attribute_to_confirm on the Example to
|
90
|
-
"different value", but that attribute does not exist.
|
91
|
-
MESSAGE
|
92
|
-
|
93
|
-
expect(&assertion).to raise_error(
|
94
|
-
Shoulda::Matchers::ActiveModel::AllowValueMatcher::AttributeDoesNotExistError,
|
95
|
-
message
|
96
|
-
)
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
|
-
context 'when the model has all attributes, but does not have the validation' do
|
101
|
-
it 'fails with an appropriate failure message' do
|
102
|
-
model = define_model(:example, attribute_to_confirm: :string) do
|
103
|
-
attr_accessor :attribute_to_confirm_confirmation
|
104
|
-
end
|
105
|
-
|
106
|
-
assertion = lambda do
|
107
|
-
expect(model.new).to validate_confirmation_of(:attribute_to_confirm)
|
108
|
-
end
|
109
|
-
|
110
|
-
message = <<-MESSAGE
|
111
|
-
Example did not properly validate that
|
112
|
-
:attribute_to_confirm_confirmation matches :attribute_to_confirm.
|
113
|
-
After setting :attribute_to_confirm_confirmation to ‹"some value"›,
|
114
|
-
then setting :attribute_to_confirm to ‹"different value"›, the matcher
|
115
|
-
expected the Example to be invalid, but it was valid instead.
|
116
|
-
MESSAGE
|
117
|
-
|
118
|
-
expect(&assertion).to fail_with_message(message)
|
119
|
-
end
|
120
|
-
end
|
121
|
-
|
122
|
-
context 'when both validation and matcher specify a custom message' do
|
123
|
-
it 'passes when the expected and actual messages match' do
|
124
|
-
builder = builder_for_record_validating_confirmation(message: 'custom')
|
125
|
-
expect(builder.record).
|
126
|
-
to validate_confirmation_of(builder.attribute_to_confirm).
|
127
|
-
with_message(/custom/)
|
128
|
-
end
|
129
|
-
|
130
|
-
it 'fails when the expected and actual messages do not match' do
|
131
|
-
builder = builder_for_record_validating_confirmation(message: 'custom')
|
132
|
-
expect(builder.record).
|
133
|
-
not_to validate_confirmation_of(builder.attribute_to_confirm).
|
134
|
-
with_message(/wrong/)
|
135
|
-
end
|
136
|
-
end
|
137
|
-
|
138
|
-
context 'when the validation specifies a message via i18n' do
|
139
|
-
it 'passes' do
|
140
|
-
builder = builder_for_record_validating_confirmation_with_18n_message
|
141
|
-
expect(builder.record).
|
142
|
-
to validate_confirmation_of(builder.attribute_to_confirm)
|
143
|
-
end
|
144
|
-
end
|
145
|
-
|
146
|
-
def validation_matcher_scenario_args
|
147
|
-
super.deep_merge(matcher_name: :validate_confirmation_of)
|
148
|
-
end
|
149
|
-
end
|
@@ -1,207 +0,0 @@
|
|
1
|
-
require 'unit_spec_helper'
|
2
|
-
|
3
|
-
describe Shoulda::Matchers::ActiveModel::ValidateExclusionOfMatcher, type: :model do
|
4
|
-
context 'an attribute which must be excluded from a range' do
|
5
|
-
it 'accepts ensuring the correct range' do
|
6
|
-
expect(validating_exclusion(in: 2..5)).
|
7
|
-
to validate_exclusion_of(:attr).in_range(2..5)
|
8
|
-
end
|
9
|
-
|
10
|
-
it 'rejects ensuring excluded value' do
|
11
|
-
expect(validating_exclusion(in: 2..5)).
|
12
|
-
not_to validate_exclusion_of(:attr).in_range(2..6)
|
13
|
-
end
|
14
|
-
|
15
|
-
it 'does not override the default message with a blank' do
|
16
|
-
expect(validating_exclusion(in: 2..5)).
|
17
|
-
to validate_exclusion_of(:attr).in_range(2..5).with_message(nil)
|
18
|
-
end
|
19
|
-
|
20
|
-
it_supports(
|
21
|
-
'ignoring_interference_by_writer',
|
22
|
-
tests: {
|
23
|
-
reject_if_qualified_but_changing_value_interferes: {
|
24
|
-
model_name: 'Example',
|
25
|
-
attribute_name: :attr,
|
26
|
-
changing_values_with: :next_value,
|
27
|
-
expected_message: <<-MESSAGE.strip
|
28
|
-
Example did not properly validate that :attr lies outside the range ‹2›
|
29
|
-
to ‹5›.
|
30
|
-
After setting :attr to ‹1› -- which was read back as ‹2› -- the
|
31
|
-
matcher expected the Example to be valid, but it was invalid instead,
|
32
|
-
producing these validation errors:
|
33
|
-
|
34
|
-
* attr: ["is reserved"]
|
35
|
-
|
36
|
-
As indicated in the message above, :attr seems to be changing certain
|
37
|
-
values as they are set, and this could have something to do with why
|
38
|
-
this test is failing. If you've overridden the writer method for this
|
39
|
-
attribute, then you may need to change it to make this test pass, or
|
40
|
-
do something else entirely.
|
41
|
-
MESSAGE
|
42
|
-
},
|
43
|
-
},
|
44
|
-
model_creator: :active_model
|
45
|
-
) do
|
46
|
-
def validation_matcher_scenario_args
|
47
|
-
super.deep_merge(validation_options: { in: 2..5 })
|
48
|
-
end
|
49
|
-
|
50
|
-
def configure_validation_matcher(matcher)
|
51
|
-
matcher.in_range(2..5)
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
context 'an attribute which must be excluded from a range with excluded end' do
|
57
|
-
it 'accepts ensuring the correct range' do
|
58
|
-
expect(validating_exclusion(in: 2...5)).
|
59
|
-
to validate_exclusion_of(:attr).in_range(2...5)
|
60
|
-
end
|
61
|
-
|
62
|
-
it 'rejects ensuring excluded value' do
|
63
|
-
expect(validating_exclusion(in: 2...5)).
|
64
|
-
not_to validate_exclusion_of(:attr).in_range(2...4)
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
context 'an attribute with a custom validation message' do
|
69
|
-
it 'accepts ensuring the correct range' do
|
70
|
-
expect(validating_exclusion(in: 2..4, message: 'not good')).
|
71
|
-
to validate_exclusion_of(:attr).in_range(2..4).with_message(/not good/)
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
context 'an attribute with custom range validations' do
|
76
|
-
it 'accepts ensuring the correct range and messages' do
|
77
|
-
model = custom_validation do
|
78
|
-
if attr >= 2 && attr <= 5
|
79
|
-
errors.add(:attr, 'should be out of this range')
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
expect(model).to validate_exclusion_of(:attr).in_range(2..5).
|
84
|
-
with_message(/should be out of this range/)
|
85
|
-
|
86
|
-
model = custom_validation do
|
87
|
-
if attr >= 2 && attr <= 4
|
88
|
-
errors.add(:attr, 'should be out of this range')
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
expect(model).to validate_exclusion_of(:attr).in_range(2...5).
|
93
|
-
with_message(/should be out of this range/)
|
94
|
-
end
|
95
|
-
|
96
|
-
it 'has correct description' do
|
97
|
-
matcher = validate_exclusion_of(:attr).in_range(1..10)
|
98
|
-
|
99
|
-
expect(matcher.description).to eq(
|
100
|
-
'validate that :attr lies outside the range ‹1› to ‹10›'
|
101
|
-
)
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
context 'an attribute which must be excluded from an array' do
|
106
|
-
it 'accepts with correct array' do
|
107
|
-
expect(validating_exclusion(in: %w(one two))).
|
108
|
-
to validate_exclusion_of(:attr).in_array(%w(one two))
|
109
|
-
end
|
110
|
-
|
111
|
-
it 'rejects when only part of array matches' do
|
112
|
-
expect(validating_exclusion(in: %w(one two))).
|
113
|
-
not_to validate_exclusion_of(:attr).in_array(%w(one wrong_value))
|
114
|
-
end
|
115
|
-
|
116
|
-
it 'rejects when array does not match at all' do
|
117
|
-
expect(validating_exclusion(in: %w(one two))).
|
118
|
-
not_to validate_exclusion_of(:attr).in_array(%w(cat dog))
|
119
|
-
end
|
120
|
-
|
121
|
-
context 'when there is one value' do
|
122
|
-
it 'has correct description' do
|
123
|
-
expect(validate_exclusion_of(:attr).in_array([true]).description).
|
124
|
-
to eq 'validate that :attr is not ‹true›'
|
125
|
-
end
|
126
|
-
end
|
127
|
-
|
128
|
-
context 'when there are two values' do
|
129
|
-
it 'has correct description' do
|
130
|
-
matcher = validate_exclusion_of(:attr).in_array([true, 'dog'])
|
131
|
-
|
132
|
-
expect(matcher.description).to eq(
|
133
|
-
'validate that :attr is neither ‹true› nor ‹"dog"›'
|
134
|
-
)
|
135
|
-
end
|
136
|
-
end
|
137
|
-
|
138
|
-
context 'when there are three or more values' do
|
139
|
-
it 'has correct description' do
|
140
|
-
matcher = validate_exclusion_of(:attr).in_array([true, 'dog', 'cat'])
|
141
|
-
|
142
|
-
expect(matcher.description).to eq(
|
143
|
-
'validate that :attr is neither ‹true›, ‹"dog"›, nor ‹"cat"›'
|
144
|
-
)
|
145
|
-
end
|
146
|
-
end
|
147
|
-
|
148
|
-
it_supports(
|
149
|
-
'ignoring_interference_by_writer',
|
150
|
-
tests: {
|
151
|
-
reject_if_qualified_but_changing_value_interferes: {
|
152
|
-
model_name: 'Example',
|
153
|
-
attribute_name: :attr,
|
154
|
-
changing_values_with: :next_value,
|
155
|
-
expected_message: <<-MESSAGE.strip
|
156
|
-
Example did not properly validate that :attr is neither ‹"one"› nor
|
157
|
-
‹"two"›.
|
158
|
-
After setting :attr to ‹"one"› -- which was read back as ‹"onf"› --
|
159
|
-
the matcher expected the Example to be invalid, but it was valid
|
160
|
-
instead.
|
161
|
-
|
162
|
-
As indicated in the message above, :attr seems to be changing certain
|
163
|
-
values as they are set, and this could have something to do with why
|
164
|
-
this test is failing. If you've overridden the writer method for this
|
165
|
-
attribute, then you may need to change it to make this test pass, or
|
166
|
-
do something else entirely.
|
167
|
-
MESSAGE
|
168
|
-
},
|
169
|
-
},
|
170
|
-
model_creator: :active_model
|
171
|
-
) do
|
172
|
-
def validation_matcher_scenario_args
|
173
|
-
super.deep_merge(validation_options: { in: ['one', 'two'] })
|
174
|
-
end
|
175
|
-
|
176
|
-
def configure_validation_matcher(matcher)
|
177
|
-
matcher.in_array(['one', 'two'])
|
178
|
-
end
|
179
|
-
end
|
180
|
-
|
181
|
-
def define_model_validating_exclusion(options)
|
182
|
-
options = options.dup
|
183
|
-
column_type = options.delete(:column_type) { :string }
|
184
|
-
super options.merge(column_type: column_type)
|
185
|
-
end
|
186
|
-
end
|
187
|
-
|
188
|
-
def define_model_validating_exclusion(options)
|
189
|
-
options = options.dup
|
190
|
-
attribute_name = options.delete(:attribute_name) { :attr }
|
191
|
-
column_type = options.delete(:column_type) { :integer }
|
192
|
-
|
193
|
-
define_model(:example, attribute_name => column_type) do |model|
|
194
|
-
model.validates_exclusion_of(attribute_name, options)
|
195
|
-
end
|
196
|
-
end
|
197
|
-
|
198
|
-
def validating_exclusion(options)
|
199
|
-
define_model_validating_exclusion(options).new
|
200
|
-
end
|
201
|
-
|
202
|
-
alias_method :build_record_validating_exclusion, :validating_exclusion
|
203
|
-
|
204
|
-
def validation_matcher_scenario_args
|
205
|
-
super.deep_merge(matcher_name: :validate_exclusion_of)
|
206
|
-
end
|
207
|
-
end
|