rainchen-email_spec 0.1.4

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 (90) hide show
  1. data/History.txt +75 -0
  2. data/MIT-LICENSE.txt +19 -0
  3. data/README.rdoc +125 -0
  4. data/Rakefile +50 -0
  5. data/examples/rails_root/Rakefile +7 -0
  6. data/examples/rails_root/app/controllers/application.rb +15 -0
  7. data/examples/rails_root/app/controllers/welcome_controller.rb +9 -0
  8. data/examples/rails_root/app/helpers/application_helper.rb +3 -0
  9. data/examples/rails_root/app/helpers/welcome_helper.rb +2 -0
  10. data/examples/rails_root/app/models/user.rb +2 -0
  11. data/examples/rails_root/app/models/user_mailer.rb +12 -0
  12. data/examples/rails_root/app/views/user_mailer/signup.erb +3 -0
  13. data/examples/rails_root/app/views/welcome/confirm.html.erb +1 -0
  14. data/examples/rails_root/app/views/welcome/index.html.erb +8 -0
  15. data/examples/rails_root/app/views/welcome/signup.html.erb +1 -0
  16. data/examples/rails_root/config/boot.rb +109 -0
  17. data/examples/rails_root/config/database.yml +22 -0
  18. data/examples/rails_root/config/environment.rb +22 -0
  19. data/examples/rails_root/config/environments/development.rb +17 -0
  20. data/examples/rails_root/config/environments/production.rb +24 -0
  21. data/examples/rails_root/config/environments/test.rb +33 -0
  22. data/examples/rails_root/config/initializers/inflections.rb +10 -0
  23. data/examples/rails_root/config/initializers/mime_types.rb +5 -0
  24. data/examples/rails_root/config/initializers/new_rails_defaults.rb +17 -0
  25. data/examples/rails_root/config/routes.rb +43 -0
  26. data/examples/rails_root/cucumber.yml +1 -0
  27. data/examples/rails_root/db/migrate/20090125013728_create_users.rb +11 -0
  28. data/examples/rails_root/db/schema.rb +19 -0
  29. data/examples/rails_root/doc/README_FOR_APP +5 -0
  30. data/examples/rails_root/features/errors.feature +42 -0
  31. data/examples/rails_root/features/example.feature +59 -0
  32. data/examples/rails_root/features/step_definitions/email_steps.rb +74 -0
  33. data/examples/rails_root/features/step_definitions/user_steps.rb +23 -0
  34. data/examples/rails_root/features/step_definitions/webrat_steps.rb +104 -0
  35. data/examples/rails_root/features/support/env.rb +21 -0
  36. data/examples/rails_root/public/404.html +30 -0
  37. data/examples/rails_root/public/422.html +30 -0
  38. data/examples/rails_root/public/500.html +33 -0
  39. data/examples/rails_root/public/dispatch.rb +10 -0
  40. data/examples/rails_root/public/favicon.ico +0 -0
  41. data/examples/rails_root/public/images/rails.png +0 -0
  42. data/examples/rails_root/public/javascripts/application.js +2 -0
  43. data/examples/rails_root/public/javascripts/controls.js +963 -0
  44. data/examples/rails_root/public/javascripts/dragdrop.js +973 -0
  45. data/examples/rails_root/public/javascripts/effects.js +1128 -0
  46. data/examples/rails_root/public/javascripts/prototype.js +4320 -0
  47. data/examples/rails_root/public/robots.txt +5 -0
  48. data/examples/rails_root/script/about +4 -0
  49. data/examples/rails_root/script/autospec +5 -0
  50. data/examples/rails_root/script/console +3 -0
  51. data/examples/rails_root/script/cucumber +7 -0
  52. data/examples/rails_root/script/dbconsole +3 -0
  53. data/examples/rails_root/script/destroy +3 -0
  54. data/examples/rails_root/script/generate +3 -0
  55. data/examples/rails_root/script/performance/benchmarker +3 -0
  56. data/examples/rails_root/script/performance/profiler +3 -0
  57. data/examples/rails_root/script/performance/request +3 -0
  58. data/examples/rails_root/script/plugin +3 -0
  59. data/examples/rails_root/script/process/inspector +3 -0
  60. data/examples/rails_root/script/process/reaper +3 -0
  61. data/examples/rails_root/script/process/spawner +3 -0
  62. data/examples/rails_root/script/runner +3 -0
  63. data/examples/rails_root/script/server +3 -0
  64. data/examples/rails_root/script/spec +5 -0
  65. data/examples/rails_root/script/spec_server +125 -0
  66. data/examples/rails_root/spec/controllers/welcome_controller_spec.rb +15 -0
  67. data/examples/rails_root/spec/model_factory.rb +6 -0
  68. data/examples/rails_root/spec/models/user_mailer_spec.rb +58 -0
  69. data/examples/rails_root/spec/models/user_spec.rb +5 -0
  70. data/examples/rails_root/spec/rcov.opts +2 -0
  71. data/examples/rails_root/spec/spec.opts +4 -0
  72. data/examples/rails_root/spec/spec_helper.rb +51 -0
  73. data/examples/rails_root/stories/all.rb +4 -0
  74. data/examples/rails_root/stories/helper.rb +3 -0
  75. data/examples/rails_root/vendor/plugins/email_spec/rails_generators/email_spec/email_spec_generator.rb +17 -0
  76. data/examples/rails_root/vendor/plugins/email_spec/rails_generators/email_spec/templates/email_steps.rb +74 -0
  77. data/install.rb +0 -0
  78. data/lib/email_spec.rb +14 -0
  79. data/lib/email_spec/address_converter.rb +27 -0
  80. data/lib/email_spec/cucumber.rb +19 -0
  81. data/lib/email_spec/deliveries.rb +55 -0
  82. data/lib/email_spec/email_viewer.rb +70 -0
  83. data/lib/email_spec/helpers.rb +129 -0
  84. data/lib/email_spec/matchers.rb +122 -0
  85. data/rails_generators/email_spec/email_spec_generator.rb +17 -0
  86. data/rails_generators/email_spec/templates/email_steps.rb +74 -0
  87. data/spec/email_spec/matchers_spec.rb +159 -0
  88. data/spec/spec.opts +4 -0
  89. data/spec/spec_helper.rb +4 -0
  90. metadata +176 -0
