gds-api-adapters 14.9.0 → 14.10.0

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.
@@ -0,0 +1,29 @@
1
+ require_relative 'base'
2
+ require_relative 'exceptions'
3
+
4
+ class GdsApi::EmailAlertApi < GdsApi::Base
5
+
6
+ def find_or_create_subscriber_list(attributes)
7
+ search_subscriber_list_by_tags(attributes.fetch("tags"))
8
+ rescue GdsApi::HTTPNotFound
9
+ create_subscriber_list(attributes)
10
+ end
11
+
12
+ def search_subscriber_list_by_tags(tags)
13
+ get_json!("#{endpoint}/subscriber_lists?" + nested_query_string(tags: tags))
14
+ end
15
+
16
+ def create_subscriber_list(attributes)
17
+ post_json!("#{endpoint}/subscriber_lists", attributes)
18
+ end
19
+
20
+ def send_alert(publication)
21
+ post_json!("#{endpoint}/notifications", publication)
22
+ end
23
+
24
+ private
25
+
26
+ def nested_query_string(params)
27
+ Rack::Utils.build_nested_query(params)
28
+ end
29
+ end
@@ -11,6 +11,7 @@ require 'gds_api/panopticon'
11
11
  require 'gds_api/publisher'
12
12
  require 'gds_api/worldwide'
13
13
  require 'gds_api/finder_api'
14
+ require 'gds_api/email_alert_api'
14
15
 
15
16
  module GdsApi
16
17
  module Helpers
@@ -70,6 +71,10 @@ module GdsApi
70
71
  @finder_api ||= FinderApi.new(Plek.current.find("finder-api"), options)
71
72
  end
72
73
 
74
+ def email_alert_api(options = {})
75
+ @email_alert_api ||= EmailAlertApi.new(Plek.current.find("email-alert-api"), options)
76
+ end
77
+
73
78
  def self.included(klass)
74
79
  if klass.respond_to?(:helper_method)
75
80
  klass.helper_method :publisher_api, :panopticon_api, :imminence_api, :content_api, :licence_application_api
@@ -0,0 +1,69 @@
1
+ require 'gds_api/test_helpers/json_client_helper'
2
+ require 'json'
3
+
4
+ module GdsApi
5
+ module TestHelpers
6
+ module EmailAlertApi
7
+ def email_alert_api_has_subscriber_list(attributes)
8
+ title = attributes.fetch("title")
9
+ tags = attributes.fetch("tags")
10
+
11
+ query = Rack::Utils.build_nested_query(tags: tags)
12
+
13
+ stub_request(:get, "http://some-domain/subscriber_lists?#{query}")
14
+ .to_return(
15
+ :status => 200,
16
+ :body => get_subscriber_list_response(attributes).to_json,
17
+ )
18
+ end
19
+
20
+ def email_alert_api_does_not_have_subscriber_list(attributes)
21
+ query = Rack::Utils.build_nested_query(tags: attributes.fetch("tags"))
22
+
23
+ stub_request(:get, "http://some-domain/subscriber_lists?#{query}")
24
+ .to_return(status: 404)
25
+ end
26
+
27
+ def email_alert_api_creates_subscriber_list(attributes)
28
+ stub_request(:post, "http://some-domain/subscriber_lists")
29
+ .to_return(
30
+ :status => 201,
31
+ :body => get_subscriber_list_response(attributes).to_json,
32
+ )
33
+ end
34
+
35
+ def email_alert_api_refuses_to_create_subscriber_list
36
+ stub_request(:post, "http://some-domain/subscriber_lists")
37
+ .to_return(
38
+ :status => 422,
39
+ )
40
+ end
41
+
42
+ def get_subscriber_list_response(attributes)
43
+ {
44
+ "subscriber_list" => {
45
+ "id" => "447135c3-07d6-4c3a-8a3b-efa49ef70e52",
46
+ "subscription_url" => "https://stage-public.govdelivery.com/accounts/UKGOVUK/subscriber/new?topic_id=UKGOVUK_1234",
47
+ "gov_delivery_id" => "UKGOVUK_1234",
48
+ "title" => "Some title",
49
+ "tags" => {
50
+ "format" => ["some-format"],
51
+ }
52
+ }.merge(attributes)
53
+ }
54
+ end
55
+
56
+ def email_alert_api_accepts_alert
57
+ stub_request(:post, "http://some-domain/notifications")
58
+ .to_return(
59
+ :status => 202,
60
+ :body => {}.to_json,
61
+ )
62
+ end
63
+
64
+ def post_alert_response
65
+ {}
66
+ end
67
+ end
68
+ end
69
+ end
@@ -1,3 +1,3 @@
1
1
  module GdsApi
