spec/tests/validations/validators_spec.rb in attestor-1.0.0 vs spec/tests/validations/validators_spec.rb in attestor-2.0.0

- old
+ new

@@ -1,11 +1,13 @@ # encoding: utf-8 describe Attestor::Validations::Validators do let(:validator_class) { Attestor::Validations::Validator } - let(:delegator_class) { Attestor::Validations::Delegator } + let(:delegator_class) { Attestor::Validations::Delegator } + let(:reporter_module) { Attestor::Validations::Reporter } + let(:invalid_error) { Attestor::InvalidError } describe ".new" do it "creates a collection" do expect(subject).to be_kind_of Enumerable @@ -59,22 +61,28 @@ end # context context "with a block" do - let(:result) { subject.add_validator { foo } } + let(:block) { proc { foo } } + let(:result) { subject.add_validator(&block) } it "returns validators" do expect(result).to be_kind_of described_class end - it "adds validator (not a delegator)" do + it "adds a validator (not a delegator)" do item = result.first expect(item).to be_kind_of validator_class expect(item).not_to be_kind_of delegator_class end + it "assigns a block to the validator" do + item = result.first + expect(item.block).to eq block + end + end # context context "with contexts" do let(:result) { subject.add_validator "foo", only: [:foo] } @@ -115,21 +123,27 @@ end # context context "with a block" do - let(:result) { subject.add_delegator { foo } } + let(:block) { proc { foo } } + let(:result) { subject.add_delegator(&block) } it "returns validators" do expect(result).to be_kind_of described_class end it "adds a delegator" do item = result.first expect(item).to be_kind_of delegator_class end + it "assigns a block to the delegator" do + item = result.first + expect(item.block).to eq block + end + end # context context "with contexts" do let(:result) { subject.add_delegator "foo", only: [:foo] } @@ -162,7 +176,70 @@ expect(subject.set("cam").map(&:name)).to contain_exactly :foo, :bar expect(subject.set("all").map(&:name)).to contain_exactly :foo, :bar, :baz end end # describe #set + + describe "#validate!" do + + let(:object) { double foo: nil, bar: nil } + + subject do + described_class.new + .add_validator("foo") + .add_validator("bar") + end + + context "when all validators passes" do + + it "calls all validators" do + expect(object).to receive :foo + expect(object).to receive :bar + subject.validate! object + end + + it "passes" do + expect { subject.validate! object }.not_to raise_error + end + + end # context + + context "when any validator fails" do + + let(:messages) { %w(foo) } + before do + allow(object) + .to receive(:foo) { fail invalid_error.new(object, messages) } + end + + it "calls all validators" do + expect(object).to receive :foo + expect(object).to receive :bar + subject.validate! object rescue nil + end + + it "fails" do + expect { subject.validate! object }.to raise_error(invalid_error) + end + + it "collects errors from validators" do + begin + subject.validate! object + rescue => error + expect(error.object).to eq object + expect(error.messages).to eq messages + end + end + + end # context + + end # describe #validate! + + describe "#validate" do + + it "is is imported from the Reporter" do + expect(described_class).to include reporter_module + end + + end # describe #validate end # describe Attestor::Validators