spec/unit/assertion/base_spec.rb in assertion-0.1.0 vs spec/unit/assertion/base_spec.rb in assertion-0.2.0
- old
+ new
@@ -3,18 +3,10 @@
describe Assertion::Base do
let(:klass) { Class.new(described_class) }
before { allow(klass).to receive(:name) { "Test" } }
- it "can declare attributes" do
- expect(klass).to be_kind_of Assertion::Attributes
- end
-
- it "can translate states" do
- expect(klass).to include Assertion::Messages
- end
-
describe ".new" do
let(:klass) { Class.new(described_class) { attribute :foo, :bar } }
context "with attributes" do
@@ -43,10 +35,86 @@
end # context
end # describe .new
+ describe ".attributes" do
+
+ subject { klass.attributes }
+ it { is_expected.to eql [] }
+
+ end # describe .attributes
+
+ describe ".attribute" do
+
+ shared_examples "defining attributes" do
+
+ it "registers attributes" do
+ expect { subject }.to change { klass.attributes }.to [:foo, :bar]
+ end
+
+ it "declares attributes" do
+ subject
+ assertion = klass.new(foo: :FOO, bar: :BAR, baz: :BAZ)
+ expect(assertion.attributes).to eql(foo: :FOO, bar: :BAR)
+ expect(assertion.foo).to eql :FOO
+ expect(assertion.bar).to eql :BAR
+ end
+
+ end # shared examples
+
+ shared_examples "raising NameError" do |with: nil|
+
+ it "fails" do
+ expect { subject }.to raise_error do |exception|
+ expect(exception).to be_kind_of NameError
+ expect(exception.message).to eql "#{klass}##{with} is already defined"
+ end
+ end
+
+ end # shared examples
+
+ context "with a single name" do
+
+ subject do
+ klass.attribute :foo
+ klass.attribute "bar"
+ end
+ it_behaves_like "defining attributes"
+
+ end # context
+
+ context "with a list of names" do
+
+ subject { klass.attribute :foo, :bar }
+ it_behaves_like "defining attributes"
+
+ end # context
+
+ context "with an array of names" do
+
+ subject { klass.attribute %w(foo bar) }
+ it_behaves_like "defining attributes"
+
+ end # context
+
+ context ":check" do
+
+ subject { klass.attribute :check }
+ it_behaves_like "raising NameError", with: :check
+
+ end # context
+
+ context ":call" do
+
+ subject { klass.attribute :call }
+ it_behaves_like "raising NameError", with: :call
+
+ end # context
+
+ end # describe .attribute
+
describe ".not" do
subject { klass.not }
it "creates the iverter for the current class" do
@@ -56,33 +124,75 @@
end # describe .not
describe ".[]" do
- subject { klass[params] }
-
let(:params) { { foo: :FOO } }
let(:state) { double }
let(:assertion) { double call: state }
- before { allow(klass).to receive(:new).with(params) { assertion } }
+ context "with params" do
- it "checks the assertion for given attributes" do
- expect(subject).to eql state
- end
+ subject { klass[params] }
+ it "checks the assertion for given attributes" do
+ allow(klass).to receive(:new).with(params) { assertion }
+ expect(subject).to eql state
+ end
+
+ end # context
+
+ context "without params" do
+
+ subject { klass[] }
+
+ it "checks the assertion" do
+ allow(klass).to receive(:new) { assertion }
+ expect(subject).to eql state
+ end
+
+ end # context
+
end # describe .[]
+ describe ".translator" do
+
+ subject { klass.translator }
+
+ it { is_expected.to be_kind_of Assertion::Translator }
+
+ it "refers to the current class" do
+ expect(subject.assertion).to eql klass
+ end
+
+ end # describe .translator
+
describe "#attributes" do
let(:attrs) { { foo: :FOO, bar: :BAR } }
let(:klass) { Class.new(described_class) { attribute :foo, :bar } }
let(:assertion) { klass.new attrs }
subject { assertion.attributes }
it { is_expected.to eql attrs }
end # describe #attributes
+
+ describe "#message" do
+
+ let(:state) { double }
+ let(:attrs) { { foo: :FOO, bar: :BAR } }
+ let(:klass) { Class.new(described_class) { attribute :foo, :bar } }
+ let(:assertion) { klass.new attrs }
+ let(:translator) { double call: nil }
+
+ it "calls a translator with state and attributes" do
+ allow(klass).to receive(:translator) { translator }
+ expect(translator).to receive(:call).with(state, attrs)
+ assertion.message(state)
+ end
+
+ end # describe #message
describe "#call" do
subject { assertion.call }