require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')

describe ISO3166 do

  let(:data) { {:code => "AD", :country => "ANDORRA"} }
  let(:different_data) {{:some => 'data'}}
  let(:iso_3166) { ISO3166.new(data) }

  it 'is equal to another ISO3166 object if contains the same data' do
    same_iso_3166 = ISO3166.new(data)
    different_iso_3166 = ISO3166.new(different_data)
    iso_3166.should == same_iso_3166
    iso_3166.should_not == different_iso_3166
  end

  it 'responds to code' do
    iso_3166.code.should == 'AD'
  end

  it 'responds to country' do
    iso_3166.country.should == 'ANDORRA'
  end
end

describe ISO3166::Codes do
  context 'validation' do
    let(:iso_3166) {ISO3166::Codes.new}
    let(:iso_records) { mock(:values_for => ['US', '123']) }
    before { ISORecords.stub(:new => iso_records) }

    context 'on default field' do
      it 'returns false for a nil value' do
        iso_3166.validate(nil).should be_false
      end

      it 'does not match nil to ""' do
        iso_records.stub(:values_for => [''])
        iso_3166.validate(nil).should be_false
      end

      it 'validates a number' do
        iso_3166.validate(123).should be_true
      end

      it 'gets a list of values' do
        iso_records.should_receive(:values_for).with(:code)
        iso_3166.validate('US')
      end
    end

    context 'on country field' do
      it 'gets a list of values' do
        iso_records.should_receive(:values_for).with(:country)
        iso_3166.validate('2345', :country)
      end
    end

    context 'on multiple fields' do
      it 'gets a list of values' do
        iso_records.should_receive(:values_for).with([:code, :country])
        iso_3166.validate('1234', [:code, :country])
      end
    end

    context 'returns true if the value is valid' do
      it 'with matching case' do
        iso_3166.validate('us').should be_true
      end

      it 'with different case' do
        iso_3166.validate('US').should be_true
      end
    end

    it 'returns false if the value is invalid' do
      iso_records.stub(:values_for => [])
      iso_3166.validate('BLABLA').should be_false
    end
  end
end