govdelivery-tms 0.8.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 +15 -0
- data/Gemfile +14 -0
- data/README.md +324 -0
- data/Rakefile +20 -0
- data/govdelivery-tms.gemspec +30 -0
- data/lib/govdelivery-tms.rb +43 -0
- data/lib/govdelivery-tms/base.rb +37 -0
- data/lib/govdelivery-tms/client.rb +97 -0
- data/lib/govdelivery-tms/collection_resource.rb +54 -0
- data/lib/govdelivery-tms/connection.rb +34 -0
- data/lib/govdelivery-tms/errors.rb +58 -0
- data/lib/govdelivery-tms/instance_resource.rb +219 -0
- data/lib/govdelivery-tms/link_header.rb +223 -0
- data/lib/govdelivery-tms/logger.rb +36 -0
- data/lib/govdelivery-tms/mail/delivery_method.rb +63 -0
- data/lib/govdelivery-tms/resource/collections.rb +98 -0
- data/lib/govdelivery-tms/resource/command.rb +25 -0
- data/lib/govdelivery-tms/resource/command_action.rb +17 -0
- data/lib/govdelivery-tms/resource/command_type.rb +20 -0
- data/lib/govdelivery-tms/resource/email_message.rb +81 -0
- data/lib/govdelivery-tms/resource/email_recipient.rb +31 -0
- data/lib/govdelivery-tms/resource/email_recipient_click.rb +8 -0
- data/lib/govdelivery-tms/resource/email_recipient_open.rb +8 -0
- data/lib/govdelivery-tms/resource/email_template.rb +15 -0
- data/lib/govdelivery-tms/resource/from_address.rb +10 -0
- data/lib/govdelivery-tms/resource/inbound_sms_message.rb +8 -0
- data/lib/govdelivery-tms/resource/ipaws_acknowledgement.rb +9 -0
- data/lib/govdelivery-tms/resource/ipaws_alert.rb +38 -0
- data/lib/govdelivery-tms/resource/ipaws_category.rb +7 -0
- data/lib/govdelivery-tms/resource/ipaws_cog_profile.rb +29 -0
- data/lib/govdelivery-tms/resource/ipaws_event_code.rb +7 -0
- data/lib/govdelivery-tms/resource/ipaws_nwem_area.rb +18 -0
- data/lib/govdelivery-tms/resource/ipaws_nwem_authorization.rb +9 -0
- data/lib/govdelivery-tms/resource/ipaws_nwem_auxilary_data.rb +8 -0
- data/lib/govdelivery-tms/resource/ipaws_response_type.rb +7 -0
- data/lib/govdelivery-tms/resource/ipaws_static_resource.rb +8 -0
- data/lib/govdelivery-tms/resource/keyword.rb +30 -0
- data/lib/govdelivery-tms/resource/recipient.rb +10 -0
- data/lib/govdelivery-tms/resource/sms_message.rb +35 -0
- data/lib/govdelivery-tms/resource/webhook.rb +20 -0
- data/lib/govdelivery-tms/util/core_ext.rb +27 -0
- data/lib/govdelivery-tms/util/hal_link_parser.rb +50 -0
- data/lib/govdelivery-tms/version.rb +3 -0
- data/spec/client_spec.rb +41 -0
- data/spec/command_types_spec.rb +29 -0
- data/spec/email_message_spec.rb +102 -0
- data/spec/email_template_spec.rb +149 -0
- data/spec/errors_spec.rb +13 -0
- data/spec/from_address_spec.rb +86 -0
- data/spec/inbound_sms_messages_spec.rb +19 -0
- data/spec/instance_resource_spec.rb +61 -0
- data/spec/ipaws_acknowledgement_spec.rb +16 -0
- data/spec/ipaws_alerts_spec.rb +192 -0
- data/spec/ipaws_cog_profile_spec.rb +75 -0
- data/spec/ipaws_event_codes_spec.rb +35 -0
- data/spec/ipaws_nwem_areas_spec.rb +58 -0
- data/spec/ipaws_nwem_authorization_spec.rb +16 -0
- data/spec/keyword_spec.rb +62 -0
- data/spec/keywords_spec.rb +21 -0
- data/spec/mail/delivery_method_spec.rb +52 -0
- data/spec/sms_message_spec.rb +63 -0
- data/spec/sms_messages_spec.rb +21 -0
- data/spec/spec_helper.rb +31 -0
- data/spec/tms_spec.rb +7 -0
- metadata +172 -0
@@ -0,0 +1,20 @@
|
|
1
|
+
module TMS #:nodoc:
|
2
|
+
# A Webhook gets invoked when a recipient enters a queued or final state
|
3
|
+
#
|
4
|
+
# @attr url [String] The URL to POST webhooks to
|
5
|
+
# @attr event_type 'sending', 'inconclusive', 'blacklisted', 'sent', 'canceled', or 'failed'
|
6
|
+
#
|
7
|
+
# @example
|
8
|
+
# webhook = client.webhooks.build(:url => 'http://your.url', :event_type => 'failed')
|
9
|
+
# webhook.post
|
10
|
+
# webhook.get
|
11
|
+
class Webhook
|
12
|
+
include InstanceResource
|
13
|
+
|
14
|
+
# @!parse attr_accessor :url, :event_type
|
15
|
+
writeable_attributes :url, :event_type
|
16
|
+
|
17
|
+
# @!parse attr_reader :created_at, :updated_at
|
18
|
+
readonly_attributes :created_at, :updated_at
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'active_support/inflector'
|
2
|
+
|
3
|
+
module TMS::CoreExt
|
4
|
+
def demodulize(path)
|
5
|
+
ActiveSupport::Inflector.demodulize(path)
|
6
|
+
end
|
7
|
+
|
8
|
+
def classify(str)
|
9
|
+
ActiveSupport::Inflector.camelize(str)
|
10
|
+
end
|
11
|
+
|
12
|
+
def singularize(str)
|
13
|
+
ActiveSupport::Inflector.singularize(str)
|
14
|
+
end
|
15
|
+
|
16
|
+
def pluralize(str)
|
17
|
+
ActiveSupport::Inflector.pluralize(str)
|
18
|
+
end
|
19
|
+
|
20
|
+
def tmsify(klassname)
|
21
|
+
ActiveSupport::Inflector.underscore(demodulize(klassname))
|
22
|
+
end
|
23
|
+
|
24
|
+
def instance_class(klass)
|
25
|
+
ActiveSupport::Inflector.constantize(singularize(klass.to_s))
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module TMS::Util
|
2
|
+
module HalLinkParser
|
3
|
+
|
4
|
+
def parse_links(_links)
|
5
|
+
@resources = {}
|
6
|
+
return if _links.nil?
|
7
|
+
parse_link(_links) and return if _links.is_a?(Hash)
|
8
|
+
_links.each { |link| parse_link(link) }
|
9
|
+
end
|
10
|
+
|
11
|
+
def subresources
|
12
|
+
@resources
|
13
|
+
end
|
14
|
+
|
15
|
+
protected
|
16
|
+
|
17
|
+
def metaclass
|
18
|
+
@metaclass ||= class << self;
|
19
|
+
self;
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def parse_link(link)
|
24
|
+
link.each do |rel, href|
|
25
|
+
if rel == 'self'
|
26
|
+
self.href = href
|
27
|
+
else
|
28
|
+
klass = relation_class(rel)
|
29
|
+
klass = self.class if ['first', 'prev', 'next', 'last'].include?(rel)
|
30
|
+
if klass
|
31
|
+
subresources[rel] = klass.new(self.client, href)
|
32
|
+
setup_subresource(link)
|
33
|
+
else
|
34
|
+
logger.info("Don't know what to do with link rel '#{rel}' for class #{self.class.to_s}!") if self.respond_to?(:logger)
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def relation_class(rel)
|
42
|
+
::TMS.const_get(classify(rel)) rescue nil
|
43
|
+
end
|
44
|
+
|
45
|
+
def setup_subresource(link)
|
46
|
+
return unless link
|
47
|
+
link.each { |rel, href| self.metaclass.send(:define_method, rel.to_sym, &lambda { subresources[rel] }) unless rel == 'self' }
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
data/spec/client_spec.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
describe TMS::Client do
|
3
|
+
context "creating a new client" do
|
4
|
+
before do
|
5
|
+
response = double('response', :status => 200, :body => {"_links" => [{"self" => "/"}, {"horse" => "/horses/new"}, {"rabbits" => "/rabbits"}]})
|
6
|
+
@raw_connection = double('raw_connection', :get => response)
|
7
|
+
@connection = TMS::Connection.stub(:new).and_return(double('connection', :connection => @raw_connection))
|
8
|
+
@client = TMS::Client.new('auth_token', :api_root => 'null_url')
|
9
|
+
end
|
10
|
+
it 'should set up logging' do
|
11
|
+
@client.logger.should_not be_nil
|
12
|
+
@client.logger.level.should eq(Logger::INFO)
|
13
|
+
end
|
14
|
+
it 'should discover endpoints for known services' do
|
15
|
+
@client.horse.should be_kind_of(TMS::Horse)
|
16
|
+
@client.rabbits.should be_kind_of(TMS::Rabbits)
|
17
|
+
end
|
18
|
+
it 'should handle 4xx responses' do
|
19
|
+
@raw_connection.stub(:get).and_return(double('response', :status => 404, :body => {'message' => 'hi'}))
|
20
|
+
expect { @client.get('/blargh') }.to raise_error(TMS::Request::Error)
|
21
|
+
end
|
22
|
+
it 'should handle 5xx responses' do
|
23
|
+
@raw_connection.stub(:get).and_return(double('response', :status => 503, :body => {'message' => 'oops'}))
|
24
|
+
expect { @client.get('/blargh') }.to raise_error(TMS::Request::Error)
|
25
|
+
end
|
26
|
+
it 'should handle 202 responses' do
|
27
|
+
@raw_connection.stub(:get).and_return(double('response', :status => 202, :body => {'message' => 'hi'}))
|
28
|
+
expect { @client.get('/blargh') }.to raise_error(TMS::Request::InProgress)
|
29
|
+
end
|
30
|
+
|
31
|
+
context 'creating a new client without output' do
|
32
|
+
subject { TMS::Client.new('auth_token', api_root: 'null_url', logger: false) }
|
33
|
+
its(:logger){ should be_falsey }
|
34
|
+
its(:horse) { should be_kind_of(TMS::Horse) }
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'defaults to the public API URL' do
|
38
|
+
expect(TMS::Client.new('auth_token').api_root).to eq('https://tms.govdelivery.com')
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe TMS::CommandTypes do
|
4
|
+
context "loading command types" do
|
5
|
+
let(:client) do
|
6
|
+
double('client')
|
7
|
+
end
|
8
|
+
before do
|
9
|
+
@command_types = TMS::CommandTypes.new(client, '/command_types')
|
10
|
+
end
|
11
|
+
it 'should GET ok' do
|
12
|
+
body = [{"name"=>"dcm_unsubscribe",
|
13
|
+
"string_fields"=>[],
|
14
|
+
"array_fields"=>["dcm_account_codes"]},
|
15
|
+
{"name"=>"dcm_subscribe",
|
16
|
+
"string_fields"=>["dcm_account_code"],
|
17
|
+
"array_fields"=>["dcm_topic_codes"]},
|
18
|
+
{"name"=>"forward",
|
19
|
+
"string_fields"=>["http_method", "username", "password", "url"],
|
20
|
+
"array_fields"=>[]}]
|
21
|
+
@command_types.client.should_receive(:get).and_return(double('response', :body => body, :status => 200, :headers => {}))
|
22
|
+
@command_types.get
|
23
|
+
@command_types.collection.length.should == 3
|
24
|
+
ct = @command_types.collection.find{|c| c.name == "dcm_subscribe"}
|
25
|
+
ct.array_fields.should eq(["dcm_topic_codes"])
|
26
|
+
ct.string_fields.should eq(["dcm_account_code"])
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe TMS::EmailMessage do
|
4
|
+
context "creating a new message" do
|
5
|
+
let(:client) do
|
6
|
+
double('client')
|
7
|
+
end
|
8
|
+
before do
|
9
|
+
@message = TMS::EmailMessage.new(client, '/messages/email', {
|
10
|
+
:body => '12345678',
|
11
|
+
:subject => 'blah',
|
12
|
+
:created_at => 'BAAAAAD',
|
13
|
+
:from_email => 'eric@evotest.govdelivery.com',
|
14
|
+
:errors_to => 'errors@evotest.govdelivery.com',
|
15
|
+
:reply_to => 'replyto@evotest.govdelivery.com'})
|
16
|
+
end
|
17
|
+
it 'should not render readonly attrs in json hash' do
|
18
|
+
@message.to_json[:body].should == '12345678'
|
19
|
+
@message.to_json[:created_at].should == nil
|
20
|
+
end
|
21
|
+
it 'should initialize with attrs and collections' do
|
22
|
+
@message.body.should == '12345678'
|
23
|
+
@message.subject.should == 'blah'
|
24
|
+
@message.from_email.should == 'eric@evotest.govdelivery.com'
|
25
|
+
@message.reply_to.should == 'replyto@evotest.govdelivery.com'
|
26
|
+
@message.errors_to.should == 'errors@evotest.govdelivery.com'
|
27
|
+
@message.recipients.class.should == TMS::EmailRecipients
|
28
|
+
end
|
29
|
+
it 'should post successfully' do
|
30
|
+
response = {
|
31
|
+
:body => 'processed',
|
32
|
+
:subject => 'blah',
|
33
|
+
:from_email => 'eric@evotest.govdelivery.com',
|
34
|
+
:errors_to => 'errors@evotest.govdelivery.com',
|
35
|
+
:reply_to => 'replyto@evotest.govdelivery.com',
|
36
|
+
:recipients => [{:email => 'billy@evotest.govdelivery.com'}],
|
37
|
+
:failed => [{:email => 'billy@evotest.govdelivery.com'}],
|
38
|
+
:sent => [{:email => 'billy@evotest.govdelivery.com'}],
|
39
|
+
:created_at => 'time'
|
40
|
+
}
|
41
|
+
@message.client.should_receive('post').with(@message).and_return(double('response', :status => 201, :body => response))
|
42
|
+
@message.post
|
43
|
+
@message.body.should == 'processed'
|
44
|
+
@message.created_at.should == 'time'
|
45
|
+
@message.from_email.should == 'eric@evotest.govdelivery.com'
|
46
|
+
@message.reply_to.should == 'replyto@evotest.govdelivery.com'
|
47
|
+
@message.errors_to.should == 'errors@evotest.govdelivery.com'
|
48
|
+
@message.recipients.class.should == TMS::EmailRecipients
|
49
|
+
@message.recipients.collection.first.class.should == TMS::EmailRecipient
|
50
|
+
@message.sent.class.should == TMS::EmailRecipients
|
51
|
+
@message.sent.collection.first.class.should == TMS::EmailRecipient
|
52
|
+
@message.failed.class.should == TMS::EmailRecipients
|
53
|
+
@message.failed.collection.first.class.should == TMS::EmailRecipient
|
54
|
+
end
|
55
|
+
it 'should handle errors' do
|
56
|
+
response = {'errors' => {:body => "can't be nil"}}
|
57
|
+
@message.client.should_receive('post').with(@message).and_return(double('response', :status => 422, :body => response))
|
58
|
+
@message.post
|
59
|
+
@message.body.should == '12345678'
|
60
|
+
@message.errors.should == {:body => "can't be nil"}
|
61
|
+
end
|
62
|
+
|
63
|
+
it 'should handle 401 errors' do
|
64
|
+
@message.client.should_receive('post').with(@message).and_return(double('response', :status => 401))
|
65
|
+
expect {@message.post}.to raise_error(StandardError, "401 Not Authorized")
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'should handle 404 errors' do
|
69
|
+
@message.client.should_receive('post').with(@message).and_return(double('response', :status => 404))
|
70
|
+
expect {@message.post}.to raise_error(StandardError, "Can't POST to /messages/email")
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
context 'an existing message' do
|
75
|
+
let(:client) do
|
76
|
+
double('client')
|
77
|
+
end
|
78
|
+
before do
|
79
|
+
# blank hash prevents the client from doing a GET in the initialize method
|
80
|
+
@message = TMS::EmailMessage.new(client, '/messages/99', {})
|
81
|
+
end
|
82
|
+
it 'should GET cleanly' do
|
83
|
+
response = {:body => 'processed',
|
84
|
+
:subject => 'hey',
|
85
|
+
:from_email => 'eric@evotest.govdelivery.com',
|
86
|
+
:errors_to => 'errors@evotest.govdelivery.com',
|
87
|
+
:reply_to => 'replyto@evotest.govdelivery.com',
|
88
|
+
:recipients => [{:email => 'billy@evotest.govdelivery.com'}],
|
89
|
+
:created_at => 'time'}
|
90
|
+
@message.client.should_receive('get').with(@message.href).and_return(double('response', :status => 200, :body => response))
|
91
|
+
@message.get
|
92
|
+
@message.body.should == 'processed'
|
93
|
+
@message.subject.should == 'hey'
|
94
|
+
@message.from_email.should == 'eric@evotest.govdelivery.com'
|
95
|
+
@message.reply_to.should == 'replyto@evotest.govdelivery.com'
|
96
|
+
@message.errors_to.should == 'errors@evotest.govdelivery.com'
|
97
|
+
@message.created_at.should == 'time'
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
|
102
|
+
end
|
@@ -0,0 +1,149 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe TMS::EmailTemplate do
|
4
|
+
context "creating a list of email templates" do
|
5
|
+
let(:client) do
|
6
|
+
double('client')
|
7
|
+
end
|
8
|
+
before do
|
9
|
+
@templates = TMS::EmailTemplates.new(client, '/templates/email')
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'should be able to get a list of email templates' do
|
13
|
+
response = [
|
14
|
+
{
|
15
|
+
'id' => "1",
|
16
|
+
'body' => "Template 1",
|
17
|
+
'subject' => "This is the template 1 subject",
|
18
|
+
'link_tracking_parameters' => "test=ok&hello=world",
|
19
|
+
'macros' => {"MACRO1" => "1"},
|
20
|
+
'open_tracking_enabled' => true,
|
21
|
+
'click_tracking_enabled' => true,
|
22
|
+
'created_at' => "sometime",
|
23
|
+
'_links' => {"self" => "/templates/email/1","account" => "/accounts/1","from_address" => "/from_addresses/1"}
|
24
|
+
}
|
25
|
+
]
|
26
|
+
|
27
|
+
@templates.client.should_receive('get').with('/templates/email').and_return(double('response', :status => 200, :body => response, :headers => {}))
|
28
|
+
@templates.get
|
29
|
+
@templates.collection.length.should == 1
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context "creating an email template" do
|
34
|
+
let(:client) do
|
35
|
+
double('client')
|
36
|
+
end
|
37
|
+
before do
|
38
|
+
@template = TMS::EmailTemplate.new(client, '/templates/email', {
|
39
|
+
:body => "Template 1",
|
40
|
+
:subject => "This is the template 1 subject",
|
41
|
+
:link_tracking_parameters => "test=ok&hello=world",
|
42
|
+
:macros => {"MACRO1" => "1"},
|
43
|
+
:open_tracking_enabled => true,
|
44
|
+
:click_tracking_enabled => true,
|
45
|
+
})
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'should render linkable attrs in json hash' do
|
49
|
+
@template.links[:from_address] = "1"
|
50
|
+
@template.links[:invalid] = "2"
|
51
|
+
links = @template.to_json[:_links]
|
52
|
+
links[:from_address].should == '1'
|
53
|
+
links[:invalid].should be_nil
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'should clear the links property after a successful post' do
|
57
|
+
@template.links[:from_address] = "1"
|
58
|
+
@template.client.should_receive('post').with(@template).and_return(double('response', :status => 201, :body => {}))
|
59
|
+
@template.post
|
60
|
+
links = @template.to_json[:_links]
|
61
|
+
links[:from_address].should be_nil
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'should not clear the links property after an invalid post' do
|
65
|
+
@template.links[:from_address] = "1"
|
66
|
+
@template.client.should_receive('post').with(@template).and_return(double('response', :status => 400, :body => {}))
|
67
|
+
@template.post
|
68
|
+
links = @template.to_json[:_links]
|
69
|
+
links[:from_address].should == "1"
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'should post successfully' do
|
73
|
+
response = {
|
74
|
+
'id' => "1",
|
75
|
+
'body' => "Template 1",
|
76
|
+
'subject' => "This is the template 1 subject",
|
77
|
+
'link_tracking_parameters' => "test=ok&hello=world",
|
78
|
+
'macros' => {"MACRO1" => "1"},
|
79
|
+
'open_tracking_enabled' => true,
|
80
|
+
'click_tracking_enabled' => true,
|
81
|
+
'created_at' => "sometime",
|
82
|
+
'_links' => {"self" => "/templates/email/1","account" => "/accounts/1","from_address" => "/from_addresses/1"}
|
83
|
+
}
|
84
|
+
@template.client.should_receive('post').with(@template).and_return(double('response', :status => 201, :body => response))
|
85
|
+
@template.post
|
86
|
+
@template.id.should == '1'
|
87
|
+
@template.body.should == 'Template 1'
|
88
|
+
@template.subject.should == 'This is the template 1 subject'
|
89
|
+
@template.link_tracking_parameters.should == 'test=ok&hello=world'
|
90
|
+
@template.macros.should == {"MACRO1"=>"1"}
|
91
|
+
@template.open_tracking_enabled.should == true
|
92
|
+
@template.click_tracking_enabled.should == true
|
93
|
+
@template.created_at.should == 'sometime'
|
94
|
+
@template.from_address.should be_a(TMS::FromAddress)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
context "handling errors at the template level" do
|
99
|
+
let(:client) do
|
100
|
+
double('client')
|
101
|
+
end
|
102
|
+
before do
|
103
|
+
@template = TMS::EmailTemplate.new(client, '/templates/email/1')
|
104
|
+
end
|
105
|
+
|
106
|
+
it 'should handle errors' do
|
107
|
+
response = {'errors' => {:body => "can't be nil"}}
|
108
|
+
@template.client.should_receive('post').with(@template).and_return(double('response', :status => 422, :body => response))
|
109
|
+
@template.post
|
110
|
+
@template.errors.should == {:body => "can't be nil"}
|
111
|
+
end
|
112
|
+
|
113
|
+
it 'should handle 401 errors' do
|
114
|
+
@template.client.should_receive('post').with(@template).and_return(double('response', :status => 401))
|
115
|
+
expect {@template.post}.to raise_error("401 Not Authorized")
|
116
|
+
end
|
117
|
+
|
118
|
+
it 'should handle 404 errors' do
|
119
|
+
@template.client.should_receive('post').with(@template).and_return(double('response', :status => 404))
|
120
|
+
expect {@template.post}.to raise_error("Can't POST to /templates/email/1")
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
context "handling errors at the email_templates root level" do
|
125
|
+
let(:client) do
|
126
|
+
double('client')
|
127
|
+
end
|
128
|
+
before do
|
129
|
+
@template = TMS::EmailTemplate.new(client, '/templates/email')
|
130
|
+
end
|
131
|
+
|
132
|
+
it 'should handle errors' do
|
133
|
+
response = {'errors' => {:body => "can't be nil"}}
|
134
|
+
@template.client.should_receive('post').with(@template).and_return(double('response', :status => 422, :body => response))
|
135
|
+
@template.post
|
136
|
+
@template.errors.should == {:body => "can't be nil"}
|
137
|
+
end
|
138
|
+
|
139
|
+
it 'should handle 401 errors' do
|
140
|
+
@template.client.should_receive('post').with(@template).and_return(double('response', :status => 401))
|
141
|
+
expect {@template.post}.to raise_error("401 Not Authorized")
|
142
|
+
end
|
143
|
+
|
144
|
+
it 'should handle 404 errors' do
|
145
|
+
@template.client.should_receive('post').with(@template).and_return(double('response', :status => 404))
|
146
|
+
expect {@template.post}.to raise_error("Can't POST to /templates/email")
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
data/spec/errors_spec.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe TMS::Errors do
|
4
|
+
context "an errors hash" do
|
5
|
+
let(:object_with_errors) do
|
6
|
+
double('instance', href: 'href', errors: {"body" => ["can't be blank"], "subject" => ["can't be blank"]})
|
7
|
+
end
|
8
|
+
subject { TMS::Errors::InvalidVerb.new(object_with_errors) }
|
9
|
+
it 'should work' do
|
10
|
+
subject.message.should =~ /body can't be blank, subject can't be blank/
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|