@@ -0,0 +1,22 @@
1
+ # SQLite version 3.x
2
+ # gem install sqlite3-ruby (not necessary on OS X Leopard)
3
+ development:
4
+ adapter: sqlite3
5
+ database: db/development.sqlite3
6
+ pool: 5
7
+ timeout: 5000
8
+
9
+ # Warning: The database defined as "test" will be erased and
10
+ # re-generated from your development database when you run "rake".
11
+ # Do not set this db to the same as development or production.
12
+ test:
13
+ adapter: sqlite3
14
+ database: db/test.sqlite3
15
+ pool: 5
16
+ timeout: 5000
17
+
18
+ production:
19
+ adapter: sqlite3
20
+ database: db/production.sqlite3
21
+ pool: 5
22
+ timeout: 5000
@@ -0,0 +1,22 @@
1
+ # Be sure to restart your server when you modify this file
2
+
3
+ # Uncomment below to force Rails into production mode when
4
+ # you don't control web/app server and can't set it the proper way
5
+ # ENV['RAILS_ENV'] ||= 'production'
6
+
7
+ # Specifies gem version of Rails to use when vendor/rails is not present
8
+ RAILS_GEM_VERSION = '2.2.2' unless defined? RAILS_GEM_VERSION
9
+
10
+ # Bootstrap the Rails environment, frameworks, and default configuration
11
+ require File.join(File.dirname(__FILE__), 'boot')
12
+
13
+ Rails::Initializer.run do |config|
14
+
15
+ config.time_zone = 'UTC'
16
+
17
+ config.action_controller.session = {
18
+ :session_key => '_es_session',
19
+ :secret => 'b9327c7967925fb36f8901e43f47e0a3e8fc7856ae1b4533ddeda776381548f9ac051721446fdbc4ccc88c7353124708e73d8b0950a30487571d8f8eb5b24732'
20
+ }
21
+
22
+ end
@@ -0,0 +1,17 @@
1
+ # Settings specified here will take precedence over those in config/environment.rb
2
+
3
+ # In the development environment your application's code is reloaded on
4
+ # every request. This slows down response time but is perfect for development
5
+ # since you don't have to restart the webserver when you make code changes.
6
+ config.cache_classes = false
7
+
8
+ # Log error messages when you accidentally call methods on nil.
9
+ config.whiny_nils = true
10
+
11
+ # Show full error reports and disable caching
12
+ config.action_controller.consider_all_requests_local = true
13
+ config.action_view.debug_rjs = true
14
+ config.action_controller.perform_caching = false
15
+
16
+ # Don't care if the mailer can't send
17
+ config.action_mailer.raise_delivery_errors = false
@@ -0,0 +1,24 @@
1
+ # Settings specified here will take precedence over those in config/environment.rb
2
+
3
+ # The production environment is meant for finished, "live" apps.
4
+ # Code is not reloaded between requests
5
+ config.cache_classes = true
6
+
7
+ # Enable threaded mode
8
+ # config.threadsafe!
9
+
10
+ # Use a different logger for distributed setups
11
+ # config.logger = SyslogLogger.new
12
+
13
+ # Full error reports are disabled and caching is turned on
14
+ config.action_controller.consider_all_requests_local = false
15
+ config.action_controller.perform_caching = true
16
+
17
+ # Use a different cache store in production
18
+ # config.cache_store = :mem_cache_store
19
+
20
+ # Enable serving of images, stylesheets, and javascripts from an asset server
21
+ # config.action_controller.asset_host = "http://assets.example.com"
22
+
23
+ # Disable delivery errors, bad email addresses will be ignored
24
+ # config.action_mailer.raise_delivery_errors = false
@@ -0,0 +1,33 @@
1
+ # Settings specified here will take precedence over those in config/environment.rb
2
+
3
+ # The test environment is used exclusively to run your application's
4
+ # test suite. You never need to work with it otherwise. Remember that
5
+ # your test database is "scratch space" for the test suite and is wiped
6
+ # and recreated between test runs. Don't rely on the data there!
7
+ config.cache_classes = true
8
+
9
+ # Log error messages when you accidentally call methods on nil.
10
+ config.whiny_nils = true
11
+
12
+ # Show full error reports and disable caching
13
+ config.action_controller.consider_all_requests_local = true
14
+ config.action_controller.perform_caching = false
15
+
16
+ # Disable request forgery protection in test environment
17
+ config.action_controller.allow_forgery_protection = false
18
+
19
+ # Tell Action Mailer not to deliver emails to the real world.
20
+ # The :test delivery method accumulates sent emails in the
21
+ # ActionMailer::Base.deliveries array.
22
+ config.action_mailer.delivery_method = :test
23
+
24
+
25
+ # I HATE config.gem.. it doesn't work as advertised...
26
+ config.gem 'webrat', :source => "http://gems.github.com"
27
+ #config.gem 'rspec', :lib => 'spec'
28
+ #config.gem 'rspec-rails', :lib => 'spec/rails'
29
+ config.gem 'cucumber', :source => "http://gems.github.com" # aslakhellesoy-cucumber
30
+ config.gem 'nakajima-fixjour', :lib => 'fixjour', :source => "http://gems.github.com" # nakajima-fixjour
31
+
32
+
33
+
@@ -0,0 +1,10 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ # Add new inflection rules using the following format
4
+ # (all these examples are active by default):
5
+ # ActiveSupport::Inflector.inflections do |inflect|
6
+ # inflect.plural /^(ox)$/i, '\1en'
7
+ # inflect.singular /^(ox)en/i, '\1'
8
+ # inflect.irregular 'person', 'people'
9
+ # inflect.uncountable %w( fish sheep )
10
+ # end
@@ -0,0 +1,5 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ # Add new mime types for use in respond_to blocks:
4
+ # Mime::Type.register "text/richtext", :rtf
5
+ # Mime::Type.register_alias "text/html", :iphone
@@ -0,0 +1,17 @@
1
+ # These settings change the behavior of Rails 2 apps and will be defaults
2
+ # for Rails 3. You can remove this initializer when Rails 3 is released.
3
+
4
+ if defined?(ActiveRecord)
5
+ # Include Active Record class name as root for JSON serialized output.
6
+ ActiveRecord::Base.include_root_in_json = true
7
+
8
+ # Store the full class name (including module namespace) in STI type column.
9
+ ActiveRecord::Base.store_full_sti_class = true
10
+ end
11
+
12
+ # Use ISO 8601 format for JSON serialized times and dates.
13
+ ActiveSupport.use_standard_json_time_format = true
14
+
15
+ # Don't escape HTML entities in JSON, leave that for the #json_escape helper.
16
+ # if you're including raw json in an HTML page.
17
+ ActiveSupport.escape_html_entities_in_json = false
@@ -0,0 +1,43 @@
1
+ ActionController::Routing::Routes.draw do |map|
2
+ # The priority is based upon order of creation: first created -> highest priority.
3
+
4
+ # Sample of regular route:
5
+ # map.connect 'products/:id', :controller => 'catalog', :action => 'view'
6
+ # Keep in mind you can assign values other than :controller and :action
7
+
8
+ # Sample of named route:
9
+ # map.purchase 'products/:id/purchase', :controller => 'catalog', :action => 'purchase'
10
+ # This route can be invoked with purchase_url(:id => product.id)
11
+
12
+ # Sample resource route (maps HTTP verbs to controller actions automatically):
13
+ # map.resources :products
14
+
15
+ # Sample resource route with options:
16
+ # map.resources :products, :member => { :short => :get, :toggle => :post }, :collection => { :sold => :get }
17
+
18
+ # Sample resource route with sub-resources:
19
+ # map.resources :products, :has_many => [ :comments, :sales ], :has_one => :seller
20
+
21
+ # Sample resource route with more complex sub-resources
22
+ # map.resources :products do |products|
23
+ # products.resources :comments
24
+ # products.resources :sales, :collection => { :recent => :get }
25
+ # end
26
+
27
+ # Sample resource route within a namespace:
28
+ # map.namespace :admin do |admin|
29
+ # # Directs /admin/products/* to Admin::ProductsController (app/controllers/admin/products_controller.rb)
30
+ # admin.resources :products
31
+ # end
32
+
33
+ # You can have the root of your site routed with map.root -- just remember to delete public/index.html.
34
+ map.root :controller => "welcome", :action => "index"
35
+ map.confirm_account "/confirm", :controller => "welcome", :action => "confirm"
36
+ # See how all your routes lay out with "rake routes"
37
+
38
+ # Install the default routes as the lowest priority.
39
+ # Note: These default routes make all actions in every controller accessible via GET requests. You should
40
+ # consider removing the them or commenting them out if you're using named routes and resources.
41
+ map.connect ':controller/:action/:id'
42
+ map.connect ':controller/:action/:id.:format'
43
+ end
@@ -0,0 +1 @@
1
+ default: features/example.feature
@@ -0,0 +1,11 @@
1
+ class CreateUsers < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :users do |t|
4
+ t.string :email, :name
5
+ end
6
+ end
7
+
8
+ def self.down
9
+ drop_table :users
10
+ end
11
+ end
@@ -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 %r{^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 %r{^"([^"]*?)" should receive (\d+) emails?$} do |address, n|
44
+ unread_emails_for(address).size.should == n.to_i
45
+ end
46
+
47
+ Then %r{^"([^"]*?)" should have (\d+) emails?$} do |address, n|
48
+ mailbox_for(address).size.should == n.to_i
49
+ end
50
+
51
+ Then %r{^"([^"]*?)" should not receive an email$} do |address|
52
+ find_email(address).should be_nil
53
+ end
54
+
55
+ Then %r{^I should see "([^"]*?)" in the subject$} do |text|
56
+ current_email.should have_subject(Regexp.new(text))
57
+ end
58
+
59
+ Then %r{^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
+