diff --git a/lib/postcodes_io.rb b/lib/postcodes_io.rb index 1cc271c..163085d 100644 --- a/lib/postcodes_io.rb +++ b/lib/postcodes_io.rb @@ -3,11 +3,13 @@ require "postcodes_io/autocomplete" require "postcodes_io/postcode" require "postcodes_io/reverse_geocode" +require "postcodes_io/validate" module Postcodes class IO include Lookup include Autocomplete include ReverseGeocode + include Validate end end diff --git a/lib/postcodes_io/validate.rb b/lib/postcodes_io/validate.rb new file mode 100644 index 0000000..1343a91 --- /dev/null +++ b/lib/postcodes_io/validate.rb @@ -0,0 +1,28 @@ +require 'excon' +require 'json' +require 'postcodes_io/postcode' + +module Postcodes + module Validate + def validate(postcode) + validate_postcode(postcode) + end + + private + + def validate_postcode(postcode) + postcode = remove_whitespace postcode + response = Excon.get("https://api.postcodes.io/postcodes/#{postcode}/validate") + + unless response.status == 404 + parsed_response = JSON.parse(response.body) + return parsed_response['result'] == true + end + return nil + end + + def remove_whitespace(string) + string.gsub(/\s+/, '') # remove any whitespace. m1 1ab => m11ab + end + end +end diff --git a/spec/fixtures/validation_invalid_response.json b/spec/fixtures/validation_invalid_response.json new file mode 100644 index 0000000..3279e5a --- /dev/null +++ b/spec/fixtures/validation_invalid_response.json @@ -0,0 +1,4 @@ +{ + "status": 200, + "result": false +} diff --git a/spec/fixtures/validation_valid_response.json b/spec/fixtures/validation_valid_response.json new file mode 100644 index 0000000..d256ef7 --- /dev/null +++ b/spec/fixtures/validation_valid_response.json @@ -0,0 +1,4 @@ +{ + "status": 200, + "result": true +} diff --git a/spec/validate_spec.rb b/spec/validate_spec.rb new file mode 100644 index 0000000..9c788ab --- /dev/null +++ b/spec/validate_spec.rb @@ -0,0 +1,42 @@ +require 'spec_helper' + +describe Postcodes::IO do + let(:base_url) {'https://api.postcodes.io'} + let(:stub_valid_response) { File.read('spec/fixtures/validation_valid_response.json') } + let(:stub_invalid_response) { File.read('spec/fixtures/validation_invalid_response.json') } + + describe '#validate' do + before :each do + stub_request(:get, "#{base_url}/postcodes/CM129TR/validate") + .to_return(status: 200, body: stub_valid_response) + + stub_request(:get, "#{base_url}/postcodes/TR49BW/validate") + .to_return(status: 200, body: stub_valid_response) + + stub_request(:get, "#{base_url}/postcodes/helloooooo/validate") + .to_return(status: 200, body: stub_invalid_response) + end + + def validate(postcode) + subject.validate(postcode) + end + + it 'removes whitespace from postcodes' do + validate('CM12 9TR') + WebMock.should have_requested(:get, "#{base_url}/postcodes/CM129TR/validate") + end + + it 'validates a postcode' do + validate('CM129TR') + WebMock.should have_requested(:get, "#{base_url}/postcodes/CM129TR/validate") + end + + it 'returns true for valid postcodes' do + expect(validate('TR49BW')).to be_truthy + end + + it 'returns false for valid postcodes' do + expect(validate('helloooooo')).to be_falsy + end + end +end