mirror of
https://github.com/thoughtbot/shoulda-matchers.git
synced 2022-11-09 12:01:38 -05:00
09bc2609d7
Closes: #1493 In Rails 7 was added a new option to validate numericality. You can use `in: range` to specify a range to validate an attribute. ```ruby class User < ApplicationRecord validates :age, numericality: { greater_than_or_equal_to: 18, less_than_or_equal_to: 65 } end class User < ApplicationRecord validates :age, numericality: { in: 18..65 } end ``` In this commit we are adding the support matcher to this new functionality, while also making a refactor on the numericality matchers that use the concept of submatchers. We've created a new class (`NumericalityMatchers::Submatcher`) that's been used by `NumericalityMatchers::RangeMatcher` and `NumericalityMatchers::ComparisonMatcher`, this new class wil handle shared logic regarding having submatchers that will check if the parent matcher is valid or not. Our new class `Numericality::Matchers::RangeMatcher` is using as submatchers two `NumericalityMatchers::ComparisonMatcher` instances to avoid creating new logic to handle this new option and also to replicate what was being used before this option existed in Rails (see example above) In this commit we are adding: * NumericalityMatchers::RangeMatcher file to support the new `in: range` option. * Specs on ValidateNumericalityOfMatcherSpec file for the new supported option, only running on rails_versions > 7. * NumericalityMatchers::Submatchers file to handle having submatchers inside a matcher file. * Refactors to NumericalityMatchers::ComparisonMatcher.
95 lines
4.3 KiB
Ruby
95 lines
4.3 KiB
Ruby
require 'shoulda/matchers/active_model/helpers'
|
|
require 'shoulda/matchers/active_model/qualifiers'
|
|
require 'shoulda/matchers/active_model/validation_matcher'
|
|
require 'shoulda/matchers/active_model/validation_matcher/build_description'
|
|
require 'shoulda/matchers/active_model/validator'
|
|
require 'shoulda/matchers/active_model/allow_value_matcher'
|
|
require 'shoulda/matchers/active_model/allow_value_matcher/attribute_changed_value_error'
|
|
require 'shoulda/matchers/active_model/allow_value_matcher/attribute_does_not_exist_error'
|
|
require 'shoulda/matchers/active_model/allow_value_matcher/attribute_setter'
|
|
require 'shoulda/matchers/active_model/allow_value_matcher/attribute_setter_and_validator'
|
|
require 'shoulda/matchers/active_model/allow_value_matcher/attribute_setters'
|
|
require 'shoulda/matchers/active_model/allow_value_matcher/attribute_setters_and_validators'
|
|
require 'shoulda/matchers/active_model/allow_value_matcher/successful_check'
|
|
require 'shoulda/matchers/active_model/allow_value_matcher/successful_setting'
|
|
require 'shoulda/matchers/active_model/disallow_value_matcher'
|
|
require 'shoulda/matchers/active_model/validate_length_of_matcher'
|
|
require 'shoulda/matchers/active_model/validate_inclusion_of_matcher'
|
|
require 'shoulda/matchers/active_model/validate_exclusion_of_matcher'
|
|
require 'shoulda/matchers/active_model/validate_absence_of_matcher'
|
|
require 'shoulda/matchers/active_model/validate_presence_of_matcher'
|
|
require 'shoulda/matchers/active_model/validate_acceptance_of_matcher'
|
|
require 'shoulda/matchers/active_model/validate_confirmation_of_matcher'
|
|
require 'shoulda/matchers/active_model/validate_numericality_of_matcher'
|
|
require 'shoulda/matchers/active_model/numericality_matchers/numeric_type_matcher'
|
|
require 'shoulda/matchers/active_model/numericality_matchers/comparison_matcher'
|
|
require 'shoulda/matchers/active_model/numericality_matchers/odd_number_matcher'
|
|
require 'shoulda/matchers/active_model/numericality_matchers/even_number_matcher'
|
|
require 'shoulda/matchers/active_model/numericality_matchers/only_integer_matcher'
|
|
require 'shoulda/matchers/active_model/numericality_matchers/range_matcher'
|
|
require 'shoulda/matchers/active_model/numericality_matchers/submatchers'
|
|
require 'shoulda/matchers/active_model/errors'
|
|
require 'shoulda/matchers/active_model/have_secure_password_matcher'
|
|
|
|
module Shoulda
|
|
module Matchers
|
|
# This module provides matchers that are used to test behavior within
|
|
# ActiveModel or ActiveRecord classes.
|
|
#
|
|
# ### Testing conditional validations
|
|
#
|
|
# If your model defines a validation conditionally -- meaning that the
|
|
# validation is declared with an `:if` or `:unless` option -- how do you
|
|
# test it? You might expect the validation matchers here to have
|
|
# corresponding `if` or `unless` qualifiers, but this isn't what you use.
|
|
# Instead, before using the matcher in question, you place the record
|
|
# you're testing in a state such that the validation you're also testing
|
|
# will be run. A common way to do this is to make a new `context` and
|
|
# override the subject to populate the record accordingly. You'll also want
|
|
# to make sure to test that the validation is *not* run when the
|
|
# conditional fails.
|
|
#
|
|
# Here's an example to illustrate what we mean:
|
|
#
|
|
# class User
|
|
# include ActiveModel::Model
|
|
#
|
|
# attr_accessor :role, :admin
|
|
#
|
|
# validates_presence_of :role, if: :admin
|
|
# end
|
|
#
|
|
# # RSpec
|
|
# RSpec.describe User, type: :model do
|
|
# context "when an admin" do
|
|
# subject { User.new(admin: true) }
|
|
#
|
|
# it { should validate_presence_of(:role) }
|
|
# end
|
|
#
|
|
# context "when not an admin" do
|
|
# subject { User.new(admin: false) }
|
|
#
|
|
# it { should_not validate_presence_of(:role) }
|
|
# end
|
|
# end
|
|
#
|
|
# # Minitest (Shoulda)
|
|
# class UserTest < ActiveSupport::TestCase
|
|
# context "when an admin" do
|
|
# subject { User.new(admin: true) }
|
|
#
|
|
# should validate_presence_of(:role)
|
|
# end
|
|
#
|
|
# context "when not an admin" do
|
|
# subject { User.new(admin: false) }
|
|
#
|
|
# should_not validate_presence_of(:role)
|
|
# end
|
|
# end
|
|
#
|
|
module ActiveModel
|
|
end
|
|
end
|
|
end
|