mongoid-enum/spec/mongoid/enum/validators/multiple_validator_spec.rb

81 lines
2.7 KiB
Ruby

require 'spec_helper'
require 'ostruct'
describe Mongoid::Enum::Validators::MultipleValidator do
subject { Mongoid::Enum::Validators::MultipleValidator }
let(:values) { [:lorem, :ipsum, :dolor, :sit] }
let(:attribute) { :word }
let(:record) { OpenStruct.new(:errors => {attribute => []}, attribute => values.first) }
let(:allow_nil) { false }
let(:validator) { subject.new(:attributes => attribute, :in => values, :allow_nil => allow_nil) }
describe ".validate_each" do
context "when allow_nil: true" do
let(:allow_nil) { true }
context "and value is nil" do
before(:each) { validator.validate_each(record, attribute, nil) }
it "validates" do
expect(record.errors[attribute].empty?).to be true
end
end
context "and value is []" do
before(:each) { validator.validate_each(record, attribute, []) }
it "validates" do
expect(record.errors[attribute].empty?).to be true
end
end
end
context "when allow_nil: false" do
context "and value is nil" do
before(:each) { validator.validate_each(record, attribute, nil) }
it "won't validate" do
expect(record.errors[attribute].any?).to be true
expect(record.errors[attribute]).to eq ["is not in #{values.join ", "}"]
end
end
context "and value is []" do
before(:each) { validator.validate_each(record, attribute, []) }
it "won't validate" do
expect(record.errors[attribute].any?).to be true
expect(record.errors[attribute]).to eq ["is not in #{values.join ", "}"]
end
end
end
context "when value is included" do
let(:allow_nil) { rand(2).zero? }
before(:each) { validator.validate_each(record, attribute, [values.sample]) }
it "validates" do
expect(record.errors[attribute].empty?).to be true
end
end
context "when value is not included" do
let(:allow_nil) { rand(2).zero? }
before(:each) { validator.validate_each(record, attribute, [:amet]) }
it "won't validate" do
expect(record.errors[attribute].any?).to be true
end
end
context "when multiple values included" do
let(:allow_nil) { rand(2).zero? }
before(:each) { validator.validate_each(record, attribute, [values.first, values.last]) }
it "validates" do
expect(record.errors[attribute].empty?).to be true
end
end
context "when one value is not included "do
let(:allow_nil) { rand(2).zero? }
before(:each) { validator.validate_each(record, attribute, [values.first, values.last, :amet]) }
it "won't validate" do
expect(record.errors[attribute].any?).to be true
end
end
end
end