email_spec 0.3.1 → 0.3.5

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.
Files changed (40) hide show
  1. data/History.txt +21 -1
  2. data/README.rdoc +10 -10
  3. data/Rakefile +14 -6
  4. data/examples/rails_root/Rakefile +6 -0
  5. data/examples/rails_root/app/controllers/welcome_controller.rb +3 -0
  6. data/examples/rails_root/app/models/user_mailer.rb +7 -0
  7. data/examples/rails_root/app/views/user_mailer/newsletter.erb +8 -0
  8. data/examples/rails_root/app/views/welcome/newsletter.html.erb +0 -0
  9. data/examples/rails_root/config/environment.rb +1 -1
  10. data/examples/rails_root/config/environments/test.rb +6 -5
  11. data/examples/rails_root/config/routes.rb +2 -1
  12. data/examples/rails_root/db/migrate/20090908054656_create_delayed_jobs.rb +20 -0
  13. data/examples/rails_root/db/schema.rb +14 -1
  14. data/examples/rails_root/features/delayed_job.feature +13 -0
  15. data/examples/rails_root/features/step_definitions/user_steps.rb +1 -1
  16. data/examples/rails_root/features/step_definitions/webrat_steps.rb +4 -4
  17. data/examples/rails_root/features/support/env.rb +2 -2
  18. data/examples/rails_root/features/support/paths.rb +3 -0
  19. data/examples/rails_root/script/delayed_job +5 -0
  20. data/examples/sinatra/app.rb +33 -0
  21. data/examples/sinatra/features/errors.feature +32 -0
  22. data/examples/sinatra/features/example.feature +62 -0
  23. data/examples/{rails_root → sinatra}/features/step_definitions/email_steps.rb +2 -2
  24. data/examples/sinatra/features/step_definitions/user_steps.rb +26 -0
  25. data/examples/sinatra/features/step_definitions/webrat_steps.rb +137 -0
  26. data/examples/sinatra/features/support/env.rb +33 -0
  27. data/examples/sinatra/features/support/paths.rb +24 -0
  28. data/lib/email_spec.rb +3 -2
  29. data/lib/email_spec/address_converter.rb +2 -0
  30. data/lib/email_spec/background_processes.rb +31 -0
  31. data/lib/email_spec/cucumber.rb +7 -5
  32. data/lib/email_spec/deliveries.rb +24 -7
  33. data/lib/email_spec/matchers.rb +32 -1
  34. data/rails_generators/email_spec/templates/email_steps.rb +2 -2
  35. data/spec/email_spec/matchers_spec.rb +26 -2
  36. metadata +16 -7
  37. data/examples/rails_root/stories/all.rb +0 -4
  38. data/examples/rails_root/stories/helper.rb +0 -3
  39. data/examples/rails_root/vendor/plugins/email_spec/rails_generators/email_spec/email_spec_generator.rb +0 -17
  40. data/examples/rails_root/vendor/plugins/email_spec/rails_generators/email_spec/templates/email_steps.rb +0 -122
@@ -3,13 +3,33 @@
3
3
  === New features
4
4
  === Bufixes
5
5
 
6
+ == 0.3.5 2009-09-30 The Pony Release!
7
+
8
+ === New features
9
+ * Support for Pony mailer library. (Rob Holland)
10
+
11
+ == 0.3.4 2009-09-26
12
+
13
+ === Bugfixes
14
+ * Typo and logic fixes for DeliverFrom matcher. (Yury Kotlyarov)
15
+
16
+ == 0.3.3 2009-09-18
17
+
18
+ === New features
19
+ * DeliverFrom matcher. i.e. email.should deliver_from(blah) or email.should be_delivered_from(blah) (Diego Carrion)
20
+
21
+ == 0.3.2 2009-09-10
22
+
23
+ === New features
24
+ * Support for delayed_job. (Kieran Pilkington)
25
+
6
26
  == 0.3.1 2009-08-19
7
27
  This release is a general refactoring of the steps and helpers.
8
28
  The example rails app was also updated to use the lateset rails and webrat. It also takes advantages
9
29
  and the newer step definistions including the new third-person forms.
10
30
 
11
31
  Some of the generated steps are being removed in favor of some of the newer ones. The older ones
12
- will remain until 0.3.5 but will issue deprecation warnings.
32
+ will remain until 0.4.0 but will issue deprecation warnings.
13
33
 
14
34
  Big shoutout to Kieran Pilkington who did the majority of work for this release.
15
35
 
@@ -8,12 +8,12 @@ A collection of RSpec matchers and Cucumber steps to make testing emails go smoo
8
8
  script/plugin install git://github.com/bmabey/email-spec.git
9
9
 
10
10
  === Gem Setup
11
-
11
+
12
12
  gem install bmabey-email_spec
13
13
 
14
14
  # config/environments/test.rb
15
15
  config.gem 'bmabey-email_spec', :lib => 'email_spec'
16
-
16
+
17
17
  === Cucumber
18
18
 
19
19
  To use the steps in features put the following in your env.rb:
@@ -21,7 +21,7 @@ To use the steps in features put the following in your env.rb:
21
21
  # Make sure this require is after you require cucumber/rails/world.
22
22
  require 'email_spec/cucumber'
23
23
 
24
- This will load all the helpers that the steps rely on.
24
+ This will load all the helpers that the steps rely on.
25
25
  It will also add a Before hook for Cucumber so that emails are cleared at the start of each scenario.
26
26
 
27
27
  Then:
@@ -32,7 +32,7 @@ This will give you a bunch of steps to get started with in step_definitions/emai
32
32
 
33
33
  === RSpec
34
34
 
35
- First you need to require the helpers and matchers in your spec_helper.rb like so:
35
+ First you need to require the helpers and matchers in your spec_helper.rb like so:
36
36
 
37
37
  require "email_spec/helpers"
38
38
  require "email_spec/matchers"
@@ -95,11 +95,11 @@ For more examples, check out examples/rails_root in the source for a small examp
95
95
  before(:all) do
96
96
  @email = UserMailer.create_signup("jojo@yahoo.com", "Jojo Binks")
97
97
  end
98
-
98
+
99
99
  it "should be set to be delivered to the email passed in" do
100
100
  @email.should deliver_to("jojo@yahoo.com")
101
101
  end
102
-
102
+
103
103
  it "should contain the user's message in the mail body" do
104
104
  @email.should have_text(/Jojo Binks/)
105
105
  end
