gds-api-adapters 1.7.1 → 1.8.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -29,6 +29,20 @@ something that actually logs:
29
29
 
30
30
  GdsApi::Base.logger = Logger.new("/path/to/file.log")
31
31
 
32
+ ## Authorization
33
+
34
+ The API Adapters currently support either HTTP Basic authentication or OAuth2
35
+ (bearer token) authorization. This is only used for Panopticon registration at
36
+ present. The GdsApi::Panopticon::Registerer adapter expects a constant called
37
+ PANOPTICON_API_CREDENTIALS to be defined and will use that to pass the relevant
38
+ options to the HTTP client.
39
+
40
+ To use bearer token authorization the format that constant should be a hash of
41
+ the form:
42
+
43
+ PANOPTICON_API_CREDENTIALS = { bearer_token: 'MY_BEARER_TOKEN' }
44
+
45
+
32
46
  ## Test Helpers
33
47
 
34
48
  There are also test helpers for stubbing various requests in other apps.
data/lib/gds_api/base.rb CHANGED
@@ -10,11 +10,7 @@ class GdsApi::Base
10
10
  end
11
11
 
12
12
  def create_client
13
- if options[:access_key]
14
- GdsApi::OAuth2Client.new(options)
15
- else
16
- GdsApi::JsonClient.new(options)
17
- end
13
+ GdsApi::JsonClient.new(options)
18
14
  end
19
15
 
20
16
  def_delegators :client, :get_json, :get_json!,
@@ -26,7 +26,7 @@ module GdsApi
26
26
  @options = options
27
27
  end
28
28
 
