email_spec 1.6.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (118) hide show
  1. checksums.yaml +7 -0
  2. data/History.txt +18 -0
  3. data/README.md +30 -28
  4. data/examples/rails4_root/Gemfile +19 -0
  5. data/examples/rails4_root/Gemfile.lock +180 -0
  6. data/examples/rails4_root/README +5 -0
  7. data/examples/rails4_root/Rakefile +11 -0
  8. data/examples/rails4_root/app/controllers/application_controller.rb +3 -0
  9. data/examples/rails4_root/app/controllers/welcome_controller.rb +18 -0
  10. data/examples/rails4_root/app/helpers/application_helper.rb +2 -0
  11. data/examples/rails4_root/app/mailers/user_mailer.rb +39 -0
  12. data/examples/rails4_root/app/models/user.rb +2 -0
  13. data/examples/rails4_root/app/views/user_mailer/email_with_attachment.html.erb +6 -0
  14. data/examples/rails4_root/app/views/user_mailer/newsletter.html.erb +8 -0
  15. data/examples/rails4_root/app/views/user_mailer/signup.html.erb +4 -0
  16. data/examples/rails4_root/app/views/user_mailer/signup.text.erb +4 -0
  17. data/examples/rails4_root/app/views/welcome/attachments.html.erb +0 -0
  18. data/examples/rails4_root/app/views/welcome/confirm.html.erb +1 -0
  19. data/examples/rails4_root/app/views/welcome/index.html.erb +8 -0
  20. data/examples/rails4_root/app/views/welcome/newsletter.html.erb +0 -0
  21. data/examples/rails4_root/app/views/welcome/signup.html.erb +1 -0
  22. data/examples/rails4_root/attachments/document.pdf +0 -0
  23. data/examples/rails4_root/attachments/image.png +0 -0
  24. data/examples/rails4_root/config.ru +4 -0
  25. data/examples/rails4_root/config/application.rb +45 -0
  26. data/examples/rails4_root/config/boot.rb +14 -0
  27. data/examples/rails4_root/config/cucumber.yml +8 -0
  28. data/examples/rails4_root/config/database.yml +25 -0
  29. data/examples/rails4_root/config/environment.rb +6 -0
  30. data/examples/rails4_root/config/environments/development.rb +19 -0
  31. data/examples/rails4_root/config/environments/production.rb +42 -0
  32. data/examples/rails4_root/config/environments/test.rb +32 -0
  33. data/examples/rails4_root/config/initializers/backtrace_silencers.rb +7 -0
  34. data/examples/rails4_root/config/initializers/cookie_verification_secret.rb +7 -0
  35. data/examples/rails4_root/config/initializers/delayed_job.rb +1 -0
  36. data/examples/rails4_root/config/initializers/inflections.rb +10 -0
  37. data/examples/rails4_root/config/initializers/mime_types.rb +5 -0
  38. data/examples/rails4_root/config/initializers/notifier_job.rb +1 -0
  39. data/examples/rails4_root/config/initializers/rspec_generator.rb +6 -0
  40. data/examples/rails4_root/config/initializers/session_store.rb +10 -0
  41. data/examples/rails4_root/config/locales/en.yml +5 -0
  42. data/examples/rails4_root/config/routes.rb +7 -0
  43. data/examples/rails4_root/config/secrets.yml +22 -0
  44. data/examples/rails4_root/db/migrate/20090125013728_create_users.rb +11 -0
  45. data/examples/rails4_root/db/migrate/20090908054656_create_delayed_jobs.rb +20 -0
  46. data/examples/rails4_root/db/migrate/20141119224309_add_queue_to_delayed_jobs.rb +9 -0
  47. data/examples/rails4_root/db/schema.rb +35 -0
  48. data/examples/rails4_root/db/seeds.rb +7 -0
  49. data/examples/rails4_root/db/test.sqlite3 +0 -0
  50. data/examples/rails4_root/doc/README_FOR_APP +2 -0
  51. data/examples/rails4_root/features/attachments.feature +27 -0
  52. data/examples/rails4_root/features/delayed_job.feature +13 -0
  53. data/examples/rails4_root/features/errors.feature +40 -0
  54. data/examples/rails4_root/features/example.feature +93 -0
  55. data/examples/rails4_root/features/step_definitions/email_steps.rb +210 -0
  56. data/examples/rails4_root/features/step_definitions/user_steps.rb +26 -0
  57. data/examples/rails4_root/features/step_definitions/web_steps.rb +219 -0
  58. data/examples/rails4_root/features/support/env.rb +59 -0
  59. data/examples/rails4_root/features/support/env_ext.rb +4 -0
  60. data/examples/rails4_root/features/support/paths.rb +33 -0
  61. data/examples/rails4_root/lib/notifier_job.rb +5 -0
  62. data/examples/rails4_root/lib/tasks/cucumber.rake +65 -0
  63. data/examples/rails4_root/lib/tasks/rspec.rake +69 -0
  64. data/examples/rails4_root/log/development.log +0 -0
  65. data/examples/rails4_root/log/test.log +43813 -0
  66. data/examples/rails4_root/public/404.html +26 -0
  67. data/examples/rails4_root/public/422.html +26 -0
  68. data/examples/rails4_root/public/500.html +26 -0
  69. data/examples/rails4_root/public/favicon.ico +0 -0
  70. data/examples/rails4_root/public/images/rails.png +0 -0
  71. data/examples/rails4_root/public/javascripts/application.js +2 -0
  72. data/examples/rails4_root/public/javascripts/controls.js +965 -0
  73. data/examples/rails4_root/public/javascripts/dragdrop.js +974 -0
  74. data/examples/rails4_root/public/javascripts/effects.js +1123 -0
  75. data/examples/rails4_root/public/javascripts/prototype.js +4874 -0
  76. data/examples/rails4_root/public/javascripts/rails.js +109 -0
  77. data/examples/rails4_root/public/robots.txt +5 -0
  78. data/examples/rails4_root/script/cucumber +10 -0
  79. data/examples/rails4_root/script/delayed_job +5 -0
  80. data/examples/rails4_root/script/rails +9 -0
  81. data/examples/rails4_root/spec/controllers/welcome_controller_spec.rb +20 -0
  82. data/examples/rails4_root/spec/models/user_mailer_spec.rb +47 -0
  83. data/examples/rails4_root/spec/spec_helper.rb +20 -0
  84. data/examples/rails4_root/test/mailers/user_mailer_classic_test.rb +27 -0
  85. data/examples/rails4_root/test/mailers/user_mailer_spec_test.rb +29 -0
  86. data/examples/rails4_root/test/test_helper.rb +10 -0
  87. data/{rails_generators → examples/rails4_root/vendor/plugins/email_spec/rails_generators}/email_spec/email_spec_generator.rb +0 -0
  88. data/{rails_generators → examples/rails4_root/vendor/plugins/email_spec/rails_generators}/email_spec/templates/email_steps.rb +22 -18
  89. data/examples/sinatra_root/Gemfile +15 -0
  90. data/examples/sinatra_root/Gemfile.lock +95 -0
  91. data/examples/sinatra_root/config.ru +4 -0
  92. data/examples/sinatra_root/features/errors.feature +40 -0
  93. data/examples/sinatra_root/features/example.feature +93 -0
  94. data/examples/sinatra_root/features/step_definitions/email_steps.rb +210 -0
  95. data/examples/sinatra_root/features/step_definitions/user_steps.rb +26 -0
  96. data/examples/sinatra_root/features/step_definitions/web_steps.rb +219 -0
  97. data/examples/sinatra_root/features/support/env.rb +21 -0
  98. data/examples/sinatra_root/features/support/paths.rb +29 -0
  99. data/examples/sinatra_root/lib/example_sinatra_app.rb +45 -0
  100. data/features/rails4_app.feature +32 -0
  101. data/features/sinatra_app.feature +14 -0
  102. data/features/step_definitions/app_steps.rb +58 -0
  103. data/features/support/env.rb +16 -0
  104. data/lib/email_spec.rb +1 -1
  105. data/lib/email_spec/deliveries.rb +0 -1
  106. data/lib/email_spec/email_viewer.rb +1 -1
  107. data/lib/email_spec/helpers.rb +16 -5
  108. data/lib/email_spec/matchers.rb +2 -1
  109. data/lib/email_spec/version.rb +3 -0
  110. data/lib/generators/email_spec/steps/templates/email_steps.rb +24 -20
  111. data/spec/email_spec/email_viewer_spec.rb +20 -0
  112. data/spec/email_spec/helpers_spec.rb +316 -0
  113. data/spec/email_spec/mail_ext_spec.rb +34 -0
  114. data/spec/email_spec/matchers_spec.rb +513 -0
  115. data/spec/spec_helper.rb +24 -0
  116. metadata +161 -150
  117. data/lib/email_spec/background_processes.rb +0 -45
  118. data/lib/generators/email_spec/steps/USAGE +0 -5
