spec/shared/postal_codes_spec.rb (87 lines of code) (raw):
# encoding: UTF-8
# Copyright 2012 Twitter, Inc
# http://www.apache.org/licenses/LICENSE-2.0
require 'spec_helper'
describe TwitterCldr::Shared::PostalCodes do
describe "#territories" do
let(:territories) { described_class.territories }
it 'returns an array' do
expect(territories).to be_instance_of(Array)
end
it 'returns symbols' do
territories.each { |territory| expect(territory).to be_instance_of(Symbol) }
end
it 'returns supported territories' do
expect(territories).to include(:br, :fr, :jp)
end
end
describe "#new" do
it "should raise an error if the territory isn't supported" do
expect { described_class.for_territory(:xx) }.to(
raise_error(TwitterCldr::Shared::InvalidTerritoryError)
)
end
it 'accepts strings' do
expect(described_class.for_territory("us")).to be_a(described_class)
end
it 'accepts upper-case strings' do
expect(described_class.for_territory("US")).to be_a(described_class)
end
end
context "with a PostalCodes instance" do
let(:postal_code) { described_class.for_territory(:us) }
describe '#regexp' do
it 'returns postal code regex for a given territory' do
expect(postal_code.regexp).to be_a(Regexp)
end
end
describe '#find_all' do
it 'matches valid postal codes' do
expect(postal_code.find_all("12345 23456")).to eql(['12345', '23456'])
end
it 'does not match invalid postal codes' do
expect(postal_code.find_all("123456 23456")).to eql(['23456'])
expect(postal_code.find_all("12345 234567")).to eql(['12345'])
expect(postal_code.find_all("12345 234567 34567")).to eql(['12345', '34567'])
end
end
describe '#valid?' do
it 'returns true if a given postal code satisfies the regexp' do
expect(postal_code.valid?('12345-6789')).to eq(true)
end
it 'returns false if a given postal code adds extra characters to an otherwise valid code' do
expect(postal_code.valid?('123456')).to eq(false)
end
it "returns false if a given postal code doesn't satisfy the regexp" do
expect(postal_code.valid?('postal-code')).to eq(false)
end
end
describe "#sample" do
described_class.territories.each do |territory|
next unless territory == :sh
postal_code = described_class.for_territory(territory)
it "returns samples that match #{territory}" do
if postal_code.has_generator?
postal_code.sample(10).each do |sample|
result = postal_code.valid?(sample)
puts "Failed with example #{sample}" unless result
expect(result).to eq(true)
end
end
end
end
end
end
context 'with a postal code that has no AST' do
let(:postal_code) { described_class.new(:xx, /\d{5}/, nil) }
describe '#sample' do
it 'raises an exception' do
expect { postal_code.sample }.to raise_error(
TwitterCldr::Shared::MissingPostcodeGeneratorError
)
end
end
describe '#has_generator?' do
it 'returns false' do
expect(postal_code).to_not have_generator
end
end
end
end