ideal_postcodes 2.0.0 → 2.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.github/workflows/ci.yml +22 -0
- data/lib/ideal_postcodes.rb +1 -1
- data/lib/idealpostcodes/address.rb +28 -28
- data/lib/idealpostcodes/errors.rb +31 -26
- data/lib/idealpostcodes/key.rb +12 -11
- data/lib/idealpostcodes/postcode.rb +21 -20
- data/lib/idealpostcodes/util.rb +38 -25
- data/lib/idealpostcodes/version.rb +2 -2
- data/lib/idealpostcodes.rb +104 -92
- data/spec/addresses_spec.rb +63 -63
- data/spec/idealpostcodes_spec.rb +51 -51
- data/spec/keys_spec.rb +21 -21
- data/spec/postcodes_spec.rb +74 -63
- data/spec/spec_helper.rb +50 -29
- data/spec/vcr_cassettes/IdealPostcodes_Address_lookup_raises_an_exception_if_invalid_key.yml +39 -39
- data/spec/vcr_cassettes/IdealPostcodes_Address_lookup_raises_an_exception_if_limit_breached.yml +39 -39
- data/spec/vcr_cassettes/IdealPostcodes_Address_lookup_raises_an_exception_if_no_lookups_remaining.yml +39 -39
- data/spec/vcr_cassettes/IdealPostcodes_Address_lookup_returns_an_address_for_a_valid_UDPRN.yml +71 -71
- data/spec/vcr_cassettes/IdealPostcodes_Address_lookup_returns_nil_for_an_invalid_UDPRN.yml +39 -39
- data/spec/vcr_cassettes/IdealPostcodes_Address_search_is_sensitive_to_limit.yml +78 -78
- data/spec/vcr_cassettes/IdealPostcodes_Address_search_is_sensitive_to_page.yml +366 -366
- data/spec/vcr_cassettes/IdealPostcodes_Address_search_raises_an_exception_if_invalid_key.yml +39 -39
- data/spec/vcr_cassettes/IdealPostcodes_Address_search_raises_an_exception_if_limit_breached.yml +39 -39
- data/spec/vcr_cassettes/IdealPostcodes_Address_search_raises_an_exception_if_no_lookups_remaining.yml +39 -39
- data/spec/vcr_cassettes/IdealPostcodes_Address_search_returns_results_in_a_SearchResult_object.yml +270 -270
- data/spec/vcr_cassettes/IdealPostcodes_Key_lookup_details_returns_key_details.yml +58 -58
- data/spec/vcr_cassettes/IdealPostcodes_Key_lookup_returns_the_availability_status_of_a_key_false_key_.yml +42 -42
- data/spec/vcr_cassettes/IdealPostcodes_Key_lookup_returns_the_availability_status_of_a_key_true_key_.yml +42 -42
- data/spec/vcr_cassettes/IdealPostcodes_Postcode_find_by_location_is_sensitive_to_limit_parameter.yml +49 -49
- data/spec/vcr_cassettes/IdealPostcodes_Postcode_find_by_location_is_sensitive_to_radius_parament.yml +130 -130
- data/spec/vcr_cassettes/IdealPostcodes_Postcode_find_by_location_returns_an_array_of_postcodes_and_locations.yml +81 -81
- data/spec/vcr_cassettes/IdealPostcodes_Postcode_find_by_location_returns_an_empty_array_if_no_results_are_found.yml +40 -40
- data/spec/vcr_cassettes/IdealPostcodes_Postcode_lookup_raises_an_exception_if_invalid_key.yml +39 -39
- data/spec/vcr_cassettes/IdealPostcodes_Postcode_lookup_raises_an_exception_if_key_has_run_out_of_balance.yml +39 -39
- data/spec/vcr_cassettes/IdealPostcodes_Postcode_lookup_raises_an_exception_if_limit_has_been_reached.yml +39 -39
- data/spec/vcr_cassettes/IdealPostcodes_Postcode_lookup_returns_a_list_of_addresses_for_a_postcode.yml +265 -265
- data/spec/vcr_cassettes/IdealPostcodes_Postcode_lookup_returns_an_empty_array_if_postcode_does_not_exist.yml +39 -39
- data/spec/vcr_cassettes/IdealPostcodes_key_available_returns_false_if_key_is_unavailable.yml +42 -42
- data/spec/vcr_cassettes/IdealPostcodes_key_available_returns_true_if_key_is_available.yml +42 -42
- data/spec/vcr_cassettes/IdealPostcodes_key_details_raises_an_exception_if_no_secret_is_provided.yml +42 -42
- data/spec/vcr_cassettes/IdealPostcodes_key_details_returns_key_information.yml +58 -58
- data/spec/vcr_cassettes/IdealPostcodes_request_generates_a_HTTP_request.yml +265 -265
- data/spec/vcr_cassettes/IdealPostcodes_request_raises_authentication_error_if_invalid_key_is_provided.yml +39 -39
- data/spec/vcr_cassettes/IdealPostcodes_request_raises_limit_reached_error_if_a_limit_has_been_breached.yml +39 -39
- data/spec/vcr_cassettes/IdealPostcodes_request_raises_token_exhausted_error_if_key_balance_is_depleted.yml +39 -39
- metadata +4 -5
- data/.travis.yml +0 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 631e1f7827c1ebd216ac8da69d07f41e99dfcb542ea8db79160f81fb4e27e2f7
|
4
|
+
data.tar.gz: 528c592ee660794a49eaca814817181d7bb46dc67a848dd3015d9ed64023af3a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f9f1c1c8405bad2e5f2593609a880f667f5b1b89643540e197aa79d348f1027abcfa7ca0de1c16d485861a6ab9d42471761068435b56be25584ed7cbcc269799
|
7
|
+
data.tar.gz: '078849bcd14507cab9dcc8263bcd823dd154d556da85065b8909b37ae5b504c51aa0d8a67b6413c487e82f5b37c4415abdab033ceb98465d450848f6a272ff8e'
|
@@ -0,0 +1,22 @@
|
|
1
|
+
name: CI
|
2
|
+
on:
|
3
|
+
push:
|
4
|
+
jobs:
|
5
|
+
test:
|
6
|
+
runs-on: ubuntu-latest
|
7
|
+
strategy:
|
8
|
+
matrix:
|
9
|
+
ruby:
|
10
|
+
- '2.5'
|
11
|
+
- '2.6'
|
12
|
+
- '2.7'
|
13
|
+
- '3.0'
|
14
|
+
steps:
|
15
|
+
- uses: actions/checkout@v2
|
16
|
+
- name: Set up Ruby
|
17
|
+
uses: ruby/setup-ruby@v1
|
18
|
+
with:
|
19
|
+
ruby-version: ${{ matrix.ruby }}
|
20
|
+
bundler-cache: true
|
21
|
+
- name: Run tests
|
22
|
+
run: bundle exec rake
|
data/lib/ideal_postcodes.rb
CHANGED
@@ -1,2 +1,2 @@
|
|
1
1
|
# Allows to reference by ideal_postcodes
|
2
|
-
require 'idealpostcodes'
|
2
|
+
require 'idealpostcodes'
|
@@ -1,31 +1,31 @@
|
|
1
1
|
module IdealPostcodes
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
2
|
+
module Address
|
3
|
+
class SearchResult
|
4
|
+
attr_reader :page, :limit, :addresses
|
5
|
+
def initialize(response)
|
6
|
+
@page = response[:result][:page]
|
7
|
+
@limit = response[:result][:limit]
|
8
|
+
@addresses = response[:result][:hits]
|
9
|
+
end
|
10
|
+
end
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
12
|
+
def self.lookup(udprn)
|
13
|
+
begin
|
14
|
+
response = IdealPostcodes.request :get, "addresses/#{udprn}"
|
15
|
+
address = response[:result]
|
16
|
+
rescue IdealPostcodes::IdealPostcodesError => error
|
17
|
+
raise error unless error.response_code == 4044
|
18
|
+
address = nil
|
19
|
+
end
|
20
|
+
address
|
21
|
+
end
|
22
22
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
end
|
23
|
+
def self.search(search_term, options = {})
|
24
|
+
query = { query: search_term }
|
25
|
+
query[:limit] = options[:limit] unless options[:limit].nil?
|
26
|
+
query[:page] = options[:page] unless options[:page].nil?
|
27
|
+
response = IdealPostcodes.request :get, 'addresses', query
|
28
|
+
SearchResult.new response
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -1,33 +1,38 @@
|
|
1
1
|
module IdealPostcodes
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
2
|
+
class IdealPostcodesError < StandardError
|
3
|
+
attr_reader :message
|
4
|
+
attr_reader :http_code
|
5
|
+
attr_reader :http_body
|
6
|
+
attr_reader :response_code
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
8
|
+
def initialize(
|
9
|
+
message = nil,
|
10
|
+
http_code = nil,
|
11
|
+
http_body = nil,
|
12
|
+
response_code = nil
|
13
|
+
)
|
14
|
+
@message = message
|
15
|
+
@http_code = http_code
|
16
|
+
@http_body = http_body
|
17
|
+
@response_code = response_code
|
18
|
+
end
|
14
19
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
20
|
+
def to_s
|
21
|
+
status = @http_code.nil? ? '' : "#{@http_code} error."
|
22
|
+
ideal_code = @response_code.nil? ? '' : "(#{@response_code})"
|
23
|
+
"#{status} error. (#{ideal_code}) #{message}"
|
24
|
+
end
|
25
|
+
end
|
21
26
|
|
22
|
-
|
23
|
-
|
27
|
+
class AuthenticationError < IdealPostcodesError
|
28
|
+
end
|
24
29
|
|
25
|
-
|
26
|
-
|
30
|
+
class TokenExhaustedError < IdealPostcodesError
|
31
|
+
end
|
27
32
|
|
28
|
-
|
29
|
-
|
33
|
+
class LimitReachedError < IdealPostcodesError
|
34
|
+
end
|
30
35
|
|
31
|
-
|
32
|
-
|
33
|
-
end
|
36
|
+
class ResourceNotFoundError < IdealPostcodesError
|
37
|
+
end
|
38
|
+
end
|
data/lib/idealpostcodes/key.rb
CHANGED
@@ -1,13 +1,14 @@
|
|
1
1
|
module IdealPostcodes
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
2
|
+
module Key
|
3
|
+
def self.lookup(api_key)
|
4
|
+
response = IdealPostcodes.request :get, "keys/#{api_key}"
|
5
|
+
response[:result]
|
6
|
+
end
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
end
|
8
|
+
def self.lookup_details(api_key, secret)
|
9
|
+
response =
|
10
|
+
IdealPostcodes.request :get, "keys/#{api_key}", { user_token: secret }
|
11
|
+
response[:result]
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -1,22 +1,23 @@
|
|
1
1
|
module IdealPostcodes
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
addresses = []
|
10
|
-
end
|
11
|
-
addresses
|
12
|
-
end
|
2
|
+
module Postcode
|
3
|
+
def self.lookup(postcode)
|
4
|
+
begin
|
5
|
+
response = IdealPostcodes.request :get, "postcodes/#{postcode}"
|
6
|
+
addresses = response[:result]
|
7
|
+
rescue IdealPostcodes::ResourceNotFoundError => e
|
8
|
+
raise e unless e.response_code == 4040
|
13
9
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
10
|
+
addresses = []
|
11
|
+
end
|
12
|
+
addresses
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.find_by_location(geolocation)
|
16
|
+
query = { lonlat: "#{geolocation[:longitude]},#{geolocation[:latitude]}" }
|
17
|
+
query[:limit] = geolocation[:limit] unless geolocation[:limit].nil?
|
18
|
+
query[:radius] = geolocation[:radius] unless geolocation[:radius].nil?
|
19
|
+
response = IdealPostcodes.request :get, 'postcodes', query
|
20
|
+
response[:result]
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/idealpostcodes/util.rb
CHANGED
@@ -1,29 +1,42 @@
|
|
1
|
+
require 'uri'
|
2
|
+
|
1
3
|
module IdealPostcodes
|
2
|
-
|
4
|
+
DEFAULT_PARSER = URI::Parser.new
|
3
5
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
end
|
9
|
-
result.join('&')
|
10
|
-
end
|
6
|
+
class Util
|
7
|
+
def self.escape(str)
|
8
|
+
IdealPostcodes::DEFAULT_PARSER.escape(str)
|
9
|
+
end
|
11
10
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
end
|
20
|
-
temp
|
21
|
-
when Array
|
22
|
-
object.map { |elem| keys_to_sym(elem) }
|
23
|
-
else
|
24
|
-
object
|
25
|
-
end
|
26
|
-
end
|
11
|
+
def self.merge_params(hash)
|
12
|
+
result = []
|
13
|
+
hash.each do |key, value|
|
14
|
+
result << "#{escape(key.to_s)}=#{escape(value.to_s)}"
|
15
|
+
end
|
16
|
+
result.join('&')
|
17
|
+
end
|
27
18
|
|
28
|
-
|
29
|
-
|
19
|
+
def self.keys_to_sym(object)
|
20
|
+
case object
|
21
|
+
when Hash
|
22
|
+
temp = {}
|
23
|
+
object.each do |key, value|
|
24
|
+
key =
|
25
|
+
(
|
26
|
+
begin
|
27
|
+
key.to_sym
|
28
|
+
rescue StandardError
|
29
|
+
key
|
30
|
+
end
|
31
|
+
) || key
|
32
|
+
temp[key] = keys_to_sym(value)
|
33
|
+
end
|
34
|
+
temp
|
35
|
+
when Array
|
36
|
+
object.map { |elem| keys_to_sym(elem) }
|
37
|
+
else
|
38
|
+
object
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -1,3 +1,3 @@
|
|
1
1
|
module IdealPostcodes
|
2
|
-
|
3
|
-
end
|
2
|
+
VERSION = '2.0.1'
|
3
|
+
end
|
data/lib/idealpostcodes.rb
CHANGED
@@ -14,99 +14,111 @@ require 'idealpostcodes/address'
|
|
14
14
|
require 'idealpostcodes/postcode'
|
15
15
|
|
16
16
|
module IdealPostcodes
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
raise IdealPostcodes::AuthenticationError.new('No Secret Key provided. ' +
|
63
|
-
'Set your secret key with IdealPostcodes.apply_secret #your_key') if @secret.nil?
|
64
|
-
response = Key.lookup_details @api_key, @secret
|
65
|
-
end
|
66
|
-
|
67
|
-
private
|
68
|
-
|
69
|
-
def self.resource_url(path='')
|
70
|
-
URI.escape "#{@base_url}/v#{@version}/#{path}"
|
71
|
-
end
|
72
|
-
|
73
|
-
def self.generate_request(options)
|
74
|
-
RestClient::Request.execute(options)
|
75
|
-
end
|
76
|
-
|
77
|
-
def self.parse(response)
|
78
|
-
begin
|
79
|
-
Util.keys_to_sym JSON.parse(response)
|
80
|
-
rescue JSON::ParserError => e
|
81
|
-
raise handle_client_error(e)
|
17
|
+
@base_url = 'https://api.ideal-postcodes.co.uk'
|
18
|
+
@version = '1'
|
19
|
+
|
20
|
+
class << self
|
21
|
+
attr_accessor :api_key, :base_url, :version, :secret
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.request(method, path, params = {})
|
25
|
+
unless @api_key
|
26
|
+
raise IdealPostcodes::AuthenticationError, 'No API Key provided. ' +
|
27
|
+
'Set your key with IdealPostcodes.api_key = #your_key'
|
28
|
+
end
|
29
|
+
|
30
|
+
url = URI.parse(resource_url(path))
|
31
|
+
params.merge! api_key: @api_key
|
32
|
+
url.query = Util.merge_params(params)
|
33
|
+
request_options = { method: method.downcase.to_sym, url: url.to_s }
|
34
|
+
|
35
|
+
begin
|
36
|
+
response = generate_request(request_options)
|
37
|
+
rescue RestClient::ExceptionWithResponse => e
|
38
|
+
if rcode = e.http_code && rbody = e.http_body
|
39
|
+
handle_error(rcode, rbody)
|
40
|
+
else
|
41
|
+
handle_client_error(e)
|
42
|
+
end
|
43
|
+
rescue RestClient::Exception, Errno::ECONNREFUSED => e
|
44
|
+
handle_client_error(e)
|
45
|
+
end
|
46
|
+
parse response.body
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.apply_secret(secret)
|
50
|
+
@secret = secret
|
51
|
+
end
|
52
|
+
|
53
|
+
def self.key_available
|
54
|
+
response = Key.lookup @api_key
|
55
|
+
response[:available]
|
56
|
+
end
|
57
|
+
|
58
|
+
def self.key_details
|
59
|
+
if @secret.nil?
|
60
|
+
raise IdealPostcodes::AuthenticationError, 'No Secret Key provided. ' +
|
61
|
+
'Set your secret key with IdealPostcodes.apply_secret #your_key'
|
82
62
|
end
|
83
|
-
|
63
|
+
response = Key.lookup_details @api_key, @secret
|
64
|
+
end
|
84
65
|
|
85
|
-
|
66
|
+
def self.resource_url(path = '')
|
67
|
+
IdealPostcodes::Util.escape "#{@base_url}/v#{@version}/#{path}"
|
68
|
+
end
|
69
|
+
|
70
|
+
def self.generate_request(options)
|
71
|
+
RestClient::Request.execute(options)
|
72
|
+
end
|
73
|
+
|
74
|
+
def self.parse(response)
|
75
|
+
Util.keys_to_sym JSON.parse(response)
|
76
|
+
rescue JSON::ParserError => e
|
77
|
+
raise handle_client_error(e)
|
78
|
+
end
|
79
|
+
|
80
|
+
def self.handle_error(http_code, http_body)
|
86
81
|
error = parse http_body
|
87
82
|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
83
|
+
ideal_code = error[:code]
|
84
|
+
ideal_message = error[:message]
|
85
|
+
|
86
|
+
case ideal_code
|
87
|
+
when 4010
|
88
|
+
raise AuthenticationError.new ideal_message,
|
89
|
+
http_code,
|
90
|
+
http_body,
|
91
|
+
ideal_code
|
92
|
+
when 4020
|
93
|
+
raise TokenExhaustedError.new ideal_message,
|
94
|
+
http_code,
|
95
|
+
http_body,
|
96
|
+
ideal_code
|
97
|
+
when 4021
|
98
|
+
raise LimitReachedError.new ideal_message,
|
99
|
+
http_code,
|
100
|
+
http_body,
|
101
|
+
ideal_code
|
102
|
+
when 4040
|
103
|
+
raise ResourceNotFoundError.new ideal_message,
|
104
|
+
http_code,
|
105
|
+
http_body,
|
106
|
+
ideal_code
|
107
|
+
else
|
108
|
+
raise IdealPostcodesError.new ideal_message,
|
109
|
+
http_code,
|
110
|
+
http_body,
|
111
|
+
ideal_code
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def self.handle_client_error(error)
|
116
|
+
raise IdealPostcodesError, "An unexpected error occured: #{error.message})"
|
117
|
+
end
|
118
|
+
|
119
|
+
def self.general_error(response_code, response_body)
|
120
|
+
IdealPostcodesError.new 'Invalid response object',
|
121
|
+
response_code,
|
122
|
+
response_body
|
123
|
+
end
|
124
|
+
end
|
data/spec/addresses_spec.rb
CHANGED
@@ -1,68 +1,68 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe IdealPostcodes::Address do
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
4
|
+
describe '.lookup' do
|
5
|
+
it 'returns an address for a valid UDPRN' do
|
6
|
+
address = IdealPostcodes::Address.lookup 0
|
7
|
+
expect(is_address(address)).to eq(true)
|
8
|
+
end
|
9
|
+
it 'returns nil for an invalid UDPRN' do
|
10
|
+
address = IdealPostcodes::Address.lookup -1
|
11
|
+
expect(address).to be_nil
|
12
|
+
end
|
13
|
+
it 'raises an exception if invalid key' do
|
14
|
+
IdealPostcodes.api_key = 'foo'
|
15
|
+
expect { IdealPostcodes::Address.lookup 0 }.to raise_error(
|
16
|
+
IdealPostcodes::AuthenticationError
|
17
|
+
)
|
18
|
+
end
|
19
|
+
it 'raises an exception if no lookups remaining' do
|
20
|
+
expect { IdealPostcodes::Address.lookup -2 }.to raise_error(
|
21
|
+
IdealPostcodes::TokenExhaustedError
|
22
|
+
)
|
23
|
+
end
|
24
|
+
it 'raises an exception if limit breached' do
|
25
|
+
expect { IdealPostcodes::Address.lookup -3 }.to raise_error(
|
26
|
+
IdealPostcodes::LimitReachedError
|
27
|
+
)
|
28
|
+
end
|
29
|
+
end
|
30
30
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
31
|
+
describe '.search' do
|
32
|
+
it 'returns results in a SearchResult object' do
|
33
|
+
results = IdealPostcodes::Address.search 'ID1 1QD'
|
34
|
+
expect(results).to be_a(IdealPostcodes::Address::SearchResult)
|
35
|
+
expect(results.addresses.length).to be > 0
|
36
|
+
results.addresses.each do |address|
|
37
|
+
expect(is_address(address)).to eq(true)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
it 'is sensitive to limit' do
|
41
|
+
limit = 1
|
42
|
+
results = IdealPostcodes::Address.search 'High Street', limit: limit
|
43
|
+
expect(results.addresses.length).to equal(limit)
|
44
|
+
expect(results.limit).to equal(limit)
|
45
|
+
end
|
46
|
+
it 'is sensitive to page' do
|
47
|
+
page = 1
|
48
|
+
results = IdealPostcodes::Address.search 'High Street', page: page
|
49
|
+
expect(results.page).to equal(page)
|
50
|
+
end
|
51
|
+
it 'raises an exception if invalid key' do
|
52
|
+
IdealPostcodes.api_key = 'foo'
|
53
|
+
expect {
|
54
|
+
results = IdealPostcodes::Address.search 'ID1 1QD'
|
55
|
+
}.to raise_error(IdealPostcodes::AuthenticationError)
|
56
|
+
end
|
57
|
+
it 'raises an exception if no lookups remaining' do
|
58
|
+
expect {
|
59
|
+
results = IdealPostcodes::Address.search 'ID1 CLIP'
|
60
|
+
}.to raise_error(IdealPostcodes::TokenExhaustedError)
|
61
|
+
end
|
62
|
+
it 'raises an exception if limit breached' do
|
63
|
+
expect {
|
64
|
+
results = IdealPostcodes::Address.search 'ID1 CHOP'
|
65
|
+
}.to raise_error(IdealPostcodes::LimitReachedError)
|
66
|
+
end
|
67
|
+
end
|
68
68
|
end
|