@@ -107,14 +107,14 @@ For more examples, check out examples/rails_root in the source for a small examp
107
107
  it "should contain a link to the confirmation link" do
108
108
  @email.should have_text(/#{confirm_account_url}/)
109
109
  end
110
-
110
+
111
111
  it "should have the correct subject" do
112
112
  @email.should have_subject(/Account confirmation/)
113
113
  end
114
-
114
+
115
115
  end
116
-
117
- ==== Using the helpers when not testing in isolation ====
116
+
117
+ ==== Using the helpers when not testing in isolation ====
118
118
 
119
119
  Don't. :) Seriously, if you do just take a look at the helpers and use them as you wish.
120
120
 
data/Rakefile CHANGED
@@ -25,12 +25,14 @@ rescue LoadError
25
25
  puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
26
26
  end
27
27
 
28
-
29
- begin
30
- gem 'fixjour'
31
- rescue Gem::LoadError
32
- puts "Installing fixjour for the example rails app..."
33
- puts `gem install fixjour --no-rdoc --no-ri`
28
+ # TODO: Maybe use geminstaller instead?
29
+ %w[collectiveidea-delayed_job fixjour pony sinatra rack-test].each do |gem_name|
30
+ begin
31
+ gem gem_name
32
+ rescue Gem::LoadError
33
+ puts "Installing #{gem_name} for the example rails app..."
34
+ puts `gem install #{gem_name} --no-rdoc --no-ri`
35
+ end
34
36
  end
35
37
 
36
38
  begin
@@ -60,8 +62,14 @@ task :default => [:features, :spec, 'example_app:spec']
60
62
 
61
63
  desc "Cleans the project of any tmp file that should not be included in the gemspec."
62
64
  task :clean do
65
+ FileUtils.rm_f('examples/rails_root/features/step_definitions/email_steps.rb')
66
+ FileUtils.rm_rf('examples/rails_root/log')
67
+ FileUtils.rm_rf('examples/rails_root/vendor')
63
68
  %w[*.sqlite3 *.log].each do |pattern|
64
69
  `find . -name "#{pattern}" -delete`
65
70
  end
66
71
  end
67
72
 
73
+ desc "Cleans the dir and builds the gem"
74
+ task :prep => [:clean, :gemspec, :build]
75
+
@@ -5,3 +5,9 @@ require 'rake/testtask'
5
5
  require 'rake/rdoctask'
6
6
 
7
7
  require 'tasks/rails'
8
+
9
+ begin
10
+ require 'delayed/tasks'
11
+ rescue LoadError
12
+ STDERR.puts "Run `rake gems:install` to install delayed_job"
13
+ end
@@ -6,4 +6,7 @@ class WelcomeController < ApplicationController
6
6
  def confirm
7
7
  end
8
8
 
9
+ def newsletter
10
+ UserMailer.send_later(:deliver_newsletter, params['Email'], params['Name'])
11
+ end
9
12
  end
@@ -8,4 +8,11 @@ class UserMailer < ActionMailer::Base
8
8
  @body[:name] = name
9
9
  end
10
10
 
11
+ def newsletter(email, name)
12
+ @recipients = email
13
+ @from = "admin@example.com"
14
+ @subject = "Newsletter sent"
15
+ @sent_on = Time.now
16
+ @body[:name] = name
17
+ end
11
18
  end
@@ -0,0 +1,8 @@
1
+ Hello <%= @name %>!
2
+
3
+ This week.....
4
+ .....
5
+ .....
6
+
7
+ Regards
8
+ Rails Example App
@@ -5,7 +5,7 @@
5
5
  # ENV['RAILS_ENV'] ||= 'production'
6
6
 
7
7
  # Specifies gem version of Rails to use when vendor/rails is not present
8
- RAILS_GEM_VERSION = '2.3.3' unless defined? RAILS_GEM_VERSION
8
+ RAILS_GEM_VERSION = '2.3.4' unless defined? RAILS_GEM_VERSION
9
9
 
10
10
  # Bootstrap the Rails environment, frameworks, and default configuration
11
11
  require File.join(File.dirname(__FILE__), 'boot')
@@ -22,8 +22,9 @@ config.action_controller.allow_forgery_protection = false
22
22
  config.action_mailer.delivery_method = :test
23
23
  config.action_mailer.default_url_options = { :host => "example.com" }
24
24
 
25
- config.gem 'cucumber', :lib => false
26
- config.gem 'webrat', :lib => false
27
- config.gem 'rspec', :lib => false
28
- config.gem 'rspec-rails', :lib => 'spec/rails'
29
- config.gem 'fixjour', :lib => 'fixjour'
25
+ config.gem 'cucumber', :lib => false
26
+ config.gem 'webrat', :lib => false
27
+ config.gem 'rspec', :lib => false
28
+ config.gem 'rspec-rails', :lib => 'spec/rails'
29
+ config.gem 'fixjour', :lib => 'fixjour'
30
+ config.gem 'collectiveidea-delayed_job', :lib => 'delayed_job', :source => 'http://gems.github.com'
@@ -17,7 +17,7 @@ ActionController::Routing::Routes.draw do |map|
17
17
 
18
18
  # Sample resource route with sub-resources:
19
19
  # map.resources :products, :has_many => [ :comments, :sales ], :has_one => :seller
20
-
20
+
21
21
  # Sample resource route with more complex sub-resources
22
22
  # map.resources :products do |products|
23
23
  # products.resources :comments
@@ -33,6 +33,7 @@ ActionController::Routing::Routes.draw do |map|
33
33
  # You can have the root of your site routed with map.root -- just remember to delete public/index.html.
34
34
  map.root :controller => "welcome", :action => "index"
35
35
  map.confirm_account "/confirm", :controller => "welcome", :action => "confirm"
36
+ map.request_newsletter "/newsletter", :controller => "welcome", :action => "newsletter"
36
37
  # See how all your routes lay out with "rake routes"
37
38
 
38
39
  # Install the default routes as the lowest priority.
@@ -0,0 +1,20 @@
1
+ class CreateDelayedJobs < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :delayed_jobs, :force => true do |table|
4
+ table.integer :priority, :default => 0 # Allows some jobs to jump to the front of the queue
5
+ table.integer :attempts, :default => 0 # Provides for retries, but still fail eventually.
6
+ table.text :handler # YAML-encoded string of the object that will do work
7
+ table.text :last_error # reason for last failure (See Note below)
8
+ table.datetime :run_at # When to run. Could be Time.now for immediately, or sometime in the future.
9
+ table.datetime :locked_at # Set when a client is working on this object
10
+ table.datetime :failed_at # Set when all retries have failed (actually, by default, the record is deleted instead)
11
+ table.string :locked_by # Who is working on this object (if locked)
12
+ table.timestamps
13
+ end
14
+
15
+ end
16
+
17
+ def self.down
18
+ drop_table :delayed_jobs
19
+ end
20
+ end
@@ -9,7 +9,20 @@
9
9
  #
10
10
  # It's strongly recommended to check this file into your version control system.
11
11
 
12
- ActiveRecord::Schema.define(:version => 20090125013728) do
12
+ ActiveRecord::Schema.define(:version => 20090908054656) do
13
+
14
+ create_table "delayed_jobs", :force => true do |t|
15
+ t.integer "priority", :default => 0
16
+ t.integer "attempts", :default => 0
17
+ t.text "handler"
18
+ t.text "last_error"
19
+ t.datetime "run_at"
20
+ t.datetime "locked_at"
21
+ t.datetime "failed_at"
22
+ t.string "locked_by"
23
+ t.datetime "created_at"
24
+ t.datetime "updated_at"
25
+ end
13
26
 
14
27
  create_table "users", :force => true do |t|
15
28
  t.string "email"
@@ -0,0 +1,13 @@
1
+ Feature: Delayed Job support
2
+ In order for developers using delayed_job to test emails
3
+ I want to be able to provide a compatibility layer, which
4
+ should run all delayed jobs before checking email boxes
5
+ In order to populate deliveries done via send_later
6
+
7
+ Scenario: Newsletter
8
+ Given no emails have been sent
9
+ And I go to request a newsletter
10
+ Then I should receive an email
11
+ And I should have 1 email
12
+ When I open the email
13
+ Then I should see "Newsletter sent" in the email subject
@@ -17,7 +17,7 @@ Then /^(?:I|they) should receive an email with a link to a confirmation page$/ d
17
17
  current_email.should have_body_text('Joe Someone')
18
18
 
19
19
  click_email_link_matching /confirm/
20
- response.should include_text("Confirm your new account")
20
+ response_body.should contain("Confirm your new account")
21
21
  end
22
22
 
23
23
  # Basically aliases "I should see [text]", but for third person
@@ -95,21 +95,21 @@ When /^I attach the file at "([^\"]*)" to "([^\"]*)"$/ do |path, field|
95
95
  end
96
96
 
97
97
  Then /^I should see "([^\"]*)"$/ do |text|
98
- response.should contain(text)
98
+ response_body.should contain(text)
99
99
  end
100
100
 
101
101
  Then /^I should see \/([^\/]*)\/$/ do |regexp|
102
102
  regexp = Regexp.new(regexp)
103
- response.should contain(regexp)
103
+ response_body.should contain(regexp)
104
104
  end
105
105
 
106
106
  Then /^I should not see "([^\"]*)"$/ do |text|
107
- response.should_not contain(text)
107
+ response_body.should_not contain(text)
108
108
  end
109
109
 
110
110
  Then /^I should not see \/([^\/]*)\/$/ do |regexp|
111
111
  regexp = Regexp.new(regexp)
112
- response.should_not contain(regexp)
112
+ response_body.should_not contain(regexp)
113
113
  end
114
114
 
115
115
  Then /^the "([^\"]*)" field should contain "([^\"]*)"$/ do |field, value|
@@ -8,11 +8,11 @@ require 'cucumber/formatter/unicode'
8
8
 
9
9
  # Comment out the next line if you don't want transactions to
10
10
  # open/roll back around each scenario
11
- Cucumber::Rails.use_transactional_fixtures
11
+ #Cucumber::Rails.use_transactional_fixtures
12
12
 
13
13
  # Comment out the next line if you want Rails' own error handling
14
14
  # (e.g. rescue_action_in_public / rescue_responses / rescue_from)
15
- Cucumber::Rails.bypass_rescue
15
+ #Cucumber::Rails.bypass_rescue
16
16
 
17
17
  require 'webrat'
18
18
  require 'cucumber/webrat/table_locator' # Lets you do table.diff!(table_at('#my_table').to_a)
@@ -11,6 +11,9 @@ module NavigationHelpers
11
11
  when /the homepage/
12
12
  '/'
13
13
 
14
+ when /request a newsletter/
15
+ request_newsletter_url('Name' => 'Joe Someone', 'Email' => 'example@example.com')
16
+
14
17
  else
15
18
  raise "Can't find mapping from \"#{page_name}\" to a path.\n" +
16
19
  "Now, go and add a mapping in #{__FILE__}"
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', 'config', 'environment'))
4
+ require 'delayed/command'
5
+ Delayed::Command.new(ARGV).daemonize
@@ -0,0 +1,33 @@
1
+ require 'sinatra'
2
+ require 'pony'
3
+
4
+ get '/' do
5
+ <<-EOHTML
6
+ <form method="post" action="/signup">
7
+ <label for="Name">Name</label>
8
+ <input type="text" id="Name" name="user[name]">
9
+ <label for="Email">Email</label>
10
+ <input type="text" id="Email" name="user[email]">
11
+ <input type="submit" value="Sign up">
12
+ </form>
13
+ EOHTML
14
+ end
15
+
16
+ post '/signup' do
17
+ user = params[:user]
18
+ body = <<-EOHTML
19
+ Hello #{user['name']}!
20
+
21
+ <a href="http://www.example.com/confirm">Click here to confirm your account!</a>
22
+ EOHTML
23
+ Pony.mail(:from => 'admin@example.com',
24
+ :to => user['email'],
25
+ :subject => 'Account confirmation',
26
+ :body => body
27
+ )
28
+ 'Thanks! Go check your email!'
29
+ end
30
+
31
+ get '/confirm' do
32
+ 'Confirm your new account!'
33
+ end
@@ -0,0 +1,32 @@
1
+ Feature: Email-spec errors example
2
+ In order to help alleviate email testing in apps
3
+ As a email-spec contributor I a newcomer
4
+ Should be able to easily determine where I have gone wrong
5
+ These scenarios should fail with helpful messages
6
+
7
+ Background:
8
+ Given I am on the homepage
9
+ And no emails have been sent
10
+ When I fill in "Email" with "example@example.com"
11
+ And I press "Sign up"
12
+
13
+ Scenario: I fail to open an email with incorrect subject
14
+ Then I should receive an email
15
+ When "example@example.com" opens the email with subject "no email"
16
+
17
+ Scenario: I fail to open an email with incorrect text
18
+ Then I should receive an email
19
+ When "example@example.com" opens the email with text "no email"
20
+
21
+ Scenario: I fail to receive an email with the expected link
22
+ Then I should receive an email
23
+ When I open the email
24
+ When I follow "link that doesn't exist" in the email
25
+
26
+ Scenario: I attempt to operate on an email that is not opened
27
+ Then I should receive an email
28
+ When I follow "confirm" in the email
29
+
30
+ Scenario: I attempt to check out an unopened email
31
+ Then I should see "confirm" in the email body
32
+ And I should see "Account confirmation" in the email subject
@@ -0,0 +1,62 @@
1
+ Feature: EmailSpec Example -- Prevent Bots from creating accounts
2
+
3
+ In order to help alleviate email testing in apps
4
+ As an email-spec contributor I want new users of the library
5
+ to easily adopt email-spec in their app by following this example
6
+
7
+ In order to prevent bots from setting up new accounts
8
+ As a site manager I want new users
9
+ to verify their email address with a confirmation link
10
+
11
+ Background:
12
+ Given no emails have been sent
13
+ And I am a real person wanting to sign up for an account
14
+ And I am on the homepage
15
+ And I submit my registration information
16
+
17
+ Scenario: First person signup (as myself) with two ways of opening email
18
+ Then I should receive an email
19
+ And I should have 1 email
20
+
21
+ # Opening email #1
22
+ When I open the email
23
+ Then I should see "Account confirmation" in the email subject
24
+ And I should see "Joe Someone" in the email body
25
+ And I should see "confirm" in the email body
26
+
27
+ # Opening email #2
28
+ When I open the email with subject "Account confirmation"
29
+ Then I should see "Account confirmation" in the email subject
30
+ And I should see "Joe Someone" in the email body
31
+ And I should see "confirm" in the email body
32
+
33
+ When I follow "Click here to confirm your account!" in the email
34
+ Then I should see "Confirm your new account"
35
+
36
+ And "foo@bar.com" should have no emails
37
+
38
+ Scenario: Third person signup (emails sent to others) with two ways of opening email
39
+ Then "foo@bar.com" should have no emails
40
+ And "example@example.com" should receive an email
41
+ And "example@example.com" should have 1 email
42
+
43
+ # Opening email #1
44
+ When they open the email
45
+ Then they should see "Account confirmation" in the email subject
46
+ And they should see "Joe Someone" in the email body
47
+ And they should see "confirm" in the email body
48
+
49
+ # Opening email #2
50
+ When "example@example.com" opens the email with subject "Account confirmation"
51
+ Then they should see "Account confirmation" in the email subject
52
+ And they should see "Joe Someone" in the email body
53
+ And they should see "confirm" in the email body
54
+
55
+ When they follow "Click here to confirm your account!" in the email
56
+ Then they should see "Confirm your new account"
57
+
58
+ Scenario: Declarative First Person signup
59
+ Then I should receive an email with a link to a confirmation page
60
+
61
+ Scenario: Declarative First Person signup
62
+ Then they should receive an email with a link to a confirmation page
@@ -58,7 +58,7 @@ end
58
58
 
59
59
  # DEPRECATED
60
60
  # The following methods are left in for backwards compatibility and
61
- # should be removed by version 0.3.5.
61
+ # should be removed by version 0.4.0
62
62
  Then /^(?:I|they|"([^"]*?)") should not receive an email$/ do |address|
