Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions lib/postcodes_io.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
28 changes: 28 additions & 0 deletions lib/postcodes_io/validate.rb
Original file line number Diff line number Diff line change
@@ -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
4 changes: 4 additions & 0 deletions spec/fixtures/validation_invalid_response.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"status": 200,
"result": false
}
4 changes: 4 additions & 0 deletions spec/fixtures/validation_valid_response.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"status": 200,
"result": true
}
42 changes: 42 additions & 0 deletions spec/validate_spec.rb
Original file line number Diff line number Diff line change
@@ -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