notifications-ruby-client 4.0.0 → 5.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,13 @@
1
+ FROM ruby:2.6-slim
2
+
3
+ RUN \
4
+ echo "Install Debian packages" \
5
+ && apt-get update \
6
+ && apt-get install -y --no-install-recommends \
7
+ gcc \
8
+ make \
9
+ curl \
10
+ git \
11
+ gnupg
12
+
13
+ WORKDIR /var/project
data/Makefile CHANGED
@@ -32,18 +32,14 @@ generate-env-file: ## Generate the environment file for running the tests inside
32
32
 
33
33
  .PHONY: prepare-docker-runner-image
34
34
  prepare-docker-runner-image: ## Prepare the Docker builder image
35
- make -C docker build
35
+ docker pull `grep "FROM " Dockerfile | cut -d ' ' -f 2` || true
36
+ docker build -t ${DOCKER_BUILDER_IMAGE_NAME} .
36
37
 
37
38
  .PHONY: build-with-docker
38
39
  build-with-docker: prepare-docker-runner-image ## Build inside a Docker container
39
40
  docker run -i --rm \
40
41
  --name "${DOCKER_CONTAINER_PREFIX}-build" \
41
42
  -v "`pwd`:/var/project" \
42
- -e http_proxy="${HTTP_PROXY}" \
43
- -e HTTP_PROXY="${HTTP_PROXY}" \
44
- -e https_proxy="${HTTPS_PROXY}" \
45
- -e HTTPS_PROXY="${HTTPS_PROXY}" \
46
- -e NO_PROXY="${NO_PROXY}" \
47
43
  ${DOCKER_BUILDER_IMAGE_NAME} \
48
44
  make build
49
45
 
@@ -52,36 +48,32 @@ test-with-docker: prepare-docker-runner-image generate-env-file ## Run tests ins
52
48
  docker run -i --rm \
53
49
  --name "${DOCKER_CONTAINER_PREFIX}-test" \
54
50
  -v "`pwd`:/var/project" \
55
- -e http_proxy="${HTTP_PROXY}" \
56
- -e HTTP_PROXY="${HTTP_PROXY}" \
57
- -e https_proxy="${HTTPS_PROXY}" \
58
- -e HTTPS_PROXY="${HTTPS_PROXY}" \
59
- -e NO_PROXY="${NO_PROXY}" \
60
51
  --env-file docker.env \
61
52
  ${DOCKER_BUILDER_IMAGE_NAME} \
62
- make test
53
+ make build test
63
54
 
64
55
  .PHONY: integration-test-with-docker
65
56
  integration-test-with-docker: prepare-docker-runner-image generate-env-file ## Run integration tests inside a Docker container
66
57
  docker run -i --rm \
67
58
  --name "${DOCKER_CONTAINER_PREFIX}-integration-test" \
68
59
  -v "`pwd`:/var/project" \
69
- -e http_proxy="${HTTP_PROXY}" \
70
- -e HTTP_PROXY="${HTTP_PROXY}" \
71
- -e https_proxy="${HTTPS_PROXY}" \
72
- -e HTTPS_PROXY="${HTTPS_PROXY}" \
73
- -e NO_PROXY="${NO_PROXY}" \
74
60
  --env-file docker.env \
75
61
  ${DOCKER_BUILDER_IMAGE_NAME} \
76
- make integration-test
62
+ make build integration-test
63
+
64
+ .PHONY: get-client-version
65
+ get-client-version: ## Retrieve client version number from source code
66
+ @ruby -e "require './lib/notifications/client/version'; puts Notifications::Client::VERSION"
67
+
68
+ .PHONY: publish-to-rubygems
69
+ publish-to-rubygems: ## Create gemspec file and publish to rubygems
70
+ $(if ${GEM_HOST_API_KEY},,$(error Must specify GEM_HOST_API_KEY))
71
+ gem build notifications-ruby-client.gemspec --output=release.gem
72
+ gem push release.gem
77
73
 