2
- VERSION = '14.9.0'
2
+ VERSION = '14.10.0'
3
3
  end
@@ -0,0 +1,184 @@
1
+ require 'test_helper'
2
+ require 'gds_api/email_alert_api'
3
+ require 'gds_api/test_helpers/email_alert_api'
4
+
5
+ describe GdsApi::EmailAlertApi do
6
+ include GdsApi::TestHelpers::EmailAlertApi
7
+
8
+ let(:base_url) { "http://some-domain" }
9
+ let(:api_client) { GdsApi::EmailAlertApi.new(base_url) }
10
+
11
+ let(:title) { "Some Title" }
12
+ let(:tags) {
13
+ {
14
+ "format" => ["some-document-format"],
15
+ }
16
+ }
17
+
18
+ describe "alerts" do
19
+ let(:path) { "/alerts" }
20
+ let(:subject) { "Email subject" }
21
+ let(:publication_params) {
22
+ {
23
+ "title" => title,
24
+ "subject" => subject,
25
+ "tags" => tags,
26
+ }
27
+ }
28
+
29
+ before do
30
+ email_alert_api_accepts_alert
31
+ end
32
+
33
+ it "posts a new alert" do
34
+ assert api_client.send_alert(publication_params)
35
+
36
+ assert_requested(:post, "#{base_url}/notifications", publication_params)
37
+ end
38
+
39
+ it "returns the an empty response" do
40
+ assert api_client.send_alert(publication_params).to_hash.empty?
41
+ end
42
+ end
43
+
44
+ describe "subscriber lists" do
45
+ let(:path){ "/subscriber_lists" }
46
+ let(:expected_subscription_url) { "a subscription url" }
47
+
48
+ describe "#find_or_create_subscriber_list_by_tags" do
49
+ let(:params) {
50
+ {
51
+ "title" => title,
52
+ "tags" => tags,
53
+ }
54
+ }
55
+
56
+ describe "a subscriber list with that tag set does not yet exist" do
57
+ before do
58
+ email_alert_api_does_not_have_subscriber_list(
59
+ "tags" => tags,
60
+ )
61
+
62
+ email_alert_api_creates_subscriber_list(
63
+ "title" => title,
64
+ "tags" => tags,
65
+ "subscription_url" => expected_subscription_url,
66
+ )
67
+ end
68
+
69
+ it "creates the list and returns its attributes" do
70
+ subscriber_list_attrs = api_client.find_or_create_subscriber_list(params)
71
+ .to_hash
72
+ .fetch("subscriber_list")
73
+
74
+ assert_equal(
75
+ expected_subscription_url,
76
+ subscriber_list_attrs.fetch("subscription_url"),
77
+ )
78
+ end
79
+ end
80
+
81
+ describe "a subscriber list with that tag set does already exist" do
82
+ before do
83
+ email_alert_api_has_subscriber_list(
84
+ "title" => "Some Title",
85
+ "tags" => tags,
86
+ "subscription_url" => expected_subscription_url,
87
+ )
88
+ end
89
+
90
+ it "returns the subscriber list attributes" do
91
+ subscriber_list_attrs = api_client.find_or_create_subscriber_list(params)
92
+ .to_hash
93
+ .fetch("subscriber_list")
94
+
95
+ assert_equal(
96
+ expected_subscription_url,
97
+ subscriber_list_attrs.fetch("subscription_url"),
98
+ )
99
+ end
100
+ end
101
+ end
102
+
103
+ describe "#create_subscriber_list" do
104
+ let(:params) {
105
+ {
106
+ "title" => title,
107
+ "tags" => tags,
108
+ }
109
+ }
110
+
111
+ before do
112
+ email_alert_api_creates_subscriber_list(
113
+ "title" => title,
114
+ "tags" => tags,
115
+ "subscription_url" => expected_subscription_url,
116
+ )
117
+ end
118
+
119
+ describe "with valid attributes" do
120
+ it "creates the list and returns its attributes" do
121
+ subscriber_list_attrs = api_client.create_subscriber_list(params)
122
+ .to_hash
123
+ .fetch("subscriber_list")
124
+
125
+ assert_equal(
126
+ expected_subscription_url,
127
+ subscriber_list_attrs.fetch("subscription_url"),
128
+ )
129
+ end
130
+ end
131
+
132
+ describe "with invalid attributes or list with tag set exists" do
133
+ before do
134
+ email_alert_api_refuses_to_create_subscriber_list
135
+ end
136
+
137
+ it "raises ClientError" do
138
+ assert_raises(GdsApi::HTTPClientError) {
139
+ api_client.create_subscriber_list(params)
140
+ }
141
+ end
142
+ end
143
+ end
144
+
145
+ describe "#search_subscriber_list_by_tags" do
146
+ let(:path) { "/subscriber_lists" }
147
+
148
+ describe "a subscriber list with that tag set already exists" do
149
+ before do
150
+ email_alert_api_has_subscriber_list(
151
+ "title" => "Some Title",
152
+ "tags" => tags,
153
+ "subscription_url" => expected_subscription_url,
154
+ )
155
+ end
156
+
157
+ it "returns the subscriber list attributes" do
158
+ subscriber_list_attrs = api_client.search_subscriber_list_by_tags(tags)
159
+ .to_hash
160
+ .fetch("subscriber_list")
161
+
162
+ assert_equal(
163
+ expected_subscription_url,
164
+ subscriber_list_attrs.fetch("subscription_url"),
165
+ )
166
+ end
167
+ end
168
+
169
+ describe "a subscriber list with that tag set does not exist" do
170
+ before do
171
+ email_alert_api_does_not_have_subscriber_list(
172
+ "tags" => tags,
173
+ )
174
+ end
175
+
176
+ it "raises" do
177
+ assert_raises(GdsApi::HTTPNotFound) {
178
+ api_client.search_subscriber_list_by_tags(tags)
179
+ }
180
+ end
181
+ end
182
+ end
183
+ end
184
+ end
@@ -135,10 +135,9 @@ describe GdsApi::Rummager do
135
135
  it "#advanced_search should issue a request for all the params supplied" do
136
136
  GdsApi::Rummager.new("http://example.com").advanced_search({keywords: "query & stuff", topics: ["1","2"], order: {public_timestamp: "desc"}})
137
137
 
138
- #the actual request is "?keywords=query+%26+stuff&topic[0]=1&topic[1]=2&order[public_timestamp]=desc", but Webmock appears to be re-escaping.
139
138
  assert_requested :get, /keywords=query%20%26%20stuff/
140
- assert_requested :get, /topics%5B0%5D=1&topics%5B1%5D=2/
141
- assert_requested :get, /order%5Bpublic_timestamp%5D=desc/
139
+ assert_requested :get, /topics\[\]=1&topics\[\]=2/
140
+ assert_requested :get, /order\[public_timestamp\]=desc/
142
141
  end
143
142
 
144
143
  # tests for unified search
@@ -205,7 +204,7 @@ describe GdsApi::Rummager do
205
204
  )
206
205
 
207
206
  assert_requested :get, /q=query%20%26%20stuff/
208
- assert_requested :get, /filter_topics%5B0%5D=1&filter_topics%5B1%5D=2/
207
+ assert_requested :get, /filter_topics\[\]=1&filter_topics\[\]=2/
209
208
  assert_requested :get, /order=-public_timestamp/
210
209
  end
211
210
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gds-api-adapters
3
3
  version: !ruby/object:Gem::Version
4
- version: 14.9.0
4
+ version: 14.10.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-10-01 00:00:00.000000000 Z
12
+ date: 2014-10-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: plek
16
- requirement: &16192660 !ruby/object:Gem::Requirement
16
+ requirement: &19203660 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *16192660
24
+ version_requirements: *19203660
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: null_logger
27
- requirement: &16191900 !ruby/object:Gem::Requirement
27
+ requirement: &19202160 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *16191900
35
+ version_requirements: *19202160
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: link_header
38
- requirement: &16190420 !ruby/object:Gem::Requirement
38
+ requirement: &19200200 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *16190420
46
+ version_requirements: *19200200
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: lrucache
49
- requirement: &16188920 !ruby/object:Gem::Requirement
49
+ requirement: &19216200 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 0.1.1
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *16188920
57
+ version_requirements: *19216200
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: rest-client
60
- requirement: &16201420 !ruby/object:Gem::Requirement
60
+ requirement: &19213000 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ~>
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: 1.6.3
66
66
  type: :runtime
