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,288 +0,0 @@
|
|
1
|
-
require 'unit_spec_helper'
|
2
|
-
|
3
|
-
describe Shoulda::Matchers::ActiveModel::ValidateLengthOfMatcher, type: :model do
|
4
|
-
context 'an attribute with a non-zero minimum length validation' do
|
5
|
-
it 'accepts ensuring the correct minimum length' do
|
6
|
-
expect(validating_length(minimum: 4)).
|
7
|
-
to validate_length_of(:attr).is_at_least(4)
|
8
|
-
end
|
9
|
-
|
10
|
-
it 'rejects ensuring a lower minimum length with any message' do
|
11
|
-
expect(validating_length(minimum: 4)).
|
12
|
-
not_to validate_length_of(:attr).is_at_least(3).with_short_message(/.*/)
|
13
|
-
end
|
14
|
-
|
15
|
-
it 'rejects ensuring a higher minimum length with any message' do
|
16
|
-
expect(validating_length(minimum: 4)).
|
17
|
-
not_to validate_length_of(:attr).is_at_least(5).with_short_message(/.*/)
|
18
|
-
end
|
19
|
-
|
20
|
-
it 'does not override the default message with a blank' do
|
21
|
-
expect(validating_length(minimum: 4)).
|
22
|
-
to validate_length_of(:attr).is_at_least(4).with_short_message(nil)
|
23
|
-
end
|
24
|
-
|
25
|
-
it_supports(
|
26
|
-
'ignoring_interference_by_writer',
|
27
|
-
tests: {
|
28
|
-
accept_if_qualified_but_changing_value_does_not_interfere: {
|
29
|
-
changing_values_with: :upcase,
|
30
|
-
},
|
31
|
-
reject_if_qualified_but_changing_value_interferes: {
|
32
|
-
model_name: 'Example',
|
33
|
-
attribute_name: :attr,
|
34
|
-
changing_values_with: :add_character,
|
35
|
-
expected_message: <<-MESSAGE.strip
|
36
|
-
Example did not properly validate that the length of :attr is at least
|
37
|
-
4.
|
38
|
-
After setting :attr to ‹"xxx"› -- which was read back as ‹"xxxa"› --
|
39
|
-
the matcher expected the Example to be invalid, but it was valid
|
40
|
-
instead.
|
41
|
-
|
42
|
-
As indicated in the message above, :attr seems to be changing certain
|
43
|
-
values as they are set, and this could have something to do with why
|
44
|
-
this test is failing. If you've overridden the writer method for this
|
45
|
-
attribute, then you may need to change it to make this test pass, or
|
46
|
-
do something else entirely.
|
47
|
-
MESSAGE
|
48
|
-
}
|
49
|
-
}
|
50
|
-
) do
|
51
|
-
def validation_matcher_scenario_args
|
52
|
-
super.deep_merge(validation_options: { minimum: 4 })
|
53
|
-
end
|
54
|
-
|
55
|
-
def configure_validation_matcher(matcher)
|
56
|
-
matcher.is_at_least(4)
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
context 'an attribute with a minimum length validation of 0' do
|
62
|
-
it 'accepts ensuring the correct minimum length' do
|
63
|
-
expect(validating_length(minimum: 0)).
|
64
|
-
to validate_length_of(:attr).is_at_least(0)
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
context 'an attribute with a maximum length' do
|
69
|
-
it 'accepts ensuring the correct maximum length' do
|
70
|
-
expect(validating_length(maximum: 4)).
|
71
|
-
to validate_length_of(:attr).is_at_most(4)
|
72
|
-
end
|
73
|
-
|
74
|
-
it 'rejects ensuring a lower maximum length with any message' do
|
75
|
-
expect(validating_length(maximum: 4)).
|
76
|
-
not_to validate_length_of(:attr).is_at_most(3).with_long_message(/.*/)
|
77
|
-
end
|
78
|
-
|
79
|
-
it 'rejects ensuring a higher maximum length with any message' do
|
80
|
-
expect(validating_length(maximum: 4)).
|
81
|
-
not_to validate_length_of(:attr).is_at_most(5).with_long_message(/.*/)
|
82
|
-
end
|
83
|
-
|
84
|
-
it 'does not override the default message with a blank' do
|
85
|
-
expect(validating_length(maximum: 4)).
|
86
|
-
to validate_length_of(:attr).is_at_most(4).with_long_message(nil)
|
87
|
-
end
|
88
|
-
|
89
|
-
it_supports(
|
90
|
-
'ignoring_interference_by_writer',
|
91
|
-
tests: {
|
92
|
-
accept_if_qualified_but_changing_value_does_not_interfere: {
|
93
|
-
changing_values_with: :upcase,
|
94
|
-
},
|
95
|
-
reject_if_qualified_but_changing_value_interferes: {
|
96
|
-
model_name: 'Example',
|
97
|
-
attribute_name: :attr,
|
98
|
-
changing_values_with: :remove_character,
|
99
|
-
expected_message: <<-MESSAGE.strip
|
100
|
-
Example did not properly validate that the length of :attr is at most 4.
|
101
|
-
After setting :attr to ‹"xxxxx"› -- which was read back as ‹"xxxx"› --
|
102
|
-
the matcher expected the Example to be invalid, but it was valid
|
103
|
-
instead.
|
104
|
-
|
105
|
-
As indicated in the message above, :attr seems to be changing certain
|
106
|
-
values as they are set, and this could have something to do with why
|
107
|
-
this test is failing. If you've overridden the writer method for this
|
108
|
-
attribute, then you may need to change it to make this test pass, or
|
109
|
-
do something else entirely.
|
110
|
-
MESSAGE
|
111
|
-
}
|
112
|
-
}
|
113
|
-
) do
|
114
|
-
def validation_matcher_scenario_args
|
115
|
-
super.deep_merge(validation_options: { maximum: 4 })
|
116
|
-
end
|
117
|
-
|
118
|
-
def configure_validation_matcher(matcher)
|
119
|
-
matcher.is_at_most(4)
|
120
|
-
end
|
121
|
-
end
|
122
|
-
end
|
123
|
-
|
124
|
-
context 'an attribute with a required exact length' do
|
125
|
-
it 'accepts ensuring the correct length' do
|
126
|
-
expect(validating_length(is: 4)).
|
127
|
-
to validate_length_of(:attr).is_equal_to(4)
|
128
|
-
end
|
129
|
-
|
130
|
-
it 'rejects ensuring a lower maximum length with any message' do
|
131
|
-
expect(validating_length(is: 4)).
|
132
|
-
not_to validate_length_of(:attr).is_equal_to(3).with_message(/.*/)
|
133
|
-
end
|
134
|
-
|
135
|
-
it 'rejects ensuring a higher maximum length with any message' do
|
136
|
-
expect(validating_length(is: 4)).
|
137
|
-
not_to validate_length_of(:attr).is_equal_to(5).with_message(/.*/)
|
138
|
-
end
|
139
|
-
|
140
|
-
it 'does not override the default message with a blank' do
|
141
|
-
expect(validating_length(is: 4)).
|
142
|
-
to validate_length_of(:attr).is_equal_to(4).with_message(nil)
|
143
|
-
end
|
144
|
-
|
145
|
-
it_supports(
|
146
|
-
'ignoring_interference_by_writer',
|
147
|
-
tests: {
|
148
|
-
accept_if_qualified_but_changing_value_does_not_interfere: {
|
149
|
-
changing_values_with: :upcase,
|
150
|
-
},
|
151
|
-
reject_if_qualified_but_changing_value_interferes: {
|
152
|
-
model_name: 'Example',
|
153
|
-
attribute_name: :attr,
|
154
|
-
changing_values_with: :add_character,
|
155
|
-
expected_message: <<-MESSAGE.strip
|
156
|
-
Example did not properly validate that the length of :attr is 4.
|
157
|
-
After setting :attr to ‹"xxx"› -- which was read back as ‹"xxxa"› --
|
158
|
-
the matcher expected the Example to be invalid, but it was valid
|
159
|
-
instead.
|
160
|
-
|
161
|
-
As indicated in the message above, :attr seems to be changing certain
|
162
|
-
values as they are set, and this could have something to do with why
|
163
|
-
this test is failing. If you've overridden the writer method for this
|
164
|
-
attribute, then you may need to change it to make this test pass, or
|
165
|
-
do something else entirely.
|
166
|
-
MESSAGE
|
167
|
-
}
|
168
|
-
}
|
169
|
-
) do
|
170
|
-
def validation_matcher_scenario_args
|
171
|
-
super.deep_merge(validation_options: { is: 4 })
|
172
|
-
end
|
173
|
-
|
174
|
-
def configure_validation_matcher(matcher)
|
175
|
-
matcher.is_equal_to(4)
|
176
|
-
end
|
177
|
-
end
|
178
|
-
end
|
179
|
-
|
180
|
-
context 'an attribute with a required exact length and another validation' do
|
181
|
-
it 'accepts ensuring the correct length' do
|
182
|
-
model = define_model(:example, attr: :string) do
|
183
|
-
validates_length_of :attr, is: 4
|
184
|
-
validates_numericality_of :attr
|
185
|
-
end.new
|
186
|
-
|
187
|
-
expect(model).to validate_length_of(:attr).is_equal_to(4)
|
188
|
-
end
|
189
|
-
end
|
190
|
-
|
191
|
-
context 'an attribute with a custom minimum length validation' do
|
192
|
-
it 'accepts ensuring the correct minimum length' do
|
193
|
-
expect(validating_length(minimum: 4, too_short: 'foobar')).
|
194
|
-
to validate_length_of(:attr).is_at_least(4).with_short_message(/foo/)
|
195
|
-
end
|
196
|
-
end
|
197
|
-
|
198
|
-
context 'an attribute with a custom maximum length validation' do
|
199
|
-
it 'accepts ensuring the correct minimum length' do
|
200
|
-
expect(validating_length(maximum: 4, too_long: 'foobar')).
|
201
|
-
to validate_length_of(:attr).is_at_most(4).with_long_message(/foo/)
|
202
|
-
end
|
203
|
-
end
|
204
|
-
|
205
|
-
context 'an attribute with a custom equal validation' do
|
206
|
-
it 'accepts ensuring the correct exact length' do
|
207
|
-
expect(validating_length(is: 4, message: 'foobar')).
|
208
|
-
to validate_length_of(:attr).is_equal_to(4).with_message(/foo/)
|
209
|
-
end
|
210
|
-
end
|
211
|
-
|
212
|
-
context 'an attribute without a length validation' do
|
213
|
-
it 'rejects ensuring a minimum length' do
|
214
|
-
expect(define_model(:example, attr: :string).new).
|
215
|
-
not_to validate_length_of(:attr).is_at_least(1)
|
216
|
-
end
|
217
|
-
end
|
218
|
-
|
219
|
-
context 'using translations' do
|
220
|
-
after { I18n.backend.reload! }
|
221
|
-
|
222
|
-
context "a too_long translation containing %{attribute}, %{model}" do
|
223
|
-
before do
|
224
|
-
stub_translation(
|
225
|
-
"activerecord.errors.messages.too_long",
|
226
|
-
"The %{attribute} of your %{model} is too long (maximum is %{count} characters)")
|
227
|
-
end
|
228
|
-
|
229
|
-
it "does not raise an exception" do
|
230
|
-
expect {
|
231
|
-
expect(validating_length(maximum: 4)).
|
232
|
-
to validate_length_of(:attr).is_at_most(4)
|
233
|
-
}.to_not raise_exception
|
234
|
-
end
|
235
|
-
end
|
236
|
-
|
237
|
-
context "a too_short translation containing %{attribute}, %{model}" do
|
238
|
-
before do
|
239
|
-
stub_translation(
|
240
|
-
"activerecord.errors.messages.too_short",
|
241
|
-
"The %{attribute} of your %{model} is too short (minimum is %{count} characters)")
|
242
|
-
end
|
243
|
-
|
244
|
-
it "does not raise an exception" do
|
245
|
-
expect {
|
246
|
-
expect(validating_length(minimum: 4)).to validate_length_of(:attr).is_at_least(4)
|
247
|
-
}.to_not raise_exception
|
248
|
-
end
|
249
|
-
end
|
250
|
-
|
251
|
-
context "a wrong_length translation containing %{attribute}, %{model}" do
|
252
|
-
before do
|
253
|
-
stub_translation(
|
254
|
-
"activerecord.errors.messages.wrong_length",
|
255
|
-
"The %{attribute} of your %{model} is the wrong length (should be %{count} characters)")
|
256
|
-
end
|
257
|
-
|
258
|
-
it "does not raise an exception" do
|
259
|
-
expect {
|
260
|
-
expect(validating_length(is: 4)).
|
261
|
-
to validate_length_of(:attr).is_equal_to(4)
|
262
|
-
}.to_not raise_exception
|
263
|
-
end
|
264
|
-
end
|
265
|
-
end
|
266
|
-
|
267
|
-
def define_model_validating_length(options = {})
|
268
|
-
options = options.dup
|
269
|
-
attribute_name = options.delete(:attribute_name) { :attr }
|
270
|
-
|
271
|
-
define_model(:example, attribute_name => :string) do |model|
|
272
|
-
model.validates_length_of(attribute_name, options)
|
273
|
-
end
|
274
|
-
end
|
275
|
-
|
276
|
-
def validating_length(options = {})
|
277
|
-
define_model_validating_length(options).new
|
278
|
-
end
|
279
|
-
|
280
|
-
alias_method :build_record_validating_length, :validating_length
|
281
|
-
|
282
|
-
def validation_matcher_scenario_args
|
283
|
-
super.deep_merge(
|
284
|
-
matcher_name: :validate_length_of,
|
285
|
-
model_creator: :active_model
|
286
|
-
)
|
287
|
-
end
|
288
|
-
end
|