govdelivery-tms 0.9.4 → 3.0.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.
checksums.yaml CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- OGU2YjhiZjAxYTBmOWZjNGRiOGEzYmJmM2JiYmFhNjVkY2U4NGJmYw==
5
- data.tar.gz: !binary |-
6
- Y2EzNjAyZDA5MWRiZmYyYzBmMzkyZWYyYzc5NDQ1MjMwZjY1NmM5NA==
2
+ SHA256:
3
+ metadata.gz: fecf72f8c754802f0f002fee9576334b534e29ca4cc0e7f5280821565912db85
4
+ data.tar.gz: d6e4087bcde8f26b587c4bc9a9616dae17b748a6548508adbdf1aeaa48e87136
7
5
  SHA512:
8
- metadata.gz: !binary |-
9
- M2ZhODFhYmQxZTZkMmI1MmU3NzA3OGNlNzFkMDlkMmQ1MTYwOWViMWNkYWRh
10
- Yzg5ZDI4Y2I5ZDZlZGE1OTQyYWZkNjAxNmJkOWFmYTU1NWNjMzIxYTM1ZmUx
11
- ZmI0MTA2MTMwNGIxZWI2YzlkYjQ2YzBlYWI0YjFhMGQ0MDk5NmU=
12
- data.tar.gz: !binary |-
13
- MmJmNzk5ZjRiNWI1OTJiNjIyYTFmMDY0MTgyZmFhZmQ1ZWQxNzA4YmZmMmU5
14
- ZjZmMWUzMDUwZTJhMGY3NGQzNjE3ZTAzZjVhNmNlMGRkNGU0NDU5MTBlODUw
15
- NTM0ZDE0ZDU4ZDFkODZhNWE0MzEyYmVmMWY3NTA3NzEwMzQ2ZWE=
6
+ metadata.gz: e0fcda1aa09326cb1761e9746032052b4d50ac5f0a08e550e64982929a63204cf1dda6c255202877384c56afafb07ed45280a3e6b159ebb8eaee0ab950588c83
7
+ data.tar.gz: be9073dd5b9e540c61283777ed5814d3fe6ecbb3064990decbc7f9c00b19aeb97a37bc3ae2f07f633c86890f05a48f4e99aa760afc21d534438237c67d2e83b9
@@ -0,0 +1 @@
1
+ 3.0.0
data/Gemfile CHANGED
@@ -2,8 +2,7 @@ source 'https://rubygems.org'
2
2
  gemspec
3
3
 
4
4
  group :development, :test do
5
- gem 'appraisal'
6
- gem 'rspec', '~> 3.2.0'
5
+ gem 'rspec'
7
6
  gem 'rspec-its'
8
7
  gem 'rake'
