ideal_postcodes 2.0.0 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|