Jack S
2 years ago
2 changed files with 118 additions and 0 deletions
@ -0,0 +1,50 @@ |
|||||||
|
require "net/http" |
||||||
|
|
||||||
|
class UprnClient |
||||||
|
attr_reader :uprn |
||||||
|
attr_accessor :error |
||||||
|
|
||||||
|
ADDRESS = "api.os.uk".freeze |
||||||
|
PATH = "/search/places/v1/uprn".freeze |
||||||
|
|
||||||
|
def initialize(uprn) |
||||||
|
@uprn = uprn |
||||||
|
end |
||||||
|
|
||||||
|
def call |
||||||
|
unless response.is_a?(Net::HTTPSuccess) && result.present? |
||||||
|
@error = "UPRN is not recognised. Check the number, or enter the address" |
||||||
|
end |
||||||
|
rescue JSON::ParserError |
||||||
|
@error = "UPRN is not recognised. Check the number, or enter the address" |
||||||
|
end |
||||||
|
|
||||||
|
def result |
||||||
|
@result ||= JSON.parse(response.body).dig("results", 0, "DPA") |
||||||
|
end |
||||||
|
|
||||||
|
private |
||||||
|
|
||||||
|
def http_client |
||||||
|
client = Net::HTTP.new(ADDRESS, 443) |
||||||
|
client.use_ssl = true |
||||||
|
client.verify_mode = OpenSSL::SSL::VERIFY_PEER |
||||||
|
client.max_retries = 3 |
||||||
|
client.read_timeout = 10 # seconds |
||||||
|
client |
||||||
|
end |
||||||
|
|
||||||
|
def endpoint_uri |
||||||
|
uri = URI(PATH) |
||||||
|
params = { |
||||||
|
uprn:, |
||||||
|
key: ENV["OS_DATA_KEY"], |
||||||
|
} |
||||||
|
uri.query = URI.encode_www_form(params) |
||||||
|
uri.to_s |
||||||
|
end |
||||||
|
|
||||||
|
def response |
||||||
|
@response ||= http_client.request_get(endpoint_uri) |
||||||
|
end |
||||||
|
end |
@ -0,0 +1,68 @@ |
|||||||
|
require "rails_helper" |
||||||
|
|
||||||
|
describe UprnClient do |
||||||
|
let(:client) { described_class.new("123") } |
||||||
|
|
||||||
|
let(:valid_response) do |
||||||
|
{ results: [{ DPA: { postcode: "12345" } }] }.to_json |
||||||
|
end |
||||||
|
|
||||||
|
def stub_api_request(body:, status: 200) |
||||||
|
stub_request(:get, "https://api.os.uk/search/places/v1/uprn?key=OS_DATA_KEY&uprn=123") |
||||||
|
.to_return(status:, body:, headers: {}) |
||||||
|
end |
||||||
|
|
||||||
|
describe "call" do |
||||||
|
context "when json parse error" do |
||||||
|
before do |
||||||
|
stub_api_request(body: "{", status: 200) |
||||||
|
|
||||||
|
client.call |
||||||
|
end |
||||||
|
|
||||||
|
it "returns error" do |
||||||
|
expect(client.error).to eq("UPRN is not recognised. Check the number, or enter the address") |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
context "when http error" do |
||||||
|
before do |
||||||
|
stub_api_request(body: valid_response, status: 500) |
||||||
|
|
||||||
|
client.call |
||||||
|
end |
||||||
|
|
||||||
|
it "returns error" do |
||||||
|
expect(client.error).to eq("UPRN is not recognised. Check the number, or enter the address") |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
context "when results empty" do |
||||||
|
before do |
||||||
|
stub_api_request(body: {}.to_json) |
||||||
|
|
||||||
|
client.call |
||||||
|
end |
||||||
|
|
||||||
|
it "returns error" do |
||||||
|
expect(client.error).to eq("UPRN is not recognised. Check the number, or enter the address") |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
context "with results" do |
||||||
|
before do |
||||||
|
stub_api_request(body: valid_response) |
||||||
|
|
||||||
|
client.call |
||||||
|
end |
||||||
|
|
||||||
|
it "returns result" do |
||||||
|
expect(client.result).to eq({ "postcode" => "12345" }) |
||||||
|
end |
||||||
|
|
||||||
|
it "returns no error" do |
||||||
|
expect(client.error).to be_nil |
||||||
|
end |
||||||
|
end |
||||||
|
end |
||||||
|
end |
Loading…
Reference in new issue