78
74
  .PHONY: clean-docker-containers
79
75
  clean-docker-containers: ## Clean up any remaining docker containers
80
76
  docker rm -f $(shell docker ps -q -f "name=${DOCKER_CONTAINER_PREFIX}") 2> /dev/null || true
81
77
 
82
- .PHONY: run-govuk-lint
83
- run-govuk-lint: ## Runs GOVUK-lint for Ruby
84
- bundle exec govuk-lint-ruby lib spec bin/test_client
85
-
86
78
  clean:
87
79
  rm -rf vendor
@@ -3,7 +3,9 @@ require './lib/notifications/client'
3
3
 
4
4
  def main
5
5
  client = Notifications::Client.new(ENV['API_KEY'], ENV['NOTIFY_API_URL'])
6
- test_get_template_by_id(client, ENV['EMAIL_TEMPLATE_ID'])
6
+ test_get_email_template_by_id(client, ENV['EMAIL_TEMPLATE_ID'])
7
+ test_get_sms_template_by_id(client, ENV['SMS_TEMPLATE_ID'])
8
+ test_get_letter_template_by_id(client, ENV['LETTER_TEMPLATE_ID'])
7
9
  test_get_template_version(client, ENV['SMS_TEMPLATE_ID'], 1)
8
10
  test_get_all_templates(client)
9
11
  test_get_all_templates_filter_by_type(client)
@@ -20,18 +22,29 @@ def main
20
22
  test_get_notification_by_id_endpoint(client, precompiled_letter_notification.id, 'precompiled_letter')
21
23
  test_get_all_notifications(client)
22
24
  test_get_received_texts
25
+ test_get_pdf_for_letter(client, letter_notification.id)
23
26
  p 'ruby client integration tests pass'
24
27
  exit 0
25
28
  end
26
29
 
27
- def test_get_template_by_id(client, id)
30
+ def test_get_email_template_by_id(client, id)
28
31
  response = client.get_template_by_id(id)
29
- test_template_response(response, 'test_get_template_by_id')
32
+ test_template_response(response, 'email', 'test_get_email_template_by_id')
33
+ end
34
+
35
+ def test_get_sms_template_by_id(client, id)
36
+ response = client.get_template_by_id(id)
37
+ test_template_response(response, 'sms', 'test_get_sms_template_by_id')
38
+ end
39
+
40
+ def test_get_letter_template_by_id(client, id)
41
+ response = client.get_template_by_id(id)
42
+ test_template_response(response, 'letter', 'test_get_letter_template_by_id')
30
43
  end
31
44
 
32
45
  def test_get_template_version(client, id, version)
33
46
  response = client.get_template_version(id, version)
34
- test_template_response(response, 'test_get_template_version')
47
+ test_template_response(response, 'sms', 'test_get_template_version')
35
48
  end
36
49
 
37
50
  def test_get_all_templates(client)
@@ -44,9 +57,9 @@ def test_get_all_templates(client)
44
57
  p 'failed test_get_all_templates, expected at least 3 templates returned.'
45
58
  exit 1
46
59
  end
47
- test_template_response(response.collection[0], 'test_get_all_templates')
48
- test_template_response(response.collection[1], 'test_get_all_templates')
49
- test_template_response(response.collection[2], 'test_get_all_templates')
60
+ test_template_response(response.collection[0], 'letter', 'test_get_all_templates')
61
+ test_template_response(response.collection[1], 'email', 'test_get_all_templates')
62
+ test_template_response(response.collection[2], 'sms', 'test_get_all_templates')
50
63
  end
51
64
 
52
65
  def test_get_all_templates_filter_by_type(client)
@@ -59,7 +72,7 @@ def test_get_all_templates_filter_by_type(client)
59
72
  p 'failed test_get_all_templates, expected at least 2 templates returned.'
60
73
  exit 1
61
74
  end
62
- test_template_response(response.collection[0], 'test_get_all_templates')
75
+ test_template_response(response.collection[0], 'sms', 'test_get_all_templates')
63
76
  end
64
77
 
65
78
  def test_generate_template_preview(client, id)
@@ -67,7 +80,7 @@ def test_generate_template_preview(client, id)
67
80
  test_template_preview(response)
68
81
  end
69
82
 
70
- def test_template_response(response, test_method)
83
+ def test_template_response(response, template_type, test_method)
71
84
  unless response.is_a?(Notifications::Client::Template)
72
85
  p 'failed test_get_template_by_id response is not a Notifications::Client::Template'
73
86
  exit 1
@@ -76,7 +89,17 @@ def test_template_response(response, test_method)
76
89
  p 'failed template id is not a String'
77
90
  exit 1
78
91
  end
79
- field_should_not_be_nil(expected_fields_in_template_response, response, test_method)
92
+
93
+ field_should_not_be_nil(
94
+ expected_fields_in_template_response(template_type),
95
+ response,
96
+ test_method
97
+ )
98
+ field_should_be_nil(
99
+ expected_nil_fields_in_template_response(template_type),
100
+ response,
101
+ test_method
102
+ )
80
103
  end
81
104
 
82
105
  def test_template_preview(response)
@@ -205,6 +228,28 @@ def test_get_notification_by_id_endpoint(client, id, message_type)
205
228
  end
206
229
  end
207
230
 
231
+ def test_get_pdf_for_letter(client, id)
232
+ response = nil
233
+
234
+ # try 15 times with 3 secs sleep between each attempt, to get the PDF
235
+ 15.times do
236
+ begin
237
+ response = client.get_pdf_for_letter(id)
238
+ rescue Notifications::Client::BadRequestError
239
+ sleep(3)
240
+ end
241
+
242
+ if !response.nil?
243
+ break
244
+ end
245
+ end
246
+
247
+ unless !response.nil? && response.start_with?("%PDF-")
248
+ p "get_pdf_for_letter response for " + id + " is not a PDF: " + response.to_s
249
+ exit 1
250
+ end
251
+ end
252
+
208
253
  def hash_key_should_not_be_nil(fields, obj, method_name)
209
254
  fields.each do |field|
210
255
  if obj.has_value?(:"#{field}")
@@ -232,14 +277,21 @@ def field_should_be_nil(fields, obj, method_name)
232
277
  end
233
278
  end
234
279
 
235
- def expected_fields_in_template_response
236
- %w(id
237
- name
238
- type
239
- created_at
240
- created_by
241
- body
242
- version)
280
+ def expected_fields_in_template_response(template_type)
281
+ {
282
+ "email" => ["id", "name", "type", "created_at", "created_by", "version", "body", "subject"],
283
+ "sms" => ["id", "name", "type", "created_at", "created_by", "version", "body"],
284
+ "letter" => ["id", "name", "type", "created_at", "created_by", "version", "body", "subject",
285
+ "letter_contact_block"],
286
+ }[template_type]
287
+ end
288
+
289
+ def expected_nil_fields_in_template_response(template_type)
290
+ {
291
+ "email" => ["letter_contact_block"],
292
+ "sms" => ["subject", "letter_contact_block"],
293
+ "letter" => [],
294
+ }[template_type]
243
295
  end
244
296
 
245
297
  def expected_fields_in_template_preview
@@ -67,6 +67,14 @@ module Notifications
67
67
  )
68
68
  end
69
69
 
70
+ ##
71
+ # @param id [String]
72
+ # @see Notifications::Client::Speaker#get
73
+ # @return [String]
74
+ def get_pdf_for_letter(id)
75
+ speaker.get_pdf_for_letter(id)
76
+ end
77
+
70
78
  ##
71
79
  # @param id [String]
72
80
  # @see Notifications::Client::Speaker#get