63
63
  email_spec_deprecate "The step 'I/they/[email] should not receive an email' is no longer supported.
64
64
  Please use 'I/they/[email] should receive no emails' instead."
@@ -96,7 +96,7 @@ end
96
96
 
97
97
  # DEPRECATED
98
98
  # The following methods are left in for backwards compatibility and
99
- # should be removed by version 0.3.5.
99
+ # should be removed by version 0.4.0.
100
100
  Then /^(?:I|they) should see "([^"]*?)" in the subject$/ do |text|
101
101
  email_spec_deprecate "The step 'I/they should see [text] in the subject' is no longer supported.
102
102
  Please use 'I/they should see [text] in the email subject' instead."
@@ -0,0 +1,26 @@
1
+ Given "I am a real person wanting to sign up for an account" do
2
+ # no-op.. for documentation purposes only!
3
+ end
4
+
5
+ When /^I submit my registration information$/ do
6
+ fill_in "Name", :with => 'Joe Someone'
7
+ fill_in "Email", :with => 'example@example.com'
8
+ click_button
9
+ end
10
+
11
+ Then /^(?:I|they) should receive an email with a link to a confirmation page$/ do
12
+ unread_emails_for(current_email_address).size.should == 1
13
+
14
+ # this call will store the email and you can access it with current_email
15
+ open_last_email_for(last_email_address)
16
+ current_email.should have_subject(/Account confirmation/)
17
+ current_email.should have_body_text('Joe Someone')
18
+
19
+ click_email_link_matching /confirm/
20
+ response_body.should contain("Confirm your new account")
21
+ end
22
+
23
+ # Basically aliases "I should see [text]", but for third person
24
+ Then /^they should see "([^\"]*)"$/ do |text|
25
+ Then "I should see \"#{text}\""
26
+ end
@@ -0,0 +1,137 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "..", "support", "paths"))
2
+
3
+ # Commonly used webrat steps
4
+ # http://github.com/brynary/webrat
5
+
6
+ Given /^I am on (.+)$/ do |page_name|
7
+ visit path_to(page_name)
8
+ end
9
+
10
+ When /^I go to (.+)$/ do |page_name|
11
+ visit path_to(page_name)
12
+ end
13
+
14
+ When /^I press "([^\"]*)"$/ do |button|
15
+ click_button(button)
16
+ end
17
+
18
+ When /^I follow "([^\"]*)"$/ do |link|
19
+ click_link(link)
20
+ end
21
+
22
+ When /^I follow "([^\"]*)" within "([^\"]*)"$/ do |link, parent|
23
+ click_link_within(parent, link)
24
+ end
25
+
26
+ When /^I fill in "([^\"]*)" with "([^\"]*)"$/ do |field, value|
27
+ fill_in(field, :with => value)
28
+ end
29
+
30
+ When /^I select "([^\"]*)" from "([^\"]*)"$/ do |value, field|
31
+ select(value, :from => field)
32
+ end
33
+
34
+ # Use this step in conjunction with Rail's datetime_select helper. For example:
35
+ # When I select "December 25, 2008 10:00" as the date and time
36
+ When /^I select "([^\"]*)" as the date and time$/ do |time|
37
+ select_datetime(time)
38
+ end
39
+
40
+ # Use this step when using multiple datetime_select helpers on a page or
41
+ # you want to specify which datetime to select. Given the following view:
42
+ # <%%= f.label :preferred %><br />
43
+ # <%%= f.datetime_select :preferred %>
44
+ # <%%= f.label :alternative %><br />
45
+ # <%%= f.datetime_select :alternative %>
46
+ # The following steps would fill out the form:
47
+ # When I select "November 23, 2004 11:20" as the "Preferred" date and time
48
+ # And I select "November 25, 2004 10:30" as the "Alternative" date and time
49
+ When /^I select "([^\"]*)" as the "([^\"]*)" date and time$/ do |datetime, datetime_label|
50
+ select_datetime(datetime, :from => datetime_label)
51
+ end
52
+
53
+ # Use this step in conjunction with Rail's time_select helper. For example:
54
+ # When I select "2:20PM" as the time
55
+ # Note: Rail's default time helper provides 24-hour time-- not 12 hour time. Webrat
56
+ # will convert the 2:20PM to 14:20 and then select it.
57
+ When /^I select "([^\"]*)" as the time$/ do |time|
58
+ select_time(time)
59
+ end
60
+
61
+ # Use this step when using multiple time_select helpers on a page or you want to
62
+ # specify the name of the time on the form. For example:
63
+ # When I select "7:30AM" as the "Gym" time
64
+ When /^I select "([^\"]*)" as the "([^\"]*)" time$/ do |time, time_label|
65
+ select_time(time, :from => time_label)
66
+ end
67
+
68
+ # Use this step in conjunction with Rail's date_select helper. For example:
69
+ # When I select "February 20, 1981" as the date
70
+ When /^I select "([^\"]*)" as the date$/ do |date|
71
+ select_date(date)
72
+ end
73
+
74
+ # Use this step when using multiple date_select helpers on one page or
75
+ # you want to specify the name of the date on the form. For example:
76
+ # When I select "April 26, 1982" as the "Date of Birth" date
77
+ When /^I select "([^\"]*)" as the "([^\"]*)" date$/ do |date, date_label|
78
+ select_date(date, :from => date_label)
79
+ end
80
+
81
+ When /^I check "([^\"]*)"$/ do |field|
82
+ check(field)
83
+ end
84
+
85
+ When /^I uncheck "([^\"]*)"$/ do |field|
86
+ uncheck(field)
87
+ end
88
+
89
+ When /^I choose "([^\"]*)"$/ do |field|
90
+ choose(field)
91
+ end
92
+
93
+ When /^I attach the file at "([^\"]*)" to "([^\"]*)"$/ do |path, field|
94
+ attach_file(field, path)
95
+ end
96
+
97
+ Then /^I should see "([^\"]*)"$/ do |text|
98
+ response_body.should contain(text)
99
+ end
100
+
101
+ Then /^I should see \/([^\/]*)\/$/ do |regexp|
102
+ regexp = Regexp.new(regexp)
103
+ response_body.should contain(regexp)
104
+ end
105
+
106
+ Then /^I should not see "([^\"]*)"$/ do |text|
107
+ response_body.should_not contain(text)
108
+ end
109
+
110
+ Then /^I should not see \/([^\/]*)\/$/ do |regexp|
111
+ regexp = Regexp.new(regexp)
112
+ response_body.should_not contain(regexp)
113
+ end
114
+
115
+ Then /^the "([^\"]*)" field should contain "([^\"]*)"$/ do |field, value|
116
+ field_labeled(field).value.should =~ /#{value}/
117
+ end
118
+
119
+ Then /^the "([^\"]*)" field should not contain "([^\"]*)"$/ do |field, value|
120
+ field_labeled(field).value.should_not =~ /#{value}/
121
+ end
122
+
123
+ Then /^the "([^\"]*)" checkbox should be checked$/ do |label|
124
+ field_labeled(label).should be_checked
125
+ end
126
+
127
+ Then /^the "([^\"]*)" checkbox should not be checked$/ do |label|
128
+ field_labeled(label).should_not be_checked
129
+ end
130
+
131
+ Then /^I should be on (.+)$/ do |page_name|
132
+ URI.parse(current_url).path.should == path_to(page_name)
133
+ end
134
+
135
+ Then /^show me the page$/ do
136
+ save_and_open_page
137
+ end
@@ -0,0 +1,33 @@
1
+ # Sets up the Rails environment for Cucumber
2
+ ENV["RACK_ENV"] ||= "test"
3
+ require File.expand_path(File.dirname(__FILE__) + '/../../app.rb')
4
+
5
+ # Comment out the next line if you don't want Cucumber Unicode support
6
+ require 'cucumber/formatter/unicode'
7
+
8
+ require 'rack/test'
9
+ require 'webrat'
10
+ require 'cucumber/webrat/table_locator' # Lets you do table.diff!(table_at('#my_table').to_a)
11
+
12
+ Webrat.configure do |config|
13
+ config.mode = :rack
14
+ end
15
+
16
+ require 'webrat/core/matchers'
17
+
18
+ # email testing in cucumber
19
+ require 'activesupport'
20
+ require File.expand_path(File.dirname(__FILE__) + '../../../../../lib/email_spec')
21
+ require 'email_spec/cucumber'
22
+
23
+ class AppWorld
24
+ include Rack::Test::Methods
25
+ include Webrat::Methods
26
+ include Webrat::Matchers
27
+
28
+ def app
29
+ Sinatra::Application.new
30
+ end
31
+ end
32
+
33
+ World { AppWorld.new }
@@ -0,0 +1,24 @@
1
+ module NavigationHelpers
2
+ # Maps a name to a path. Used by the
3
+ #
4
+ # When /^I go to (.+)$/ do |page_name|
5
+ #
6
+ # step definition in webrat_steps.rb
7
+ #
8
+ def path_to(page_name)
9
+ case page_name
10
+
11
+ when /the homepage/
12
+ '/'
13
+
14
+ when /request a newsletter/
15
+ "/newsletter/Joe Someone/example@example.com"
16
+
17
+ else
18
+ raise "Can't find mapping from \"#{page_name}\" to a path.\n" +
19
+ "Now, go and add a mapping in #{__FILE__}"
20
+ end
21
+ end
22
+ end
23
+
24
+ World(NavigationHelpers)
@@ -1,10 +1,11 @@
1
- unless defined?(ActionMailer)
2
- Kernel.warn("ActionMailer did not appear to be loaded so email-spec is requiring it.")
1
+ unless defined?(Pony) or defined?(ActionMailer)
2
+ Kernel.warn("Neither Pony nor ActionMailer appear to be loaded so email-spec is requiring ActionMailer.")
3
3
  require 'actionmailer'