@@ -0,0 +1,9 @@
1
+ class AddQueueToDelayedJobs < ActiveRecord::Migration
2
+ def self.up
3
+ add_column :delayed_jobs, :queue, :string
4
+ end
5
+
6
+ def self.down
7
+ remove_column :delayed_jobs, :queue
8
+ end
9
+ end
@@ -0,0 +1,35 @@
1
+ # encoding: UTF-8
2
+ # This file is auto-generated from the current state of the database. Instead
3
+ # of editing this file, please use the migrations feature of Active Record to
4
+ # incrementally modify your database, and then regenerate this schema definition.
5
+ #
6
+ # Note that this schema.rb definition is the authoritative source for your
7
+ # database schema. If you need to create the application database on another
8
+ # system, you should be using db:schema:load, not running all the migrations
9
+ # from scratch. The latter is a flawed and unsustainable approach (the more migrations
10
+ # you'll amass, the slower it'll run and the greater likelihood for issues).
11
+ #
12
+ # It's strongly recommended that you check this file into your version control system.
13
+
14
+ ActiveRecord::Schema.define(version: 20141119224309) do
15
+
16
+ create_table "delayed_jobs", force: :cascade do |t|
17
+ t.integer "priority", default: 0
18
+ t.integer "attempts", default: 0
19
+ t.text "handler"
20
+ t.text "last_error"
21
+ t.datetime "run_at"
22
+ t.datetime "locked_at"
23
+ t.datetime "failed_at"
24
+ t.string "locked_by"
25
+ t.datetime "created_at"
26
+ t.datetime "updated_at"
27
+ t.string "queue"
28
+ end
29
+
30
+ create_table "users", force: :cascade do |t|
31
+ t.string "email"
32
+ t.string "name"
33
+ end
34
+
35
+ end
@@ -0,0 +1,7 @@
1
+ # This file should contain all the record creation needed to seed the database with its default values.
2
+ # The data can then be loaded with the rake db:seed (or created alongside the db with db:setup).
3
+ #
4
+ # Examples:
5
+ #
6
+ # cities = City.create([{ :name => 'Chicago' }, { :name => 'Copenhagen' }])
7
+ # Mayor.create(:name => 'Daley', :city => cities.first)
@@ -0,0 +1,2 @@
1
+ Use this README file to introduce your application and point to useful places in the API for learning more.
2
+ Run "rake doc:app" to generate API documentation for your models, controllers, helpers, and libraries.
@@ -0,0 +1,27 @@
1
+ Feature: Attachment testing support
2
+ In order for developers to test attachments in emails
3
+ I want to be able to provide working steps which inspect attachments
4
+
5
+ Scenario: Email with Attachments
6
+ Given no emails have been sent
7
+ And I go to request attachments be sent to me
8
+ Then I should receive an email
9
+ When I open the email
10
+ Then I should see 2 attachments with the email
11
+ And there should be an attachment named "image.png"
12
+ And there should be an attachment named "document.pdf"
13
+ And attachment 1 should be named "image.png"
14
+ And attachment 2 should be named "document.pdf"
15
+ And there should be an attachment of type "image/png"
16
+ And there should be an attachment of type "application/pdf"
17
+ And attachment 1 should be of type "image/png"
18
+ And attachment 2 should be of type "application/pdf"
19
+ And all attachments should not be blank
20
+
21
+ Scenario: Email without Attachments
22
+ Given no emails have been sent
23
+ And I am on the homepage
24
+ And I submit my registration information
25
+ Then I should receive an email
26
+ When I open the email
27
+ Then I should see no attachments with the 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
@@ -0,0 +1,40 @@
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 subject
18
+ Then I should receive an email
19
+ When "example@example.com" opens the email with subject /no email/
20
+
21
+ Scenario: I fail to open an email with incorrect text
22
+ Then I should receive an email
23
+ When "example@example.com" opens the email with text "no email"
24
+
25
+ Scenario: I fail to open an email with incorrect text
26
+ Then I should receive an email
27
+ When "example@example.com" opens the email with text /no email/
28
+
29
+ Scenario: I fail to receive an email with the expected link
30
+ Then I should receive an email
31
+ When I open the email
32
+ When I follow "link that doesn't exist" in the email
33
+
34
+ Scenario: I attempt to operate on an email that is not opened
35
+ Then I should receive an email
36
+ When I follow "confirm" in the email
37
+
38
+ Scenario: I attempt to check out an unopened email
39
+ Then I should see "confirm" in the email body
40
+ And I should see "Account confirmation" in the email subject
@@ -0,0 +1,93 @@
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 three 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
+ # Opening email #3
34
+ When I open the email with subject /Account confirmation/
35
+ Then I should see "Account confirmation" in the email subject
36
+ And I should see "Joe Someone" in the email body
37
+ And I should see "confirm" in the email body
38
+
39
+ When I follow "Click here to confirm your account!" in the email
40
+ Then I should see "Confirm your new account"
41
+
42
+ And "foo@bar.com" should have no emails
43
+
44
+ Scenario: Third person signup (emails sent to others) with three ways of opening email
45
+ Then "foo@bar.com" should have no emails
46
+ And "example@example.com" should receive an email
47
+ And "example@example.com" should have 1 email
48
+
49
+ # Opening email #1
50
+ When they open the email
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
+ # Opening email #2
56
+ When "example@example.com" opens the email with subject "Account confirmation"
57
+ Then they should see "Account confirmation" in the email subject
58
+ And they should see "Joe Someone" in the email body
59
+ And they should see "confirm" in the email body
60
+
61
+ # Opening email #3
62
+ When "example@example.com" opens the email with subject /Account confirmation/
63
+ Then they should see "Account confirmation" in the email subject
64
+ And they should see "Joe Someone" in the email body
65
+ And they should see "confirm" in the email body
66
+
67
+ When they follow "Click here to confirm your account!" in the email
68
+ Then they should see "Confirm your new account"
69
+
70
+ Scenario: Declarative First Person signup
71
+ Then I should receive an email with a link to a confirmation page
72
+
73
+ Scenario: Declarative First Person signup
74
+ Then they should receive an email with a link to a confirmation page
75
+
76
+ Scenario: Checking for text in different parts
77
+ Then I should receive an email
78
+ And I should have 1 email
79
+
80
+ # Opening email #1
81
+ When I open the email
82
+ Then I should see "This is the HTML part" in the email html part body
83
+ And I should see "This is the text part" in the email text part body
84
+
85
+ # Opening email #2
86
+ When I open the email with text "This is the HTML part"
87
+ Then I should see "This is the HTML part" in the email html part body
88
+ And I should see "This is the text part" in the email text part body
89
+
90
+ # Opening email #3
91
+ When I open the email with text /This is the HTML part/
92
+ Then I should see "This is the HTML part" in the email html part body
93
+ And I should see "This is the text part" in the email text part body
@@ -0,0 +1,210 @@
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
+ expect(unread_emails_for(address).size).to eql parse_email_count(amount)
53
+ end
54
+
55
+ Then /^(?:I|they|"([^"]*?)") should have (an|no|\d+) emails?$/ do |address, amount|
56
+ expect(mailbox_for(address).size).to eql parse_email_count(amount)
57
+ end
58
+
59
+ Then /^(?:I|they|"([^"]*?)") should receive (an|no|\d+) emails? with subject "([^"]*?)"$/ do |address, amount, subject|
60
+ expect(unread_emails_for(address).select { |m| m.subject =~ Regexp.new(Regexp.escape(subject)) }.size).to eql parse_email_count(amount)
61
+ end
62
+
63
+ Then /^(?:I|they|"([^"]*?)") should receive (an|no|\d+) emails? with subject \/([^"]*?)\/$/ do |address, amount, subject|
64
+ expect(unread_emails_for(address).select { |m| m.subject =~ Regexp.new(subject) }.size).to eql parse_email_count(amount)
65
+ end
66
+
67
+ Then /^(?:I|they|"([^"]*?)") should receive an email with the following body:$/ do |address, expected_body|
68
+ open_email(address, :with_text => expected_body)
69
+ end
70
+
71
+ #
72
+ # Accessing emails
73
+ #
74
+
75
+ # Opens the most recently received email
76
+ When /^(?:I|they|"([^"]*?)") opens? the email$/ do |address|
77
+ open_email(address)
78
+ end
79
+
80
+ When /^(?:I|they|"([^"]*?)") opens? the email with subject "([^"]*?)"$/ do |address, subject|
81
+ open_email(address, :with_subject => subject)
82
+ end
83
+
84
+ When /^(?:I|they|"([^"]*?)") opens? the email with subject \/([^"]*?)\/$/ do |address, subject|
85
+ open_email(address, :with_subject => Regexp.new(subject))
86
+ end
87
+
88
+ When /^(?:I|they|"([^"]*?)") opens? the email with text "([^"]*?)"$/ do |address, text|
89
+ open_email(address, :with_text => text)
90
+ end
91
+
92
+ When /^(?:I|they|"([^"]*?)") opens? the email with text \/([^"]*?)\/$/ do |address, text|
93
+ open_email(address, :with_text => Regexp.new(text))
94
+ end
95
+
96
+ #
97
+ # Inspect the Email Contents
98
+ #
99
+
100
+ Then /^(?:I|they) should see "([^"]*?)" in the email subject$/ do |text|
101
+ expect(current_email).to have_subject(text)
102
+ end
103
+
104
+ Then /^(?:I|they) should see \/([^"]*?)\/ in the email subject$/ do |text|
105
+ expect(current_email).to have_subject(Regexp.new(text))
106
+ end
107
+
108
+ Then /^(?:I|they) should see "([^"]*?)" in the email body$/ do |text|
109
+ expect(current_email.default_part_body.to_s).to include(text)
110
+ end
111
+
112
+ Then /^(?:I|they) should see \/([^"]*?)\/ in the email body$/ do |text|
113
+ expect(current_email.default_part_body.to_s).to match Regexp.new(text)
114
+ end
115
+
116
+ Then /^(?:I|they) should see the email delivered from "([^"]*?)"$/ do |text|
117
+ expect(current_email).to be_delivered_from(text)
118
+ end
119
+
120
+ Then /^(?:I|they) should see the email reply to "([^"]*?)"$/ do |text|
121
+ current_email.should have_reply_to(text)
122
+ end
123
+
124
+ Then /^(?:I|they) should see "([^\"]*)" in the email "([^"]*?)" header$/ do |text, name|
125
+ expect(current_email).to have_header(name, text)
126
+ end
127
+
128
+ Then /^(?:I|they) should see \/([^\"]*)\/ in the email "([^"]*?)" header$/ do |text, name|
129
+ expect(current_email).to have_header(name, Regexp.new(text))
130
+ end
131
+
132
+ Then /^I should see it is a multi\-part email$/ do
133
+ expect(current_email).to be_multipart
134
+ end
135
+
136
+ Then /^(?:I|they) should see "([^"]*?)" in the email html part body$/ do |text|
137
+ expect(current_email.html_part.body.to_s).to include(text)
138
+ end
139
+
140
+ Then /^(?:I|they) should see "([^"]*?)" in the email text part body$/ do |text|
141
+ expect(current_email.text_part.body.to_s).to include(text)
142
+ end
143
+
144
+ #
145
+ # Inspect the Email Attachments
146
+ #
147
+
148
+ Then /^(?:I|they) should see (an|no|\d+) attachments? with the email$/ do |amount|
149
+ expect(current_email_attachments.size).to eql parse_email_count(amount)
150
+ end
151
+
152
+ Then /^there should be (an|no|\d+) attachments? named "([^"]*?)"$/ do |amount, filename|
153
+ expect(current_email_attachments.select { |a| a.filename == filename }.size).to eql parse_email_count(amount)
154
+ end
155
+
156
+ Then /^attachment (\d+) should be named "([^"]*?)"$/ do |index, filename|
157
+ expect(current_email_attachments[(index.to_i - 1)].filename).to eql filename
158
+ end
159
+
160
+ Then /^there should be (an|no|\d+) attachments? of type "([^"]*?)"$/ do |amount, content_type|
161
+ expect(current_email_attachments.select { |a| a.content_type.include?(content_type) }.size).to eql parse_email_count(amount)
162
+ end
163
+
164
+ Then /^attachment (\d+) should be of type "([^"]*?)"$/ do |index, content_type|
165
+ expect(current_email_attachments[(index.to_i - 1)].content_type).to include(content_type)
166
+ end
167
+
168
+ Then /^all attachments should not be blank$/ do
169
+ current_email_attachments.each do |attachment|
170
+ expect(attachment.read.size).to_not eql 0
171
+ end
172
+ end
173
+
174
+ Then /^show me a list of email attachments$/ do
175
+ EmailSpec::EmailViewer::save_and_open_email_attachments_list(current_email)
176
+ end
177
+
178
+ #
179
+ # Interact with Email Contents
180
+ #
181
+
182
+ When /^(?:I|they|"([^"]*?)") follows? "([^"]*?)" in the email$/ do |address, link|
183
+ visit_in_email(link, address)
184
+ end
185
+
186
+ When /^(?:I|they) click the first link in the email$/ do
187
+ click_first_link_in_email
188
+ end
189
+
190
+ #
191
+ # Debugging
192
+ # These only work with Rails and OSx ATM since EmailViewer uses RAILS_ROOT and OSx's 'open' command.
193
+ # Patches accepted. ;)
194
+ #
195
+
196
+ Then /^save and open current email$/ do
197
+ EmailSpec::EmailViewer::save_and_open_email(current_email)
198
+ end
199
+
200
+ Then /^save and open all text emails$/ do
201
+ EmailSpec::EmailViewer::save_and_open_all_text_emails
202
+ end
203
+
204
+ Then /^save and open all html emails$/ do
205
+ EmailSpec::EmailViewer::save_and_open_all_html_emails
206
+ end
207
+
208
+ Then /^save and open all raw emails$/ do
209
+ EmailSpec::EmailViewer::save_and_open_all_raw_emails
210
+ end