@@ -1,9 +1,9 @@
1
1
  require "base64"
2
2
 
3
3
  module Notifications
4
- def self.prepare_upload(file)
5
- raise ArgumentError.new("Document is larger than 2MB") if file.size > Client::MAX_FILE_UPLOAD_SIZE
4
+ def self.prepare_upload(file, is_csv=false)
5
+ raise ArgumentError.new("File is larger than 2MB") if file.size > Client::MAX_FILE_UPLOAD_SIZE
6
6
 
7
- { file: Base64.strict_encode64(file.read) }
7
+ { file: Base64.strict_encode64(file.read), is_csv: is_csv }
8
8
  end
9
9
  end
@@ -6,15 +6,18 @@ module Notifications
6
6
  def initialize(response)
7
7
  @code = response.code
8
8
  @body = parse_body(response.body)
9
+ super(build_message)
9
10
  end
10
11
 
12
+ private
13
+
11
14
  def parse_body(body)
12
15
  JSON.parse(body)
13
16
  rescue JSON::ParserError
14
17
  body
15
18
  end
16
19
 
17
- def message
20
+ def build_message
18
21
  return body if body.is_a?(String)
19
22
 
20
23
  error_messages = body.fetch('errors')
@@ -13,6 +13,7 @@ module Notifications
13
13
  version
14
14
  body
15
15
  subject
16
+ letter_contact_block
16
17
  ).freeze
17
18
 
18
19
  attr_reader(*FIELDS)
@@ -118,6 +118,19 @@ module Notifications
118
118
  perform_request!(request)
119
119
  end
120
120
 
121
+ def get_pdf_for_letter(id)
122
+ path = "/v2/notifications/" << id << "/pdf"
123
+ request = Net::HTTP::Get.new(path, headers)
124
+
125
+ # can't use `perform_request!` because we're just returning raw binary data
126
+ response = open(request)
127
+ if response.is_a?(Net::HTTPClientError) || response.is_a?(Net::HTTPServerError)
128
+ raise build_error(response)
129
+ else
130
+ response.body
131
+ end
132
+ end
133
+
121
134
  private
122
135
 
123
136
  ##
@@ -9,6 +9,6 @@
9
9
 
10
10
  module Notifications
11
11
  class Client
12
- VERSION = "4.0.0".freeze
12
+ VERSION = "5.3.0".freeze
13
13
  end
14
14
  end
@@ -22,10 +22,9 @@ Gem::Specification.new do |spec|
22
22
 
23
23
  spec.add_runtime_dependency "jwt", ">= 1.5", "< 3"
24
24
 
25
- spec.add_development_dependency "bundler", "~> 1.13"
26
- spec.add_development_dependency "rake", "~> 12.3"
25
+ spec.add_development_dependency "bundler", "~> 1.7"
26
+ spec.add_development_dependency "rake", "~> 13.0"
27
27
  spec.add_development_dependency "rspec", "~> 3.7"
28
28
  spec.add_development_dependency "webmock", "~> 3.4"
29
- spec.add_development_dependency "factory_bot", "~> 4.10"
30
- spec.add_development_dependency "govuk-lint", "~> 3.8"
29
+ spec.add_development_dependency "factory_bot", "~> 6.1"
31
30
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: notifications-ruby-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.0
4
+ version: 5.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Government Digital Service
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-07-02 00:00:00.000000000 Z
11
+ date: 2020-08-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jwt
@@ -36,28 +36,28 @@ dependencies:
36
36
  requirements:
37
37
  - - "~>"
38
38
  - !ruby/object:Gem::Version
39
- version: '1.13'
39
+ version: '1.7'
40
40
  type: :development
41
41
  prerelease: false
42
42
  version_requirements: !ruby/object:Gem::Requirement
43
43
  requirements:
44
44
  - - "~>"
45
45
  - !ruby/object:Gem::Version
