require 'spec_helper' describe BikePOA::Helpers::ForceField do describe 'enforcer installation' do before :each do module BikePOA::Helpers::ForceField::Enforcers def self.force_something(value) "#{value}, forced" end end class DummySubject < Hashie::Dash include BikePOA::Helpers::ForceField property :forced force_something :forced end end context 'when setting property directly' do let(:dummy) { DummySubject.new } it 'applies the enforcer' do dummy.forced = 'a value' dummy.forced.should == 'a value, forced' end end context 'when creating the object from a hash' do let(:dummy) { DummySubject.new(forced: 'a value') } it 'forces the value to become something else' do dummy = DummySubject.new(forced: 'a value') dummy.forced.should == 'a value, forced' end end end describe :Enforcers do let(:mod) { BikePOA::Helpers::ForceField::Enforcers } describe :force_utf8 do it 'encodes a iso-8859-1 value to utf-8' do mod.force_utf8("Jo\xE3o da Silva").bytes.to_a.should == "Jo\xC3\xA3o da Silva".bytes.to_a end it 'does not try to over-convert an utf-8 value' do mod.force_utf8("Jo\xC3\xA3o da Silva").bytes.to_a.should == "Jo\xC3\xA3o da Silva".bytes.to_a end end describe 'force integer' do it "accepts any value that is castable to integer" do expect { mod.force_integer('42') }.to_not raise_error(ArgumentError) expect { mod.force_integer(42) }.to_not raise_error(ArgumentError) expect { mod.force_integer(42.0) }.to_not raise_error(ArgumentError) end it "raises when the value is not castable to integer" do expect { mod.force_integer("abc") }.to raise_error(ArgumentError) expect { mod.force_integer("a12") }.to raise_error(ArgumentError) end end end end