67
67
  prerelease: false
68
- version_requirements: *16201420
68
+ version_requirements: *19213000
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rack-cache
71
- requirement: &16198200 !ruby/object:Gem::Requirement
71
+ requirement: &19210600 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: '0'
77
77
  type: :runtime
78
78
  prerelease: false
79
- version_requirements: *16198200
79
+ version_requirements: *19210600
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: rdoc
82
- requirement: &16195560 !ruby/object:Gem::Requirement
82
+ requirement: &19226440 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - =
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: '3.12'
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *16195560
90
+ version_requirements: *19226440
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: rake
93
- requirement: &16235380 !ruby/object:Gem::Requirement
93
+ requirement: &19224200 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ~>
@@ -98,24 +98,21 @@ dependencies:
98
98
  version: 0.9.2.2
99
99
  type: :development
100
100
  prerelease: false
101
- version_requirements: *16235380
101
+ version_requirements: *19224200
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: webmock
104
- requirement: &16232840 !ruby/object:Gem::Requirement
104
+ requirement: &19221840 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
- - - ! '>='
108
- - !ruby/object:Gem::Version
109
- version: '1.8'
110
- - - <=
107
+ - - ~>
111
108
  - !ruby/object:Gem::Version
112
- version: 1.18.0
109
+ version: '1.19'
113
110
  type: :development
114
111
  prerelease: false
115
- version_requirements: *16232840
112
+ version_requirements: *19221840
116
113
  - !ruby/object:Gem::Dependency
117
114
  name: mocha
118
- requirement: &16260140 !ruby/object:Gem::Requirement
115
+ requirement: &19249960 !ruby/object:Gem::Requirement
119
116
  none: false
120
117
  requirements:
121
118
  - - ~>
@@ -123,10 +120,10 @@ dependencies:
123
120
  version: 0.12.4
124
121
  type: :development
125
122
  prerelease: false
126
- version_requirements: *16260140
123
+ version_requirements: *19249960
127
124
  - !ruby/object:Gem::Dependency
128
125
  name: minitest
129
- requirement: &16259300 !ruby/object:Gem::Requirement
126
+ requirement: &19247260 !ruby/object:Gem::Requirement
130
127
  none: false
131
128
  requirements:
132
129
  - - ~>
@@ -134,10 +131,10 @@ dependencies:
134
131
  version: 3.4.0
135
132
  type: :development
136
133
  prerelease: false
137
- version_requirements: *16259300
134
+ version_requirements: *19247260
138
135
  - !ruby/object:Gem::Dependency
139
136
  name: rack
140
- requirement: &16258420 !ruby/object:Gem::Requirement
137
+ requirement: &19263240 !ruby/object:Gem::Requirement
141
138
  none: false
142
139
  requirements:
143
140
  - - ! '>='
@@ -145,10 +142,10 @@ dependencies:
145
142
  version: '0'
146
143
  type: :development
147
144
  prerelease: false
148
- version_requirements: *16258420
145
+ version_requirements: *19263240
149
146
  - !ruby/object:Gem::Dependency
150
147
  name: rack-test
151
- requirement: &16257280 !ruby/object:Gem::Requirement
148
+ requirement: &19289900 !ruby/object:Gem::Requirement
152
149
  none: false
153
150
  requirements:
154
151
  - - ! '>='
@@ -156,10 +153,10 @@ dependencies:
156
153
  version: '0'
157
154
  type: :development
158
155
  prerelease: false
159
- version_requirements: *16257280
156
+ version_requirements: *19289900
160
157
  - !ruby/object:Gem::Dependency
161
158
  name: simplecov
162
- requirement: &16256560 !ruby/object:Gem::Requirement
159
+ requirement: &19284340 !ruby/object:Gem::Requirement
163
160
  none: false
164
161
  requirements:
165
162
  - - ~>
@@ -167,10 +164,10 @@ dependencies:
167
164
  version: 0.5.4
168
165
  type: :development
169
166
  prerelease: false
170
- version_requirements: *16256560
167
+ version_requirements: *19284340
171
168
  - !ruby/object:Gem::Dependency