46
- version: '1.13'
46
+ version: '1.7'
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rake
49
49
  requirement: !ruby/object:Gem::Requirement
50
50
  requirements:
51
51
  - - "~>"
52
52
  - !ruby/object:Gem::Version
53
- version: '12.3'
53
+ version: '13.0'
54
54
  type: :development
55
55
  prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
57
57
  requirements:
58
58
  - - "~>"
59
59
  - !ruby/object:Gem::Version
60
- version: '12.3'
60
+ version: '13.0'
61
61
  - !ruby/object:Gem::Dependency
62
62
  name: rspec
63
63
  requirement: !ruby/object:Gem::Requirement
@@ -92,28 +92,14 @@ dependencies:
92
92
  requirements:
93
93
  - - "~>"
94
94
  - !ruby/object:Gem::Version
95
- version: '4.10'
95
+ version: '6.1'
96
96
  type: :development
97
97
  prerelease: false
98
98
  version_requirements: !ruby/object:Gem::Requirement
99
99
  requirements:
100
100
  - - "~>"
101
101
  - !ruby/object:Gem::Version
102
- version: '4.10'
103
- - !ruby/object:Gem::Dependency
104
- name: govuk-lint
105
- requirement: !ruby/object:Gem::Requirement
106
- requirements:
107
- - - "~>"
108
- - !ruby/object:Gem::Version
109
- version: '3.8'
110
- type: :development
111
- prerelease: false
112
- version_requirements: !ruby/object:Gem::Requirement
113
- requirements:
114
- - - "~>"
115
- - !ruby/object:Gem::Version
116
- version: '3.8'
102
+ version: '6.1'
117
103
  description:
118
104
  email:
119
105
  - notify@digital.cabinet-office.gov.uk
@@ -128,6 +114,7 @@ files:
128
114
  - CHANGELOG.md
129
115
  - CONTRIBUTING.md
130
116
  - DOCUMENTATION.md
117
+ - Dockerfile
131
118
  - Gemfile
132
119
  - LICENSE
133
120
  - Makefile
@@ -137,8 +124,6 @@ files:
137
124
  - bin/generate_docker_env.sh
138
125
  - bin/setup
139
126
  - bin/test_client.rb
140
- - docker/Dockerfile
141
- - docker/Makefile
142
127
  - lib/notifications/client.rb
143
128
  - lib/notifications/client/helper_methods.rb
144
129
  - lib/notifications/client/notification.rb
@@ -173,8 +158,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
173
158
  - !ruby/object:Gem::Version
174
159
  version: '0'
175
160
  requirements: []
176
- rubyforge_project:
177
- rubygems_version: 2.7.6
161
+ rubygems_version: 3.0.3
178
162
  signing_key:
179
163
  specification_version: 4
180
164
  summary: Ruby client for GOV.UK Notifications API
@@ -1,26 +0,0 @@
1
- FROM ruby:2.3.1-slim
2
-
3
- ARG HTTP_PROXY
4
- ARG HTTPS_PROXY
5
- ARG NO_PROXY
6
-
7
- RUN \
8
- echo "Install Debian packages" \
9
- && ([ -z "$HTTP_PROXY" ] || echo "Acquire::http::Proxy \"${HTTP_PROXY}\";" > /etc/apt/apt.conf.d/99HttpProxy) \
10
- && apt-get update \
11
- && apt-get install -y --no-install-recommends \
12
- gcc \
13
- make \
14
- curl \
15
- git \
16
-
17
- && echo "Clean up" \
18
- && rm -rf /var/lib/apt/lists/* /tmp/*
19
-
20
- ENV PATH=/var/project/vendor/bin:$PATH \
21
- BUNDLE_PATH="/var/project/vendor/bundle" \
22
- BUNDLE_BIN="/var/project/vendor/bin" \
23
- BUNDLE_APP_CONFIG="/var/project/.bundle"
24
-
25
-
26
- WORKDIR /var/project