29
- REQUEST_HEADERS = {
29
+ DEFAULT_REQUEST_HEADERS = {
30
30
  'Accept' => 'application/json',
31
31
  'Content-Type' => 'application/json',
32
32
  'User-Agent' => "GDS Api Client v. #{GdsApi::VERSION}"
@@ -96,21 +96,46 @@ module GdsApi
96
96
  end
97
97
  end
98
98
 
99
+ def extract_url_and_path(url)
100
+ url = URI.parse(url)
101
+ path = url.path
102
+ path = path + "?" + url.query if url.query
103
+ return url, path
104
+ end
105
+
106
+ def attach_auth_options(request)
107
+ if @options[:bearer_token]
108
+ request.add_field('Authorization', "Bearer #{@options[:bearer_token]}")
109
+ elsif @options[:basic_auth]
110
+ request.basic_auth(@options[:basic_auth][:user], @options[:basic_auth][:password])
111
+ end
112
+ end
113
+
114
+ def set_timeout(http)
115
+ unless options[:disable_timeout]
116
+ http.read_timeout = options[:timeout] || DEFAULT_TIMEOUT_IN_SECONDS
117
+ end
118
+ end
119
+
120
+ def ssl_options(port)
121
+ if port == 443
122
+ {use_ssl: true, verify_mode: OpenSSL::SSL::VERIFY_NONE}
123
+ else
124
+ {}
125
+ end
126
+ end
127
+
99
128
  def do_request(method_class, url, params = nil)
100
129
  loggable = {request_uri: url, start_time: Time.now.to_f}
101
130
  start_logging = loggable.merge(action: 'start')
102
131
  logger.debug start_logging.to_json
103
132
 
104
- url = URI.parse(url)
105
- path = url.path
106
- path = path + "?" + url.query if url.query
133
+ url, path = extract_url_and_path(url)
107
134
 
108
- response = Net::HTTP.start(url.host, url.port, nil, nil, nil, nil, {use_ssl: url.port == 443, verify_mode: (OpenSSL::SSL::VERIFY_NONE if url.port == 443)}) do |http|
109
- unless options[:disable_timeout]
110
- http.read_timeout = options[:timeout] || DEFAULT_TIMEOUT_IN_SECONDS
111
- end
112
- request = method_class.new(path, REQUEST_HEADERS)
113
- request.basic_auth(@options[:basic_auth][:user], @options[:basic_auth][:password]) if @options[:basic_auth]
135
+ response = Net::HTTP.start(url.host, url.port, nil, nil, nil, nil, ssl_options(url.port)) do |http|
136
+ set_timeout(http)
137
+ request = method_class.new(path, DEFAULT_REQUEST_HEADERS)
138
+ attach_auth_options(request)
114
139
  request.body = params.to_json if params
115
140
  http.request(request)
116
141
  end
@@ -34,7 +34,7 @@ module GdsApi
34
34
  slug = input_details.delete('slug')
35
35
  uri = "#{PUBLISHER_ENDPOINT}/local_transactions/#{slug}/verify_snac.json"
36
36
  stub_request(:post, uri).with(:body => JSON.dump(input_details),
37
- :headers => GdsApi::JsonClient::REQUEST_HEADERS).
37
+ :headers => GdsApi::JsonClient::DEFAULT_REQUEST_HEADERS).
38
38
  to_return(:body => json, :status => 200)
39
39
  end
40
40
 
@@ -1,3 +1,3 @@
1
1
  module GdsApi
2
- VERSION = '1.7.1'
2
+ VERSION = '1.8.0'
3
3
  end
@@ -125,8 +125,23 @@ class JsonClientTest < MiniTest::Spec
125
125
  def test_client_can_use_basic_auth
126
126
  client = GdsApi::JsonClient.new(basic_auth: {user: 'user', password: 'password'})
127
127
 
128
- stub_request(:put, "http://user:password@some.endpoint/some.json").to_return(:body => '{"a":1}', :status => 200)
128
+ stub_request(:put, "http://user:password@some.endpoint/some.json").
129
+ to_return(:body => '{"a":1}', :status => 200)
130
+
129
131
  response = client.put_json("http://some.endpoint/some.json", {})
130
132
  assert_equal 1, response.a
131
133
  end
134
+
135
+ def test_client_can_use_bearer_token
136
+ client = GdsApi::JsonClient.new(bearer_token: 'SOME_BEARER_TOKEN')
137
+ expected_headers = GdsApi::JsonClient::DEFAULT_REQUEST_HEADERS.
138
+ merge('Authorization' => 'Bearer SOME_BEARER_TOKEN')
139
+
140
+ stub_request(:put, "http://some.other.endpoint/some.json").
141
+ with(:headers => expected_headers).
142
+ to_return(:body => '{"a":2}', :status => 200)
143
+
144
+ response = client.put_json("http://some.other.endpoint/some.json", {})
145
+ assert_equal 2, response.a
146
+ end
132
147
  end
@@ -17,7 +17,7 @@ class LicenceApplicationApiTest < MiniTest::Unit::TestCase
17
17
 
18
18
  def test_should_return_an_error_message_if_licence_is_unrecognised
19
19
  stub_request(:get, "https://licenceapplication.test.alphagov.co.uk/api/bloop").
20
- with(headers: GdsApi::JsonClient::REQUEST_HEADERS).
20
+ with(headers: GdsApi::JsonClient::DEFAULT_REQUEST_HEADERS).
21
21
  to_return(status: 404, body: "{\"error\": [\"Unrecognised Licence Id: bloop\"]}")
22
22
 
23
23
  assert_equal nil, api.details_for_licence("bloop")
@@ -25,7 +25,7 @@ class LicenceApplicationApiTest < MiniTest::Unit::TestCase
25
25
 
26
26
  def test_should_provide_full_licence_details_for_canonical_id
27
27
  stub_request(:get, "https://licenceapplication.test.alphagov.co.uk/api/590001").
28
- with(headers: GdsApi::JsonClient::REQUEST_HEADERS).
28
+ with(headers: GdsApi::JsonClient::DEFAULT_REQUEST_HEADERS).
29
29
  to_return(status: 200, body: "{\"issuingAuthorityType\":\"non-geographical\",\"geographicalAvailability\":\"England\",\"issuingAuthorities\":[{\"authorityName\":\"Authority Name\",\"interactions\":{\"apply\":{\"url\":\"www.gov.uk\",\"usesLicensify\":true,\"description\":\"Custom description\",\"payment\":\"none\",\"paymentAmount\":0}}}]}")
30
30
 
31
31
  expected = {
@@ -48,7 +48,7 @@ class LicenceApplicationApiTest < MiniTest::Unit::TestCase
48
48
 
49
49
  def test_should_return_an_error_message_for_bad_snac_code_entry
50
50
  stub_request(:get, "https://licenceapplication.test.alphagov.co.uk/api/590001/bleep").
51
- with(headers: GdsApi::JsonClient::REQUEST_HEADERS).
51
+ with(headers: GdsApi::JsonClient::DEFAULT_REQUEST_HEADERS).
52
52
  to_return(status: 404, body: "{\"error\": [\"Unrecognised SNAC: bleep\"]}")
53
53
 
54
54
  assert_equal nil, api.details_for_licence("590001", "bleep")
@@ -56,7 +56,7 @@ class LicenceApplicationApiTest < MiniTest::Unit::TestCase
56
56
 
57
57
  def test_should_return_error_messages_for_bad_licence_id_and_snac_code
58
58
  stub_request(:get, "https://licenceapplication.test.alphagov.co.uk/api/bloop/bleep").
59
- with(headers: GdsApi::JsonClient::REQUEST_HEADERS).
59
+ with(headers: GdsApi::JsonClient::DEFAULT_REQUEST_HEADERS).
60
60
  to_return(status: 404, body: "{\"error\": [\"Unrecognised Licence Id: bloop\", \"Unrecognised SNAC: bleep\"]}")
61
61
 
62
62
  assert_equal nil, api.details_for_licence("bloop", "bleep")
@@ -64,7 +64,7 @@ class LicenceApplicationApiTest < MiniTest::Unit::TestCase
64
64
 
65
65
  def test_should_return_error_message_to_pick_a_relevant_snac_code_for_the_provided_licence_id
66
66
  stub_request(:get, "https://licenceapplication.test.alphagov.co.uk/api/590001/sw10").
67
- with(headers: GdsApi::JsonClient::REQUEST_HEADERS).
67
+ with(headers: GdsApi::JsonClient::DEFAULT_REQUEST_HEADERS).
68
68
  to_return(status: 200, body: "{\"error\": [\"Licence not available in the provided snac area\"], \"geographicalAvailability\": [\"Scotland\", \"NI\"]}")
69
69
 
70
70
  expected = {
@@ -173,7 +173,7 @@ class PanopticonApiTest < MiniTest::Unit::TestCase
173
173
 
174
174
  def test_should_be_able_to_fetch_curated_lists
175
175
  stub_request(:get, "#{PANOPTICON_ENDPOINT}/curated_lists.json").
176
- with(:headers => GdsApi::JsonClient::REQUEST_HEADERS).
176
+ with(:headers => GdsApi::JsonClient::DEFAULT_REQUEST_HEADERS).
177
177
  to_return(:status => 200, :body => '{ "crume": ["pinishment", "prosin"]}', :headers => {})
178
178
  assert_equal({ "crume" => ["pinishment", "prosin"]}, api.curated_lists)
179
179
  end
@@ -5,6 +5,7 @@ require 'gds_api/test_helpers/publisher'
5
5
 
6
6
  describe GdsApi::Publisher do
7
7
  include GdsApi::TestHelpers::Publisher
8
+ PUBLISHER_ENDPOINT = GdsApi::TestHelpers::Publisher::PUBLISHER_ENDPOINT
8
9
 
9
10
  def basic_answer
10
11
  {
@@ -101,7 +102,7 @@ describe GdsApi::Publisher do
101
102
 
102
103
  it "should be able to retrieve local transaction details" do
103
104
  stub_request(:post, "#{PUBLISHER_ENDPOINT}/local_transactions/fake-transaction/verify_snac.json").
104
- with(:body => "{\"snac_codes\":[12345]}", :headers => GdsApi::JsonClient::REQUEST_HEADERS).
105
+ with(:body => "{\"snac_codes\":[12345]}", :headers => GdsApi::JsonClient::DEFAULT_REQUEST_HEADERS).
105
106
  to_return(:status => 200, :body => '{"snac": "12345"}', :headers => {})
106
107
  assert_equal '12345', api.council_for_slug('fake-transaction', [12345])
107
108
  end
@@ -141,7 +142,7 @@ describe GdsApi::Publisher do
141
142
 
142
143
  it "should return nil if a council snac code is not found" do
143
144
  stub_request(:get, "#{PUBLISHER_ENDPOINT}/local_transactions/find_by_snac?snac=bloop").
144
- with(:headers => GdsApi::JsonClient::REQUEST_HEADERS).
145
+ with(:headers => GdsApi::JsonClient::DEFAULT_REQUEST_HEADERS).
145
146
  to_return(:status => 404, :body => " ", :headers => {})
146
147
 
147
148
  assert_equal nil, api.council_for_snac_code("bloop")
@@ -149,7 +150,7 @@ describe GdsApi::Publisher do
149
150
 
150
151
  it "should return a council hash for a snac code" do
151
152
  stub_request(:get, "#{PUBLISHER_ENDPOINT}/local_transactions/find_by_snac?snac=AA00").
152
- with(:headers => GdsApi::JsonClient::REQUEST_HEADERS).
153
+ with(:headers => GdsApi::JsonClient::DEFAULT_REQUEST_HEADERS).
153
154
  to_return(:status => 200, :body => '{"name": "Some Council", "snac": "AA00"}', :headers => {})
154
155
 
155
156
  expected = {"name" => "Some Council", "snac" => "AA00"}
@@ -158,7 +159,7 @@ describe GdsApi::Publisher do
158
159
 
159
160
  it "should return nil if a council name is not found" do
160
161
  stub_request(:get, "#{PUBLISHER_ENDPOINT}/local_transactions/find_by_council_name?name=bloop").
161
- with(:headers => GdsApi::JsonClient::REQUEST_HEADERS).
162
+ with(:headers => GdsApi::JsonClient::DEFAULT_REQUEST_HEADERS).
162
163
  to_return(:status => 404, :body => " ", :headers => {})
163
164
 
164
165
  assert_equal nil, api.council_for_name("bloop")
@@ -166,7 +167,7 @@ describe GdsApi::Publisher do
166
167
 
167
168
  it "should return a council hash for a mixed case council name" do
168
169
  stub_request(:get, "#{PUBLISHER_ENDPOINT}/local_transactions/find_by_council_name?name=Some%20Council").
169
- with(:headers => GdsApi::JsonClient::REQUEST_HEADERS).
170
+ with(:headers => GdsApi::JsonClient::DEFAULT_REQUEST_HEADERS).
170
171
  to_return(:status => 200, :body => '{"name": "Some Council", "snac": "AA00"}', :headers => {})
171
172
 
172
173
  expected = {"name" => "Some Council", "snac" => "AA00"}
@@ -175,7 +176,7 @@ describe GdsApi::Publisher do
175
176
 
176
177
  it "should return a council hash for a lowercase council name" do
177
178
  stub_request(:get, "#{PUBLISHER_ENDPOINT}/local_transactions/find_by_council_name?name=some%20council").
178
- with(:headers => GdsApi::JsonClient::REQUEST_HEADERS).
179
+ with(:headers => GdsApi::JsonClient::DEFAULT_REQUEST_HEADERS).
179
180
  to_return(:status => 200, :body => '{"name": "Some Council", "snac": "AA00"}', :headers => {})
180
181
 
181
182
  expected = {"name" => "Some Council", "snac" => "AA00"}
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: gds-api-adapters
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 1.7.1
5
+ version: 1.8.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - James Stewart
@@ -85,7 +85,7 @@ dependencies:
85
85
  requirements:
86
86
  - - ~>
87
87
  - !ruby/object:Gem::Version
88
- version: 0.10.0
88
+ version: 0.12.4
89
89
  type: :development
90
90
  prerelease: false
91
91
  version_requirements: *id007
@@ -96,7 +96,7 @@ dependencies:
96
96
  requirements:
97
97
  - - ~>
98
98
  - !ruby/object:Gem::Version
99
- version: 2.10.0
99
+ version: 3.4.0
100
100
  type: :development
101
101
  prerelease: false
102
102
  version_requirements: *id008
@@ -167,7 +167,6 @@ files:
167
167
  - lib/gds_api/typhoeus_client.rb
168
168
  - lib/gds_api/json_client.rb
169
169
  - lib/gds_api/contactotron.rb
170
- - lib/gds_api/oauth2_client.rb
171
170
  - lib/gds_api/response.rb
172
171
  - lib/gds_api/panopticon/registerer.rb
173
172
  - lib/gds_api/publisher.rb
@@ -203,7 +202,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
203
202
  requirements:
204
203
  - - ">="
205
204
  - !ruby/object:Gem::Version
206
- hash: -3691164780019311001
205
+ hash: 2196406087180137809
207
206
  segments:
208
207
  - 0
209
208
  version: "0"
@@ -212,7 +211,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
212
211
  requirements:
213
212
  - - ">="
214
213
  - !ruby/object:Gem::Version
215
- hash: -3691164780019311001
214
+ hash: 2196406087180137809
216
215
  segments:
217
216
  - 0
218
217
  version: "0"
@@ -1,25 +0,0 @@
1
- require_relative 'response'
2
- require_relative 'exceptions'
3
-
4
- # TODO: This is a work in progress
5
- module GdsApi
6
- class OAuth2Client
7
- def initialize(options)
8
- raise "access_token required" unless options[:access_token]
9
- @oauth_client = OAuth2::Client.new(nil, nil)
10
- @access_token = OAuth2::AccessToken.new(@oauth_client, options[:access_token], options[:token_options])
11
- end
12
-
13
- def get_json(url)
14
- @access_token.get(url, headers: REQUEST_HEADERS)
15
- end
16
-
17
- def post_json(url, params)
18
- @access_token.post(url, body: params, headers: REQUEST_HEADERS)
19
- end
20
-
21
- def put_json(url, params)
22
- @access_token.put(url, body: params, headers: REQUEST_HEADERS)
23
- end
24
- end
25
- end