172
169
  name: simplecov-rcov
173
- requirement: &16255920 !ruby/object:Gem::Requirement
170
+ requirement: &19298140 !ruby/object:Gem::Requirement
174
171
  none: false
175
172
  requirements:
176
173
  - - ! '>='
@@ -178,10 +175,10 @@ dependencies:
178
175
  version: '0'
179
176
  type: :development
180
177
  prerelease: false
181
- version_requirements: *16255920
178
+ version_requirements: *19298140
182
179
  - !ruby/object:Gem::Dependency
183
180
  name: gem_publisher
184
- requirement: &16269420 !ruby/object:Gem::Requirement
181
+ requirement: &19293840 !ruby/object:Gem::Requirement
185
182
  none: false
186
183
  requirements:
187
184
  - - ~>
@@ -189,10 +186,10 @@ dependencies:
189
186
  version: 1.1.1
190
187
  type: :development
191
188
  prerelease: false
192
- version_requirements: *16269420
189
+ version_requirements: *19293840
193
190
  - !ruby/object:Gem::Dependency
194
191
  name: timecop
195
- requirement: &16267840 !ruby/object:Gem::Requirement
192
+ requirement: &19291900 !ruby/object:Gem::Requirement
196
193
  none: false
197
194
  requirements:
198
195
  - - ~>
@@ -200,7 +197,18 @@ dependencies:
200
197
  version: 0.5.1
201
198
  type: :development
202
199
  prerelease: false
203
- version_requirements: *16267840
200
+ version_requirements: *19291900
201
+ - !ruby/object:Gem::Dependency
202
+ name: pry
203
+ requirement: &19309860 !ruby/object:Gem::Requirement
204
+ none: false
205
+ requirements:
206
+ - - ! '>='
207
+ - !ruby/object:Gem::Version
208
+ version: '0'
209
+ type: :development
210
+ prerelease: false
211
+ version_requirements: *19309860
204
212
  description: A set of adapters providing easy access to the GDS GOV.UK APIs
205
213
  email:
206
214
  - jystewart@gmail.com
@@ -251,6 +259,7 @@ files:
251
259
  - lib/gds_api/test_helpers/router.rb
252
260
  - lib/gds_api/test_helpers/common_responses.rb
253
261
  - lib/gds_api/test_helpers/business_support_api.rb
262
+ - lib/gds_api/test_helpers/email_alert_api.rb
254
263
  - lib/gds_api/test_helpers/content_api.rb
255
264
  - lib/gds_api/organisations.rb
256
265
  - lib/gds_api/needotron.rb
@@ -274,6 +283,7 @@ files:
274
283
  - lib/gds_api/publisher.rb
275
284
  - lib/gds_api/router.rb
276
285
  - lib/gds_api/business_support_api.rb
286
+ - lib/gds_api/email_alert_api.rb
277
287
  - lib/gds_api/external_link_tracker.rb
278
288
  - lib/gds_api/content_api.rb
279
289
  - README.md
@@ -297,6 +307,7 @@ files:
297
307
  - test/middleware/govuk_request_id_sniffer_test.rb
298
308
  - test/rummager_test.rb
299
309
  - test/json_client_test.rb
310
+ - test/email_alert_api_test.rb
300
311
  - test/content_api_test.rb
301
312
  - test/response_test.rb
302
313
  - test/organisations_api_test.rb
@@ -331,7 +342,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
331
342
  version: '0'
332
343
  segments:
333
344
  - 0
334
- hash: 1622028299170972729
345
+ hash: 305882728721763385
335
346
  required_rubygems_version: !ruby/object:Gem::Requirement
336
347
  none: false
337
348
  requirements:
@@ -340,7 +351,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
340
351
  version: '0'
341
352
  segments:
342
353
  - 0
343
- hash: 1622028299170972729
354
+ hash: 305882728721763385
344
355
  requirements: []
345
356
  rubyforge_project:
346
357
  rubygems_version: 1.8.11
@@ -367,6 +378,7 @@ test_files:
367
378
  - test/middleware/govuk_request_id_sniffer_test.rb
368
379
  - test/rummager_test.rb
369
380
  - test/json_client_test.rb
381
+ - test/email_alert_api_test.rb
370
382
  - test/content_api_test.rb
371
383
  - test/response_test.rb
372
384
  - test/organisations_api_test.rb