4
4
  end
5
5
 
6
6
  $LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__))) unless $LOAD_PATH.include?(File.expand_path(File.dirname(__FILE__)))
7
7
 
8
+ require 'email_spec/background_processes'
8
9
  require 'email_spec/deliveries'
9
10
  require 'email_spec/address_converter'
10
11
  require 'email_spec/email_viewer'
@@ -1,3 +1,5 @@
1
+ require 'singleton'
2
+
1
3
  module EmailSpec
2
4
  class AddressConverter
3
5
  include Singleton
@@ -0,0 +1,31 @@
1
+ module EmailSpec
2
+ module BackgroundProcesses
3
+ module DelayedJob
4
+ def all_emails
5
+ Delayed::Job.work_off
6
+ super
7
+ end
8
+
9
+ def last_email_sent
10
+ Delayed::Job.work_off
11
+ super
12
+ end
13
+
14
+ def reset_mailer
15
+ Delayed::Job.work_off
16
+ super
17
+ end
18
+
19
+ def mailbox_for(address)
20
+ Delayed::Job.work_off
21
+ super
22
+ end
23
+ end
24
+
25
+ module Compatibility
26
+ if defined?(Delayed)
27
+ include EmailSpec::BackgroundProcesses::DelayedJob
28
+ end
29
+ end
30
+ end
31
+ end
@@ -1,12 +1,14 @@
1
1
  # require this in your env.rb file after you require cucumber/rails/world
2
2
 
3
3
  # Global Setup
4
- ActionMailer::Base.delivery_method = :test unless ActionMailer::Base.delivery_method == :activerecord
5
- ActionMailer::Base.perform_deliveries = true
4
+ if defined?(ActionMailer)
5
+ ActionMailer::Base.delivery_method = :test unless ActionMailer::Base.delivery_method == :activerecord
6
+ ActionMailer::Base.perform_deliveries = true
6
7
 
7
- Before do
8
- # Scenario setup
9
- ActionMailer::Base.deliveries.clear if ActionMailer::Base.delivery_method == :test
8
+ Before do
9
+ # Scenario setup
10
+ ActionMailer::Base.deliveries.clear if ActionMailer::Base.delivery_method == :test
11
+ end
10
12
  end
11
13
 
12
14
  After do
@@ -1,19 +1,19 @@
1
1
  module EmailSpec
2
- module TestDeliveries
2
+ module MailerDeliveries
3
3
  def all_emails
4
- ActionMailer::Base.deliveries
4
+ mailer.deliveries
5
5
  end
6
6
 
7
7
  def last_email_sent
8
- ActionMailer::Base.deliveries.last || raise("No email has been sent!")
8
+ mailer.deliveries.last || raise("No email has been sent!")
9
9
  end
10
10
 
11
11
  def reset_mailer
12
- ActionMailer::Base.deliveries.clear
12
+ mailer.deliveries.clear
13
13
  end
14
14
 
15
15
  def mailbox_for(address)
16
- ActionMailer::Base.deliveries.select { |m| m.to.include?(address) || (m.bcc && m.bcc.include?(address)) || (m.cc && m.cc.include?(address)) }
16
+ mailer.deliveries.select { |m| m.to.include?(address) || (m.bcc && m.bcc.include?(address)) || (m.cc && m.cc.include?(address)) }
17
17
  end
18
18
  end
19
19
 
@@ -43,12 +43,29 @@ module EmailSpec
43
43
  end
44
44
  end
45
45
 
46
+ if defined?(Pony)
47
+ module ::Pony
48
+ def self.deliveries
49
+ @deliveries ||= []
50
+ end
51
+
52
+ def self.mail(options)
53
+ deliveries << build_tmail(options)
54
+ end
55
+ end
56
+ end
57
+
46
58
  module Deliveries
47
- if ActionMailer::Base.delivery_method == :activerecord
59
+ if defined?(Pony)
60
+ def mailer; Pony; end
61
+ include EmailSpec::MailerDeliveries
62
+ elsif ActionMailer::Base.delivery_method == :activerecord
48
63
  include EmailSpec::ARMailerDeliveries
49
64
  else
50
- include EmailSpec::TestDeliveries
65
+ def mailer; ActionMailer::Base; end
66
+ include EmailSpec::MailerDeliveries
51
67
  end
68
+ include EmailSpec::BackgroundProcesses::Compatibility
52
69
  end
53
70
  end
54
71
 
@@ -23,7 +23,7 @@ module EmailSpec
23
23
  end
24
24
 
25
25
  def failure_message
26
- "expected #{@email.inspect} to deliver to #{@expected_email_addresses.inspect}, but it delievered to #{@actual_recipients.inspect}"
26
+ "expected #{@email.inspect} to deliver to #{@expected_email_addresses.inspect}, but it delivered to #{@actual_recipients.inspect}"
27
27
  end
28
28
 
29
29
  def negative_failure_message
@@ -37,6 +37,37 @@ module EmailSpec
37
37
 
38
38
  alias :be_delivered_to :deliver_to
39
39
 
40
+ class DeliverFrom
41
+
42
+ def initialize(email)
43
+ @expected_email_addresses = email
44
+ end
45
+
46
+ def description
47
+ "be delivered from #{@expected_email_addresses.inspect}"
48
+ end
49
+
50
+ def matches?(email)
51
+ @email = email
52
+ @actual_sender = (email.from || []).first
53
+ @actual_sender.eql? @expected_email_addresses
54
+ end
55
+
56
+ def failure_message
57
+ "expected #{@email.inspect} to deliver from #{@expected_email_addresses.inspect}, but it delivered from #{@actual_sender.inspect}"
58
+ end
59
+
60
+ def negative_failure_message
61
+ "expected #{@email.inspect} not to deliver from #{@expected_email_addresses.inspect}, but it did"
62
+ end
63
+ end
64
+
65
+ def deliver_from(email)
66
+ DeliverFrom.new(email)
67
+ end
68
+
69
+ alias :be_delivered_from :deliver_from
70
+
40
71
  class BccTo
41
72
 
42
73
  def initialize(expected_email_addresses_or_objects_that_respond_to_email)
@@ -58,7 +58,7 @@ end
58
58
 
59
59
  # DEPRECATED
60
60
  # The following methods are left in for backwards compatibility and
61
- # should be removed by version 0.3.5.
61
+ # should be removed by version 0.4.0
62
62
  Then /^(?:I|they|"([^"]*?)") should not receive an email$/ do |address|
63
63
  email_spec_deprecate "The step 'I/they/[email] should not receive an email' is no longer supported.
64
64
  Please use 'I/they/[email] should receive no emails' instead."
@@ -96,7 +96,7 @@ end
96
96
 
97
97
  # DEPRECATED
98
98
  # The following methods are left in for backwards compatibility and
99
- # should be removed by version 0.3.5.
99
+ # should be removed by version 0.4.0.
100
100
  Then /^(?:I|they) should see "([^"]*?)" in the subject$/ do |text|
101
101
  email_spec_deprecate "The step 'I/they should see [text] in the subject' is no longer supported.
102
102
  Please use 'I/they should see [text] in the email subject' instead."
@@ -45,7 +45,6 @@ describe EmailSpec::Matchers do
45
45
  end
46
46
 
47
47
  describe "#deliver_to" do
48
-
49
48
  it "should match when the email is set to deliver to the specidied address" do
50
49
  email = mock_email(:to => "jimmy_bean@yahoo.com")
51
50
 
@@ -72,6 +71,31 @@ describe EmailSpec::Matchers do
72
71
  deliver_to(user).should match(email)
73
72
  end
74
73
 
74
+ it "should give correct failure message when the email is not set to deliver to the specified address" do
75
+ matcher = deliver_to("jimmy_bean@yahoo.com")
76
+ matcher.matches?(mock_email(:inspect => 'email', :to => 'freddy_noe@yahoo.com'))
77
+ matcher.failure_message.should == %{expected email to deliver to ["jimmy_bean@yahoo.com"], but it delivered to ["freddy_noe@yahoo.com"]}
78
+ end
79
+
80
+ end
81
+
82
+ describe "#deliver_from" do
83
+ it "should match when the email is set to deliver from the specidied address" do
84
+ email = mock_email(:from => ["jimmy_bean@yahoo.com"])
85
+ deliver_from("jimmy_bean@yahoo.com").should match(email)
86
+ end
87
+
88
+ it "should not match when the email is not set to deliver from the specified address" do
89
+ email = mock_email(:from => nil)
90
+ deliver_from("jimmy_bean@yahoo.com").should_not match(email)
91
+ end
92
+
93
+ it "should give correct failure message when the email is not set to deliver from the specified address" do
94
+ matcher = deliver_from("jimmy_bean@yahoo.com")
95
+ matcher.matches?(mock_email(:inspect => 'email', :from => ['freddy_noe@yahoo.com']))
96
+ matcher.failure_message.should == %{expected email to deliver from "jimmy_bean@yahoo.com", but it delivered from "freddy_noe@yahoo.com"}
97
+ end
98
+
75
99
  end
76
100
 
77
101
  describe "#bcc_to" do
@@ -182,7 +206,7 @@ describe EmailSpec::Matchers do
182
206
  describe "#have_body_text" do
183
207
  it "should have specs!"
184
208
  end
185
-
209
+
186
210
  describe "#have_header" do
187
211
  it "should have specs!"
188
212
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: email_spec
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.3.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Mabey
@@ -11,7 +11,7 @@ autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
13
 
14
- date: 2009-08-19 00:00:00 -06:00
14
+ date: 2009-10-08 00:00:00 -06:00
15
15
  default_executable:
16
16
  dependencies: []
17
17
 
@@ -33,6 +33,7 @@ files:
33
33
  - lib/email-spec.rb
34
34
  - lib/email_spec.rb
35
35
  - lib/email_spec/address_converter.rb
36
+ - lib/email_spec/background_processes.rb
36
37
  - lib/email_spec/cucumber.rb
37
38
  - lib/email_spec/deliveries.rb
38
39
  - lib/email_spec/email_viewer.rb
@@ -78,9 +79,11 @@ test_files:
78
79
  - examples/rails_root/app/helpers/welcome_helper.rb
79
80
  - examples/rails_root/app/models/user.rb
80
81
  - examples/rails_root/app/models/user_mailer.rb
82
+ - examples/rails_root/app/views/user_mailer/newsletter.erb
81
83
  - examples/rails_root/app/views/user_mailer/signup.erb
82
84
  - examples/rails_root/app/views/welcome/confirm.html.erb
83
85
  - examples/rails_root/app/views/welcome/index.html.erb
86
+ - examples/rails_root/app/views/welcome/newsletter.html.erb
84
87
  - examples/rails_root/app/views/welcome/signup.html.erb
85
88
  - examples/rails_root/config/boot.rb
86
89
  - examples/rails_root/config/database.yml
@@ -93,11 +96,12 @@ test_files:
93
96
  - examples/rails_root/config/initializers/new_rails_defaults.rb
94
97
  - examples/rails_root/config/routes.rb
95
98
  - examples/rails_root/db/migrate/20090125013728_create_users.rb
99
+ - examples/rails_root/db/migrate/20090908054656_create_delayed_jobs.rb
96
100
  - examples/rails_root/db/schema.rb
97
101
  - examples/rails_root/doc/README_FOR_APP
102
+ - examples/rails_root/features/delayed_job.feature
98
103
  - examples/rails_root/features/errors.feature
99
104
  - examples/rails_root/features/example.feature
100
- - examples/rails_root/features/step_definitions/email_steps.rb
101
105
  - examples/rails_root/features/step_definitions/user_steps.rb
102
106
  - examples/rails_root/features/step_definitions/webrat_steps.rb
103
107
  - examples/rails_root/features/support/env.rb
@@ -120,6 +124,7 @@ test_files:
120
124
  - examples/rails_root/script/console
121
125
  - examples/rails_root/script/cucumber
122
126
  - examples/rails_root/script/dbconsole
127
+ - examples/rails_root/script/delayed_job
123
128
  - examples/rails_root/script/destroy
124
129
  - examples/rails_root/script/generate
125
130
  - examples/rails_root/script/performance/benchmarker
@@ -140,7 +145,11 @@ test_files:
140
145
  - examples/rails_root/spec/rcov.opts
141
146
  - examples/rails_root/spec/spec.opts
142
147
  - examples/rails_root/spec/spec_helper.rb
143
- - examples/rails_root/stories/all.rb
144
- - examples/rails_root/stories/helper.rb
145
- - examples/rails_root/vendor/plugins/email_spec/rails_generators/email_spec/email_spec_generator.rb
146
- - examples/rails_root/vendor/plugins/email_spec/rails_generators/email_spec/templates/email_steps.rb
148
+ - examples/sinatra/app.rb
149
+ - examples/sinatra/features/errors.feature
150
+ - examples/sinatra/features/example.feature
151
+ - examples/sinatra/features/step_definitions/email_steps.rb
152
+ - examples/sinatra/features/step_definitions/user_steps.rb
153
+ - examples/sinatra/features/step_definitions/webrat_steps.rb
154
+ - examples/sinatra/features/support/env.rb
155
+ - examples/sinatra/features/support/paths.rb
@@ -1,4 +0,0 @@
1
- dir = File.dirname(__FILE__)
2
- Dir[File.expand_path("#{dir}/**/*.rb")].uniq.each do |file|
3
- require file
4
- end
@@ -1,3 +0,0 @@
1
- ENV["RAILS_ENV"] = "test"
2
- require File.expand_path(File.dirname(__FILE__) + "/../config/environment")
3
- require 'spec/rails/story_adapter'
@@ -1,17 +0,0 @@
1
- # This generator adds email steps to the step definitions directory
2
- generator_base = defined?(Rails) ? Rails::Generator::Base : RubiGen::Base
3
- class EmailSpecGenerator < generator_base
4
- def manifest
5
- record do |m|
6
- m.directory 'features/step_definitions'
7
- m.file 'email_steps.rb', 'features/step_definitions/email_steps.rb'
8
- end
9
- end
10
-
11
- protected
12
-
13
- def banner
14
- "Usage: #{$0} email_spec"
15
- end
16
-
17
- end
@@ -1,122 +0,0 @@
1
- # Commonly used email steps
2
- #
3
- # To add your own steps make a custom_email_steps.rb
4
- # The provided methods are:
5
- #
6
- # last_email_address
7
- # reset_mailer
8
- # open_last_email
9
- # visit_in_email
10
- # unread_emails_for
11
- # mailbox_for
12
- # current_email
13
- # open_email
14
- # read_emails_for
15
- # find_email
16
- #
17
- # General form for email scenarios are:
18
- # - clear the email queue (done automatically by email_spec)
19
- # - execute steps that sends an email
20
- # - check the user received an/no/[0-9] emails
21
- # - open the email
22
- # - inspect the email contents
23
- # - interact with the email (e.g. click links)
24
- #
25
- # The Cucumber steps below are setup in this order.
26
-
27
- module EmailHelpers
28
- def current_email_address
29
- # Replace with your a way to find your current email. e.g @current_user.email
30
- # last_email_address will return the last email address used by email spec to find an email.
31
- # Note that last_email_address will be reset after each Scenario.
32
- last_email_address || "example@example.com"
33
- end
34
- end
35
-
36
- World(EmailHelpers)
37
-
38
- #
39
- # Reset the e-mail queue within a scenario.
40
- # This is done automatically before each scenario.
41
- #
42
-
43
- Given /^(?:a clear email queue|no emails have been sent)$/ do
44
- reset_mailer
45
- end
46
-
47
- #
48
- # Check how many emails have been sent/received
49
- #
50
-
51
- Then /^(?:I|they|"([^"]*?)") should receive (an|no|\d+) emails?$/ do |address, amount|
52
- unread_emails_for(address).size.should == parse_email_count(amount)
53
- end
54
-
55
- Then /^(?:I|they|"([^"]*?)") should have (an|no|\d+) emails?$/ do |address, amount|
56
- mailbox_for(address).size.should == parse_email_count(amount)
57
- end
58
-
59
- # DEPRECATED
60
- # The following methods are left in for backwards compatibility and
61
- # should be removed by version 0.3.5.
62
- Then /^(?:I|they|"([^"]*?)") should not receive an email$/ do |address|
63
- email_spec_deprecate "The step 'I/they/[email] should not receive an email' is no longer supported.
64
- Please use 'I/they/[email] should receive no emails' instead."
65
- unread_emails_for(address).size.should == 0
66
- end
67
-
68
- #
69
- # Accessing emails
70
- #
71
-
72
- # Opens the most recently received email
73
- When /^(?:I|they|"([^"]*?)") opens? the email$/ do |address|
74
- open_email(address)
75
- end
76
-
77
- When /^(?:I|they|"([^"]*?)") opens? the email with subject "([^"]*?)"$/ do |address, subject|
78
- open_email(address, :with_subject => subject)
79
- end
80
-
81
- When /^(?:I|they|"([^"]*?)") opens? the email with text "([^"]*?)"$/ do |address, text|
82
- open_email(address, :with_text => text)
83
- end
84
-
85
- #
86
- # Inspect the Email Contents
87
- #
88
-
89
- Then /^(?:I|they) should see "([^"]*?)" in the email subject$/ do |text|
90
- current_email.should have_subject(Regexp.new(text))
91
- end
92
-
93
- Then /^(?:I|they) should see "([^"]*?)" in the email body$/ do |text|
94
- current_email.body.should =~ Regexp.new(text)
95
- end
96
-
97
- # DEPRECATED
98
- # The following methods are left in for backwards compatibility and
99
- # should be removed by version 0.3.5.
100
- Then /^(?:I|they) should see "([^"]*?)" in the subject$/ do |text|
101
- email_spec_deprecate "The step 'I/they should see [text] in the subject' is no longer supported.
102
- Please use 'I/they should see [text] in the email subject' instead."
103
- current_email.should have_subject(Regexp.new(text))
104
- end
105
- Then /^(?:I|they) should see "([^"]*?)" in the email$/ do |text|
106
- email_spec_deprecate "The step 'I/they should see [text] in the email' is no longer supported.
107
- Please use 'I/they should see [text] in the email body' instead."
108
- current_email.body.should =~ Regexp.new(text)
109
- end
110
-
111
- #
112
- # Interact with Email Contents
113
- #
114
-
115
- When /^(?:I|they) follow "([^"]*?)" in the email$/ do |link|
116
- visit_in_email(link)
117
- end
118
-
119
- When /^(?:I|they) click the first link in the email$/ do
120
- click_first_link_in_email
121
- end
122
-