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,4 +1,5 @@
|
|
1
1
|
require 'bigdecimal'
|
2
|
+
require 'date'
|
2
3
|
|
3
4
|
module Shoulda
|
4
5
|
module Matchers
|
@@ -18,7 +19,7 @@ module Shoulda
|
|
18
19
|
# end
|
19
20
|
#
|
20
21
|
# # RSpec
|
21
|
-
# describe Issue do
|
22
|
+
# RSpec.describe Issue, type: :model do
|
22
23
|
# it do
|
23
24
|
# should validate_inclusion_of(:state).
|
24
25
|
# in_array(['open', 'resolved', 'unresolved'])
|
@@ -41,7 +42,7 @@ module Shoulda
|
|
41
42
|
# end
|
42
43
|
#
|
43
44
|
# # RSpec
|
44
|
-
# describe Issue do
|
45
|
+
# RSpec.describe Issue, type: :model do
|
45
46
|
# it { should validate_inclusion_of(:state).in_range(1..5) }
|
46
47
|
# end
|
47
48
|
#
|
@@ -83,7 +84,7 @@ module Shoulda
|
|
83
84
|
# end
|
84
85
|
#
|
85
86
|
# # RSpec
|
86
|
-
# describe Issue do
|
87
|
+
# RSpec.describe Issue, type: :model do
|
87
88
|
# it do
|
88
89
|
# should validate_inclusion_of(:severity).
|
89
90
|
# in_array(%w(low medium high)).
|
@@ -112,7 +113,7 @@ module Shoulda
|
|
112
113
|
# end
|
113
114
|
#
|
114
115
|
# # RSpec
|
115
|
-
# describe Issue do
|
116
|
+
# RSpec.describe Issue, type: :model do
|
116
117
|
# it do
|
117
118
|
# should validate_inclusion_of(:severity).
|
118
119
|
# in_array(%w(low medium high)).
|
@@ -148,7 +149,7 @@ module Shoulda
|
|
148
149
|
# end
|
149
150
|
#
|
150
151
|
# # RSpec
|
151
|
-
# describe Person do
|
152
|
+
# RSpec.describe Person, type: :model do
|
152
153
|
# it do
|
153
154
|
# should validate_inclusion_of(:age).
|
154
155
|
# in_range(0..65).
|
@@ -184,7 +185,7 @@ module Shoulda
|
|
184
185
|
# end
|
185
186
|
#
|
186
187
|
# # RSpec
|
187
|
-
# describe Person do
|
188
|
+
# RSpec.describe Person, type: :model do
|
188
189
|
# it do
|
189
190
|
# should validate_inclusion_of(:age).
|
190
191
|
# in_range(0..21).
|
@@ -214,7 +215,7 @@ module Shoulda
|
|
214
215
|
# end
|
215
216
|
#
|
216
217
|
# # RSpec
|
217
|
-
# describe Issue do
|
218
|
+
# RSpec.describe Issue, type: :model do
|
218
219
|
# it do
|
219
220
|
# should validate_inclusion_of(:state).
|
220
221
|
# in_array(['open', 'resolved', 'unresolved']).
|
@@ -244,7 +245,7 @@ module Shoulda
|
|
244
245
|
# end
|
245
246
|
#
|
246
247
|
# # RSpec
|
247
|
-
# describe Issue do
|
248
|
+
# RSpec.describe Issue, type: :model do
|
248
249
|
# it do
|
249
250
|
# should validate_inclusion_of(:state).
|
250
251
|
# in_array(['open', 'resolved', 'unresolved']).
|
@@ -267,19 +268,20 @@ module Shoulda
|
|
267
268
|
|
268
269
|
# @private
|
269
270
|
class ValidateInclusionOfMatcher < ValidationMatcher
|
270
|
-
|
271
|
-
|
272
|
-
|
271
|
+
BLANK_VALUES = ['', ' ', "\n", "\r", "\t", "\f"].freeze
|
272
|
+
ARBITRARY_OUTSIDE_STRING = 'shoulda-matchers test string'.freeze
|
273
|
+
ARBITRARY_OUTSIDE_INTEGER = 123456789
|
274
|
+
ARBITRARY_OUTSIDE_DECIMAL = BigDecimal('0.123456789')
|
273
275
|
ARBITRARY_OUTSIDE_DATE = Date.jd(9999999)
|
274
276
|
ARBITRARY_OUTSIDE_DATETIME = DateTime.jd(9999999)
|
275
277
|
ARBITRARY_OUTSIDE_TIME = Time.at(9999999999)
|
276
|
-
BOOLEAN_ALLOWS_BOOLEAN_MESSAGE = <<EOT
|
278
|
+
BOOLEAN_ALLOWS_BOOLEAN_MESSAGE = <<EOT.freeze
|
277
279
|
You are using `validate_inclusion_of` to assert that a boolean column allows
|
278
280
|
boolean values and disallows non-boolean ones. Be aware that it is not possible
|
279
281
|
to fully test this, as boolean columns will automatically convert non-boolean
|
280
282
|
values to boolean ones. Hence, you should consider removing this test.
|
281
283
|
EOT
|
282
|
-
BOOLEAN_ALLOWS_NIL_MESSAGE = <<EOT
|
284
|
+
BOOLEAN_ALLOWS_NIL_MESSAGE = <<EOT.freeze
|
283
285
|
You are using `validate_inclusion_of` to assert that a boolean column allows nil.
|
284
286
|
Be aware that it is not possible to fully test this, as anything other than
|
285
287
|
true, false or nil will be converted to false. Hence, you should consider
|
@@ -293,8 +295,8 @@ EOT
|
|
293
295
|
@range = nil
|
294
296
|
@minimum = nil
|
295
297
|
@maximum = nil
|
296
|
-
@low_message =
|
297
|
-
@high_message =
|
298
|
+
@low_message = :inclusion
|
299
|
+
@high_message = :inclusion
|
298
300
|
end
|
299
301
|
|
300
302
|
def in_array(array)
|
@@ -309,17 +311,8 @@ EOT
|
|
309
311
|
self
|
310
312
|
end
|
311
313
|
|
312
|
-
def
|
313
|
-
@options[:
|
314
|
-
self
|
315
|
-
end
|
316
|
-
|
317
|
-
def expects_to_allow_blank?
|
318
|
-
@options[:allow_blank]
|
319
|
-
end
|
320
|
-
|
321
|
-
def allow_nil(allow_nil = true)
|
322
|
-
@options[:allow_nil] = allow_nil
|
314
|
+
def allow_nil
|
315
|
+
@options[:allow_nil] = true
|
323
316
|
self
|
324
317
|
end
|
325
318
|
|
@@ -361,11 +354,12 @@ EOT
|
|
361
354
|
else
|
362
355
|
description = "validate that :#{@attribute}"
|
363
356
|
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
357
|
+
description <<
|
358
|
+
if @array.count > 1
|
359
|
+
" is either #{inspected_array}"
|
360
|
+
else
|
361
|
+
" is #{inspected_array}"
|
362
|
+
end
|
369
363
|
|
370
364
|
description
|
371
365
|
end
|
@@ -375,8 +369,6 @@ EOT
|
|
375
369
|
super(subject)
|
376
370
|
|
377
371
|
if @range
|
378
|
-
@low_message ||= :inclusion
|
379
|
-
@high_message ||= :inclusion
|
380
372
|
matches_for_range?
|
381
373
|
elsif @array
|
382
374
|
if matches_for_array?
|
@@ -388,47 +380,55 @@ EOT
|
|
388
380
|
end
|
389
381
|
end
|
390
382
|
|
383
|
+
def does_not_match?(subject)
|
384
|
+
super(subject)
|
385
|
+
|
386
|
+
if @range
|
387
|
+
does_not_match_for_range?
|
388
|
+
elsif @array
|
389
|
+
if does_not_match_for_array?
|
390
|
+
true
|
391
|
+
else
|
392
|
+
@failure_message = "#{@array} matches array in validation"
|
393
|
+
false
|
394
|
+
end
|
395
|
+
end
|
396
|
+
end
|
397
|
+
|
391
398
|
private
|
392
399
|
|
393
400
|
def matches_for_range?
|
394
401
|
disallows_lower_value &&
|
395
402
|
allows_minimum_value &&
|
396
|
-
|
397
|
-
|
403
|
+
allows_maximum_value &&
|
404
|
+
disallows_higher_value
|
405
|
+
end
|
406
|
+
|
407
|
+
def does_not_match_for_range?
|
408
|
+
allows_lower_value ||
|
409
|
+
disallows_minimum_value ||
|
410
|
+
disallows_maximum_value ||
|
411
|
+
allows_higher_value
|
398
412
|
end
|
399
413
|
|
400
414
|
def matches_for_array?
|
401
415
|
allows_all_values_in_array? &&
|
402
|
-
|
416
|
+
disallows_all_values_outside_of_array? &&
|
403
417
|
allows_nil_value? &&
|
404
|
-
|
418
|
+
allow_blank_matches?
|
405
419
|
end
|
406
420
|
|
407
|
-
def
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
true
|
413
|
-
end
|
421
|
+
def does_not_match_for_array?
|
422
|
+
disallows_any_values_in_array? ||
|
423
|
+
allows_any_value_outside_of_array? ||
|
424
|
+
disallows_nil_value? ||
|
425
|
+
allow_blank_does_not_match?
|
414
426
|
end
|
415
427
|
|
416
|
-
def
|
417
|
-
|
418
|
-
@
|
419
|
-
|
420
|
-
true
|
421
|
-
end
|
422
|
-
end
|
423
|
-
|
424
|
-
def inspect_message
|
425
|
-
@range.nil? ? @array.inspect : @range.inspect
|
426
|
-
end
|
427
|
-
|
428
|
-
def allows_all_values_in_array?
|
429
|
-
@array.all? do |value|
|
430
|
-
allows_value_of(value, @low_message)
|
431
|
-
end
|
428
|
+
def allows_lower_value
|
429
|
+
@minimum &&
|
430
|
+
@minimum != 0 &&
|
431
|
+
allows_value_of(@minimum - 1, @low_message)
|
432
432
|
end
|
433
433
|
|
434
434
|
def disallows_lower_value
|
@@ -437,19 +437,43 @@ EOT
|
|
437
437
|
disallows_value_of(@minimum - 1, @low_message)
|
438
438
|
end
|
439
439
|
|
440
|
-
def disallows_higher_value
|
441
|
-
disallows_value_of(@maximum + 1, @high_message)
|
442
|
-
end
|
443
|
-
|
444
440
|
def allows_minimum_value
|
445
441
|
allows_value_of(@minimum, @low_message)
|
446
442
|
end
|
447
443
|
|
444
|
+
def disallows_minimum_value
|
445
|
+
disallows_value_of(@minimum, @low_message)
|
446
|
+
end
|
447
|
+
|
448
448
|
def allows_maximum_value
|
449
449
|
allows_value_of(@maximum, @high_message)
|
450
450
|
end
|
451
451
|
|
452
|
-
def
|
452
|
+
def disallows_maximum_value
|
453
|
+
disallows_value_of(@maximum, @high_message)
|
454
|
+
end
|
455
|
+
|
456
|
+
def allows_higher_value
|
457
|
+
allows_value_of(@maximum + 1, @high_message)
|
458
|
+
end
|
459
|
+
|
460
|
+
def disallows_higher_value
|
461
|
+
disallows_value_of(@maximum + 1, @high_message)
|
462
|
+
end
|
463
|
+
|
464
|
+
def allows_all_values_in_array?
|
465
|
+
@array.all? do |value|
|
466
|
+
allows_value_of(value, @low_message)
|
467
|
+
end
|
468
|
+
end
|
469
|
+
|
470
|
+
def disallows_any_values_in_array?
|
471
|
+
@array.any? do |value|
|
472
|
+
disallows_value_of(value, @low_message)
|
473
|
+
end
|
474
|
+
end
|
475
|
+
|
476
|
+
def allows_any_value_outside_of_array?
|
453
477
|
if attribute_type == :boolean
|
454
478
|
case @array
|
455
479
|
when [false, true], [true, false]
|
@@ -465,11 +489,32 @@ EOT
|
|
465
489
|
end
|
466
490
|
end
|
467
491
|
|
468
|
-
|
492
|
+
values_outside_of_array.any? do |value|
|
469
493
|
allows_value_of(value, @low_message)
|
470
494
|
end
|
471
495
|
end
|
472
496
|
|
497
|
+
def disallows_all_values_outside_of_array?
|
498
|
+
if attribute_type == :boolean
|
499
|
+
case @array
|
500
|
+
when [false, true], [true, false]
|
501
|
+
Shoulda::Matchers.warn BOOLEAN_ALLOWS_BOOLEAN_MESSAGE
|
502
|
+
return true
|
503
|
+
when [nil]
|
504
|
+
if attribute_column.null
|
505
|
+
Shoulda::Matchers.warn BOOLEAN_ALLOWS_NIL_MESSAGE
|
506
|
+
return true
|
507
|
+
else
|
508
|
+
raise NonNullableBooleanError.create(@attribute)
|
509
|
+
end
|
510
|
+
end
|
511
|
+
end
|
512
|
+
|
513
|
+
values_outside_of_array.all? do |value|
|
514
|
+
disallows_value_of(value, @low_message)
|
515
|
+
end
|
516
|
+
end
|
517
|
+
|
473
518
|
def values_outside_of_array
|
474
519
|
if !(@array & outside_values).empty?
|
475
520
|
raise CouldNotDetermineValueOutsideOfArray
|
@@ -482,8 +527,8 @@ EOT
|
|
482
527
|
case attribute_type
|
483
528
|
when :boolean
|
484
529
|
boolean_outside_values
|
485
|
-
when :
|
486
|
-
[
|
530
|
+
when :integer
|
531
|
+
[ARBITRARY_OUTSIDE_INTEGER]
|
487
532
|
when :decimal
|
488
533
|
[ARBITRARY_OUTSIDE_DECIMAL]
|
489
534
|
when :date
|
@@ -501,10 +546,10 @@ EOT
|
|
501
546
|
values = []
|
502
547
|
|
503
548
|
values << case @array
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
|
549
|
+
when [true] then false
|
550
|
+
when [false] then true
|
551
|
+
else raise CouldNotDetermineValueOutsideOfArray
|
552
|
+
end
|
508
553
|
|
509
554
|
if attribute_allows_nil?
|
510
555
|
values << nil
|
@@ -537,28 +582,36 @@ EOT
|
|
537
582
|
|
538
583
|
def column_type_to_attribute_type(type)
|
539
584
|
case type
|
540
|
-
|
541
|
-
|
542
|
-
|
585
|
+
when :float then :integer
|
586
|
+
when :timestamp then :datetime
|
587
|
+
else type
|
543
588
|
end
|
544
589
|
end
|
545
590
|
|
546
591
|
def value_to_attribute_type(value)
|
547
592
|
case value
|
548
|
-
|
549
|
-
|
550
|
-
|
551
|
-
|
552
|
-
|
553
|
-
|
554
|
-
|
593
|
+
when true, false then :boolean
|
594
|
+
when BigDecimal then :decimal
|
595
|
+
when Integer then :integer
|
596
|
+
when Date then :date
|
597
|
+
when DateTime then :datetime
|
598
|
+
when Time then :time
|
599
|
+
else :unknown
|
555
600
|
end
|
556
601
|
end
|
557
602
|
|
603
|
+
def allows_nil_value?
|
604
|
+
@options[:allow_nil] != true || allows_value_of(nil)
|
605
|
+
end
|
606
|
+
|
607
|
+
def disallows_nil_value?
|
608
|
+
@options[:allow_nil] && disallows_value_of(nil)
|
609
|
+
end
|
610
|
+
|
558
611
|
def inspected_array
|
559
612
|
Shoulda::Matchers::Util.inspect_values(@array).to_sentence(
|
560
|
-
two_words_connector:
|
561
|
-
last_word_connector:
|
613
|
+
two_words_connector: ' or ',
|
614
|
+
last_word_connector: ', or ',
|
562
615
|
)
|
563
616
|
end
|
564
617
|
end
|