require "spec_helper" module Hexx describe Coercible do # ========================================================================== # Prepare environment # ========================================================================== before { class TestModel; extend Coercible; end } before { module TestModule; end } before { class TestCoercion < Struct.new(:string); end } let(:test_model) { TestModel } let(:test_module) { TestModule } let(:test_coercion) { TestCoercion } after { Hexx.send :remove_const, :TestCoercion } after { Hexx.send :remove_const, :TestModule } after { Hexx.send :remove_const, :TestModel } # ========================================================================== # Run tests # ========================================================================== describe ".attr_coerced" do context "when the name is neither type nor symbol" do it "fails with TypeError" do expect { test_model.send :attr_coerced, 1, type: test_coercion } .to raise_error(TypeError) end end context "when the name is empty" do it "fails with ArgumentError" do expect { test_model.send :attr_coerced, "", type: test_coercion } .to raise_error(ArgumentError) end end context "when no type is set" do it "fails with ArgumentError" do expect { test_model.send :attr_coerced, :name } .to raise_error(ArgumentError) end end context "when a type is not a class" do it "fails with TypeError" do expect { test_model.send :attr_coerced, :name, type: test_module } .to raise_error(TypeError) end end context "with valid arguments" do before { test_model.send :attr_coerced, :name, type: test_coercion } subject { test_model.new } it "coerces an attribute with given type" do subject.name = "some name" expect(subject.name).to be_kind_of test_coercion end end end end end