hectoregm-email_spec 0.1.2

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 (89) hide show
  1. data/History.txt +65 -0
  2. data/MIT-LICENSE.txt +19 -0
  3. data/README.rdoc +126 -0
  4. data/Rakefile +51 -0
  5. data/examples/rails_root/app/controllers/application.rb +15 -0
  6. data/examples/rails_root/app/controllers/welcome_controller.rb +9 -0
  7. data/examples/rails_root/app/helpers/application_helper.rb +3 -0
  8. data/examples/rails_root/app/helpers/welcome_helper.rb +2 -0
  9. data/examples/rails_root/app/models/user.rb +2 -0
  10. data/examples/rails_root/app/models/user_mailer.rb +12 -0
  11. data/examples/rails_root/app/views/user_mailer/signup.erb +3 -0
  12. data/examples/rails_root/app/views/welcome/confirm.html.erb +1 -0
  13. data/examples/rails_root/app/views/welcome/index.html.erb +8 -0
  14. data/examples/rails_root/app/views/welcome/signup.html.erb +1 -0
  15. data/examples/rails_root/config/boot.rb +109 -0
  16. data/examples/rails_root/config/database.yml +22 -0
  17. data/examples/rails_root/config/environment.rb +22 -0
  18. data/examples/rails_root/config/environments/development.rb +17 -0
  19. data/examples/rails_root/config/environments/production.rb +24 -0
  20. data/examples/rails_root/config/environments/test.rb +33 -0
  21. data/examples/rails_root/config/initializers/inflections.rb +10 -0
  22. data/examples/rails_root/config/initializers/mime_types.rb +5 -0
  23. data/examples/rails_root/config/initializers/new_rails_defaults.rb +17 -0
  24. data/examples/rails_root/config/routes.rb +43 -0
  25. data/examples/rails_root/cucumber.yml +1 -0
  26. data/examples/rails_root/db/migrate/20090125013728_create_users.rb +11 -0
  27. data/examples/rails_root/db/schema.rb +19 -0
  28. data/examples/rails_root/doc/README_FOR_APP +5 -0
  29. data/examples/rails_root/features/errors.feature +42 -0
  30. data/examples/rails_root/features/example.feature +59 -0
  31. data/examples/rails_root/features/step_definitions/email_steps.rb +74 -0
  32. data/examples/rails_root/features/step_definitions/user_steps.rb +23 -0
  33. data/examples/rails_root/features/step_definitions/webrat_steps.rb +104 -0
  34. data/examples/rails_root/features/support/env.rb +21 -0
  35. data/examples/rails_root/public/404.html +30 -0
  36. data/examples/rails_root/public/422.html +30 -0
  37. data/examples/rails_root/public/500.html +33 -0
  38. data/examples/rails_root/public/dispatch.rb +10 -0
  39. data/examples/rails_root/public/favicon.ico +0 -0
  40. data/examples/rails_root/public/images/rails.png +0 -0
  41. data/examples/rails_root/public/javascripts/application.js +2 -0
  42. data/examples/rails_root/public/javascripts/controls.js +963 -0
  43. data/examples/rails_root/public/javascripts/dragdrop.js +973 -0
  44. data/examples/rails_root/public/javascripts/effects.js +1128 -0
  45. data/examples/rails_root/public/javascripts/prototype.js +4320 -0
  46. data/examples/rails_root/public/robots.txt +5 -0
  47. data/examples/rails_root/script/about +4 -0
  48. data/examples/rails_root/script/autospec +5 -0
  49. data/examples/rails_root/script/console +3 -0
  50. data/examples/rails_root/script/cucumber +7 -0
  51. data/examples/rails_root/script/dbconsole +3 -0
  52. data/examples/rails_root/script/destroy +3 -0
  53. data/examples/rails_root/script/generate +3 -0
  54. data/examples/rails_root/script/performance/benchmarker +3 -0
  55. data/examples/rails_root/script/performance/profiler +3 -0
  56. data/examples/rails_root/script/performance/request +3 -0
  57. data/examples/rails_root/script/plugin +3 -0
  58. data/examples/rails_root/script/process/inspector +3 -0
  59. data/examples/rails_root/script/process/reaper +3 -0
  60. data/examples/rails_root/script/process/spawner +3 -0
  61. data/examples/rails_root/script/runner +3 -0
  62. data/examples/rails_root/script/server +3 -0
  63. data/examples/rails_root/script/spec +5 -0
  64. data/examples/rails_root/script/spec_server +125 -0
  65. data/examples/rails_root/spec/controllers/welcome_controller_spec.rb +15 -0
  66. data/examples/rails_root/spec/model_factory.rb +6 -0
  67. data/examples/rails_root/spec/models/user_mailer_spec.rb +58 -0
  68. data/examples/rails_root/spec/models/user_spec.rb +5 -0
  69. data/examples/rails_root/spec/rcov.opts +2 -0
  70. data/examples/rails_root/spec/spec.opts +4 -0
  71. data/examples/rails_root/spec/spec_helper.rb +51 -0
  72. data/examples/rails_root/stories/all.rb +4 -0
  73. data/examples/rails_root/stories/helper.rb +3 -0
  74. data/examples/rails_root/vendor/plugins/email_spec/rails_generators/email_spec/email_spec_generator.rb +17 -0
  75. data/examples/rails_root/vendor/plugins/email_spec/rails_generators/email_spec/templates/email_steps.rb +74 -0
  76. data/install.rb +0 -0
  77. data/lib/email_spec/address_converter.rb +27 -0
  78. data/lib/email_spec/cucumber.rb +19 -0
  79. data/lib/email_spec/deliveries.rb +55 -0
  80. data/lib/email_spec/email_viewer.rb +70 -0
  81. data/lib/email_spec/helpers.rb +128 -0
  82. data/lib/email_spec/matchers.rb +122 -0
  83. data/lib/email_spec.rb +14 -0
  84. data/rails_generators/email_spec/email_spec_generator.rb +17 -0
  85. data/rails_generators/email_spec/templates/email_steps.rb +74 -0
  86. data/spec/email_spec/matchers_spec.rb +159 -0
  87. data/spec/spec.opts +4 -0
  88. data/spec/spec_helper.rb +4 -0
  89. metadata +187 -0
@@ -0,0 +1,19 @@
1
+ # This file is auto-generated from the current state of the database. Instead of editing this file,
2
+ # please use the migrations feature of Active Record to incrementally modify your database, and
3
+ # then regenerate this schema definition.
4
+ #
5
+ # Note that this schema.rb definition is the authoritative source for your database schema. If you need
6
+ # to create the application database on another system, you should be using db:schema:load, not running
7
+ # all the migrations from scratch. The latter is a flawed and unsustainable approach (the more migrations
8
+ # you'll amass, the slower it'll run and the greater likelihood for issues).
9
+ #
10
+ # It's strongly recommended to check this file into your version control system.
11
+
12
+ ActiveRecord::Schema.define(:version => 20090125013728) do
13
+
14
+ create_table "users", :force => true do |t|
15
+ t.string "email"
16
+ t.string "name"
17
+ end
18
+
19
+ end
@@ -0,0 +1,5 @@
1
+ To build the guides:
2
+
3
+ * Install source-highlighter (http://www.gnu.org/software/src-highlite/source-highlight.html)
4
+ * Install the mizuho gem (http://github.com/FooBarWidget/mizuho/tree/master)
5
+ * Run `rake guides` from the railties directory
@@ -0,0 +1,42 @@
1
+ Feature: Email-spec errors example
2
+
3
+ In order to help alleviate email testing in apps
4
+ As a email-spec contributor I a newcomer
5
+ Should be able to easily determine where I have gone wrong
6
+ These scenarios should fail with helpful messages
7
+
8
+ Scenario: I fail to receive an email
9
+ Given I am at "/"
10
+ And no emails have been sent
11
+ When I fill in "Email" with "quentin@example.com"
12
+ And I press "Sign up"
13
+ And I should receive an email
14
+ When "quentin@example.com" opens the email with subject "no email"
15
+
16
+ Scenario: I fail to receive an email with the expected link
17
+ Given I am at "/"
18
+ And no emails have been sent
19
+ When I fill in "Email" with "quentin@example.com"
20
+ And I press "Sign up"
21
+ And I should receive an email
22
+ When I open the email
23
+ When I follow "link that doesn't exist" in the email
24
+
25
+ Scenario: I attempt to operate on an email that is not opened
26
+ Given I am at "/"
27
+ And no emails have been sent
28
+ When I fill in "Email" with "quentin@example.com"
29
+ And I press "Sign up"
30
+ And I should receive an email
31
+ When I follow "confirm" in the email
32
+
33
+ Scenario: I attempt to check out an unopened email
34
+ Given I am at "/"
35
+ And no emails have been sent
36
+ When I fill in "Email" with "quentin@example.com"
37
+ And I press "Sign up"
38
+ Then I should see "confirm" in the email
39
+ And I should see "Account confirmation" in the subject
40
+
41
+
42
+
@@ -0,0 +1,59 @@
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
+ Scenario: A new person signs up imperatively
12
+ Given I am a real person wanting to sign up for an account
13
+ And I am at "/"
14
+
15
+ When I fill in "Email" with "quentin@example.com"
16
+ And I fill in "Name" with "Quentin Jones"
17
+ And I press "Sign up"
18
+
19
+ Then "quentin@example.com" should receive 1 email
20
+ And "quentin@example.com" should have 1 email
21
+ And "foo@bar.com" should not receive an email
22
+
23
+ When "quentin@example.com" opens the email with subject "Account confirmation"
24
+
25
+ Then I should see "confirm" in the email
26
+ And I should see "Quentin Jones" in the email
27
+ And I should see "Account confirmation" in the subject
28
+
29
+ When I follow "Click here to confirm your account!" in the email
30
+ Then I should see "Confirm your new account"
31
+
32
+
33
+ Scenario: slightly more declarative, but still mostly imperative
34
+ Given I am a real person wanting to sign up for an account
35
+ And I'm on the signup page
36
+
37
+ When I fill in "Email" with "quentin@example.com"
38
+ And I fill in "Name" with "Quentin Jones"
39
+ And I press "Sign up"
40
+
41
+ Then I should receive an email
42
+
43
+ When I open the email
44
+ Then I should see "Account confirmation" in the subject
45
+
46
+ When I follow "http:///confirm" in the email
47
+ Then I should see "Confirm your new account"
48
+
49
+
50
+ Scenario: declarative
51
+ Given I am a real person wanting to sign up for an account
52
+ And I'm on the signup page
53
+
54
+ When I submit my registration information
55
+ Then I should receive an email with a link to a confirmation page
56
+
57
+
58
+
59
+
@@ -0,0 +1,74 @@
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
+ # reset_mailer
7
+ # open_last_email
8
+ # visit_in_email
9
+ # unread_emails_for
10
+ # mailbox_for
11
+ # current_email
12
+ # open_email
13
+ # read_emails_for
14
+ # find_email
15
+
16
+ module EmailHelpers
17
+ def current_email_address
18
+ "quentin@example.com" # Replace with your a way to find your current_email. e.g current_user.email
19
+ end
20
+ end
21
+ World(EmailHelpers)
22
+
23
+ # Use this step to reset the e-mail queue within a scenario.
24
+ # This is done automatically before each scenario.
25
+ Given /^(?:a clear email queue|no emails have been sent)$/ do
26
+ reset_mailer
27
+ end
28
+
29
+ # Use this step to open the most recently sent e-mail.
30
+ When /^I open the email$/ do
31
+ open_email(current_email_address)
32
+ end
33
+
34
+ When /^I follow "(.*)" in the email$/ do |link|
35
+ visit_in_email(link)
36
+ end
37
+
38
+ Then /^I should receive (an|\d+) emails?$/ do |amount|
39
+ amount = 1 if amount == "an"
40
+ unread_emails_for(current_email_address).size.should == amount.to_i
41
+ end
42
+
43
+ Then /^"([^']*?)" should receive (\d+) emails?$/ do |address, n|
44
+ unread_emails_for(address).size.should == n.to_i
45
+ end
46
+
47
+ Then /^"([^']*?)" should have (\d+) emails?$/ do |address, n|
48
+ mailbox_for(address).size.should == n.to_i
49
+ end
50
+
51
+ Then /^"([^']*?)" should not receive an email$/ do |address|
52
+ find_email(address).should be_nil
53
+ end
54
+
55
+ Then /^I should see "(.*)" in the subject$/ do |text|
56
+ current_email.should have_subject(Regexp.new(text))
57
+ end
58
+
59
+ Then /^I should see "(.*)" in the email$/ do |text|
60
+ current_email.body.should =~ Regexp.new(text)
61
+ end
62
+
63
+ When %r{^"([^']*?)" opens? the email with subject "([^']*?)"$} do |address, subject|
64
+ open_email(address, :with_subject => subject)
65
+ end
66
+
67
+ When %r{^"([^']*?)" opens? the email with text "([^']*?)"$} do |address, text|
68
+ open_email(address, :with_text => text)
69
+ end
70
+
71
+ When /^I click the first link in the email$/ do
72
+ click_first_link_in_email
73
+ end
74
+
@@ -0,0 +1,23 @@
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 => valid_user_attributes[:name]
7
+ fill_in "Email", :with => valid_user_attributes[:email]
8
+ click_button
9
+ end
10
+
11
+ Then /^I should receive an email with a link to a confirmation page$/ do
12
+ unread_emails_for(valid_user_attributes[:email]).size.should == 1
13
+
14
+ # this call will store the email and you can access it with current_email
15
+ open_last_email_for(valid_user_attributes[:email])
16
+ current_email.should have_subject(/Account confirmation/)
17
+ current_email.should have_body_text(valid_user_attributes[:name])
18
+
19
+ click_email_link_matching /confirm/
20
+ response.should include_text("Confirm your new account")
21
+
22
+ end
23
+
@@ -0,0 +1,104 @@
1
+ # Commonly used webrat steps
2
+ # http://github.com/brynary/webrat
3
+
4
+ Given /^I am at "(.+)"$/ do |path|
5
+ visit path
6
+ end
7
+
8
+ Given /^I'm on the (.+) page$/ do |page|
9
+ locations = {"signup" => "/"}
10
+ visit locations[page]
11
+ end
12
+
13
+ When /^I press "(.*)"$/ do |button|
14
+ click_button(button)
15
+ end
16
+
17
+ When /^I follow "(.*)"$/ do |link|
18
+ click_link(link)
19
+ end
20
+
21
+ When /^I fill in "(.*)" with "(.*)"$/ do |field, value|
22
+ fill_in(field, :with => value)
23
+ end
24
+
25
+ When /^I select "(.*)" from "(.*)"$/ do |value, field|
26
+ select(value, :from => field)
27
+ end
28
+
29
+ # Use this step in conjunction with Rail's datetime_select helper. For example:
30
+ # When I select "December 25, 2008 10:00" as the date and time
31
+ When /^I select "(.*)" as the date and time$/ do |time|
32
+ select_datetime(time)
33
+ end
34
+
35
+ # Use this step when using multiple datetime_select helpers on a page or
36
+ # you want to specify which datetime to select. Given the following view:
37
+ # <%= f.label :preferred %><br />
38
+ # <%= f.datetime_select :preferred %>
39
+ # <%= f.label :alternative %><br />
40
+ # <%= f.datetime_select :alternative %>
41
+ # The following steps would fill out the form:
42
+ # When I select "November 23, 2004 11:20" as the "Preferred" data and time
43
+ # And I select "November 25, 2004 10:30" as the "Alternative" data and time
44
+ When /^I select "(.*)" as the "(.*)" date and time$/ do |datetime, datetime_label|
45
+ select_datetime(datetime, :from => datetime_label)
46
+ end
47
+
48
+ # Use this step in conjuction with Rail's time_select helper. For example:
49
+ # When I select "2:20PM" as the time
50
+ # Note: Rail's default time helper provides 24-hour time-- not 12 hour time. Webrat
51
+ # will convert the 2:20PM to 14:20 and then select it.
52
+ When /^I select "(.*)" as the time$/ do |time|
53
+ select_time(time)
54
+ end
55
+
56
+ # Use this step when using multiple time_select helpers on a page or you want to
57
+ # specify the name of the time on the form. For example:
58
+ # When I select "7:30AM" as the "Gym" time
59
+ When /^I select "(.*)" as the "(.*)" time$/ do |time, time_label|
60
+ select_time(time, :from => time_label)
61
+ end
62
+
63
+ # Use this step in conjuction with Rail's date_select helper. For example:
64
+ # When I select "February 20, 1981" as the date
65
+ When /^I select "(.*)" as the date$/ do |date|
66
+ select_date(date)
67
+ end
68
+
69
+ # Use this step when using multiple date_select helpers on one page or
70
+ # you want to specify the name of the date on the form. For example:
71
+ # When I select "April 26, 1982" as the "Date of Birth" date
72
+ When /^I select "(.*)" as the "(.*)" date$/ do |date, date_label|
73
+ select_date(date, :from => date_label)
74
+ end
75
+
76
+ When /^I check "(.*)"$/ do |field|
77
+ check(field)
78
+ end
79
+
80
+ When /^I uncheck "(.*)"$/ do |field|
81
+ uncheck(field)
82
+ end
83
+
84
+ When /^I choose "(.*)"$/ do |field|
85
+ choose(field)
86
+ end
87
+
88
+ When /^I attach the file at "(.*)" to "(.*)" $/ do |path, field|
89
+ attach_file(field, path)
90
+ end
91
+
92
+ Then /^I should see "(.*)"$/ do |text|
93
+ response.body.should =~ /#{text}/m
94
+ end
95
+
96
+ Then /^I should not see "(.*)"$/ do |text|
97
+ response.body.should_not =~ /#{text}/m
98
+ end
99
+
100
+ Then /^the "(.*)" checkbox should be checked$/ do |label|
101
+ field_labeled(label).should be_checked
102
+ end
103
+
104
+
@@ -0,0 +1,21 @@
1
+ # Sets up the Rails environment for Cucumber
2
+ ENV["RAILS_ENV"] = "test"
3
+ require File.expand_path(File.dirname(__FILE__) + '/../../config/environment')
4
+ require 'cucumber/rails/world'
5
+ Cucumber::Rails.use_transactional_fixtures
6
+
7
+ require 'webrat'
8
+ require 'cucumber/rails/rspec'
9
+ require 'webrat/core/matchers'
10
+
11
+ Webrat.configure do |config|
12
+ config.mode = :rails
13
+ end
14
+
15
+
16
+
17
+ require File.expand_path(File.dirname(__FILE__) + '../../../../../lib/email_spec')
18
+ require 'email_spec/cucumber'
19
+
20
+ require File.expand_path(File.dirname(__FILE__) +'/../../spec/model_factory.rb')
21
+ World(Fixjour)
@@ -0,0 +1,30 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
+
4
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
5
+
6
+ <head>
7
+ <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
8
+ <title>The page you were looking for doesn't exist (404)</title>
9
+ <style type="text/css">
10
+ body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
11
+ div.dialog {
12
+ width: 25em;
13
+ padding: 0 4em;
14
+ margin: 4em auto 0 auto;
15
+ border: 1px solid #ccc;
16
+ border-right-color: #999;
17
+ border-bottom-color: #999;
18
+ }
19
+ h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
20
+ </style>
21
+ </head>
22
+
23
+ <body>
24
+ <!-- This file lives in public/404.html -->
25
+ <div class="dialog">
26
+ <h1>The page you were looking for doesn't exist.</h1>
27
+ <p>You may have mistyped the address or the page may have moved.</p>
28
+ </div>
29
+ </body>
30
+ </html>
@@ -0,0 +1,30 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
+
4
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
5
+
6
+ <head>
7
+ <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
8
+ <title>The change you wanted was rejected (422)</title>
9
+ <style type="text/css">
10
+ body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
11
+ div.dialog {
12
+ width: 25em;
13
+ padding: 0 4em;
14
+ margin: 4em auto 0 auto;
15
+ border: 1px solid #ccc;
16
+ border-right-color: #999;
17
+ border-bottom-color: #999;
18
+ }
19
+ h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
20
+ </style>
21
+ </head>
22
+
23
+ <body>
24
+ <!-- This file lives in public/422.html -->
25
+ <div class="dialog">
26
+ <h1>The change you wanted was rejected.</h1>
27
+ <p>Maybe you tried to change something you didn't have access to.</p>
28
+ </div>
29
+ </body>
30
+ </html>
@@ -0,0 +1,33 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
+
4
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
5
+
6
+ <head>
7
+ <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
8
+ <title>We're sorry, but something went wrong (500)</title>
9
+ <style type="text/css">
10
+ body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
11
+ div.dialog {
12
+ width: 25em;
13
+ padding: 0 4em;
14
+ margin: 4em auto 0 auto;
15
+ border: 1px solid #ccc;
16
+ border-right-color: #999;
17
+ border-bottom-color: #999;
18
+ }
19
+ h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
20
+ </style>
21
+ </head>
22
+
23
+ <body>
24
+ <!-- This file lives in public/500.html -->
25
+ <div class="dialog">
26
+ <h1>We're sorry, but something went wrong.</h1>
27
+ <p>We've been notified about this issue and we'll take a look at it shortly.</p>
28
+ <p><small>(If you're the administrator of this website, then please read
29
+ the log file "<%=h RAILS_ENV %>.log"
30
+ to find out what went wrong.)</small></p>
31
+ </div>
32
+ </body>
33
+ </html>
@@ -0,0 +1,10 @@
1
+ #!/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby
2
+
3
+ require File.dirname(__FILE__) + "/../config/environment" unless defined?(RAILS_ROOT)
4
+
5
+ # If you're using RubyGems and mod_ruby, this require should be changed to an absolute path one, like:
6
+ # "/usr/local/lib/ruby/gems/1.8/gems/rails-0.8.0/lib/dispatcher" -- otherwise performance is severely impaired
7
+ require "dispatcher"
8
+
9
+ ADDITIONAL_LOAD_PATHS.reverse.each { |dir| $:.unshift(dir) if File.directory?(dir) } if defined?(Apache::RubyRun)
10
+ Dispatcher.dispatch
File without changes
@@ -0,0 +1,2 @@
1
+ // Place your application-specific JavaScript functions and classes here
2
+ // This file is automatically included by javascript_include_tag :defaults