mirror of
https://github.com/moparisthebest/mailcatcher
synced 2025-03-11 06:50:12 -04:00
Basic but ugly acceptance specs with selenium
This commit is contained in:
parent
77212c3e98
commit
c3f6979314
11
Gemfile.lock
11
Gemfile.lock
@ -17,6 +17,8 @@ GEM
|
|||||||
activesupport (3.2.17)
|
activesupport (3.2.17)
|
||||||
i18n (~> 0.6, >= 0.6.4)
|
i18n (~> 0.6, >= 0.6.4)
|
||||||
multi_json (~> 1.0)
|
multi_json (~> 1.0)
|
||||||
|
childprocess (0.5.1)
|
||||||
|
ffi (~> 1.0, >= 1.0.11)
|
||||||
chunky_png (1.3.0)
|
chunky_png (1.3.0)
|
||||||
coffee-script (2.2.0)
|
coffee-script (2.2.0)
|
||||||
coffee-script-source
|
coffee-script-source
|
||||||
@ -29,6 +31,7 @@ GEM
|
|||||||
daemons (1.1.9)
|
daemons (1.1.9)
|
||||||
eventmachine (1.0.3)
|
eventmachine (1.0.3)
|
||||||
execjs (2.0.2)
|
execjs (2.0.2)
|
||||||
|
ffi (1.9.3)
|
||||||
fssm (0.2.10)
|
fssm (0.2.10)
|
||||||
haml (4.0.5)
|
haml (4.0.5)
|
||||||
tilt
|
tilt
|
||||||
@ -48,7 +51,13 @@ GEM
|
|||||||
rake (10.1.1)
|
rake (10.1.1)
|
||||||
rdoc (4.1.1)
|
rdoc (4.1.1)
|
||||||
json (~> 1.4)
|
json (~> 1.4)
|
||||||
|
rubyzip (1.1.2)
|
||||||
sass (3.2.17)
|
sass (3.2.17)
|
||||||
|
selenium-webdriver (2.40.0)
|
||||||
|
childprocess (>= 0.5.0)
|
||||||
|
multi_json (~> 1.0)
|
||||||
|
rubyzip (~> 1.0)
|
||||||
|
websocket (~> 1.0.4)
|
||||||
sinatra (1.4.4)
|
sinatra (1.4.4)
|
||||||
rack (~> 1.4)
|
rack (~> 1.4)
|
||||||
rack-protection (~> 1.4)
|
rack-protection (~> 1.4)
|
||||||
@ -76,6 +85,7 @@ GEM
|
|||||||
uglifier (2.5.0)
|
uglifier (2.5.0)
|
||||||
execjs (>= 0.3.0)
|
execjs (>= 0.3.0)
|
||||||
json (>= 1.8.0)
|
json (>= 1.8.0)
|
||||||
|
websocket (1.0.7)
|
||||||
|
|
||||||
PLATFORMS
|
PLATFORMS
|
||||||
ruby
|
ruby
|
||||||
@ -88,6 +98,7 @@ DEPENDENCIES
|
|||||||
rake
|
rake
|
||||||
rdoc
|
rdoc
|
||||||
sass
|
sass
|
||||||
|
selenium-webdriver
|
||||||
sprockets
|
sprockets
|
||||||
sprockets-sass
|
sprockets-sass
|
||||||
uglifier
|
uglifier
|
||||||
|
@ -16,4 +16,4 @@ Content-Type: text/html
|
|||||||
|
|
||||||
<html><body><em>HTML</em> mail</body></html>
|
<html><body><em>HTML</em> mail</body></html>
|
||||||
|
|
||||||
--BOUNDARY--198849662--
|
--BOUNDARY--198849662--
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
To: Blah <blah@blah.com>
|
To: Blah <blah@blah.com>
|
||||||
From: Me <me@sj26.com>
|
From: Me <me@sj26.com>
|
||||||
Subject: Whatever
|
Subject: Plain mail
|
||||||
Content-Type: text/plain
|
Content-Type: text/plain
|
||||||
|
|
||||||
Plain text mail
|
Here's some text
|
||||||
|
@ -45,6 +45,7 @@ Gem::Specification.new do |s|
|
|||||||
s.add_development_dependency "rake"
|
s.add_development_dependency "rake"
|
||||||
s.add_development_dependency "rdoc"
|
s.add_development_dependency "rdoc"
|
||||||
s.add_development_dependency "sass"
|
s.add_development_dependency "sass"
|
||||||
|
s.add_development_dependency "selenium-webdriver"
|
||||||
s.add_development_dependency "sprockets"
|
s.add_development_dependency "sprockets"
|
||||||
s.add_development_dependency "sprockets-sass"
|
s.add_development_dependency "sprockets-sass"
|
||||||
s.add_development_dependency "uglifier"
|
s.add_development_dependency "uglifier"
|
||||||
|
228
spec/acceptance_spec.rb
Normal file
228
spec/acceptance_spec.rb
Normal file
@ -0,0 +1,228 @@
|
|||||||
|
require "minitest/autorun"
|
||||||
|
require "mail_catcher"
|
||||||
|
require "socket"
|
||||||
|
require "net/smtp"
|
||||||
|
require "selenium-webdriver"
|
||||||
|
|
||||||
|
SMTP_PORT = 10025
|
||||||
|
HTTP_PORT = 10080
|
||||||
|
|
||||||
|
# Start MailCatcher
|
||||||
|
MAILCATCHER_PID = spawn "bundle", "exec", "mailcatcher", "--foreground", "--smtp-port", SMTP_PORT.to_s, "--http-port", HTTP_PORT.to_s
|
||||||
|
|
||||||
|
# Make sure it will be stopped
|
||||||
|
MiniTest.after_run do
|
||||||
|
Process.kill("TERM", MAILCATCHER_PID) and Process.wait
|
||||||
|
end
|
||||||
|
|
||||||
|
# Wait for it to boot
|
||||||
|
begin
|
||||||
|
TCPSocket.new("127.0.0.1", SMTP_PORT).close
|
||||||
|
rescue Errno::ECONNREFUSED
|
||||||
|
retry
|
||||||
|
end
|
||||||
|
|
||||||
|
describe MailCatcher do
|
||||||
|
DEFAULT_FROM = "from@example.com"
|
||||||
|
DEFAULT_TO = "to@example.com"
|
||||||
|
|
||||||
|
def deliver(message, options={})
|
||||||
|
options = {:from => DEFAULT_FROM, :to => DEFAULT_TO}.merge(options)
|
||||||
|
Net::SMTP.start('127.0.0.1', SMTP_PORT) do |smtp|
|
||||||
|
smtp.send_message message, options[:from], options[:to]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def read_example(name)
|
||||||
|
File.read(File.expand_path("../../examples/#{name}", __FILE__))
|
||||||
|
end
|
||||||
|
|
||||||
|
def deliver_example(name, options={})
|
||||||
|
deliver(read_example(name), options)
|
||||||
|
end
|
||||||
|
|
||||||
|
def selenium
|
||||||
|
@selenium ||= begin
|
||||||
|
Selenium::WebDriver.for(:phantomjs).tap do |selenium|
|
||||||
|
selenium.navigate.to("http://127.0.0.1:#{HTTP_PORT}")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def messages_element
|
||||||
|
selenium.find_element(:id, "messages")
|
||||||
|
end
|
||||||
|
|
||||||
|
def message_row_element
|
||||||
|
messages_element.find_element(:xpath, ".//table/tbody/tr[1]")
|
||||||
|
end
|
||||||
|
|
||||||
|
def message_from_element
|
||||||
|
message_row_element.find_element(:xpath, ".//td[1]")
|
||||||
|
end
|
||||||
|
|
||||||
|
def message_to_element
|
||||||
|
message_row_element.find_element(:xpath, ".//td[2]")
|
||||||
|
end
|
||||||
|
|
||||||
|
def message_subject_element
|
||||||
|
message_row_element.find_element(:xpath, ".//td[3]")
|
||||||
|
end
|
||||||
|
|
||||||
|
def message_received_element
|
||||||
|
message_row_element.find_element(:xpath, ".//td[4]")
|
||||||
|
end
|
||||||
|
|
||||||
|
def html_tab_element
|
||||||
|
selenium.find_element(:css, "#message header .format.html a")
|
||||||
|
end
|
||||||
|
|
||||||
|
def plain_tab_element
|
||||||
|
selenium.find_element(:css, "#message header .format.plain a")
|
||||||
|
end
|
||||||
|
|
||||||
|
def source_tab_element
|
||||||
|
selenium.find_element(:css, "#message header .format.source a")
|
||||||
|
end
|
||||||
|
|
||||||
|
def iframe_element
|
||||||
|
selenium.find_element(:css, "#message iframe")
|
||||||
|
end
|
||||||
|
|
||||||
|
def body_element
|
||||||
|
selenium.find_element(:tag_name, "body")
|
||||||
|
end
|
||||||
|
|
||||||
|
before { selenium.navigate.refresh }
|
||||||
|
|
||||||
|
it "catches and displays a plain text message as plain text and source" do
|
||||||
|
deliver_example("plainmail")
|
||||||
|
|
||||||
|
message_from_element.text.must_include DEFAULT_FROM
|
||||||
|
message_to_element.text.must_include DEFAULT_TO
|
||||||
|
message_subject_element.text.must_equal "Plain mail"
|
||||||
|
Time.parse(message_received_element.text).must_be_close_to Time.now, 5
|
||||||
|
|
||||||
|
message_row_element.click
|
||||||
|
|
||||||
|
source_tab_element.displayed?.must_equal true
|
||||||
|
plain_tab_element.displayed?.must_equal true
|
||||||
|
html_tab_element.displayed?.must_equal false
|
||||||
|
|
||||||
|
plain_tab_element.click
|
||||||
|
|
||||||
|
iframe_element.displayed?.must_equal true
|
||||||
|
iframe_element.attribute(:src).must_match /\.plain\Z/
|
||||||
|
|
||||||
|
selenium.switch_to.frame(iframe_element)
|
||||||
|
|
||||||
|
body_element.text.wont_include "Subject: Plain mail"
|
||||||
|
body_element.text.must_include "Here's some text"
|
||||||
|
|
||||||
|
selenium.switch_to.default_content
|
||||||
|
source_tab_element.click
|
||||||
|
selenium.switch_to.frame(iframe_element)
|
||||||
|
|
||||||
|
body_element.text.must_include "Subject: Plain mail"
|
||||||
|
body_element.text.must_include "Here's some text"
|
||||||
|
end
|
||||||
|
|
||||||
|
it "catches and displays an html message as html and source" do
|
||||||
|
deliver_example("htmlmail")
|
||||||
|
|
||||||
|
message_from_element.text.must_include DEFAULT_FROM
|
||||||
|
message_to_element.text.must_include DEFAULT_TO
|
||||||
|
message_subject_element.text.must_equal "Test HTML Mail"
|
||||||
|
Time.parse(message_received_element.text).must_be_close_to Time.now, 5
|
||||||
|
|
||||||
|
message_row_element.click
|
||||||
|
|
||||||
|
source_tab_element.displayed?.must_equal true
|
||||||
|
plain_tab_element.displayed?.must_equal false
|
||||||
|
html_tab_element.displayed?.must_equal true
|
||||||
|
|
||||||
|
html_tab_element.click
|
||||||
|
|
||||||
|
iframe_element.displayed?.must_equal true
|
||||||
|
iframe_element.attribute(:src).must_match /\.html\Z/
|
||||||
|
|
||||||
|
selenium.switch_to.frame(iframe_element)
|
||||||
|
|
||||||
|
body_element.text.must_include "Yo, you slimey scoundrel."
|
||||||
|
body_element.text.wont_include "Content-Type: text/html"
|
||||||
|
body_element.text.wont_include "Yo, you <em>slimey scoundrel</em>."
|
||||||
|
|
||||||
|
selenium.switch_to.default_content
|
||||||
|
source_tab_element.click
|
||||||
|
selenium.switch_to.frame(iframe_element)
|
||||||
|
|
||||||
|
body_element.text.must_include "Content-Type: text/html"
|
||||||
|
body_element.text.must_include "Yo, you <em>slimey scoundrel</em>."
|
||||||
|
body_element.text.wont_include "Yo, you slimey scoundrel."
|
||||||
|
end
|
||||||
|
|
||||||
|
it "catches and displays a multipart message as text, html and source" do
|
||||||
|
deliver_example("multipartmail")
|
||||||
|
|
||||||
|
message_from_element.text.must_include DEFAULT_FROM
|
||||||
|
message_to_element.text.must_include DEFAULT_TO
|
||||||
|
message_subject_element.text.must_equal "Test Multipart Mail"
|
||||||
|
Time.parse(message_received_element.text).must_be_close_to Time.now, 5
|
||||||
|
|
||||||
|
message_row_element.click
|
||||||
|
|
||||||
|
source_tab_element.displayed?.must_equal true
|
||||||
|
plain_tab_element.displayed?.must_equal true
|
||||||
|
html_tab_element.displayed?.must_equal true
|
||||||
|
|
||||||
|
plain_tab_element.click
|
||||||
|
|
||||||
|
iframe_element.displayed?.must_equal true
|
||||||
|
iframe_element.attribute(:src).must_match /\.plain\Z/
|
||||||
|
|
||||||
|
selenium.switch_to.frame(iframe_element)
|
||||||
|
|
||||||
|
body_element.text.must_include "Plain text mail"
|
||||||
|
body_element.text.wont_include "HTML mail"
|
||||||
|
body_element.text.wont_include "Content-Type: multipart/alternative; boundary=BOUNDARY--198849662"
|
||||||
|
|
||||||
|
selenium.switch_to.default_content
|
||||||
|
html_tab_element.click
|
||||||
|
selenium.switch_to.frame(iframe_element)
|
||||||
|
|
||||||
|
body_element.text.must_include "HTML mail"
|
||||||
|
body_element.text.wont_include "Content-Type: multipart/alternative; boundary=BOUNDARY--198849662"
|
||||||
|
|
||||||
|
selenium.switch_to.default_content
|
||||||
|
source_tab_element.click
|
||||||
|
selenium.switch_to.frame(iframe_element)
|
||||||
|
|
||||||
|
body_element.text.must_include "Content-Type: multipart/alternative; boundary=BOUNDARY--198849662"
|
||||||
|
body_element.text.must_include "Plain text mail"
|
||||||
|
body_element.text.must_include "<em>HTML</em> mail"
|
||||||
|
end
|
||||||
|
|
||||||
|
it "catches and displays an unknown message as source" do
|
||||||
|
deliver_example("unknownmail")
|
||||||
|
|
||||||
|
skip
|
||||||
|
end
|
||||||
|
|
||||||
|
it "catches and displays a message with multipart attachments" do
|
||||||
|
deliver_example("attachmail")
|
||||||
|
|
||||||
|
skip
|
||||||
|
end
|
||||||
|
|
||||||
|
it "doesn't choke on messages containing dots" do
|
||||||
|
deliver_example("dotmail")
|
||||||
|
|
||||||
|
skip
|
||||||
|
end
|
||||||
|
|
||||||
|
it "doesn't choke on messages containing quoted printables" do
|
||||||
|
deliver_example("quoted_printable_htmlmail")
|
||||||
|
|
||||||
|
skip
|
||||||
|
end
|
||||||
|
end
|
@ -1,67 +0,0 @@
|
|||||||
require "minitest/autorun"
|
|
||||||
require "mail_catcher"
|
|
||||||
require "socket"
|
|
||||||
require "net/smtp"
|
|
||||||
|
|
||||||
SMTP_PORT = 10025
|
|
||||||
HTTP_PORT = 10080
|
|
||||||
|
|
||||||
# Start MailCatcher
|
|
||||||
MAILCATCHER_PID = spawn "bundle", "exec", "mailcatcher", "--foreground", "--smtp-port", SMTP_PORT.to_s, "--http-port", HTTP_PORT.to_s
|
|
||||||
|
|
||||||
# Make sure it will be stopped
|
|
||||||
MiniTest.after_run do
|
|
||||||
Process.kill("TERM", MAILCATCHER_PID) and Process.wait
|
|
||||||
end
|
|
||||||
|
|
||||||
# Wait for it to boot
|
|
||||||
begin
|
|
||||||
TCPSocket.new("127.0.0.1", SMTP_PORT).close
|
|
||||||
rescue Errno::ECONNREFUSED
|
|
||||||
retry
|
|
||||||
end
|
|
||||||
|
|
||||||
describe MailCatcher do
|
|
||||||
def deliver(message, options={})
|
|
||||||
options = {:from => "from@example.com", :to => "to@example.com"}.merge(options)
|
|
||||||
Net::SMTP.start('127.0.0.1', SMTP_PORT) do |smtp|
|
|
||||||
smtp.send_message message, options[:from], options[:to]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def read_example(name)
|
|
||||||
File.read(File.expand_path("../../examples/#{name}", __FILE__))
|
|
||||||
end
|
|
||||||
|
|
||||||
def deliver_example(name, options={})
|
|
||||||
deliver(read_example(name), options)
|
|
||||||
end
|
|
||||||
|
|
||||||
it "catches and displays a plain text message as plain text and source" do
|
|
||||||
deliver_example("plainmail")
|
|
||||||
end
|
|
||||||
|
|
||||||
it "catches and displays an html message as html and source" do
|
|
||||||
deliver_example("htmlmail")
|
|
||||||
end
|
|
||||||
|
|
||||||
it "catches and displays a multipart message as text, html and source" do
|
|
||||||
deliver_example("multipartmail")
|
|
||||||
end
|
|
||||||
|
|
||||||
it "catches and displays an unknown message as source" do
|
|
||||||
deliver_example("unknownmail")
|
|
||||||
end
|
|
||||||
|
|
||||||
it "catches and displays a message with multipart attachments" do
|
|
||||||
deliver_example("attachmail")
|
|
||||||
end
|
|
||||||
|
|
||||||
it "doesn't choke on messages containing dots" do
|
|
||||||
deliver_example("dotmail")
|
|
||||||
end
|
|
||||||
|
|
||||||
it "doesn't choke on messages containing quoted printables" do
|
|
||||||
deliver_example("quoted_printable_htmlmail")
|
|
||||||
end
|
|
||||||
end
|
|
Loading…
x
Reference in New Issue
Block a user