9
8
  gem 'redcarpet', platform: :ruby
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- [![Build Status](https://travis-ci.org/govdelivery/govdelivery-tms-ruby.svg?branch=master)](https://travis-ci.org/govdelivery/govdelivery-tms-ruby)
1
+ [![Build Status](https://travis-ci.org/granicus/govdelivery-tms-ruby.svg?branch=master)](https://travis-ci.org/granicus/govdelivery-tms-ruby)
2
2
 
3
3
  TMS Client
4
4
  ===========
@@ -39,6 +39,27 @@ client.sms_messages.get # get the first page of sms messages
39
39
  client.sms_messages.next.get # get the next page of sms messages
40
40
  ```
41
41
 
42
+ #### Optional parameters
43
+ When loading messages, the following parameters can be passed with requests to change the sort order and number of results returned:
44
+
45
+ **page_size**: Must be an integer between 1 and 100
46
+
47
+ ```ruby
48
+ client.sms_messages.get({page_size: 2}) # get the first two sms messages
49
+ ```
50
+
51
+ **sort_by**: Field by which to sort results. Default: created_at.
52
+
53
+ ```ruby
54
+ client.sms_messages.get({sort_by: 'created_at'}) # get the first page of sms messages, sorted by created_at
55
+ ```
56
+
57
+ **sort_order**: Order by which to sort results. Must be ASC or DESC. Default: DESC.
58
+
59
+ ```ruby
60
+ client.sms_messages.get({sort_order: 'ASC'}) # get the first page of sms messages, sorted by created_at DESC
61
+ client.sms_messages.get({sort_by: 'body', sort_order: 'ASC'}) # get the first page of sms messages, sorted by body ASC
62
+ ```
42
63
 
43
64
  ### Sending an SMS Message
44
65
 
@@ -68,8 +89,7 @@ inbound_sms.attributes # {:from=>"+15005550
68
89
 
69
90
  ```ruby
70
91
  message = client.email_messages.build(:body=>'<p><a href="http://example.com">Visit here</a></p>',
71
- :subject => 'Hey',
72
- :from_email => 'foo@example.com')
92
+ :subject => 'Hey')
73
93
  message.recipients.build(:email=>'example1@example.com')
74
94
  message.recipients.build(:email=>'')
75
95
  message.post # true
@@ -91,6 +111,45 @@ message.recipients.build(:email=>'bill@example.com')
91
111
  message.post
92
112
  ```
93
113
 
114
+ #### From Addresses
115
+
116
+ From Addresses are read only resources that define which email addresses you
117
+ can send an email from and have replies and bounces sent to. From Addresses
118
+ also have an associated default display name. If you wish to send a message
119
+ from an address that is not your account's default, you will need to specify a
120
+ From Address on your Message.
121
+
122
+ To add or edit From Addresses, you will need to contact your CSC.
123
+
124
+ ```ruby
125
+ # Fetch the from_addresses on your account
126
+ client.from_addresses.get
127
+
128
+ # Get the first from address on your account
129
+ from_address = client.from_addresses.collection.first
130
+
131
+ # Lets see what the emails and display name are
132
+ puts from_address.from_email
133
+ puts from_address.reply_to_email
134
+ puts from_address.bound_email
135
+ puts from_address.from_name
136
+
137
+ # Is this from address the account's default?
138
+ puts from_address.is_default
139
+
140
+ # New messages default to using the default from_address of your account
141
+ message = client.email_messages.build(:body=>'<p><a href="http://example.com">Visit here</a></p>',
142
+ :subject => 'Hey')
143
+
144
+ # Specifiy a different from_address using the links hash
145
+ message.links[:from_address] = from_address.id
146
+
147
+ # If you want, you can override the form_name on a message
148
+ message.from_name = 'Better Name'
149
+ message.post
150
+ ```
151
+
152
+
94
153
  ### Creating an Email Template
95
154
 
96
155
  ```ruby
@@ -181,6 +240,7 @@ completed_at | (sent or failed recipients only)
181
240
 
182
241
  Metrics
183
242
  -------
243
+
184
244
  ### Viewing recipients that clicked on a link in an email
185
245
 
186
246
  ```ruby
@@ -205,6 +265,29 @@ email_recipient.clicks.get.collection #=> [<#EmailRecipientClick>,...]
205
265
  email_recipient.opens.get.collection #=> [<#EmailRecipientOpen>,...]
206
266
  ```
207
267
 
268
+ Reports
269
+ -------
270
+
271
+ ### Message recipient counts
272
+ Recipient counts are aggregated across all messages and grouped by message status.
273
+
274
+ `start` and `end` are required datetime parameters. They must be truncated to the hour and be in ISO 8601 format (YYYY-MM-DDTHH:MM:SSZ).
275
+
276
+ End dates are exclusive and all results are based on utc time.
277
+
278
+ #### Email
279
+
280
+ ```ruby
281
+ stats = client.reports_messages_email_statistics.get({start: '2017-06-01T10:00:00Z', end: '2017:06:30T18:00:00Z'}) # get email recipient counts for messages sent between 6/1/17 and 6/30/17
282
+ stats.recipients
283
+ ```
284
+
285
+ #### SMS
286
+ ```ruby
287
+ stats = client.reports_messages_sms_statistics.get({start: '2017-06-01T10:00:00Z', end: '2017:06:30T18:00:00Z'}) # get sms recipient counts for messages sent between 6/1/17 and 6/30/17
288
+ stats.recipients
289
+ ```
290
+
208
291
  Configuring 2-way SMS
209
292
  ---------------------
210
293
 
@@ -321,25 +404,22 @@ Generating Documentation
321
404
  ------------------------
322
405
  This project uses [yard](https://github.com/lsegal/yard) to generate documentation. To generate API documentation yourself, use the following series of commands from the project root:
323
406
 
324
- ```ruby
407
+ ```
325
408
  # install development gems
326
409
  bundle install
327
410
  # generate documentation
328
- rake yard
411
+ bundle exec rake yard
329
412
  ```
330
413
  The generated documentation will be placed in the `doc` folder.
331
414
 
332
415
 
333
416
  Running Tests
334
417
  -------------
335
- ```ruby
336
- appraisal install
337
- # optionally specify an activesupport version to test against (3/4), e.g.
338
- # appraisal 4 rake ## for ruby 2.1.2
339
- appraisal rake
340
418
  ```
341
-
419
+ bundle install
420
+ bundle exec rake
421
+ ```
342
422
 
343
423
  Compatibility
344
424
  -------------
345
- This project is tested and compatible with MRI 1.9.3, JRuby 1.7.12, and MRI 2.1.2.
425
+ This project is tested and compatible with Ruby >=2.5.8, and <= 2.7.1.
@@ -12,18 +12,21 @@ Gem::Specification.new do |s|
12
12
  s.summary = 'A ruby client to interact with the GovDelivery TMS REST API.'
13
13
  s.description = "A reference implementation, written in Ruby,
14
14
  to interact with GovDelivery's TMS API. The client is
15
- compatible with Ruby 1.9 and 2.0. "
15
+ compatible with Ruby >=2.5.8, and <= 2.7.1"
16
16
 
17
- s.add_runtime_dependency 'activesupport'
17
+ s.add_runtime_dependency 'activesupport', '>=5.2.4.3', '<6.0.0'
18
18
  s.add_runtime_dependency 'faraday'
19
19
  s.add_runtime_dependency 'faraday_middleware'
20
20
  s.add_runtime_dependency 'mime-types'
21
+ s.add_development_dependency 'simplecov'
22
+ s.add_development_dependency 'simplecov-cobertura'
21
23
 
22
24
  s.files = %w(
23
25
  Gemfile
24
26
  README.md
25
27
  Rakefile
26
28
  govdelivery-tms.gemspec
29
+ .version
27
30
  ) + Dir['lib/**/*']
28
31
 
29
32
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
@@ -36,3 +36,5 @@ require 'govdelivery/tms/resource/command_action'
36
36
  require 'govdelivery/tms/resource/command'
37
37
  require 'govdelivery/tms/resource/keyword'
38
38
  require 'govdelivery/tms/resource/webhook'
39
+ require 'govdelivery/tms/resource/reports_messages_email_statistics'
40
+ require 'govdelivery/tms/resource/reports_messages_sms_statistics'
@@ -39,8 +39,8 @@ class GovDelivery::TMS::Client
39
39
  parse_links(services['_links'])
40
40
  end
41
41
 
42
- def get(href)
43
- response = raw_connection.get(href)
42
+ def get(href, params = {})
43
+ response = raw_connection.get(href, params)
44
44
  case response.status
45
45
  when 500..599
46
46
  fail GovDelivery::TMS::Request::Error.new(response.status)
@@ -16,8 +16,8 @@ module GovDelivery::TMS::CollectionResource
16
16
  end
17
17
  end
18
18
 
19
- def get
20
- response = client.get(href)
19
+ def get(params = {})
20
+ response = client.get(href, params)
21
21
  initialize_collection_from_items(response.body)
22
22
  # setup page links from header
23
23
  links = LinkHeader.parse(response.headers['link']).to_a.collect do |a|
@@ -1,8 +1,8 @@
1
1
  class GovDelivery::TMS::Connection
2
2
  attr_accessor :auth_token, :api_root, :connection, :logger
3
3
 
4
- def get(href)
5
- resp = connection.get("#{href}.json")
4
+ def get(href, params = {})
5
+ resp = connection.get("#{href}.json", params)
6
6
  if resp.status != 200
7
7
  fail RecordNotFound.new("Could not find resource at #{href} (status #{resp.status})")
8
8
  else
@@ -130,9 +130,9 @@ module GovDelivery::TMS::InstanceResource
130
130
 
131
131
  attr_reader :attributes
132
132
 
133
- def get
133
+ def get(params={})
134
134
  fail GovDelivery::TMS::Errors::InvalidGet if self.new_record?
135
- process_response(client.get(href), :get) && self
135
+ process_response(client.get(href, params), :get) && self
136
136
  end
137
137
  alias_method :get!, :get
138
138
 
@@ -1,11 +1,23 @@
1
1
  module GovDelivery::TMS #:nodoc:
2
+ # FromAddress is an email address, associated response addresses (reply to,
3
+ # error to), and a display name that is used when sending an email via TMS.
4
+ # All messages sent via TMS must have a FromAddress, which can be set via or
5
+ # via a template. If neither is set with a message is sent, then the account's
6
+ # default FromAddress will be used.
7
+ #
8
+ # This resource is read-only.
9
+ #
10
+ # To add more FromAddresses to your account, please contact your CSC.
11
+ #
12
+ # @attr from_email [String] Email address that a message will be sent from
13
+ # @attr from_name [String] Display name of the sender of a message
14
+ # @attr reploy_to_email [Stirng] Email address that will be used for the Reply-To header
15
+ # @attr bounce_email [String] Email address that will be used for the Errors-To header
16
+ # @attr is_default [Boolean] Indicates if the FromAddress is the account's default FromAddress
2
17
  class FromAddress
3
18
  include InstanceResource
4
19
 
5
- # @!parse attr_accessor :from_email, :reply_to_email, :bounce_email, :is_default
6
- writeable_attributes :from_email, :reply_to_email, :bounce_email, :is_default
7
-
8
20
  # @!parse attr_reader :id, :created_at
9
- readonly_attributes :id, :created_at
21
+ readonly_attributes :id, :created_at, :from_email, :from_name, :reply_to_email, :bounce_email, :is_default
10
22
  end
11
23
  end
@@ -0,0 +1,8 @@
1
+ module GovDelivery::TMS #:nodoc:
2
+ class ReportsMessagesEmailStatistics
3
+ include InstanceResource
4
+
5
+ # @!parse attr_reader :recipients
6
+ readonly_attributes :recipients
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ module GovDelivery::TMS #:nodoc:
2
+ class ReportsMessagesSmsStatistics
3
+ include InstanceResource
4
+
5
+ # @!parse attr_reader :recipients
6
+ readonly_attributes :recipients
7
+ end
8
+ end
@@ -5,8 +5,10 @@ module GovDelivery::TMS::CoreExt
5
5
  ActiveSupport::Inflector.demodulize(path)
6
6
  end
7
7
 
8
- def classify(str)
9
- ActiveSupport::Inflector.camelize(str)
8
+ def camelize(str)
9
+ # Do not use ActiveSupport::Inflector.camelize because it uses global
10
+ # ActiveSupport::Inflector.acronum data.
11
+ str.to_s.gsub(/\/(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase }
10
12
  end
11
13
 
12
14
  def singularize(str)
@@ -38,7 +38,7 @@ module GovDelivery::TMS::Util
38
38
  end
39
39
 
40
40
  def relation_class(rel)
41
- ::GovDelivery::TMS.const_get(classify(rel)).tap do |klass|
41
+ ::GovDelivery::TMS.const_get(camelize(rel)).tap do |klass|
42
42
  return nil unless klass.name =~ /GovDelivery::TMS/
43
43
  end
44
44
  rescue NameError
@@ -1,5 +1,5 @@
1
1
  module GovDelivery
2
2
  module TMS #:nodoc:
3
- VERSION = '0.9.4'.freeze
3
+ VERSION = File.read(File.join(__dir__, "../../../.version")).freeze
4
4
  end
5
5
  end
@@ -52,6 +52,11 @@ describe GovDelivery::TMS::Client do
52
52
  allow(@raw_connection).to receive(:get).and_return(double('response', status: 202, body: { 'message' => 'hi' }))
53
53
  expect { @client.get('/blargh') }.to raise_error(GovDelivery::TMS::Request::InProgress)
54
54
  end
55
+ it 'should handle all other responses' do
56
+ response = double('response', status: 200, body: { 'message' => 'hi' })
57
+ allow(@raw_connection).to receive(:get).with('/blargh', {params: 'foobar'}).and_return(response)
58
+ expect(@client.get('/blargh', {params: 'foobar'})).to eq(response)
59
+ end
55
60
 
56
61
  context 'creating a new client without output' do
57
62
  subject { GovDelivery::TMS::Client.new('auth_token', api_root: 'null_url', logger: false) }
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+
3
+ def inflector
4
+ m = ActiveSupport::Inflector.method('inflections')
5
+ return ActiveSupport::Inflector.inflections(:en) if m.arity == 1
6
+ ActiveSupport::Inflector.inflections
7
+ end
8
+
9
+ describe GovDelivery::TMS::CoreExt do
10
+
11
+ subject do
12
+ Object.new.extend(described_class)
13
+ end
14
+
15
+ describe '#camelize' do
16
+ before do
17
+ inflector do |inflect|
18
+ inflect.acronym 'SMS'
19
+ end
20
+ end
21
+
22
+ it 'should return camilized string not using inflector acronyms' do
23
+ expect(subject.camelize('sms_message')).to eq 'SmsMessage'
24
+ end
25
+ end
26
+
27
+ end
@@ -91,7 +91,7 @@ describe GovDelivery::TMS::EmailMessage do
91
91
  'message_type' => '/message_type/abc',
92
92
  'email_template' => '/templates/email/new-template' }
93
93
  }
94
- expect(@message.client).to receive('get').with(@message.href).and_return(double('response', status: 200, body: response))
94
+ expect(@message.client).to receive('get').with(@message.href, {}).and_return(double('response', status: 200, body: response))
95
95
  @message.get
96
96
  expect(@message.body).to eq('processed')
97
97
  expect(@message.subject).to eq('hey')
@@ -0,0 +1,34 @@
1
+ require 'spec_helper'
2
+
3
+ describe GovDelivery::TMS::EmailMessages do
4
+ let(:href) {'/messages/email'}
5
+ context 'loading messages' do
6
+ let(:client) {double('client')}
7
+ let(:messages) {[
8
+ { subject: 'hello', body: 'greetings from places', created_at: 'a while ago' },
9
+ { subject: 'hi!', body: 'feel me flow', created_at: 'longer ago' },
10
+ { subject: 'yo', body: 'I am not a robot', created_at: 'even longer ago' }
11
+ ]}
12
+
13
+ before do
14
+ @messages = GovDelivery::TMS::EmailMessages.new(client, href)
15
+ end
16
+
17
+ it 'should GET ok' do
18
+ expect(@messages.client).to receive(:get).and_return(double('response', body: messages, status: 200, headers: { 'link' => "</messages/email/page/2>; rel=\"next\",</messages/email/page/11>; rel=\"last\"" }))
19
+
20
+ @messages.get
21
+ expect(@messages.collection.length).to eq(3)
22
+ expect(@messages.next.href).to eq('/messages/email/page/2')
23
+ expect(@messages.last.href).to eq('/messages/email/page/11')
24
+ end
25
+
26
+ it 'should GET ok with parameters' do
27
+ params = {page_size: 2, sort_by: 'created_by', sort_order: 'foobar'}
28
+ expect(@messages.client).to receive(:get).with(href, params).and_return(double('response', body: messages[1..-1], status: 200, headers: { 'link' => "</messages/email/page/2>; rel=\"next\",</messages/email/page/11>; rel=\"last\"" }))
29
+
30
+ @messages.get(params)
31
+ expect(@messages.collection.length).to eq(2)
32
+ end
33
+ end
34
+ end
@@ -25,7 +25,7 @@ describe GovDelivery::TMS::EmailTemplate do
25
25
  }
26
26
  ]
27
27
 
28
- expect(@templates.client).to receive('get').with('/templates/email').and_return(double('response', status: 200, body: response, headers: {}))
28
+ expect(@templates.client).to receive('get').with('/templates/email', {}).and_return(double('response', status: 200, body: response, headers: {}))
29
29
  @templates.get
30
30
  expect(@templates.collection.length).to eq(1)
31
31
  end
@@ -12,6 +12,7 @@ describe GovDelivery::TMS::FromAddress do
12
12
  it 'should be able to get a list of email templates' do
13
13
  response = [{
14
14
  'from_email' => 'something@evotest.govdelivery.com',
15
+ 'from_name' => 'Something',
15
16
  'reply_to_email' => 'something@evotest.govdelivery.com',
16
17
  'bounce_email' => 'something@evotest.govdelivery.com',
17
18
  'is_default' => true,
@@ -20,43 +21,12 @@ describe GovDelivery::TMS::FromAddress do
20
21
  '_links' => { 'self' => '/from_addresses/1' }
21
22
  }]
22
23
 
23
- expect(@fromaddresses.client).to receive('get').with('/from_addresses').and_return(double('/from_addresses', status: 200, body: response, headers: {}))
24
+ expect(@fromaddresses.client).to receive('get').with('/from_addresses',{}).and_return(double('/from_addresses', status: 200, body: response, headers: {}))
24
25
  addresses = @fromaddresses.get
25
26
  expect(addresses.collection.length).to eq(1)
26
27
  expect(addresses.collection.first.class).to eq(GovDelivery::TMS::FromAddress)
27
28
  expect(addresses.collection.first.from_email).to eq('something@evotest.govdelivery.com')
28
- end
29
- end
30
-
31
- context 'creating a from address' do
32
- let(:client) do
33
- double('client')
34
- end
35
-
36
- before do
37
- @fromaddress = GovDelivery::TMS::FromAddress.new(client, '/from_addresses', from_email: 'something@evotest.govdelivery.com',
38
- reply_to_email: 'something@evotest.govdelivery.com',
39
- bounce_email: 'something@evotest.govdelivery.com',
40
- is_default: true)
41
- end
42
-
43
- it 'should post successfully' do
44
- response = {
45
- 'from_email' => 'something@evotest.govdelivery.com',
46
- 'reply_to_email' => 'something@evotest.govdelivery.com',
47
- 'bounce_email' => 'something@evotest.govdelivery.com',
48
- 'is_default' => true,
49
- 'created_at' => 'sometime',
50
- '_links' => { 'self' => '/from_addresses/1' }
51
- }
52
- expect(@fromaddress.client).to receive('post').with(@fromaddress).and_return(double('response', status: 201, body: response))
53
- @fromaddress.post
54
- expect(@fromaddress.from_email).to eq('something@evotest.govdelivery.com')
55
- expect(@fromaddress.reply_to_email).to eq('something@evotest.govdelivery.com')
56
- expect(@fromaddress.bounce_email).to eq('something@evotest.govdelivery.com')
57
- expect(@fromaddress.is_default).to eq(true)
58
- expect(@fromaddress.created_at).to eq('sometime')
59
- expect(@fromaddress.href).to eq('/from_addresses/1')
29
+ expect(addresses.collection.first.from_name).to eq('Something')
60
30
  end
61
31
  end
62
32
 
@@ -39,7 +39,7 @@ describe GovDelivery::TMS::Keyword do
39
39
  end
40
40
  it 'should GET cleanly' do
41
41
  response = { name: 'FOO', response_text: 'hello' }
42
- expect(@keyword.client).to receive('get').with(@keyword.href).and_return(double('response', status: 200, body: response))
42
+ expect(@keyword.client).to receive('get').with(@keyword.href, {}).and_return(double('response', status: 200, body: response))
43
43
  @keyword.get
44
44
  expect(@keyword.name).to eq('FOO')
45
45
  expect(@keyword.response_text).to eq('hello')
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ describe GovDelivery::TMS::ReportsMessagesEmailStatistics do
4
+ context 'loading email message statistics' do
5
+ let(:client) { double('client') }
6
+ let(:href) { '/reports/messages/email/statistics' }
7
+
8
+ before do
9
+ @statistics = GovDelivery::TMS::ReportsMessagesEmailStatistics.new(client, href, {})
10
+ end
11
+
12
+ it 'gets OK with params' do
13
+ params = {start: Time.now.beginning_of_hour - 7.days, end: Time.now.beginning_of_hour}
14
+ stats = {:recipients => {:new => 5, :sending => 3, :inconclusive => 2, :blacklisted => 1, :canceled => 7, :sent => 80, :failed => 2} }
15
+
16
+
17
+ expect(@statistics.client).to receive('get').with(href, params).and_return(double('response', status: 200, body: stats))
18
+ @statistics.get(params)
19
+ expect(@statistics.recipients).to eq(stats[:recipients])
20
+ expect(@statistics.recipients[:sent]).to eq(80)
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+
3
+ describe GovDelivery::TMS::ReportsMessagesSmsStatistics do
4
+ context 'loading sms message statistics' do
5
+ let(:client) { double('client') }
6
+ let(:href) { '/reports/messages/sms/statistics' }
7
+
8
+ before do
9
+ @statistics = GovDelivery::TMS::ReportsMessagesSmsStatistics.new(client, href, {})
10
+ end
11
+
12
+ it 'gets OK with params' do
13
+ params = {start: Time.now.beginning_of_hour - 7.days, end: Time.now.beginning_of_hour}
14
+ stats = {:recipients => {:new => 5, :sending => 3, :inconclusive => 2, :blacklisted => 1, :canceled => 7, :sent => 80, :failed => 2} }
15
+
16
+ expect(@statistics.client).to receive('get').with(href, params).and_return(double('response', status: 200, body: stats))
17
+ @statistics.get(params)
18
+ expect(@statistics.recipients).to eq(stats[:recipients])
19
+ expect(@statistics.recipients[:sent]).to eq(80)
20
+ end
21
+ end
22
+ end
@@ -52,7 +52,7 @@ describe GovDelivery::TMS::SmsMessage do
52
52
  end
53
53
  it 'should GET cleanly' do
54
54
  response = { body: 'processed', recipients: [{ phone: '22345678' }], created_at: 'time' }
55
- expect(@message.client).to receive('get').with(@message.href).and_return(double('response', status: 200, body: response))
55
+ expect(@message.client).to receive('get').with(@message.href, {}).and_return(double('response', status: 200, body: response))
56
56
  @message.get
57
57
  expect(@message.body).to eq('processed')
58
58
  expect(@message.created_at).to eq('time')
@@ -1,21 +1,33 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe GovDelivery::TMS::SmsMessages do
4
+ let(:href) {'/messages/sms'}
4
5
  context 'creating a new messages list' do
5
- let(:client) do
6
- double('client')
7
- end
6
+ let(:client) {double('client')}
7
+ let(:messages) {[
8
+ { short_body: 'hi ho', created_at: 'a while ago' },
9
+ { short_body: 'hello', created_at: 'longer ago' },
10
+ { short_body: 'yo', created_at: 'even longer ago' }
11
+ ]}
12
+
8
13
  before do
9
- @messages = GovDelivery::TMS::SmsMessages.new(client, '/messages')
14
+ @messages = GovDelivery::TMS::SmsMessages.new(client, href)
10
15
  end
11
16
  it 'should GET itself' do
12
- body = [{ short_body: 'hi ho', created_at: 'a while ago' }, { short_body: 'feel me flow', created_at: 'longer ago' }]
13
- expect(@messages.client).to receive(:get).and_return(double('response', body: body, status: 200, headers: { 'link' => "</messages/page/2>; rel=\"next\",</messages/page/11>; rel=\"last\"" }))
17
+ expect(@messages.client).to receive(:get).and_return(double('response', body: messages, status: 200, headers: { 'link' => "</messages/sms/page/2>; rel=\"next\",</messages/sms/page/11>; rel=\"last\"" }))
14
18
 
15
19
  @messages.get
20
+ expect(@messages.collection.length).to eq(3)
21
+ expect(@messages.next.href).to eq('/messages/sms/page/2')
22
+ expect(@messages.last.href).to eq('/messages/sms/page/11')
23
+ end
24
+
25
+ it 'should GET ok with parameters' do
26
+ params = {page_size: 2, sort_by: 'created_by', sort_order: 'foobar'}
27
+ expect(@messages.client).to receive(:get).with(href, params).and_return(double('response', body: messages[1..-1], status: 200, headers: { 'link' => "</messages/sms/page/2>; rel=\"next\",</messages/sms/page/11>; rel=\"last\"" }))
28
+
29
+ @messages.get(params)
16
30
  expect(@messages.collection.length).to eq(2)
17
- expect(@messages.next.href).to eq('/messages/page/2')
18
- expect(@messages.last.href).to eq('/messages/page/11')
19
31
  end
20
32
  end
21
33
  end
@@ -1,4 +1,11 @@
1
1
  $LOAD_PATH << File.expand_path('../lib', __FILE__)
2
+
3
+ require 'simplecov'
4
+ require 'simplecov-cobertura'
5
+
6
+ SimpleCov.formatter = SimpleCov::Formatter::CoberturaFormatter
7
+ SimpleCov.start { add_filter "/spec/" }
8
+
2
9
  require 'govdelivery-tms'
3
10
 
4
11
  class GovDelivery::TMS::Horse
metadata CHANGED
@@ -1,80 +1,116 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: govdelivery-tms
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.4
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - GovDelivery
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-06-03 00:00:00.000000000 Z
11
+ date: 2020-08-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ! '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: 5.2.4.3
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: 6.0.0
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
24
- - - ! '>='
27
+ - - ">="
25
28
  - !ruby/object:Gem::Version
26
- version: '0'
29
+ version: 5.2.4.3
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: 6.0.0
27
33
  - !ruby/object:Gem::Dependency
28
34
  name: faraday
29
35
  requirement: !ruby/object:Gem::Requirement
30
36
  requirements:
31
- - - ! '>='
37
+ - - ">="
32
38
  - !ruby/object:Gem::Version
33
39
  version: '0'
34
40
  type: :runtime
35
41
  prerelease: false
36
42
  version_requirements: !ruby/object:Gem::Requirement
37
43
  requirements:
38
- - - ! '>='
44
+ - - ">="
39
45
  - !ruby/object:Gem::Version
40
46
  version: '0'
41
47
  - !ruby/object:Gem::Dependency
42
48
  name: faraday_middleware
43
49
  requirement: !ruby/object:Gem::Requirement
44
50
  requirements:
45
- - - ! '>='
51
+ - - ">="
46
52
  - !ruby/object:Gem::Version
47
53
  version: '0'
48
54
  type: :runtime
49
55
  prerelease: false
50
56
  version_requirements: !ruby/object:Gem::Requirement
51
57
  requirements:
52
- - - ! '>='
58
+ - - ">="
53
59
  - !ruby/object:Gem::Version
54
60
  version: '0'
55
61
  - !ruby/object:Gem::Dependency
56
62
  name: mime-types
57
63
  requirement: !ruby/object:Gem::Requirement
58
64
  requirements:
59
- - - ! '>='
65
+ - - ">="
60
66
  - !ruby/object:Gem::Version
61
67
  version: '0'
62
68
  type: :runtime
63
69
  prerelease: false
64
70
  version_requirements: !ruby/object:Gem::Requirement
65
71
  requirements:
66
- - - ! '>='
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ - !ruby/object:Gem::Dependency
76
+ name: simplecov
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ - !ruby/object:Gem::Dependency
90
+ name: simplecov-cobertura
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
67
101
  - !ruby/object:Gem::Version
68
102
  version: '0'
69
- description: ! "A reference implementation, written in Ruby,\n to
70
- interact with GovDelivery's TMS API. The client is\n compatible
71
- with Ruby 1.9 and 2.0. "
103
+ description: |-
104
+ A reference implementation, written in Ruby,
105
+ to interact with GovDelivery's TMS API. The client is
106
+ compatible with Ruby >=2.5.8, and <= 2.7.1
72
107
  email:
73
108
  - support@govdelivery.com
74
109
  executables: []
75
110
  extensions: []
76
111
  extra_rdoc_files: []
77
112
  files:
113
+ - ".version"
78
114
  - Gemfile
79
115
  - README.md
80
116
  - Rakefile
@@ -103,6 +139,8 @@ files:
103
139
  - lib/govdelivery/tms/resource/keyword.rb
104
140
  - lib/govdelivery/tms/resource/message_type.rb
105
141
  - lib/govdelivery/tms/resource/recipient.rb
142
+ - lib/govdelivery/tms/resource/reports_messages_email_statistics.rb
143
+ - lib/govdelivery/tms/resource/reports_messages_sms_statistics.rb
106
144
  - lib/govdelivery/tms/resource/sms_message.rb
107
145
  - lib/govdelivery/tms/resource/sms_template.rb
108
146
  - lib/govdelivery/tms/resource/webhook.rb
@@ -111,7 +149,9 @@ files:
111
149
  - lib/govdelivery/tms/version.rb
112
150
  - spec/client_spec.rb
113
151
  - spec/command_types_spec.rb
152
+ - spec/core_ext_spec.rb
114
153
  - spec/email_message_spec.rb
154
+ - spec/email_messages_spec.rb
115
155
  - spec/email_template_spec.rb
116
156
  - spec/errors_spec.rb
117
157
  - spec/from_address_spec.rb
@@ -121,6 +161,8 @@ files:
121
161
  - spec/keywords_spec.rb
122
162
  - spec/mail/delivery_method_spec.rb
123
163
  - spec/message_types_spec.rb
164
+ - spec/reports_messages_email_statistics_spec.rb
165
+ - spec/reports_messages_sms_statistics_spec.rb
124
166
  - spec/sms_message_spec.rb
125
167
  - spec/sms_messages_spec.rb
126
168
  - spec/spec_helper.rb
@@ -128,30 +170,32 @@ files:
128
170
  homepage: http://govdelivery.com
129
171
  licenses: []
130
172
  metadata: {}
131
- post_install_message:
173
+ post_install_message:
132
174
  rdoc_options: []
133
175
  require_paths:
134
176
  - lib
135
177
  required_ruby_version: !ruby/object:Gem::Requirement
136
178
  requirements:
137
- - - ! '>='
179
+ - - ">="
138
180
  - !ruby/object:Gem::Version
139
181
  version: '0'
140
182
  required_rubygems_version: !ruby/object:Gem::Requirement
141
183
  requirements:
142
- - - ! '>='
184
+ - - ">="
143
185
  - !ruby/object:Gem::Version
144
186
  version: '0'
145
187
  requirements: []
146
- rubyforge_project:
147
- rubygems_version: 2.4.6
148
- signing_key:
188
+ rubyforge_project:
189
+ rubygems_version: 2.7.6.2
190
+ signing_key:
149
191
  specification_version: 4
150
192
  summary: A ruby client to interact with the GovDelivery TMS REST API.
151
193
  test_files:
152
194
  - spec/client_spec.rb
153
195
  - spec/command_types_spec.rb
196
+ - spec/core_ext_spec.rb
154
197
  - spec/email_message_spec.rb
198
+ - spec/email_messages_spec.rb
155
199
  - spec/email_template_spec.rb
156
200
  - spec/errors_spec.rb
157
201
  - spec/from_address_spec.rb
@@ -161,8 +205,9 @@ test_files:
161
205
  - spec/keywords_spec.rb
162
206
  - spec/mail/delivery_method_spec.rb
163
207
  - spec/message_types_spec.rb
208
+ - spec/reports_messages_email_statistics_spec.rb
209
+ - spec/reports_messages_sms_statistics_spec.rb
164
210
  - spec/sms_message_spec.rb
165
211
  - spec/sms_messages_spec.rb
166
212
  - spec/spec_helper.rb
167
213
  - spec/tms_spec.rb
168
- has_rdoc: