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.
Files changed (48) hide show
  1. checksums.yaml +5 -5
  2. data/.github/workflows/ci.yml +22 -0
  3. data/lib/ideal_postcodes.rb +1 -1
  4. data/lib/idealpostcodes/address.rb +28 -28
  5. data/lib/idealpostcodes/errors.rb +31 -26
  6. data/lib/idealpostcodes/key.rb +12 -11
  7. data/lib/idealpostcodes/postcode.rb +21 -20
  8. data/lib/idealpostcodes/util.rb +38 -25
  9. data/lib/idealpostcodes/version.rb +2 -2
  10. data/lib/idealpostcodes.rb +104 -92
  11. data/spec/addresses_spec.rb +63 -63
  12. data/spec/idealpostcodes_spec.rb +51 -51
  13. data/spec/keys_spec.rb +21 -21
  14. data/spec/postcodes_spec.rb +74 -63
  15. data/spec/spec_helper.rb +50 -29
  16. data/spec/vcr_cassettes/IdealPostcodes_Address_lookup_raises_an_exception_if_invalid_key.yml +39 -39
  17. data/spec/vcr_cassettes/IdealPostcodes_Address_lookup_raises_an_exception_if_limit_breached.yml +39 -39
  18. data/spec/vcr_cassettes/IdealPostcodes_Address_lookup_raises_an_exception_if_no_lookups_remaining.yml +39 -39
  19. data/spec/vcr_cassettes/IdealPostcodes_Address_lookup_returns_an_address_for_a_valid_UDPRN.yml +71 -71
  20. data/spec/vcr_cassettes/IdealPostcodes_Address_lookup_returns_nil_for_an_invalid_UDPRN.yml +39 -39
  21. data/spec/vcr_cassettes/IdealPostcodes_Address_search_is_sensitive_to_limit.yml +78 -78
  22. data/spec/vcr_cassettes/IdealPostcodes_Address_search_is_sensitive_to_page.yml +366 -366
  23. data/spec/vcr_cassettes/IdealPostcodes_Address_search_raises_an_exception_if_invalid_key.yml +39 -39
  24. data/spec/vcr_cassettes/IdealPostcodes_Address_search_raises_an_exception_if_limit_breached.yml +39 -39
  25. data/spec/vcr_cassettes/IdealPostcodes_Address_search_raises_an_exception_if_no_lookups_remaining.yml +39 -39
  26. data/spec/vcr_cassettes/IdealPostcodes_Address_search_returns_results_in_a_SearchResult_object.yml +270 -270
  27. data/spec/vcr_cassettes/IdealPostcodes_Key_lookup_details_returns_key_details.yml +58 -58
  28. data/spec/vcr_cassettes/IdealPostcodes_Key_lookup_returns_the_availability_status_of_a_key_false_key_.yml +42 -42
  29. data/spec/vcr_cassettes/IdealPostcodes_Key_lookup_returns_the_availability_status_of_a_key_true_key_.yml +42 -42
  30. data/spec/vcr_cassettes/IdealPostcodes_Postcode_find_by_location_is_sensitive_to_limit_parameter.yml +49 -49
  31. data/spec/vcr_cassettes/IdealPostcodes_Postcode_find_by_location_is_sensitive_to_radius_parament.yml +130 -130
  32. data/spec/vcr_cassettes/IdealPostcodes_Postcode_find_by_location_returns_an_array_of_postcodes_and_locations.yml +81 -81
  33. data/spec/vcr_cassettes/IdealPostcodes_Postcode_find_by_location_returns_an_empty_array_if_no_results_are_found.yml +40 -40
  34. data/spec/vcr_cassettes/IdealPostcodes_Postcode_lookup_raises_an_exception_if_invalid_key.yml +39 -39
  35. data/spec/vcr_cassettes/IdealPostcodes_Postcode_lookup_raises_an_exception_if_key_has_run_out_of_balance.yml +39 -39
  36. data/spec/vcr_cassettes/IdealPostcodes_Postcode_lookup_raises_an_exception_if_limit_has_been_reached.yml +39 -39
  37. data/spec/vcr_cassettes/IdealPostcodes_Postcode_lookup_returns_a_list_of_addresses_for_a_postcode.yml +265 -265
  38. data/spec/vcr_cassettes/IdealPostcodes_Postcode_lookup_returns_an_empty_array_if_postcode_does_not_exist.yml +39 -39
  39. data/spec/vcr_cassettes/IdealPostcodes_key_available_returns_false_if_key_is_unavailable.yml +42 -42
  40. data/spec/vcr_cassettes/IdealPostcodes_key_available_returns_true_if_key_is_available.yml +42 -42
  41. data/spec/vcr_cassettes/IdealPostcodes_key_details_raises_an_exception_if_no_secret_is_provided.yml +42 -42
  42. data/spec/vcr_cassettes/IdealPostcodes_key_details_returns_key_information.yml +58 -58
  43. data/spec/vcr_cassettes/IdealPostcodes_request_generates_a_HTTP_request.yml +265 -265
  44. data/spec/vcr_cassettes/IdealPostcodes_request_raises_authentication_error_if_invalid_key_is_provided.yml +39 -39
  45. data/spec/vcr_cassettes/IdealPostcodes_request_raises_limit_reached_error_if_a_limit_has_been_breached.yml +39 -39
  46. data/spec/vcr_cassettes/IdealPostcodes_request_raises_token_exhausted_error_if_key_balance_is_depleted.yml +39 -39
  47. metadata +4 -5
  48. data/.travis.yml +0 -9
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: ced7ca1b0bfedf6e6e3de16898062cc335927ed5
4
- data.tar.gz: a59fe3d7b1cc4797842872997a7128ee1e2399e3
2
+ SHA256:
3
+ metadata.gz: 631e1f7827c1ebd216ac8da69d07f41e99dfcb542ea8db79160f81fb4e27e2f7
4
+ data.tar.gz: 528c592ee660794a49eaca814817181d7bb46dc67a848dd3015d9ed64023af3a
5
5
  SHA512:
6
- metadata.gz: 79892c818f0d4319a12ec35ef81aca5aee11d5478742989bfe0f87fc4f77e1567c4efbd08d254663984a5aee15ba4ee15a79fffe91c3e4d34f413951ec42ba04
7
- data.tar.gz: 471e2ac36ad0eb8c662a641e11d5d7d23b5e77c0952901b18611ee01ae54d26717c86b198d63635d48451a5deca67e34a61379d31643f303404bfba84079795f
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
@@ -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
- 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
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
- 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
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
- 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
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
- class IdealPostcodesError < StandardError
3
- attr_reader :message
4
- attr_reader :http_code
5
- attr_reader :http_body
6
- attr_reader :response_code
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
- def initialize(message = nil, http_code = nil, http_body = nil, response_code = nil)
9
- @message = message
10
- @http_code = http_code
11
- @http_body = http_body
12
- @response_code = response_code
13
- end
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
- def to_s
16
- status = @http_code.nil? ? "" : "#{@http_code} error."
17
- ideal_code = @response_code.nil? ? "" : "(#{@response_code})"
18
- "#{status} error. (#{ideal_code}) #{message}"
19
- end
20
- end
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
- class AuthenticationError< IdealPostcodesError
23
- end
27
+ class AuthenticationError < IdealPostcodesError
28
+ end
24
29
 
25
- class TokenExhaustedError < IdealPostcodesError
26
- end
30
+ class TokenExhaustedError < IdealPostcodesError
31
+ end
27
32
 
28
- class LimitReachedError < IdealPostcodesError
29
- end
33
+ class LimitReachedError < IdealPostcodesError
34
+ end
30
35
 
31
- class ResourceNotFoundError < IdealPostcodesError
32
- end
33
- end
36
+ class ResourceNotFoundError < IdealPostcodesError
37
+ end
38
+ end
@@ -1,13 +1,14 @@
1
1
  module IdealPostcodes
2
- module Key
3
- def self.lookup api_key
4
- response = IdealPostcodes.request :get, "keys/#{api_key}"
5
- response[:result]
6
- end
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
- def self.lookup_details api_key, secret
9
- response = IdealPostcodes.request :get, "keys/#{api_key}", { user_token: secret }
10
- response[:result]
11
- end
12
- end
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
- module Postcode
3
- def self.lookup postcode
4
- begin
5
- response = IdealPostcodes.request :get, "postcodes/#{postcode}"
6
- addresses = response[:result]
7
- rescue IdealPostcodes::ResourceNotFoundError => error
8
- raise error unless error.response_code == 4040
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
- def self.find_by_location geolocation
15
- query = {lonlat: "#{geolocation[:longitude]},#{geolocation[:latitude]}"}
16
- query[:limit] = geolocation[:limit] unless geolocation[:limit].nil?
17
- query[:radius] = geolocation[:radius] unless geolocation[:radius].nil?
18
- response = IdealPostcodes.request :get, 'postcodes', query
19
- response[:result]
20
- end
21
- end
22
- end
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
@@ -1,29 +1,42 @@
1
+ require 'uri'
2
+
1
3
  module IdealPostcodes
2
- class Util
4
+ DEFAULT_PARSER = URI::Parser.new
3
5
 
4
- def self.merge_params(hash)
5
- result = []
6
- hash.each do |key, value|
7
- result << "#{CGI.escape(key.to_s)}=#{CGI.escape(value.to_s)}"
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
- def self.keys_to_sym(object)
13
- case object
14
- when Hash
15
- temp = {}
16
- object.each do |key, value|
17
- key = (key.to_sym rescue key) || key
18
- temp[key] = keys_to_sym(value)
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
- end
29
- end
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
- VERSION = '2.0.0'
3
- end
2
+ VERSION = '2.0.1'
3
+ end
@@ -14,99 +14,111 @@ require 'idealpostcodes/address'
14
14
  require 'idealpostcodes/postcode'
15
15
 
16
16
  module IdealPostcodes
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.new('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 = {
34
- method: method.downcase.to_sym,
35
- url: url.to_s
36
- }
37
-
38
- begin
39
- response = generate_request(request_options)
40
- rescue RestClient::ExceptionWithResponse => error
41
- if rcode = error.http_code && rbody = error.http_body
42
- handle_error(rcode, rbody)
43
- else
44
- handle_client_error(error)
45
- end
46
- rescue RestClient::Exception, Errno::ECONNREFUSED => error
47
- handle_client_error(error)
48
- end
49
- parse response.body
50
- end
51
-
52
- def self.apply_secret(secret)
53
- @secret = secret
54
- end
55
-
56
- def self.key_available
57
- response = Key.lookup @api_key
58
- response[:available]
59
- end
60
-
61
- def self.key_details
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
- end
63
+ response = Key.lookup_details @api_key, @secret
64
+ end
84
65
 
85
- def self.handle_error(http_code, http_body)
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
- ideal_code, ideal_message = error[:code], error[:message]
89
-
90
- case ideal_code
91
- when 4010
92
- raise AuthenticationError.new ideal_message, http_code, http_body, ideal_code
93
- when 4020
94
- raise TokenExhaustedError.new ideal_message, http_code, http_body, ideal_code
95
- when 4021
96
- raise LimitReachedError.new ideal_message, http_code, http_body, ideal_code
97
- when 4040
98
- raise ResourceNotFoundError.new ideal_message, http_code, http_body, ideal_code
99
- else
100
- raise IdealPostcodesError.new ideal_message, http_code, http_body, ideal_code
101
- end
102
- end
103
-
104
- def self.handle_client_error(error)
105
- raise IdealPostcodesError.new("An unexpected error occured: #{error.message})")
106
- end
107
-
108
- def self.general_error(response_code, response_body)
109
- IdealPostcodesError.new 'Invalid response object', response_code, response_body
110
- end
111
-
112
- end
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
@@ -1,68 +1,68 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe IdealPostcodes::Address do
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 {
16
- IdealPostcodes::Address.lookup 0
17
- }.to raise_error(IdealPostcodes::AuthenticationError)
18
- end
19
- it 'raises an exception if no lookups remaining' do
20
- expect {
21
- IdealPostcodes::Address.lookup -2
22
- }.to raise_error(IdealPostcodes::TokenExhaustedError)
23
- end
24
- it 'raises an exception if limit breached' do
25
- expect {
26
- IdealPostcodes::Address.lookup -3
27
- }.to raise_error(IdealPostcodes::LimitReachedError)
28
- end
29
- end
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
- 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
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