gds-api-adapters 14.9.0 → 14.10.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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