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.
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