mail-store-agent 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.
- data/README.mkd +51 -0
- data/lib/mail-store-agent.rb +35 -0
- data/spec/mail_store_agent_spec.rb +98 -0
- metadata +60 -0
data/README.mkd
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
# MailStoreAgent
|
2
|
+
|
3
|
+
## Background
|
4
|
+
|
5
|
+
Most websites that authenticate users require some form of user account self-management.
|
6
|
+
Users need to register with e-mail and password, verify their e-mail address,
|
7
|
+
and to occasionally reset their e-mail and password.
|
8
|
+
|
9
|
+
I like to delegate this to other services with [OpenID](http://en.wikipedia.org/wiki/OpenID)
|
10
|
+
and [OAuth](http://en.wikipedia.org/wiki/Oauth),
|
11
|
+
but not all clients agree to delegate ownership of their customers' authentication records.
|
12
|
+
|
13
|
+
So I'm often stuck with implementing these boilerplace features yet again,
|
14
|
+
each of the above use-cases require sending out e-mails to confirm or facilitate.
|
15
|
+
Testing this can be a pain-in-the-butt.
|
16
|
+
|
17
|
+
Fortunately, [Mikel Lindsaar](https://github.com/mikel)'s
|
18
|
+
[Mail](https://github.com/mikel/mail) gem
|
19
|
+
has a simple and effective way to store and not send e-mails in order to facilitate test scripts.
|
20
|
+
|
21
|
+
Mail::TestMailer
|
22
|
+
|
23
|
+
Mail.defaults do
|
24
|
+
delivery_method :test
|
25
|
+
end
|
26
|
+
|
27
|
+
# send a few mails ...
|
28
|
+
|
29
|
+
Mail::TestMailer.deliveries.is_a? Array # ==> true
|
30
|
+
Mail::TestMailer.deliveries.first.is_a? Mail::Message # ==> true
|
31
|
+
|
32
|
+
I want to take this a step further so that I can verify that mail got sent to the right people in the right order:
|
33
|
+
|
34
|
+
## SYNOPSIS
|
35
|
+
|
36
|
+
require 'mail'
|
37
|
+
require 'mail-store-agent'
|
38
|
+
|
39
|
+
Mail.defaults do
|
40
|
+
delivery_method :test
|
41
|
+
end
|
42
|
+
|
43
|
+
Mail::TestMailer.deliveries = MailStoreAgent.new
|
44
|
+
|
45
|
+
# send some mail to someone@someplace.com ...
|
46
|
+
|
47
|
+
Mail::TestMailer.deliveries.get('someone@someplace.com').is_a? Mail::Message # or nil
|
48
|
+
|
49
|
+
## LICENSE
|
50
|
+
* <a rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/"><img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by-sa/3.0/88x31.png" /></a><br /><span xmlns:dct="http://purl.org/dc/terms/" href="http://purl.org/dc/dcmitype/Text" property="dct:title" rel="dct:type">mail-store-agent.gem</span> by <a xmlns:cc="http://creativecommons.org/ns#" href="http://westside-consulting.com/" property="cc:attributionName" rel="cc:attributionURL">Lawrence Siden</a> is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/">Creative Commons Attribution-ShareAlike 3.0 Unported License</a>.<br />Based on a work at <a xmlns:dct="http://purl.org/dc/terms/" href="https://github.com/lsiden" rel="dct:source">github.com</a>.
|
51
|
+
* [Ruby License](http://www.ruby-lang.org/en/LICENSE.txt)
|
@@ -0,0 +1,35 @@
|
|
1
|
+
|
2
|
+
class MailStoreAgent < Array
|
3
|
+
|
4
|
+
def initialize
|
5
|
+
@queues = {}
|
6
|
+
@next_unsorted = 0 # index of next unsorted e-mail
|
7
|
+
end
|
8
|
+
|
9
|
+
def accounts
|
10
|
+
self.sort_mail!
|
11
|
+
return @queues.keys
|
12
|
+
end
|
13
|
+
|
14
|
+
def get(address)
|
15
|
+
self.sort_mail!
|
16
|
+
return @queues[address] ? @queues[address].shift : nil
|
17
|
+
end
|
18
|
+
|
19
|
+
protected
|
20
|
+
def sort_mail!
|
21
|
+
self[@next_unsorted..self.length].each do |email|
|
22
|
+
#raise "MailStoreAgent is intended to be used as value for Mail::TestMailer.deliveries=(). See README" \
|
23
|
+
# unless email.respond_to?(:destinations) && email.destinations.respond_to?(:each)
|
24
|
+
|
25
|
+
if email.respond_to?(:destinations) && email.destinations.respond_to?(:each) then
|
26
|
+
email.destinations.each do |dest|
|
27
|
+
@queues[dest] = [] if @queues[dest].nil?
|
28
|
+
@queues[dest].push email
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
@next_unsorted = self.length
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rspec'
|
3
|
+
require 'mail'
|
4
|
+
|
5
|
+
require File.join(File.dirname(__FILE__), %w[ .. lib mail-store-agent ])
|
6
|
+
|
7
|
+
describe MailStoreAgent do
|
8
|
+
before(:all) do
|
9
|
+
Mail.defaults do
|
10
|
+
delivery_method :test # don't use '='!
|
11
|
+
Mail::TestMailer.deliveries = MailStoreAgent.new
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'is an instance of Array' do
|
16
|
+
MailStoreAgent.is_a? Array
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'can be given as argument to Mail::TestMailer#deliveries=()' do
|
20
|
+
Mail::TestMailer.deliveries.is_a? MailStoreAgent
|
21
|
+
Mail::TestMailer.deliveries.should have(0).messages
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'can store mail' do
|
26
|
+
mail = Mail.deliver do
|
27
|
+
to 'tarzan@jungle.com'
|
28
|
+
from 'tarzan@jungle.com'
|
29
|
+
subject 'just testing'
|
30
|
+
body 'get this?'
|
31
|
+
end
|
32
|
+
mail.should be_instance_of Mail::Message
|
33
|
+
mail.perform_deliveries.should == true
|
34
|
+
mail.errors.each {|e| puts e}
|
35
|
+
Mail::TestMailer.deliveries.should have(1).message
|
36
|
+
|
37
|
+
Mail.deliver do
|
38
|
+
to 'tarzan@jungle.com'
|
39
|
+
from 'tarzan@jungle.com'
|
40
|
+
subject 'still testing'
|
41
|
+
body 'get this, too?'
|
42
|
+
end
|
43
|
+
|
44
|
+
Mail.deliver do
|
45
|
+
to 'jane@jungle.com'
|
46
|
+
from 'tarzan@jungle.com'
|
47
|
+
subject 'testing now'
|
48
|
+
body 'get this?'
|
49
|
+
end
|
50
|
+
|
51
|
+
mail = Mail.deliver do
|
52
|
+
to 'tarzan@jungle.com'
|
53
|
+
from 'tarzan@jungle.com'
|
54
|
+
subject 'keep on testing'
|
55
|
+
body 'what about this?'
|
56
|
+
end
|
57
|
+
Mail::TestMailer.deliveries.should have(4).messages
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'knows what accounts have been sent mail' do
|
61
|
+
Mail::TestMailer.deliveries.accounts == ['tarzan@jungle.com', 'jane@jungle.com']
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'can return next e-mail for any given address' do
|
65
|
+
mail = Mail::TestMailer.deliveries.get('jane@jungle.com')
|
66
|
+
mail.should be_kind_of Mail::Message
|
67
|
+
mail.to[0].should == 'jane@jungle.com'
|
68
|
+
mail.subject.should == 'testing now'
|
69
|
+
end
|
70
|
+
|
71
|
+
it 'returns nil if there is no more mail for address' do
|
72
|
+
Mail::TestMailer.deliveries.get('jane@jungle.com').should be_nil
|
73
|
+
end
|
74
|
+
|
75
|
+
it 'returns nil if given a non-existent address' do
|
76
|
+
Mail::TestMailer.deliveries.get('blah@foo.bar').should be_nil
|
77
|
+
end
|
78
|
+
|
79
|
+
it 'returns emails in order' do
|
80
|
+
Mail::TestMailer.deliveries.get('tarzan@jungle.com').subject.should == 'just testing'
|
81
|
+
Mail::TestMailer.deliveries.get('tarzan@jungle.com').subject.should == 'still testing'
|
82
|
+
Mail::TestMailer.deliveries.get('tarzan@jungle.com').subject.should == 'keep on testing'
|
83
|
+
Mail::TestMailer.deliveries.get('tarzan@jungle.com').should be_nil
|
84
|
+
end
|
85
|
+
|
86
|
+
it 'does not delete the mail' do
|
87
|
+
Mail::TestMailer.deliveries.should have(4).entries
|
88
|
+
end
|
89
|
+
|
90
|
+
it 'acts like Array and ignores contents that are not instances of Mail::Message' do
|
91
|
+
Mail::TestMailer.deliveries.push :foo
|
92
|
+
Mail::TestMailer.deliveries.push 'baz'
|
93
|
+
Mail::TestMailer.deliveries.push Object.new
|
94
|
+
Mail::TestMailer.deliveries.accounts == ['tarzan@jungle.com', 'jane@jungle.com']
|
95
|
+
Mail::TestMailer.deliveries.get('tarzan@jungle.com').should be_nil
|
96
|
+
Mail::TestMailer.deliveries.should have(7).items
|
97
|
+
end
|
98
|
+
end
|
metadata
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: mail-store-agent
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Larry Siden, Westside Consulting LLC
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2011-12-21 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: mail
|
16
|
+
requirement: &79348610 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *79348610
|
25
|
+
description: Provides per-email-account sequential access to Mail::TestMailer.deliveries
|
26
|
+
email: lsiden@westside-consulting.com
|
27
|
+
executables: []
|
28
|
+
extensions: []
|
29
|
+
extra_rdoc_files: []
|
30
|
+
files:
|
31
|
+
- README.mkd
|
32
|
+
- lib/mail-store-agent.rb
|
33
|
+
- spec/mail_store_agent_spec.rb
|
34
|
+
homepage: http://github.com/lsiden/mail-store-agent/
|
35
|
+
licenses:
|
36
|
+
- Creative Commons Share-Alike Unported
|
37
|
+
- Ruby License
|
38
|
+
post_install_message:
|
39
|
+
rdoc_options: []
|
40
|
+
require_paths:
|
41
|
+
- lib
|
42
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
43
|
+
none: false
|
44
|
+
requirements:
|
45
|
+
- - ! '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
requirements: []
|
55
|
+
rubyforge_project:
|
56
|
+
rubygems_version: 1.8.10
|
57
|
+
signing_key:
|
58
|
+
specification_version: 3
|
59
|
+
summary: Tiny mail agent for extracting delivered mail messages from Mail::TestMailer
|
60
|
+
test_files: []
|