outbox 0.0.1 → 0.1.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,212 @@
1
+ require 'spec_helper'
2
+
3
+ describe Outbox::Messages::Base do
4
+ class Message < Outbox::Messages::Base
5
+ default_client :test
6
+ fields :to, 'from'
7
+ field :foo
8
+ end
9
+
10
+ class MessageWithRequiredField < Outbox::Messages::Base
11
+ default_client :test
12
+ field :foo, required: true
13
+ end
14
+
15
+ class MessageWithRequiredFields < Outbox::Messages::Base
16
+ default_client :test
17
+ required_fields :to, :from
18
+ fields :foo
19
+ end
20
+
21
+ class MessageWithoutFieldAccessors < Outbox::Messages::Base
22
+ attr_reader :to_reader_called, :to_writer_called,
23
+ :from_reader_called, :from_writer_called,
24
+ :body_reader_called, :body_writer_called
25
+
26
+ def to(value = nil)
27
+ @to_reader_called = true
28
+ value ? @to = value : @to
29
+ end
30
+
31
+ def to=(value)
32
+ @to_writer_called = true
33
+ @to = value
34
+ end
35
+
36
+ def from(value = nil)
37
+ @from_reader_called = true
38
+ value ? @fields[:from] = value : @fields[:from]
39
+ end
40
+
41
+ def from=(value)
42
+ @from_writer_called = true
43
+ @fields[:from] = value
44
+ end
45
+
46
+ def body
47
+ @body_reader_called = true
48
+ @fields[:body]
49
+ end
50
+
51
+ def body=(value)
52
+ @body_writer_called = true
53
+ @fields[:body] = value
54
+ end
55
+
56
+ field :to, accessor: false
57
+ field :from, reader: false
58
+ field :body, writer: false
59
+ end
60
+
61
+ describe '.default_client' do
62
+ after { Message.default_client :test }
63
+
64
+ it 'sets the default client' do
65
+ client = double :client
66
+ allow(client).to receive(:dup) { client }
67
+ Message.default_client(client)
68
+ message = Message.new
69
+ expect(message.client).to be(client)
70
+ end
71
+ end
72
+
73
+ describe '.register_client' do
74
+ after { Message.default_client :test }
75
+
76
+ it 'registers a client alias' do
77
+ Client = Class.new
78
+ Message.register_client_alias :foo, Client
79
+ client = double :client
80
+ options = { option_1: 1, option_2: 2 }
81
+ expect(Client).to receive(:new).with(options) { client}
82
+ Message.default_client :foo, options
83
+ expect(Message.default_client).to be(client)
84
+ end
85
+ end
86
+
87
+ describe '.field' do
88
+ it 'creates accessors for defined fields' do
89
+ message = Message.new
90
+ message.foo = :foo
91
+ expect(message.foo).to eq(:foo)
92
+ message.foo :bar
93
+ expect(message.foo).to eq(:bar)
94
+ end
95
+
96
+ it 'allows hash accessors for defined fields' do
97
+ message = Message.new
98
+ message['foo'] = :foo
99
+ expect(message[:foo]).to eq(:foo)
100
+ expect(message.foo).to eq(:foo)
101
+ end
102
+
103
+ it 'does not create accessors if specified' do
104
+ message = MessageWithoutFieldAccessors.new
105
+ message.to = 'Bob'
106
+ message.from = 'John'
107
+ message.body = 'Hi'
108
+ expect(message.to).to eq('Bob')
109
+ expect(message.from).to eq('John')
110
+ expect(message.body).to eq('Hi')
111
+ expect(message.to_reader_called).to be_true
112
+ expect(message.to_writer_called).to be_true
113
+ expect(message.from_reader_called).to be_true
114
+ expect(message.from_writer_called).to be_false
115
+ expect(message.body_reader_called).to be_false
116
+ expect(message.body_writer_called).to be_true
117
+ end
118
+ end
119
+
120
+ describe '.defaults' do
121
+ it 'sets the fields defaults' do
122
+ Message.defaults from: 'John'
123
+ message = Message.new
124
+ expect(message.from).to eql('John')
125
+ end
126
+
127
+ context 'without field accessors' do
128
+ after { MessageWithoutFieldAccessors.instance_variable_set :@defaults, nil }
129
+
130
+ it 'still sets the defaults' do
131
+ MessageWithoutFieldAccessors.defaults to: 'Bob'
132
+ message = MessageWithoutFieldAccessors.new
133
+ expect(message.to).to eq('Bob')
134
+ end
135
+ end
136
+ end
137
+
138
+ describe '.new' do
139
+ it 'initializes with a hash' do
140
+ message = Message.new to: 'Bob', oops: 'John'
141
+ expect(message.to).to eq('Bob')
142
+ expect(message).to_not respond_to(:oops)
143
+ end
144
+
145
+ it 'initializes with a block' do
146
+ message = Message.new do
147
+ to 'Bob'
148
+ from 'John'
149
+ end
150
+ expect(message.to).to eq('Bob')
151
+ expect(message.from).to eq('John')
152
+ end
153
+ end
154
+
155
+ describe '#fields' do
156
+ it 'returns a hash of the fields' do
157
+ message = Message.new
158
+ message.to = 'Bob'
159
+ message.from = 'John'
160
+ expect(message.fields).to eq(to: 'Bob', from: 'John', body: nil, foo: nil)
161
+ end
162
+
163
+ context 'without field accessors' do
164
+ it 'returns a hash of the fields' do
165
+ message = MessageWithoutFieldAccessors.new to: 'Bob', from: 'John'
166
+ expect(message.fields).to eq(to: 'Bob', from: 'John', body: nil)
167
+ end
168
+ end
169
+ end
170
+
171
+ describe '#audience=' do
172
+ it 'sets the to field by default' do
173
+ message = Message.new
174
+ message.audience = 'Bob'
175
+ expect(message.to).to eq('Bob')
176
+ end
177
+ end
178
+
179
+ describe '#deliver' do
180
+ context 'when valid' do
181
+ it 'delivers the message using a client' do
182
+ client = double :client
183
+ message = Message.new
184
+ message.client(client)
185
+ expect(client).to receive(:deliver).with(message)
186
+ message.deliver
187
+ end
188
+ end
189
+
190
+ context 'with an audience' do
191
+ it 'delivers to that audience' do
192
+ message = Message.new
193
+ message.deliver 'Bob'
194
+ expect(message.to).to eq('Bob')
195
+ end
196
+ end
197
+
198
+ context 'with a required field' do
199
+ it 'raises an error' do
200
+ message = MessageWithRequiredField.new
201
+ expect{message.deliver}.to raise_error(Outbox::MissingRequiredFieldError)
202
+ end
203
+ end
204
+
205
+ context 'with required fields' do
206
+ it 'raises an error' do
207
+ message = MessageWithRequiredFields.new to: 'Bob'
208
+ expect{message.deliver}.to raise_error(Outbox::MissingRequiredFieldError)
209
+ end
210
+ end
211
+ end
212
+ end
@@ -0,0 +1,135 @@
1
+ require 'spec_helper'
2
+
3
+ describe Outbox::Messages::Email do
4
+ it 'sets common email fields' do
5
+ email = Outbox::Messages::Email.new do
6
+ to 'bob@gmail.com'
7
+ from 'john@gmail.com'
8
+ subject 'Simple email subject'
9
+ body 'Hello world.'
10
+ end
11
+ expect(email.to).to eq(['bob@gmail.com'])
12
+ expect(email.from).to eq(['john@gmail.com'])
13
+ expect(email.subject).to eq('Simple email subject')
14
+ expect(email.body).to eq('Hello world.')
15
+ end
16
+
17
+ it 'sets a multipart body' do
18
+ email = Outbox::Messages::Email.new do
19
+ text_part do
20
+ body 'Hello world.'
21
+ end
22
+ html_part do
23
+ body '<h1>Hello world.</h1>'
24
+ end
25
+ end
26
+ expect(email.parts.length).to eq(2)
27
+ end
28
+
29
+ describe '.registered_client_aliases' do
30
+ it 'includes TestClient' do
31
+ expect(Outbox::Messages::Email.registered_client_aliases[:test]).to eq(Outbox::Clients::TestClient)
32
+ end
33
+
34
+ it 'includes MailClient' do
35
+ expect(Outbox::Messages::Email.registered_client_aliases[:mail]).to eq(Outbox::Clients::MailClient)
36
+ end
37
+ end
38
+
39
+ describe '.default_client' do
40
+ it 'defaults to MailClient' do
41
+ expect(Outbox::Messages::Email.default_client).to be_an_instance_of(Outbox::Clients::MailClient)
42
+ end
43
+ end
44
+
45
+ describe '#audience=' do
46
+ context 'with a string' do
47
+ it 'sets the To: field' do
48
+ email = Outbox::Messages::Email.new
49
+ email.audience = 'bob@gmail.com'
50
+ expect(email.to).to eq(['bob@gmail.com'])
51
+ end
52
+ end
53
+
54
+ context 'with an array' do
55
+ it 'sets the To: field' do
56
+ email = Outbox::Messages::Email.new
57
+ email.audience = ['bob@gmail.com', 'john@gmail.com']
58
+ expect(email.to).to eq(['bob@gmail.com', 'john@gmail.com'])
59
+ end
60
+ end
61
+
62
+ context 'with a hash' do
63
+ it 'sets multiple fields' do
64
+ email = Outbox::Messages::Email.new
65
+ email.audience = {
66
+ :to => 'bob@gmail.com',
67
+ :cc => 'john@gmail.com',
68
+ 'bcc' => 'sally@gmail.com',
69
+ :from => 'someone@gmail.com'
70
+ }
71
+ expect(email.to).to eq(['bob@gmail.com'])
72
+ expect(email.cc).to eq(['john@gmail.com'])
73
+ expect(email.bcc).to eq(['sally@gmail.com'])
74
+ expect(email.from).to be_nil
75
+ end
76
+ end
77
+
78
+ context 'with an object' do
79
+ it 'sets multiple fields' do
80
+ email = Outbox::Messages::Email.new
81
+ email.audience = OpenStruct.new to: 'bob@gmail.com', cc: 'john@gmail.com'
82
+ expect(email.to).to eq(['bob@gmail.com'])
83
+ expect(email.cc).to eq(['john@gmail.com'])
84
+ end
85
+ end
86
+ end
87
+
88
+ describe '#validate_fields' do
89
+ before do
90
+ @valid_email = Outbox::Messages::Email.new do
91
+ to 'bob@gmail.com'
92
+ from 'john@gmail.com'
93
+ body 'Hello world.'
94
+ end
95
+ end
96
+
97
+ it 'does not raise an error with a valid email' do
98
+ expect{@valid_email.validate_fields}.not_to raise_error()
99
+ end
100
+
101
+ it 'raises an error without a recipient' do
102
+ @valid_email.to = nil
103
+ expect{@valid_email.validate_fields}.to raise_error(Outbox::MissingRequiredFieldError)
104
+ end
105
+
106
+ it 'does not raise an error with a Cc: field' do
107
+ @valid_email.to = nil
108
+ @valid_email.cc = 'bob@gmail.com'
109
+ expect{@valid_email.validate_fields}.not_to raise_error()
110
+ end
111
+
112
+ it 'does not raise an error with a Bcc: field' do
113
+ @valid_email.to = nil
114
+ @valid_email.bcc = 'bob@gmail.com'
115
+ expect{@valid_email.validate_fields}.not_to raise_error()
116
+ end
117
+
118
+ it 'raises an error without a receiver' do
119
+ @valid_email.from = nil
120
+ expect{@valid_email.validate_fields}.to raise_error(Outbox::MissingRequiredFieldError)
121
+ end
122
+
123
+ it 'does not raise an error with a Return-path: field' do
124
+ @valid_email.from = nil
125
+ @valid_email.return_path = 'bob@gmail.com'
126
+ expect{@valid_email.validate_fields}.not_to raise_error()
127
+ end
128
+
129
+ it 'does not raise an error with a Sender: field' do
130
+ @valid_email.from = nil
131
+ @valid_email.sender = 'bob@gmail.com'
132
+ expect{@valid_email.validate_fields}.not_to raise_error()
133
+ end
134
+ end
135
+ end
@@ -4,8 +4,4 @@ describe Outbox do
4
4
  it 'should have a version number' do
5
5
  expect(Outbox::VERSION).to_not be_nil
6
6
  end
7
-
8
- it 'should do something useful' do
9
- expect(true).to be_true
10
- end
11
7
  end
@@ -1,2 +1,11 @@
1
1
  $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
2
+
3
+ require 'ostruct'
4
+ require 'mail'
2
5
  require 'outbox'
6
+
7
+ RSpec.configure do |config|
8
+ config.after(:each) do
9
+ Outbox::Clients::TestClient.deliveries.clear
10
+ end
11
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: outbox
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,8 +9,24 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-07-27 00:00:00.000000000 Z
12
+ date: 2013-07-31 00:00:00.000000000 Z
13
13
  dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: mail
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 2.5.3
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: 2.5.3
14
30
  - !ruby/object:Gem::Dependency
15
31
  name: bundler
16
32
  requirement: !ruby/object:Gem::Requirement
@@ -75,7 +91,7 @@ dependencies:
75
91
  - - ! '>='
76
92
  - !ruby/object:Gem::Version
77
93
  version: '0'
78
- description: A Rails engine and generic interface for sending email, SMS, & push notifications.
94
+ description: A generic interface for sending email, SMS, & push notifications.
79
95
  email:
80
96
  - pete.browne@localmed.com
81
97
  executables: []
@@ -89,8 +105,26 @@ files:
89
105
  - README.md
90
106
  - Rakefile
91
107
  - lib/outbox.rb
108
+ - lib/outbox/accessor.rb
109
+ - lib/outbox/clients/base.rb
110
+ - lib/outbox/clients/mail_client.rb
111
+ - lib/outbox/clients/test_client.rb
112
+ - lib/outbox/errors.rb
113
+ - lib/outbox/message.rb
114
+ - lib/outbox/message_clients.rb
115
+ - lib/outbox/message_fields.rb
116
+ - lib/outbox/message_types.rb
117
+ - lib/outbox/messages/base.rb
118
+ - lib/outbox/messages/email.rb
92
119
  - lib/outbox/version.rb
93
120
  - outbox.gemspec
121
+ - spec/outbox/accessor_spec.rb
122
+ - spec/outbox/clients/base_spec.rb
123
+ - spec/outbox/clients/mail_client_spec.rb
124
+ - spec/outbox/clients/test_client_spec.rb
125
+ - spec/outbox/message_spec.rb
126
+ - spec/outbox/messages/base_spec.rb
127
+ - spec/outbox/messages/email_spec.rb
94
128
  - spec/outbox_spec.rb
95
129
  - spec/spec_helper.rb
96
130
  homepage: https://github.com/localmed/outbox
@@ -108,7 +142,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
108
142
  version: '0'
109
143
  segments:
110
144
  - 0
111
- hash: 1226627478344272925
145
+ hash: -1152741713307649410
112
146
  required_rubygems_version: !ruby/object:Gem::Requirement
113
147
  none: false
114
148
  requirements:
@@ -117,15 +151,21 @@ required_rubygems_version: !ruby/object:Gem::Requirement
117
151
  version: '0'
118
152
  segments:
119
153
  - 0
120
- hash: 1226627478344272925
154
+ hash: -1152741713307649410
121
155
  requirements: []
122
156
  rubyforge_project:
123
157
  rubygems_version: 1.8.23
124
158
  signing_key:
125
159
  specification_version: 3
126
- summary: Outbox is a Rails engine and generic interface for sending notifications
127
- using a variety of delivery methods, with built-in support for the most popular
128
- SaaS solutions.
160
+ summary: Outbox is a generic interface for sending notifications using a variety of
161
+ protocols, with built-in support for the most popular SaaS solutions.
129
162
  test_files:
163
+ - spec/outbox/accessor_spec.rb
164
+ - spec/outbox/clients/base_spec.rb
165
+ - spec/outbox/clients/mail_client_spec.rb
166
+ - spec/outbox/clients/test_client_spec.rb
167
+ - spec/outbox/message_spec.rb
168
+ - spec/outbox/messages/base_spec.rb
169
+ - spec/outbox/messages/email_spec.rb
130
170
  - spec/outbox_spec.rb
131
171
  - spec/spec_helper.rb