watirmark_email 1.3.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: bb366bfcf3fab9ccfcc228545902f2c27b6b95e6
4
+ data.tar.gz: 25d666f434e75c7e26454177a529c38bb90b3c76
5
+ SHA512:
6
+ metadata.gz: 25ea7b742c9c6d989d5cdcf7b76991113d04d1d09c701af78f9d85cbd1d94e59bd307cadeb842a3bcc444c2560271ac2e0065e1399c0ed2c6b9009ba718b6984
7
+ data.tar.gz: 7e32bea10309b1bb6d4103851da24ab1b71d9c7bf1e3c75828c626c721760beeff6a45dbd2db5587ed567632f060a48c3b6cf7887ab1b54316fce1995b754ffc
@@ -0,0 +1,10 @@
1
+ require 'net/imap'
2
+ require 'net/smtp'
3
+ require 'logger'
4
+ require 'timeout'
5
+
6
+ require 'watirmark_email/email_base'
7
+ require 'watirmark_email/gmail'
8
+ require 'watirmark_email/qamail'
9
+ require 'watirmark_email/email_collection'
10
+
@@ -0,0 +1,142 @@
1
+ module WatirmarkEmail
2
+ class BaseController
3
+ # Connects using the credentials supplied on initialize, returns the IMAP object. Most of the time, if all you want
4
+ # is an email, you won't need to use this method as get_email_text handles connect for you.
5
+ def connect
6
+ imap = Net::IMAP.new(@url, @port, @ssl)
7
+ imap.login(@email, @password)
8
+ imap.select(@inbox)
9
+ imap
10
+ end
11
+
12
+ # This is a test method to disconnect from the server. get_email_text handles disconnect for you.
13
+ def disconnect(imap)
14
+ return true if imap.disconnected?
15
+ imap.logout
16
+ imap.disconnect
17
+ end
18
+
19
+ # This is a test method to copy an email to the inbox
20
+ def copy(search_array, destination_folder=@inbox)
21
+ begin
22
+ @log.debug("copying to #{destination_folder}")
23
+ imap = connect
24
+ email_id = imap.search(search_array).last
25
+ email_uid = imap.fetch(email_id, 'UID').last.attr['UID']
26
+ raise "Original message not found to copy!" unless email_uid
27
+ imap.uid_copy(email_uid, destination_folder)
28
+ ensure
29
+ disconnect(imap)
30
+ end
31
+ end
32
+
33
+ def get_email_text(search_array, timeout=600, delete=true, since_sec=3600)
34
+ # Trying super ugly workaraound for the gmail 'Too many simlutaneous connections' error.
35
+ # Just trying to login to gmail and if it fails try to wait until other connections
36
+ # are closed and try again.
37
+ email_text = nil
38
+ email_subject = nil
39
+ email_uid = nil
40
+
41
+ ::Timeout.timeout(timeout) do
42
+ @log.debug("start Timeout block for #{timeout} seconds")
43
+ loop do
44
+ begin
45
+ imap = connect
46
+ msgs = imap.search(search_array)
47
+ if (msgs && msgs.length > 0)
48
+ email_id = msgs.last
49
+ email_uid = imap.fetch(email_id, 'UID').last.attr['UID']
50
+ email_text = imap.uid_fetch(email_uid, 'BODY[TEXT]').last.attr['BODY[TEXT]']
51
+ envelope = imap.uid_fetch(email_uid, 'ENVELOPE').last.attr['ENVELOPE']
52
+ email_subject = envelope.subject
53
+ end
54
+ rescue => e
55
+ @log.info("Error connecting to IMAP: #{e.message}")
56
+ ensure
57
+ if (delete && email_uid)
58
+ @log.info("Deleting the email message #{email_subject}")
59
+ delete(email_uid, imap)
60
+ end
61
+ disconnect(imap) unless imap.nil? # because sometimes the timeout happens before imap is defined
62
+ end
63
+ break if email_text
64
+ @log.debug("Couldn't find email yet ... trying again")
65
+ sleep 10
66
+ end
67
+ end
68
+ email_text
69
+ end
70
+
71
+ def get_email_replyto(search_array, timeout=600, delete=true)
72
+ envelope = nil
73
+ email_uid = nil
74
+
75
+ ::Timeout.timeout(timeout) do
76
+ @log.debug("start Timeout block for #{timeout} seconds")
77
+ loop do
78
+ begin
79
+ imap = connect
80
+ msgs = imap.search(search_array)
81
+ if (msgs && msgs.length > 0)
82
+ email_id = msgs.last
83
+ email_uid = imap.fetch(email_id, 'UID').last.attr['UID']
84
+ envelope = imap.uid_fetch(email_uid, 'ENVELOPE').last.attr['ENVELOPE']
85
+ end
86
+ rescue => e
87
+ @log.info("Error connecting to IMAP: #{e.message}")
88
+ ensure
89
+ if (delete && email_uid)
90
+ delete(email_uid, imap)
91
+ end
92
+ disconnect(imap) unless imap.nil? # because sometimes the timeout happens before imap is defined
93
+ end
94
+ break if envelope
95
+ @log.debug("Couldn't find email yet ... trying again")
96
+ sleep 10
97
+ end
98
+ end
99
+ "#{envelope.reply_to[0].name} <#{envelope.reply_to[0].mailbox}@#{envelope.reply_to[0].host}>"
100
+ end
101
+
102
+ #returns the name of the email attachment
103
+ #returns nil if there is no attachment
104
+ def get_email_attachment(search_array, timeout=600)
105
+ attachment = nil
106
+ finished = false
107
+ ::Timeout.timeout(timeout) do
108
+ @log.debug("start Timeout block for #{timeout} seconds")
109
+ loop do
110
+ begin
111
+ imap = connect
112
+ msgs = imap.search(search_array)
113
+ if (msgs && msgs.length > 0)
114
+ msgs.each do |msgID|
115
+ msg = imap.fetch(msgID, ["ENVELOPE", "UID", "BODY"])[0]
116
+ body = msg.attr["BODY"]
117
+ attachment = body.parts[1].param['NAME']
118
+ finished = true
119
+ #TODO read text of .pdf file
120
+ #grab attachment file
121
+ #attachment_file = imap.fetch(msgID, "BODY[#{2}]")[0].attr["BODY[#{2}]"]
122
+ end
123
+ end
124
+ rescue => e
125
+ @log.info("Error connecting to IMAP: #{e.message}")
126
+ ensure
127
+ disconnect(imap) unless imap.nil? # because sometimes the timeout happens before imap is defined
128
+ end
129
+ break if finished
130
+ @log.debug("Couldn't find email yet ... trying again")
131
+ sleep 10
132
+ end
133
+ end
134
+ attachment
135
+ end
136
+ end
137
+ end
138
+
139
+
140
+
141
+
142
+
@@ -0,0 +1,62 @@
1
+ module WatirmarkEmail
2
+ class Email
3
+ attr_accessor :date, :subject, :to, :from, :message_id, :body_text, :body_raw, :uid
4
+
5
+ def initialize(envelope, body_text, body_raw, uid)
6
+ @to = []
7
+ @date = envelope.date
8
+ @subject = envelope.subject
9
+ envelope.to.each do |recipient|
10
+ @to << "#{recipient.mailbox}@#{recipient.host}"
11
+ end
12
+ @from = "#{envelope.from.first.mailbox}@#{envelope.from.first.host}"
13
+ @message_id = envelope.message_id
14
+ @body_text = body_text
15
+ @body_raw = body_raw
16
+ @uid = uid
17
+ end
18
+
19
+ def <=> (other)
20
+ date <=> other.date
21
+ end
22
+ end
23
+
24
+ class EmailCollection
25
+ include Enumerable
26
+
27
+ def initialize
28
+ @emails = []
29
+ end
30
+
31
+ def each(&block)
32
+ @emails.each(&block)
33
+ end
34
+
35
+ def empty?
36
+ @emails.empty?
37
+ end
38
+
39
+ def [](x)
40
+ @emails[x]
41
+ end
42
+
43
+ def length
44
+ @emails.length
45
+ end
46
+ alias :size :length
47
+
48
+ def add_emails(email_info)
49
+ #should be an array of Net::IMAP::FetchData or a single class
50
+ email_info = [email_info] unless email_info.is_a?(Array)
51
+ email_info.each do |email|
52
+ envelope = email.attr["ENVELOPE"]
53
+ body_text = email.attr["BODY[TEXT]"]
54
+ body_raw = email.attr["BODY[]"]
55
+ uid = email.attr["UID"]
56
+ @emails << Email.new(envelope, body_text, body_raw, uid)
57
+ end
58
+ end
59
+ end
60
+ end
61
+
62
+
@@ -0,0 +1,94 @@
1
+ module WatirmarkEmail
2
+ class Gmail < BaseController
3
+ attr_accessor :inbox
4
+ URL = "imap.gmail.com"
5
+ PORT = 993
6
+ MAILBOX_INBOX = "INBOX"
7
+ MAILBOX_TRASH = "[Gmail]/Trash"
8
+ MAILBOX_ALL = "[Gmail]/All Mail"
9
+
10
+ # Constructor for this class.
11
+ # This will initialize all variables according to the type email service this is using.
12
+ def initialize(email, password, logLevel = ::Logger::INFO)
13
+ @email = email
14
+ @password = password
15
+ @log = ::Logger.new STDOUT
16
+ @log.level = logLevel
17
+ @url = URL
18
+ @port = PORT
19
+ @inbox = MAILBOX_INBOX
20
+ @trash = MAILBOX_TRASH
21
+ @ssl = true # port 993
22
+ end
23
+
24
+ def delete(email_uid, imap)
25
+ imap.uid_copy(email_uid, @trash)
26
+ imap.uid_store(email_uid, "+FLAGS", [:Deleted])
27
+ end
28
+
29
+
30
+ # This keeps polling the email inbox until a message is found with the given
31
+ # parameters (based on net::IMAP search) or the timeout is reached. This also
32
+ # deletes the email from the inbox if the delete flag is set to true.
33
+ # Returns the email text.
34
+ #
35
+ # search_array is an array of strings that need to be formatted according to the following convention from Net::IMAP.
36
+ # These strings will be used to send a SEARCH command to search the mailbox for messages that match the given
37
+ # searching criteria:
38
+ # BEFORE <date>: messages with an internal date strictly before <date>. The date argument has a format similar
39
+ # to 8-Aug-2002.
40
+ # BODY <string>: messages that contain <string> within their body.
41
+ # CC <string>: messages containing <string> in their CC field.
42
+ # FROM <string>: messages that contain <string> in their FROM field.
43
+ # NEW: messages with the Recent, but not the Seen, flag set.
44
+ # NOT <search-key>: negate the following search key.
45
+ # OR <search-key> <search-key>: "or" two search keys together.
46
+ # ON <date>: messages with an internal date exactly equal to <date>, which has a format similar to 8-Aug-2002.
47
+ # SINCE <date>: messages with an internal date on or after <date>.
48
+ # SUBJECT <string>: messages with <string> in their subject.
49
+ # TO <string>: messages with <string> in their TO field.
50
+ #
51
+ # For example:
52
+ # get_email_text(["SUBJECT", "hello", "NOT", "NEW"])
53
+ # => finds emails with the subject "hello" which are not "NEW" (see definition of NEW)
54
+ #
55
+ # See also: http://tools.ietf.org/html/rfc3501#section-6.4.4
56
+ #
57
+ def get_email_text(search_array, timeout=600, delete=true, since_sec=3600)
58
+ # Only look for emails that have come in since the last hour
59
+ since = Time.now - since_sec
60
+ imap_search_terms = search_array.dup.push("SINCE", since.strftime('%d-%b-%Y'))
61
+ @log.debug("Searching for email with query: #{imap_search_terms}")
62
+
63
+ super imap_search_terms, timeout, delete, since_sec
64
+ end
65
+
66
+ def send_email(to, opts={})
67
+ opts[:from] ||= 'qa@convio.com'
68
+ opts[:from_alias] ||= 'Watirmark Email'
69
+ opts[:subject] ||= "test"
70
+ opts[:body] ||= "Watirmark Email test message"
71
+
72
+ smtp = Net::SMTP.new 'smtp.gmail.com', 587
73
+ smtp.enable_starttls
74
+
75
+ msg = <<END_OF_MESSAGE
76
+ From: #{opts[:from_alias]} <#{opts[:from]}>
77
+ To: <#{to}>
78
+ Subject: #{opts[:subject]}
79
+
80
+ #{opts[:body]}
81
+ END_OF_MESSAGE
82
+
83
+ response = smtp.start('smtp.gmail.com', @email, @password, :plain) do |smpt|
84
+ smtp.send_message msg, opts[:from], to
85
+ end
86
+
87
+ if response && response.status == "250"
88
+ return true
89
+ else
90
+ return false
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,158 @@
1
+ module WatirmarkEmail
2
+ class QAMail < BaseController
3
+ URL = "qasendmail.conviocloud.com"
4
+ PORT = 143
5
+ MAILBOX_INBOX = "Inbox"
6
+
7
+ # Constructor for this class.
8
+ # This will initialize all variables according to the type email service this is using.
9
+ def initialize(account, password=nil, logLevel = ::Logger::INFO)
10
+ @email = account
11
+ @password = password || account
12
+ @log = ::Logger.new STDOUT
13
+ @log.level = logLevel
14
+ @url = URL
15
+ @port = PORT
16
+ @inbox = MAILBOX_INBOX
17
+ @ssl = false # port 143
18
+ end
19
+
20
+ def delete(email_uid, imap)
21
+ imap.uid_store(email_uid, "+FLAGS", [:Deleted])
22
+ imap.expunge
23
+ end
24
+
25
+ # used for testing
26
+ def delete_emails(search_terms, timeout = 60)
27
+ uid_list = find_email_uids(search_terms, timeout)
28
+ imap = connect
29
+ uid_list.each do |uid|
30
+ imap.uid_store(uid, "+FLAGS", [:Deleted])
31
+ end
32
+ imap.expunge
33
+ disconnect imap
34
+ end
35
+
36
+ # This keeps polling the email inbox until a message is found with the given
37
+ # parameters (based on net::IMAP search) or the timeout is reached. This also
38
+ # deletes the email from the inbox if the delete flag is set to true.
39
+ # Returns the email text.
40
+ #
41
+ # search_array is an array of strings that need to be formatted according to the following convention from Net::IMAP.
42
+ # These strings will be used to send a SEARCH command to search the mailbox for messages that match the given
43
+ # searching criteria:
44
+ # BEFORE <date>: messages with an internal date strictly before <date>. The date argument has a format similar
45
+ # to 8-Aug-2002.
46
+ # BODY <string>: messages that contain <string> within their body.
47
+ # CC <string>: messages containing <string> in their CC field.
48
+ # FROM <string>: messages that contain <string> in their FROM field.
49
+ # NEW: messages with the Recent, but not the Seen, flag set.
50
+ # NOT <search-key>: negate the following search key.
51
+ # OR <search-key> <search-key>: "or" two search keys together.
52
+ # ON <date>: messages with an internal date exactly equal to <date>, which has a format similar to 8-Aug-2002.
53
+ # SINCE <date>: messages with an internal date on or after <date>.
54
+ # SUBJECT <string>: messages with <string> in their subject.
55
+ # TO <string>: messages with <string> in their TO field.
56
+ #
57
+ # For example:
58
+ # get_email_text(["SUBJECT", "hello", "NOT", "NEW"])
59
+ # => finds emails with the subject "hello" which are not "NEW" (see definition of NEW)
60
+ #
61
+ # See also: http://tools.ietf.org/html/rfc3501#section-6.4.4
62
+ #
63
+ def get_email_text(search_array, timeout=600, delete=true)
64
+ @log.debug("Searching for email with query: #{search_array}")
65
+
66
+ super search_array, timeout, delete
67
+ end
68
+
69
+ def get_email_replyto(search_array, timeout=600, delete=true)
70
+ @log.debug("Searching for email with query: #{search_array}")
71
+
72
+ super search_array, timeout, delete
73
+ end
74
+
75
+ def get_email_attachment(search_arry, timeout=600)
76
+ @log.debug("Searching for email attachment with query: #{search_arry}")
77
+
78
+ super search_arry, timeout
79
+ end
80
+
81
+ def send_email(to, opts={})
82
+ opts[:server] ||= 'qasendmail.conviocloud.com'
83
+ opts[:from] ||= 'qa@convio.com'
84
+ opts[:from_alias] ||= 'Watirmark Email'
85
+ opts[:subject] ||= "test"
86
+ opts[:body] ||= "Watirmark Email test message"
87
+
88
+ msg = <<END_OF_MESSAGE
89
+ From: #{opts[:from_alias]} <#{opts[:from]}>
90
+ To: <#{to}>
91
+ Subject: #{opts[:subject]}
92
+
93
+ #{opts[:body]}
94
+ END_OF_MESSAGE
95
+
96
+ response = Net::SMTP.start(opts[:server]) do |smtp|
97
+ smtp.send_message msg, opts[:from], to
98
+ end
99
+
100
+ if response && response.status == "250"
101
+ return true
102
+ else
103
+ return false
104
+ end
105
+ end
106
+
107
+ def find_emails(search_terms, timeout = 60)
108
+ uids = find_email_uids(search_terms, timeout)
109
+ emails = WatirmarkEmail::EmailCollection.new
110
+
111
+ ::Timeout.timeout(timeout) do
112
+ @log.debug("start Timeout block for #{timeout} seconds")
113
+ loop do
114
+ begin
115
+ imap = connect
116
+ fetchdata = imap.uid_fetch(uids, ["ENVELOPE", "BODY[TEXT]", "BODY[]", "UID"])
117
+ emails.add_emails(fetchdata)
118
+ rescue => e
119
+ @log.info("#{e.class}: #{e.message}")
120
+ ensure
121
+ disconnect(imap) unless imap.nil? # because sometimes the timeout happens before imap is defined
122
+ end
123
+ break unless emails.empty?
124
+ @log.debug("Couldn't find email yet ... trying again")
125
+ sleep 10
126
+ end
127
+ end
128
+ emails
129
+ end
130
+
131
+ def find_email_uids(search_terms, timeout = 60)
132
+ email_uids = []
133
+
134
+ ::Timeout.timeout(timeout) do
135
+ @log.debug("start Timeout block for #{timeout} seconds")
136
+ loop do
137
+ begin
138
+ imap = connect
139
+ msgs = imap.search(search_terms)
140
+ @log.debug("found message numbers: #{msgs}")
141
+ if (msgs && msgs.length > 0)
142
+ email_uids = msgs.inject([]) { |email_uids, email_id| email_uids << imap.fetch(email_id, 'UID').last.attr['UID'] }
143
+ end
144
+ rescue => e
145
+ @log.info("Error connecting to IMAP: #{e.message}")
146
+ ensure
147
+ disconnect(imap) unless imap.nil? # because sometimes the timeout happens before imap is defined
148
+ end
149
+ break unless email_uids.empty?
150
+ @log.debug("Couldn't find email yet ... trying again")
151
+ sleep 10
152
+ end
153
+ end
154
+ @log.debug("found UIDS: #{email_uids}}")
155
+ email_uids
156
+ end
157
+ end
158
+ end
@@ -0,0 +1,7 @@
1
+ module WatirmarkEmail
2
+ module VERSION
3
+ NAME = 'watirmark_email'
4
+ STRING = '1.3.1'
5
+ SUMMARY = "#{NAME}-#{STRING}"
6
+ end
7
+ end
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Get Emails" do
4
+ before(:all) do
5
+ username = CREDENTIALS['qamail']['username']
6
+ password = CREDENTIALS['qamail']['password']
7
+ send_to = CREDENTIALS['qamail']['send_to']
8
+ @subject = "Multiple Email Test #{Time.now.strftime "%Y%m%d%H%M%S"}"
9
+ @search_terms = ['SUBJECT', "Multiple Email Test"]
10
+ @e = WatirmarkEmail::QAMail.new(username, password, ::Logger::DEBUG)
11
+ 1.upto(5) do |x|
12
+ @e.send_email(send_to, :subject => "#{@subject} - message #{x}", :body => "#{@subject} - message #{x}")
13
+ end
14
+ end
15
+
16
+ after(:all) do
17
+ @e.delete_emails @search_terms
18
+ end
19
+
20
+ it "should find 5 emails when searching by subject \"Multiple Email Test\"" do
21
+ emails = @e.find_emails(@search_terms)
22
+ emails.length.should == 5
23
+ end
24
+
25
+ it "when searching by subject \"Multiple Email Test\", each found email should have a subject and a body with an incrementing number" do
26
+ emails = @e.find_emails(@search_terms)
27
+ 0.upto(4).each do |x|
28
+ emails[x].subject.should == "#{@subject} - message #{x + 1}"
29
+ emails[x].body_text.should =~ /#{@subject} - message #{x + 1}/
30
+ end
31
+ end
32
+
33
+ it "when searching by subject \"Multiple Email Test\", mapping the subjects to an array returns an array of length 5" do
34
+ expected_subject_array = ["#{@subject} - message 1",
35
+ "#{@subject} - message 2",
36
+ "#{@subject} - message 3",
37
+ "#{@subject} - message 4",
38
+ "#{@subject} - message 5"]
39
+ @e.find_emails(@search_terms).map { |email| email.subject }.sort.should == expected_subject_array
40
+ end
41
+ end
@@ -0,0 +1,16 @@
1
+ require 'rspec'
2
+ require 'yaml'
3
+ require 'watirmark_email'
4
+
5
+ # this file contains credentials to gmail and IMAP servers in a simple hash expressed in YAML and looks like:
6
+ #---
7
+ #qamail:
8
+ # username: <supply your own>
9
+ # password: <not telling>
10
+ # send_to: <email address on your IMAP server, needed here because we all know how to get to gmail>
11
+ #gmail:
12
+ # username: <supply your own>
13
+ # password: <not telling>
14
+ CREDENTIALS = YAML.load_file(File.join(File.dirname(__FILE__), "email_server_credentials.yaml"))
15
+
16
+ alias :context :describe
@@ -0,0 +1,66 @@
1
+ require 'spec_helper'
2
+
3
+ context 'WatirmarkEmail::Gmail' do
4
+
5
+ before :all do
6
+ STDOUT.sync = true
7
+ @username = CREDENTIALS['gmail']['username']
8
+ @password = CREDENTIALS['gmail']['password']
9
+ @test_message = ['SUBJECT', 'UNIT TEST MESSAGE', 'BODY', "unit_test_message_id"]
10
+ @does_not_exist_test_message = ['SUBJECT', "MISSING"]
11
+ end
12
+
13
+ specify 'initialize email connection to gmail.com' do
14
+ e = WatirmarkEmail::Gmail.new(@username, @password)
15
+ e.should_not be_nil
16
+ end
17
+
18
+ specify 'should timeout when the email does not exist' do
19
+ e = WatirmarkEmail::Gmail.new(@username, @password, Logger::DEBUG)
20
+ lambda {
21
+ txt = e.get_email_text(@does_not_exist_test_message, 15, false)
22
+ }.should raise_error Timeout::Error
23
+ end
24
+
25
+ specify 'should send an email to gmail' do
26
+ e = WatirmarkEmail::Gmail.new(@username, @password, Logger::DEBUG)
27
+ e.send_email(@username, :subject => 'UNIT TEST MESSAGE', :body => "unit_test_message_id").should be_true
28
+ end
29
+
30
+ specify 'copy the test email to the UnitTest folder' do
31
+ e = WatirmarkEmail::Gmail.new(@username, @password, Logger::DEBUG)
32
+ e.copy(@test_message, 'UnitTest')
33
+ end
34
+
35
+ specify 'verify test email exists in the UnitTest folder' do
36
+ e = WatirmarkEmail::Gmail.new(@username, @password, Logger::DEBUG)
37
+ e.inbox = 'UnitTest'
38
+ txt = e.get_email_text(@test_message, 60, false)
39
+ txt.should be_a(String)
40
+ end
41
+
42
+ specify 'copy the test email from the UnitTest folder to the inbox' do
43
+ e = WatirmarkEmail::Gmail.new(@username, @password, Logger::DEBUG)
44
+ e.inbox = 'UnitTest'
45
+ e.copy(@test_message, WatirmarkEmail::Gmail::MAILBOX_INBOX)
46
+ end
47
+
48
+ specify 'should return body text from an email in the inbox' do
49
+ e = WatirmarkEmail::Gmail.new(@username, @password, Logger::DEBUG)
50
+ txt = e.get_email_text(@test_message, 60, false)
51
+ txt.should be_a(String)
52
+ end
53
+
54
+ specify 'delete flag should remove the email from the inbox' do
55
+ e = WatirmarkEmail::Gmail.new(@username, @password, Logger::DEBUG)
56
+ txt = e.get_email_text(@test_message, 60, true)
57
+ txt.should be_a(String)
58
+ end
59
+
60
+ specify 'should not see the email now that it is deleted' do
61
+ e = WatirmarkEmail::Gmail.new(@username, @password, Logger::DEBUG)
62
+ lambda {
63
+ txt = e.get_email_text(@test_message, 15, false)
64
+ }.should raise_error Timeout::Error
65
+ end
66
+ end
@@ -0,0 +1,48 @@
1
+ require 'spec_helper'
2
+
3
+ describe "WatirmarkEmail::QAMail" do
4
+
5
+ before(:all) do
6
+ @username = CREDENTIALS['qamail']['username']
7
+ @password = CREDENTIALS['qamail']['password']
8
+ @send_to = CREDENTIALS['qamail']['send_to']
9
+ @search_terms = ['BODY', "Watirmark"]
10
+ @not_present_search_terms = ['SUBJECT', "MISSING"]
11
+ end
12
+
13
+ it "should return an instance of itself when started" do
14
+ e = WatirmarkEmail::QAMail.new(@username, @password)
15
+ e.class.should == WatirmarkEmail::QAMail
16
+ end
17
+
18
+ it "should be able to connect to the qamail server successfullly" do
19
+ e = WatirmarkEmail::QAMail.new(@username, @password)
20
+ imap = e.connect
21
+ imap.should_not be_disconnected # cause imap has no "connected" method
22
+ e.disconnect(imap).should be_nil
23
+ end
24
+
25
+ it 'should send an email to qamail' do
26
+ e = WatirmarkEmail::QAMail.new(@username, @password)
27
+ e.send_email(@send_to, :subject => 'UNIT TEST MESSAGE', :body => "Watirmark Email test message").should be_true
28
+ end
29
+
30
+ it "should get a sample email with 'Watirmark Email test message' in the body of the email" do
31
+ e = WatirmarkEmail::QAMail.new(@username, @password)
32
+ email_body_text = e.get_email_text(@search_terms, 30, false)
33
+ email_body_text.should match(/Watirmark Email test message/)
34
+ end
35
+
36
+ specify "should timeout when the email does not exist" do
37
+ e = WatirmarkEmail::QAMail.new(@username, @password, Logger::DEBUG)
38
+ lambda {
39
+ txt = e.get_email_text(@not_present_search_terms, 15, false)
40
+ }.should raise_error Timeout::Error
41
+ end
42
+
43
+ it "should delete a sample email with 'Watirmark Email test message' in the body of the email" do
44
+ e = WatirmarkEmail::QAMail.new(@username, @password)
45
+ email_body_text = e.get_email_text(@search_terms, 30, true)
46
+ email_body_text.should match(/Watirmark Email test message/)
47
+ end
48
+ end
metadata ADDED
@@ -0,0 +1,57 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: watirmark_email
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.3.1
5
+ platform: ruby
6
+ authors:
7
+ - Alan Baird
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-10-01 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: watirmark_email lets you get email from both GMAIL and generic IMAP servers
14
+ email: abaird@convio.com
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - lib/watirmark_email.rb
20
+ - lib/watirmark_email/email_base.rb
21
+ - lib/watirmark_email/email_collection.rb
22
+ - lib/watirmark_email/gmail.rb
23
+ - lib/watirmark_email/qamail.rb
24
+ - lib/watirmark_email/version.rb
25
+ - spec/get_emails_spec.rb
26
+ - spec/spec_helper.rb
27
+ - spec/watirmark_email_gmail_spec.rb
28
+ - spec/watirmark_email_qamail_spec.rb
29
+ homepage: http://github.com/convio/watirmark_email
30
+ licenses: []
31
+ metadata: {}
32
+ post_install_message:
33
+ rdoc_options: []
34
+ require_paths:
35
+ - lib
36
+ required_ruby_version: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ required_rubygems_version: !ruby/object:Gem::Requirement
42
+ requirements:
43
+ - - '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ requirements: []
47
+ rubyforge_project:
48
+ rubygems_version: 2.4.8
49
+ signing_key:
50
+ specification_version: 4
51
+ summary: watirmark_email-1.3.1
52
+ test_files:
53
+ - spec/get_emails_spec.rb
54
+ - spec/spec_helper.rb
55
+ - spec/watirmark_email_gmail_spec.rb
56
+ - spec/watirmark_email_qamail_spec.rb
57
+ has_rdoc: