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
@@ -12,7 +12,7 @@ module Shoulda
|
|
12
12
|
# end
|
13
13
|
#
|
14
14
|
# # RSpec
|
15
|
-
# describe Person do
|
15
|
+
# RSpec.describe Person, type: :model do
|
16
16
|
# it { should validate_numericality_of(:gpa) }
|
17
17
|
# end
|
18
18
|
#
|
@@ -35,7 +35,7 @@ module Shoulda
|
|
35
35
|
# end
|
36
36
|
#
|
37
37
|
# # RSpec
|
38
|
-
# describe Person do
|
38
|
+
# RSpec.describe Person, type: :model do
|
39
39
|
# it do
|
40
40
|
# should validate_numericality_of(:number_of_dependents).
|
41
41
|
# on(:create)
|
@@ -61,7 +61,7 @@ module Shoulda
|
|
61
61
|
# end
|
62
62
|
#
|
63
63
|
# # RSpec
|
64
|
-
# describe Person do
|
64
|
+
# RSpec.describe Person, type: :model do
|
65
65
|
# it { should validate_numericality_of(:age).only_integer }
|
66
66
|
# end
|
67
67
|
#
|
@@ -85,7 +85,7 @@ module Shoulda
|
|
85
85
|
# end
|
86
86
|
#
|
87
87
|
# # RSpec
|
88
|
-
# describe Person do
|
88
|
+
# RSpec.describe Person, type: :model do
|
89
89
|
# it do
|
90
90
|
# should validate_numericality_of(:number_of_cars).
|
91
91
|
# is_less_than(2)
|
@@ -113,7 +113,7 @@ module Shoulda
|
|
113
113
|
# end
|
114
114
|
#
|
115
115
|
# # RSpec
|
116
|
-
# describe Person do
|
116
|
+
# RSpec.describe Person, type: :model do
|
117
117
|
# it do
|
118
118
|
# should validate_numericality_of(:birth_year).
|
119
119
|
# is_less_than_or_equal_to(1987)
|
@@ -140,7 +140,7 @@ module Shoulda
|
|
140
140
|
# end
|
141
141
|
#
|
142
142
|
# # RSpec
|
143
|
-
# describe Person do
|
143
|
+
# RSpec.describe Person, type: :model do
|
144
144
|
# it { should validate_numericality_of(:weight).is_equal_to(150) }
|
145
145
|
# end
|
146
146
|
#
|
@@ -164,7 +164,7 @@ module Shoulda
|
|
164
164
|
# end
|
165
165
|
#
|
166
166
|
# # RSpec
|
167
|
-
# describe Person do
|
167
|
+
# RSpec.describe Person, type: :model do
|
168
168
|
# it do
|
169
169
|
# should validate_numericality_of(:height).
|
170
170
|
# is_greater_than_or_equal_to(55)
|
@@ -191,7 +191,7 @@ module Shoulda
|
|
191
191
|
# end
|
192
192
|
#
|
193
193
|
# # RSpec
|
194
|
-
# describe Person do
|
194
|
+
# RSpec.describe Person, type: :model do
|
195
195
|
# it do
|
196
196
|
# should validate_numericality_of(:legal_age).
|
197
197
|
# is_greater_than(21)
|
@@ -204,6 +204,33 @@ module Shoulda
|
|
204
204
|
# is_greater_than(21)
|
205
205
|
# end
|
206
206
|
#
|
207
|
+
# ##### is_other_than
|
208
|
+
#
|
209
|
+
# Use `is_other_than` to test usage of the `:other_than` option.
|
210
|
+
# This asserts that the attribute can take a number which is not equal to
|
211
|
+
# the given value.
|
212
|
+
#
|
213
|
+
# class Person
|
214
|
+
# include ActiveModel::Model
|
215
|
+
# attr_accessor :legal_age
|
216
|
+
#
|
217
|
+
# validates_numericality_of :legal_age, other_than: 21
|
218
|
+
# end
|
219
|
+
#
|
220
|
+
# # RSpec
|
221
|
+
# RSpec.describe Person, type: :model do
|
222
|
+
# it do
|
223
|
+
# should validate_numericality_of(:legal_age).
|
224
|
+
# is_other_than(21)
|
225
|
+
# end
|
226
|
+
# end
|
227
|
+
#
|
228
|
+
# # Minitest (Shoulda)
|
229
|
+
# class PersonTest < ActiveSupport::TestCase
|
230
|
+
# should validate_numericality_of(:legal_age).
|
231
|
+
# is_other_than(21)
|
232
|
+
# end
|
233
|
+
#
|
207
234
|
# ##### even
|
208
235
|
#
|
209
236
|
# Use `even` to test usage of the `:even` option. This asserts that the
|
@@ -217,7 +244,7 @@ module Shoulda
|
|
217
244
|
# end
|
218
245
|
#
|
219
246
|
# # RSpec
|
220
|
-
# describe Person do
|
247
|
+
# RSpec.describe Person, type: :model do
|
221
248
|
# it { should validate_numericality_of(:birth_month).even }
|
222
249
|
# end
|
223
250
|
#
|
@@ -240,7 +267,7 @@ module Shoulda
|
|
240
267
|
# end
|
241
268
|
#
|
242
269
|
# # RSpec
|
243
|
-
# describe Person do
|
270
|
+
# RSpec.describe Person, type: :model do
|
244
271
|
# it { should validate_numericality_of(:birth_day).odd }
|
245
272
|
# end
|
246
273
|
#
|
@@ -262,7 +289,7 @@ module Shoulda
|
|
262
289
|
# end
|
263
290
|
#
|
264
291
|
# # RSpec
|
265
|
-
# describe Person do
|
292
|
+
# RSpec.describe Person, type: :model do
|
266
293
|
# it do
|
267
294
|
# should validate_numericality_of(:number_of_dependents).
|
268
295
|
# with_message('Number of dependents must be a number')
|
@@ -287,7 +314,7 @@ module Shoulda
|
|
287
314
|
# end
|
288
315
|
#
|
289
316
|
# # RSpec
|
290
|
-
# describe Post do
|
317
|
+
# RSpec.describe Post, type: :model do
|
291
318
|
# it { should validate_numericality_of(:age).allow_nil }
|
292
319
|
# end
|
293
320
|
#
|
@@ -304,8 +331,7 @@ module Shoulda
|
|
304
331
|
|
305
332
|
# @private
|
306
333
|
class ValidateNumericalityOfMatcher
|
307
|
-
NUMERIC_NAME = 'number'
|
308
|
-
NON_NUMERIC_VALUE = 'abcd'
|
334
|
+
NUMERIC_NAME = 'number'.freeze
|
309
335
|
DEFAULT_DIFF_TO_COMPARE = 1
|
310
336
|
|
311
337
|
include Qualifiers::IgnoringInterferenceByWriter
|
@@ -337,7 +363,7 @@ module Shoulda
|
|
337
363
|
|
338
364
|
def only_integer
|
339
365
|
prepare_submatcher(
|
340
|
-
NumericalityMatchers::OnlyIntegerMatcher.new(self, @attribute)
|
366
|
+
NumericalityMatchers::OnlyIntegerMatcher.new(self, @attribute),
|
341
367
|
)
|
342
368
|
self
|
343
369
|
end
|
@@ -345,9 +371,9 @@ module Shoulda
|
|
345
371
|
def allow_nil
|
346
372
|
@expects_to_allow_nil = true
|
347
373
|
prepare_submatcher(
|
348
|
-
AllowValueMatcher.new(nil)
|
349
|
-
|
350
|
-
|
374
|
+
AllowValueMatcher.new(nil).
|
375
|
+
for(@attribute).
|
376
|
+
with_message(:not_a_number),
|
351
377
|
)
|
352
378
|
self
|
353
379
|
end
|
@@ -358,14 +384,14 @@ module Shoulda
|
|
358
384
|
|
359
385
|
def odd
|
360
386
|
prepare_submatcher(
|
361
|
-
NumericalityMatchers::OddNumberMatcher.new(self, @attribute)
|
387
|
+
NumericalityMatchers::OddNumberMatcher.new(self, @attribute),
|
362
388
|
)
|
363
389
|
self
|
364
390
|
end
|
365
391
|
|
366
392
|
def even
|
367
393
|
prepare_submatcher(
|
368
|
-
NumericalityMatchers::EvenNumberMatcher.new(self, @attribute)
|
394
|
+
NumericalityMatchers::EvenNumberMatcher.new(self, @attribute),
|
369
395
|
)
|
370
396
|
self
|
371
397
|
end
|
@@ -395,6 +421,11 @@ module Shoulda
|
|
395
421
|
self
|
396
422
|
end
|
397
423
|
|
424
|
+
def is_other_than(value)
|
425
|
+
prepare_submatcher(comparison_matcher_for(value, :!=).for(@attribute))
|
426
|
+
self
|
427
|
+
end
|
428
|
+
|
398
429
|
def with_message(message)
|
399
430
|
@expects_custom_validation_message = true
|
400
431
|
@expected_message = message
|
@@ -411,13 +442,13 @@ module Shoulda
|
|
411
442
|
end
|
412
443
|
|
413
444
|
def matches?(subject)
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
add_disallow_value_matcher
|
418
|
-
qualify_submatchers
|
445
|
+
matches_or_does_not_match?(subject)
|
446
|
+
first_submatcher_that_fails_to_match.nil?
|
447
|
+
end
|
419
448
|
|
420
|
-
|
449
|
+
def does_not_match?(subject)
|
450
|
+
matches_or_does_not_match?(subject)
|
451
|
+
first_submatcher_that_fails_to_not_match.nil?
|
421
452
|
end
|
422
453
|
|
423
454
|
def simple_description
|
@@ -427,7 +458,7 @@ module Shoulda
|
|
427
458
|
description << Shoulda::Matchers::Util.a_or_an(full_allowed_type)
|
428
459
|
|
429
460
|
if comparison_descriptions.present?
|
430
|
-
description <<
|
461
|
+
description << " #{comparison_descriptions}"
|
431
462
|
end
|
432
463
|
|
433
464
|
description
|
@@ -440,20 +471,15 @@ module Shoulda
|
|
440
471
|
def failure_message
|
441
472
|
overall_failure_message.dup.tap do |message|
|
442
473
|
message << "\n"
|
443
|
-
message <<
|
474
|
+
message << failure_message_for_first_submatcher_that_fails_to_match
|
444
475
|
end
|
445
476
|
end
|
446
477
|
|
447
478
|
def failure_message_when_negated
|
448
479
|
overall_failure_message_when_negated.dup.tap do |message|
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
message << Shoulda::Matchers.word_wrap(
|
453
|
-
submatcher_failure_message_when_negated,
|
454
|
-
indent: 2
|
455
|
-
)
|
456
|
-
end
|
480
|
+
message << "\n"
|
481
|
+
message <<
|
482
|
+
failure_message_for_first_submatcher_that_fails_to_not_match
|
457
483
|
end
|
458
484
|
end
|
459
485
|
|
@@ -464,19 +490,25 @@ module Shoulda
|
|
464
490
|
|
465
491
|
private
|
466
492
|
|
467
|
-
def
|
468
|
-
@subject
|
493
|
+
def matches_or_does_not_match?(subject)
|
494
|
+
@subject = subject
|
495
|
+
@number_of_submatchers = @submatchers.size
|
496
|
+
|
497
|
+
add_disallow_value_matcher
|
498
|
+
qualify_submatchers
|
469
499
|
end
|
470
500
|
|
471
501
|
def overall_failure_message
|
472
502
|
Shoulda::Matchers.word_wrap(
|
473
|
-
"#{model.name}
|
503
|
+
"Expected #{model.name} to #{description}, but this could not "\
|
504
|
+
'be proved.',
|
474
505
|
)
|
475
506
|
end
|
476
507
|
|
477
508
|
def overall_failure_message_when_negated
|
478
509
|
Shoulda::Matchers.word_wrap(
|
479
|
-
"Expected #{model.name} not to #{description}, but
|
510
|
+
"Expected #{model.name} not to #{description}, but this could not "\
|
511
|
+
'be proved.',
|
480
512
|
)
|
481
513
|
end
|
482
514
|
|
@@ -498,7 +530,7 @@ module Shoulda
|
|
498
530
|
|
499
531
|
def add_disallow_value_matcher
|
500
532
|
disallow_value_matcher = DisallowValueMatcher.
|
501
|
-
new(
|
533
|
+
new(non_numeric_value).
|
502
534
|
for(@attribute).
|
503
535
|
with_message(:not_a_number)
|
504
536
|
|
@@ -526,7 +558,10 @@ module Shoulda
|
|
526
558
|
end
|
527
559
|
|
528
560
|
if submatcher.respond_to?(:diff_to_compare)
|
529
|
-
@diff_to_compare = [
|
561
|
+
@diff_to_compare = [
|
562
|
+
@diff_to_compare,
|
563
|
+
submatcher.diff_to_compare,
|
564
|
+
].max
|
530
565
|
end
|
531
566
|
|
532
567
|
@submatchers << submatcher
|
@@ -547,7 +582,7 @@ module Shoulda
|
|
547
582
|
end
|
548
583
|
|
549
584
|
submatcher.ignoring_interference_by_writer(
|
550
|
-
ignore_interference_by_writer
|
585
|
+
ignore_interference_by_writer,
|
551
586
|
)
|
552
587
|
end
|
553
588
|
end
|
@@ -562,39 +597,56 @@ module Shoulda
|
|
562
597
|
|
563
598
|
def has_been_qualified?
|
564
599
|
@submatchers.any? do |submatcher|
|
565
|
-
submatcher.class
|
600
|
+
Shoulda::Matchers::RailsShim.parent_of(submatcher.class) ==
|
601
|
+
NumericalityMatchers
|
566
602
|
end
|
567
603
|
end
|
568
604
|
|
569
|
-
def
|
570
|
-
@
|
571
|
-
|
572
|
-
|
605
|
+
def first_submatcher_that_fails_to_match
|
606
|
+
@_first_submatcher_that_fails_to_match ||=
|
607
|
+
@submatchers.detect do |submatcher|
|
608
|
+
!submatcher.matches?(@subject)
|
609
|
+
end
|
573
610
|
end
|
574
611
|
|
575
|
-
def
|
576
|
-
|
612
|
+
def first_submatcher_that_fails_to_not_match
|
613
|
+
@_first_submatcher_that_fails_to_not_match ||=
|
614
|
+
@submatchers.detect do |submatcher|
|
615
|
+
!submatcher.does_not_match?(@subject)
|
616
|
+
end
|
577
617
|
end
|
578
618
|
|
579
|
-
def
|
580
|
-
|
619
|
+
def failure_message_for_first_submatcher_that_fails_to_match
|
620
|
+
build_submatcher_failure_message_for(
|
621
|
+
first_submatcher_that_fails_to_match,
|
622
|
+
:failure_message,
|
623
|
+
)
|
581
624
|
end
|
582
625
|
|
583
|
-
def
|
584
|
-
|
626
|
+
def failure_message_for_first_submatcher_that_fails_to_not_match
|
627
|
+
build_submatcher_failure_message_for(
|
628
|
+
first_submatcher_that_fails_to_not_match,
|
629
|
+
:failure_message_when_negated,
|
630
|
+
)
|
631
|
+
end
|
585
632
|
|
586
|
-
|
587
|
-
|
588
|
-
|
589
|
-
|
590
|
-
|
591
|
-
|
633
|
+
def build_submatcher_failure_message_for(
|
634
|
+
submatcher,
|
635
|
+
failure_message_method
|
636
|
+
)
|
637
|
+
failure_message = submatcher.public_send(failure_message_method)
|
638
|
+
submatcher_description = submatcher.simple_description.
|
639
|
+
sub(/\bvalidate that\b/, 'validates').
|
640
|
+
sub(/\bdisallow\b/, 'disallows').
|
641
|
+
sub(/\ballow\b/, 'allows')
|
642
|
+
submatcher_message =
|
643
|
+
if number_of_submatchers_for_failure_message > 1
|
592
644
|
"In checking that #{model.name} #{submatcher_description}, " +
|
593
|
-
|
594
|
-
|
595
|
-
|
596
|
-
|
597
|
-
|
645
|
+
failure_message[0].downcase +
|
646
|
+
failure_message[1..]
|
647
|
+
else
|
648
|
+
failure_message
|
649
|
+
end
|
598
650
|
|
599
651
|
Shoulda::Matchers.word_wrap(submatcher_message, indent: 2)
|
600
652
|
end
|
@@ -605,7 +657,11 @@ module Shoulda
|
|
605
657
|
|
606
658
|
def comparison_descriptions
|
607
659
|
description_array = submatcher_comparison_descriptions
|
608
|
-
description_array.empty?
|
660
|
+
if description_array.empty?
|
661
|
+
''
|
662
|
+
else
|
663
|
+
submatcher_comparison_descriptions.join(' and ')
|
664
|
+
end
|
609
665
|
end
|
610
666
|
|
611
667
|
def submatcher_comparison_descriptions
|
@@ -616,6 +672,14 @@ module Shoulda
|
|
616
672
|
arr
|
617
673
|
end
|
618
674
|
end
|
675
|
+
|
676
|
+
def model
|
677
|
+
@subject.class
|
678
|
+
end
|
679
|
+
|
680
|
+
def non_numeric_value
|
681
|
+
'abcd'
|
682
|
+
end
|
619
683
|
end
|
620
684
|
end
|
621
685
|
end
|