diff --git a/spec/matchers/have_key_matcher_spec.cr b/spec/matchers/have_key_matcher_spec.cr new file mode 100644 index 0000000..f5afdea --- /dev/null +++ b/spec/matchers/have_key_matcher_spec.cr @@ -0,0 +1,109 @@ +require "../spec_helper" + +describe Spectator::Matchers::HaveKeyMatcher do + describe "#match?" do + context "against a Hash" do + context "with an existing key" do + it "is true" do + hash = Hash{"foo" => "bar"} + key = "foo" + partial = Spectator::Expectations::ValueExpectationPartial.new(hash) + matcher = Spectator::Matchers::HaveKeyMatcher.new(key) + matcher.match?(partial).should be_true + end + end + + context "with a non-existent key" do + it "is false" do + hash = Hash{"foo" => "bar"} + key = "baz" + partial = Spectator::Expectations::ValueExpectationPartial.new(hash) + matcher = Spectator::Matchers::HaveKeyMatcher.new(key) + matcher.match?(partial).should be_false + end + end + end + + context "against a NamedTuple" do + context "with an existing key" do + it "is true" do + tuple = {foo: "bar"} + key = :foo + partial = Spectator::Expectations::ValueExpectationPartial.new(tuple) + matcher = Spectator::Matchers::HaveKeyMatcher.new(key) + matcher.match?(partial).should be_true + end + end + + context "with a non-existent key" do + it "is false" do + tuple = {foo: "bar"} + key = :baz + partial = Spectator::Expectations::ValueExpectationPartial.new(tuple) + matcher = Spectator::Matchers::HaveKeyMatcher.new(key) + matcher.match?(partial).should be_false + end + end + end + end + + describe "#message" do + it "contains the actual label" do + tuple = {foo: "bar"} + key = :foo + label = "blah" + partial = Spectator::Expectations::ValueExpectationPartial.new(label, tuple) + matcher = Spectator::Matchers::HaveKeyMatcher.new(key) + matcher.message(partial).should contain(label) + end + + it "contains the expected label" do + tuple = {foo: "bar"} + key = :foo + label = "blah" + partial = Spectator::Expectations::ValueExpectationPartial.new(tuple) + matcher = Spectator::Matchers::HaveKeyMatcher.new(label, key) + matcher.message(partial).should contain(label) + end + + context "when the expected label is omitted" do + it "contains the stringified key" do + tuple = {foo: "bar"} + key = :foo + partial = Spectator::Expectations::ValueExpectationPartial.new(tuple) + matcher = Spectator::Matchers::HaveKeyMatcher.new(key) + matcher.message(partial).should contain(key.to_s) + end + end + end + + describe "#negated_message" do + it "contains the actual label" do + tuple = {foo: "bar"} + key = :foo + label = "blah" + partial = Spectator::Expectations::ValueExpectationPartial.new(label, tuple) + matcher = Spectator::Matchers::HaveKeyMatcher.new(key) + matcher.negated_message(partial).should contain(label) + end + + it "contains the expected label" do + tuple = {foo: "bar"} + key = :foo + label = "blah" + partial = Spectator::Expectations::ValueExpectationPartial.new(tuple) + matcher = Spectator::Matchers::HaveKeyMatcher.new(label, key) + matcher.negated_message(partial).should contain(label) + end + + context "when the expected label is omitted" do + it "contains the stringified key" do + tuple = {foo: "bar"} + key = :foo + partial = Spectator::Expectations::ValueExpectationPartial.new(tuple) + matcher = Spectator::Matchers::HaveKeyMatcher.new(key) + matcher.negated_message(partial).should contain(key.to_s) + end + end + end +end