spec/models/skip_validation_spec.rb
require "rails_helper"
describe SkipValidation do
describe ".skip_validation" do
before do
dummy_model = Class.new do
include ActiveModel::Model
include SkipValidation
attr_accessor :title, :description
validates :title, presence: true, length: { in: 10..60, allow_nil: true }
validates :description, presence: true
end
stub_const("DummyModel", dummy_model)
end
it "accepts validator classes as parameters" do
DummyModel.skip_validation :title, ActiveModel::Validations::PresenceValidator
expect(DummyModel.new(title: nil, description: "Something")).to be_valid
end
it "accepts symbols as parameters" do
DummyModel.skip_validation :title, :presence
expect(DummyModel.new(title: nil, description: "Something")).to be_valid
end
it "does not affect other attributes" do
DummyModel.skip_validation :title, :presence
expect(DummyModel.new(title: nil, description: nil)).not_to be_valid
end
it "does not affect other validations" do
DummyModel.skip_validation :title, :presence
expect(DummyModel.new(title: "Short", description: "Something")).not_to be_valid
end
it "works with validators other than presence" do
DummyModel.skip_validation :title, :length
expect(DummyModel.new(title: "Short", description: "Something")).to be_valid
expect(DummyModel.new(title: nil, description: "Something")).not_to be_valid
end
end
describe ".skip_translation_validation" do
before do
dummy_banner = Class.new(ApplicationRecord) do
def self.name
"DummyBanner"
end
self.table_name = "banners"
translates :title, touch: true
translates :description, touch: true
include Globalizable
has_many :translations, class_name: "DummyBanner::Translation", foreign_key: "banner_id"
validates_translation :title, presence: true
validates_translation :description, presence: true
end
stub_const("DummyBanner", dummy_banner)
end
it "removes the validation from the translatable attribute" do
DummyBanner.skip_translation_validation :title, :presence
custom_banner = DummyBanner.new(build(:banner).attributes.merge(title: nil))
expect { custom_banner.save! }.not_to raise_exception
end
it "does not affect other validations" do
DummyBanner.skip_translation_validation :title, :presence
custom_banner = DummyBanner.new(build(:banner).attributes.merge(description: nil))
expect { custom_banner.save! }.to raise_exception(ActiveRecord::RecordInvalid)
end
end
end