devise 1.1.pre4 → 1.1.rc0

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 (122) hide show
  1. data/CHANGELOG.rdoc +31 -2
  2. data/Gemfile +15 -6
  3. data/README.rdoc +12 -16
  4. data/Rakefile +2 -2
  5. data/TODO +2 -1
  6. data/app/controllers/devise/confirmations_controller.rb +1 -1
  7. data/app/controllers/devise/passwords_controller.rb +2 -3
  8. data/app/controllers/devise/registrations_controller.rb +5 -5
  9. data/app/controllers/devise/sessions_controller.rb +5 -27
  10. data/app/controllers/devise/unlocks_controller.rb +9 -1
  11. data/app/models/devise/mailer.rb +17 -11
  12. data/app/views/devise/confirmations/new.html.erb +1 -1
  13. data/app/views/devise/passwords/edit.html.erb +1 -1
  14. data/app/views/devise/passwords/new.html.erb +1 -1
  15. data/app/views/devise/registrations/edit.html.erb +2 -2
  16. data/app/views/devise/registrations/new.html.erb +2 -2
  17. data/app/views/devise/sessions/new.html.erb +2 -2
  18. data/app/views/devise/shared/_links.erb +5 -5
  19. data/app/views/devise/unlocks/new.html.erb +1 -1
  20. data/config/locales/en.yml +4 -9
  21. data/lib/devise.rb +83 -42
  22. data/lib/devise/controllers/helpers.rb +6 -18
  23. data/lib/devise/controllers/internal_helpers.rb +11 -12
  24. data/lib/devise/controllers/scoped_views.rb +2 -2
  25. data/lib/devise/controllers/url_helpers.rb +1 -1
  26. data/lib/devise/failure_app.rb +56 -16
  27. data/lib/devise/hooks/activatable.rb +18 -6
  28. data/lib/devise/hooks/rememberable.rb +36 -27
  29. data/lib/devise/hooks/timeoutable.rb +1 -1
  30. data/lib/devise/hooks/trackable.rb +4 -2
  31. data/lib/devise/mapping.rb +19 -14
  32. data/lib/devise/models.rb +12 -3
  33. data/lib/devise/models/authenticatable.rb +19 -95
  34. data/lib/devise/models/confirmable.rb +14 -20
  35. data/lib/devise/models/database_authenticatable.rb +99 -0
  36. data/lib/devise/models/lockable.rb +53 -39
  37. data/lib/devise/models/recoverable.rb +3 -3
  38. data/lib/devise/models/rememberable.rb +5 -10
  39. data/lib/devise/models/token_authenticatable.rb +18 -25
  40. data/lib/devise/models/validatable.rb +14 -9
  41. data/lib/devise/modules.rb +7 -8
  42. data/lib/devise/orm/active_record.rb +1 -1
  43. data/lib/devise/orm/data_mapper.rb +20 -7
  44. data/lib/devise/orm/mongoid.rb +40 -0
  45. data/lib/devise/rails.rb +26 -3
  46. data/lib/devise/rails/routes.rb +18 -16
  47. data/lib/devise/rails/warden_compat.rb +2 -2
  48. data/lib/devise/schema.rb +45 -18
  49. data/lib/devise/strategies/authenticatable.rb +92 -21
  50. data/lib/devise/strategies/base.rb +6 -3
  51. data/lib/devise/strategies/database_authenticatable.rb +20 -0
  52. data/lib/devise/strategies/rememberable.rb +10 -6
  53. data/lib/devise/strategies/token_authenticatable.rb +28 -19
  54. data/lib/devise/test_helpers.rb +5 -1
  55. data/lib/devise/version.rb +1 -1
  56. data/lib/generators/devise/devise_generator.rb +15 -5
  57. data/lib/generators/devise/templates/migration.rb +2 -2
  58. data/lib/generators/devise_install/templates/devise.rb +37 -16
  59. data/lib/generators/devise_views/devise_views_generator.rb +51 -4
  60. data/test/controllers/helpers_test.rb +16 -8
  61. data/test/controllers/internal_helpers_test.rb +6 -1
  62. data/test/controllers/url_helpers_test.rb +10 -10
  63. data/test/devise_test.rb +13 -17
  64. data/test/encryptors_test.rb +2 -0
  65. data/test/failure_app_test.rb +72 -23
  66. data/test/integration/confirmable_test.rb +4 -4
  67. data/test/integration/{authenticatable_test.rb → database_authenticatable_test.rb} +35 -17
  68. data/test/integration/http_authenticatable_test.rb +3 -3
  69. data/test/integration/lockable_test.rb +28 -8
  70. data/test/integration/recoverable_test.rb +3 -3
  71. data/test/integration/registerable_test.rb +6 -4
  72. data/test/integration/rememberable_test.rb +11 -4
  73. data/test/integration/timeoutable_test.rb +4 -4
  74. data/test/integration/token_authenticatable_test.rb +46 -10
  75. data/test/integration/trackable_test.rb +2 -2
  76. data/test/mailers/confirmation_instructions_test.rb +5 -5
  77. data/test/mailers/reset_password_instructions_test.rb +5 -5
  78. data/test/mailers/unlock_instructions_test.rb +5 -5
  79. data/test/mapping_test.rb +15 -14
  80. data/test/models/confirmable_test.rb +9 -32
  81. data/test/models/{authenticatable_test.rb → database_authenticatable_test.rb} +2 -34
  82. data/test/models/lockable_test.rb +48 -66
  83. data/test/models/recoverable_test.rb +8 -8
  84. data/test/models/rememberable_test.rb +6 -28
  85. data/test/models/timeoutable_test.rb +1 -1
  86. data/test/models/token_authenticatable_test.rb +1 -8
  87. data/test/models/trackable_test.rb +1 -1
  88. data/test/models/validatable_test.rb +2 -2
  89. data/test/models_test.rb +16 -2
  90. data/test/orm/active_record.rb +1 -22
  91. data/test/orm/data_mapper.rb +1 -0
  92. data/test/orm/mongoid.rb +10 -0
  93. data/test/rails_app/app/active_record/admin.rb +1 -5
  94. data/test/rails_app/app/controllers/application_controller.rb +2 -0
  95. data/test/rails_app/app/controllers/sessions_controller.rb +1 -1
  96. data/test/rails_app/app/data_mapper/admin.rb +13 -0
  97. data/test/rails_app/app/data_mapper/user.rb +24 -0
  98. data/test/rails_app/app/mongoid/admin.rb +15 -0
  99. data/test/rails_app/app/mongoid/user.rb +21 -0
  100. data/test/rails_app/config/application.rb +10 -5
  101. data/test/rails_app/config/boot.rb +5 -1
  102. data/test/rails_app/config/initializers/devise.rb +1 -1
  103. data/test/rails_app/config/routes.rb +4 -1
  104. data/test/rails_app/db/migrate/20100401102949_create_tables.rb +27 -0
  105. data/test/rails_app/db/schema.rb +86 -0
  106. data/test/routes_test.rb +3 -3
  107. data/test/support/assertions.rb +2 -0
  108. data/test/support/helpers.rb +2 -0
  109. data/test/support/integration.rb +4 -7
  110. data/test/support/webrat/integrations/rails.rb +2 -1
  111. data/test/test_helper.rb +5 -2
  112. data/test/test_helpers_test.rb +4 -4
  113. metadata +36 -21
  114. data/lib/devise/models/http_authenticatable.rb +0 -19
  115. data/lib/devise/orm/mongo_mapper.rb +0 -49
  116. data/lib/devise/strategies/http_authenticatable.rb +0 -47
  117. data/test/models/http_authenticatable_test.rb +0 -19
  118. data/test/orm/mongo_mapper.rb +0 -12
  119. data/test/rails_app/app/mongo_mapper/admin.rb +0 -10
  120. data/test/rails_app/app/mongo_mapper/user.rb +0 -11
  121. data/test/rails_app/config/initializers/cookie_verification_secret.rb +0 -7
  122. data/test/rails_app/config/initializers/session_store.rb +0 -15
@@ -1,28 +1,7 @@
1
- require File.expand_path('../../rails_app/config/environment', __FILE__)
2
- require 'rails/test_help'
3
-
4
1
  ActiveRecord::Migration.verbose = false
5
2
  ActiveRecord::Base.logger = Logger.new(nil)
6
3
 
7
- ActiveRecord::Schema.define(:version => 1) do
8
- [:users, :admins, :accounts].each do |table|
9
- create_table table do |t|
10
- t.authenticatable :null => table == :admins
11
-
12
- if table != :admin
13
- t.string :username
14
- t.confirmable
15
- t.recoverable
16
- t.rememberable
17
- t.trackable
18
- t.lockable
19
- t.token_authenticatable
20
- end
21
-
22
- t.timestamps
23
- end
24
- end
25
- end
4
+ ActiveRecord::Migrator.migrate(File.expand_path("../../rails_app/db/migrate/", __FILE__))
26
5
 
27
6
  class ActiveSupport::TestCase
28
7
  self.use_transactional_fixtures = true
@@ -0,0 +1 @@
1
+ DataMapper.auto_migrate!
@@ -0,0 +1,10 @@
1
+ Mongoid.configure do |config|
2
+ config.master = Mongo::Connection.new('127.0.0.1', 27017).db("devise-test-suite")
3
+ end
4
+
5
+ class ActiveSupport::TestCase
6
+ setup do
7
+ User.delete_all
8
+ Admin.delete_all
9
+ end
10
+ end
@@ -1,7 +1,3 @@
1
1
  class Admin < ActiveRecord::Base
2
- devise :authenticatable, :registerable, :timeoutable
3
-
4
- def self.find_for_authentication(conditions)
5
- last(:conditions => conditions)
6
- end
2
+ devise :authenticatable, :registerable, :timeoutable, :recoverable
7
3
  end
@@ -3,4 +3,6 @@
3
3
 
4
4
  class ApplicationController < ActionController::Base
5
5
  protect_from_forgery
6
+
7
+ before_filter :current_user
6
8
  end
@@ -1,6 +1,6 @@
1
1
  class SessionsController < Devise::SessionsController
2
2
  def new
3
- flash[:notice] = "Welcome to #{controller_path.inspect} controller!"
3
+ flash[:special] = "Welcome to #{controller_path.inspect} controller!"
4
4
  super
5
5
  end
6
6
  end
@@ -0,0 +1,13 @@
1
+ class Admin
2
+ include DataMapper::Resource
3
+
4
+ property :id, Serial
5
+ property :username, String
6
+
7
+ devise :authenticatable, :registerable, :timeoutable, :recoverable
8
+
9
+ def self.create!(*args)
10
+ create(*args)
11
+ end
12
+
13
+ end
@@ -0,0 +1,24 @@
1
+ class User
2
+ include DataMapper::Resource
3
+
4
+ property :id, Serial
5
+ property :username, String
6
+
7
+ devise :authenticatable, :http_authenticatable, :confirmable, :lockable, :recoverable,
8
+ :registerable, :rememberable, :timeoutable, :token_authenticatable,
9
+ :trackable, :validatable
10
+
11
+ timestamps :at
12
+
13
+ def save!(*args)
14
+ save
15
+ end
16
+
17
+ def self.create!(*args)
18
+ create(*args)
19
+ end
20
+
21
+ def self.destroy_all
22
+ all.destroy
23
+ end
24
+ end
@@ -0,0 +1,15 @@
1
+ class Admin
2
+ include Mongoid::Document
3
+
4
+ devise :authenticatable, :timeoutable, :registerable, :recoverable
5
+
6
+ def self.last(options={})
7
+ options.delete(:order) if options[:order] == "id"
8
+ super options
9
+ end
10
+
11
+ # overwrite equality (because some devise tests use this for asserting model equality)
12
+ def ==(other)
13
+ other.is_a?(self.class) && _id == other._id
14
+ end
15
+ end
@@ -0,0 +1,21 @@
1
+ class User
2
+ include Mongoid::Document
3
+
4
+ field :created_at, :type => DateTime
5
+
6
+ devise :authenticatable, :http_authenticatable, :confirmable, :lockable, :recoverable,
7
+ :registerable, :rememberable, :timeoutable, :token_authenticatable,
8
+ :trackable, :validatable
9
+
10
+ # attr_accessible :username, :email, :password, :password_confirmation
11
+
12
+ def self.last(options={})
13
+ options.delete(:order) if options[:order] == "id"
14
+ super options
15
+ end
16
+
17
+ # overwrite equality (because some devise tests use this for asserting model equality)
18
+ def ==(other)
19
+ other.is_a?(self.class) && _id == other._id
20
+ end
21
+ end
@@ -1,20 +1,21 @@
1
1
  require File.expand_path('../boot', __FILE__)
2
2
 
3
- DEVISE_ORM = :active_record unless defined? DEVISE_ORM
4
-
5
- require "active_record/railtie" if DEVISE_ORM == :active_record
6
3
  require "action_controller/railtie"
7
4
  require "action_mailer/railtie"
8
5
  require "active_resource/railtie"
9
6
  require "rails/test_unit/railtie"
10
7
 
11
8
  Bundler.require :default, DEVISE_ORM
9
+
10
+ begin
11
+ require "#{DEVISE_ORM}/railtie"
12
+ rescue LoadError
13
+ end
14
+
12
15
  require "devise"
13
16
 
14
17
  module RailsApp
15
18
  class Application < Rails::Application
16
- config.root = File.expand_path("../..", __FILE__)
17
-
18
19
  # Add additional load paths for your own custom dirs
19
20
  config.load_paths.reject!{ |p| p =~ /\/app\/(\w+)$/ && !%w(controllers helpers views).include?($1) }
20
21
  config.load_paths += [ "#{config.root}/app/#{DEVISE_ORM}" ]
@@ -28,5 +29,9 @@ module RailsApp
28
29
 
29
30
  # Configure sensitive parameters which will be filtered from the log file.
30
31
  config.filter_parameters << :password
32
+
33
+ # Cookie settings
34
+ config.cookie_secret = 'ea942c41850d502f2c8283e26bdc57829f471bb18224ddff0a192c4f32cdf6cb5aa0d82b3a7a7adbeb640c4b06f3aa1cd5f098162d8240f669b39d6b49680571'
35
+ config.session_store :cookie_store, :key => "_my_app"
31
36
  end
32
37
  end
@@ -1,9 +1,13 @@
1
+ unless defined?(DEVISE_ORM)
2
+ DEVISE_ORM = (ENV["DEVISE_ORM"] || :active_record).to_sym
3
+ end
4
+
1
5
  begin
2
6
  require File.expand_path("../../../../.bundle/environment", __FILE__)
3
7
  rescue LoadError
4
8
  require 'rubygems'
5
9
  require 'bundler'
6
- Bundler.setup
10
+ Bundler.setup :default, DEVISE_ORM
7
11
  end
8
12
 
9
13
  $:.unshift File.expand_path('../../../../lib', __FILE__)
@@ -36,7 +36,7 @@ Devise.setup do |config|
36
36
  # Configure the e-mail address which will be shown in DeviseMailer.
37
37
  config.mailer_sender = "please-change-me-omg@yourapp.com"
38
38
 
39
- # Load and configure the ORM. Supports :active_record, :data_mapper and :mongo_mapper.
39
+ # Load and configure the ORM. Supports :active_record, :data_mapper and :mongoid.
40
40
  require "devise/orm/#{DEVISE_ORM}"
41
41
 
42
42
  # Turn scoped views on. Before rendering "sessions/new", it will first check for
@@ -6,7 +6,7 @@ Rails::Application.routes.draw do
6
6
  resources :admins, :only => [:index]
7
7
 
8
8
  devise_for :users
9
- devise_for :admin, :as => "admin_area", :controllers => { :sessions => "sessions" }
9
+ devise_for :admin, :as => "admin_area", :controllers => { :sessions => "sessions" }, :skip => :passwords
10
10
  devise_for :accounts, :scope => "manager", :path_prefix => ":locale",
11
11
  :class_name => "User", :path_names => {
12
12
  :sign_in => "login", :sign_out => "logout",
@@ -17,5 +17,8 @@ Rails::Application.routes.draw do
17
17
  match "/admin_area/home", :to => "admins#index", :as => :admin_root
18
18
  match "/sign_in", :to => "devise/sessions#new"
19
19
 
20
+ # Dummy route for new admin pasword
21
+ match "/anywhere", :to => "foo#bar", :as => :new_admin_password
22
+
20
23
  root :to => "home#index"
21
24
  end
@@ -0,0 +1,27 @@
1
+ class CreateTables < ActiveRecord::Migration
2
+ def self.up
3
+ [:users, :admins, :accounts].each do |table|
4
+ create_table table do |t|
5
+ t.authenticatable :null => table == :admins
6
+
7
+ if table != :admin
8
+ t.string :username
9
+ t.confirmable
10
+ t.recoverable
11
+ t.rememberable
12
+ t.trackable
13
+ t.lockable
14
+ t.token_authenticatable
15
+ end
16
+
17
+ t.timestamps
18
+ end
19
+ end
20
+ end
21
+
22
+ def self.down
23
+ [:users, :admins, :accounts].each do |table|
24
+ drop_table table
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,86 @@
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 => 20100401102949) do
13
+
14
+ create_table "accounts", :force => true do |t|
15
+ t.string "email", :default => "", :null => false
16
+ t.string "encrypted_password", :default => "", :null => false
17
+ t.string "password_salt", :default => "", :null => false
18
+ t.string "username"
19
+ t.string "confirmation_token"
20
+ t.datetime "confirmed_at"
21
+ t.datetime "confirmation_sent_at"
22
+ t.string "reset_password_token"
23
+ t.string "remember_token"
24
+ t.datetime "remember_created_at"
25
+ t.integer "sign_in_count", :default => 0
26
+ t.datetime "current_sign_in_at"
27
+ t.datetime "last_sign_in_at"
28
+ t.string "current_sign_in_ip"
29
+ t.string "last_sign_in_ip"
30
+ t.integer "failed_attempts", :default => 0
31
+ t.string "unlock_token"
32
+ t.datetime "locked_at"
33
+ t.string "authentication_token"
34
+ t.datetime "created_at"
35
+ t.datetime "updated_at"
36
+ end
37
+
38
+ create_table "admins", :force => true do |t|
39
+ t.string "email", :default => ""
40
+ t.string "encrypted_password", :default => ""
41
+ t.string "password_salt", :default => ""
42
+ t.string "username"
43
+ t.string "confirmation_token"
44
+ t.datetime "confirmed_at"
45
+ t.datetime "confirmation_sent_at"
46
+ t.string "reset_password_token"
47
+ t.string "remember_token"
48
+ t.datetime "remember_created_at"
49
+ t.integer "sign_in_count", :default => 0
50
+ t.datetime "current_sign_in_at"
51
+ t.datetime "last_sign_in_at"
52
+ t.string "current_sign_in_ip"
53
+ t.string "last_sign_in_ip"
54
+ t.integer "failed_attempts", :default => 0
55
+ t.string "unlock_token"
56
+ t.datetime "locked_at"
57
+ t.string "authentication_token"
58
+ t.datetime "created_at"
59
+ t.datetime "updated_at"
60
+ end
61
+
62
+ create_table "users", :force => true do |t|
63
+ t.string "email", :default => "", :null => false
64
+ t.string "encrypted_password", :default => "", :null => false
65
+ t.string "password_salt", :default => "", :null => false
66
+ t.string "username"
67
+ t.string "confirmation_token"
68
+ t.datetime "confirmed_at"
69
+ t.datetime "confirmation_sent_at"
70
+ t.string "reset_password_token"
71
+ t.string "remember_token"
72
+ t.datetime "remember_created_at"
73
+ t.integer "sign_in_count", :default => 0
74
+ t.datetime "current_sign_in_at"
75
+ t.datetime "last_sign_in_at"
76
+ t.string "current_sign_in_ip"
77
+ t.string "last_sign_in_ip"
78
+ t.integer "failed_attempts", :default => 0
79
+ t.string "unlock_token"
80
+ t.datetime "locked_at"
81
+ t.string "authentication_token"
82
+ t.datetime "created_at"
83
+ t.datetime "updated_at"
84
+ end
85
+
86
+ end
@@ -1,4 +1,4 @@
1
- require 'test/test_helper'
1
+ require 'test_helper'
2
2
 
3
3
  class MapRoutingTest < ActionController::TestCase
4
4
 
@@ -82,9 +82,9 @@ class MapRoutingTest < ActionController::TestCase
82
82
  assert_recognizes({:controller => 'sessions', :action => 'new'}, {:path => 'admin_area/sign_in', :method => :get})
83
83
  end
84
84
 
85
- test 'does not map admin confirmation' do
85
+ test 'does not map admin password' do
86
86
  assert_raise ActionController::RoutingError do
87
- assert_recognizes({:controller => 'devise/confirmations', :action => 'new'}, 'admin_area/confirmation/new')
87
+ assert_recognizes({:controller => 'devise/passwords', :action => 'new'}, 'admin_area/password/new')
88
88
  end
89
89
  end
90
90
 
@@ -1,3 +1,5 @@
1
+ require 'active_support/test_case'
2
+
1
3
  class ActiveSupport::TestCase
2
4
  def assert_not(assertion)
3
5
  assert !assertion
@@ -1,3 +1,5 @@
1
+ require 'active_support/test_case'
2
+
1
3
  class ActiveSupport::TestCase
2
4
  VALID_AUTHENTICATION_TOKEN = 'AbCdEfGhIjKlMnOpQrSt'.freeze
3
5
 
@@ -1,5 +1,6 @@
1
- class ActionController::IntegrationTest
1
+ require 'action_dispatch/testing/integration'
2
2
 
3
+ class ActionDispatch::IntegrationTest
3
4
  def warden
4
5
  request.env['warden']
5
6
  end
@@ -14,7 +15,7 @@ class ActionController::IntegrationTest
14
15
  :created_at => Time.now.utc
15
16
  )
16
17
  user.confirm! unless options[:confirm] == false
17
- user.lock! if options[:locked] == true
18
+ user.lock_access! if options[:locked] == true
18
19
  user
19
20
  end
20
21
  end
@@ -32,7 +33,7 @@ class ActionController::IntegrationTest
32
33
  user = create_user(options)
33
34
  get new_user_session_path unless options[:visit] == false
34
35
  fill_in 'email', :with => 'user@test.com'
35
- fill_in 'password', :with => '123456'
36
+ fill_in 'password', :with => options[:password] || '123456'
36
37
  check 'remember me' if options[:remember_me] == true
37
38
  yield if block_given?
38
39
  click_button 'Sign In'
@@ -49,10 +50,6 @@ class ActionController::IntegrationTest
49
50
  admin
50
51
  end
51
52
 
52
- def assert_current_path(path)
53
- assert_equal(prepend_host(path), prepend_host(current_url))
54
- end
55
-
56
53
  # Fix assert_redirect_to in integration sessions because they don't take into
57
54
  # account Middleware redirects.
58
55
  #
@@ -1,4 +1,5 @@
1
1
  require 'webrat/core/elements/field'
2
+ require 'action_dispatch/testing/integration'
2
3
 
3
4
  module Webrat
4
5
  Field.class_eval do
@@ -8,7 +9,7 @@ module Webrat
8
9
  end
9
10
  end
10
11
 
11
- module ActionController #:nodoc:
12
+ module ActionDispatch #:nodoc:
12
13
  IntegrationTest.class_eval do
13
14
  include Webrat::Methods
14
15
  include Webrat::Matchers
@@ -1,11 +1,14 @@
1
1
  ENV["RAILS_ENV"] = "test"
2
2
  DEVISE_ORM = (ENV["DEVISE_ORM"] || :active_record).to_sym
3
3
 
4
+ $:.unshift File.dirname(__FILE__)
4
5
  puts "\n==> Devise.orm = #{DEVISE_ORM.inspect}"
5
6
 
6
- require File.expand_path('../rails_app/config/application', __FILE__)
7
- require File.expand_path("../orm/#{DEVISE_ORM}", __FILE__)
7
+ require "rails_app/config/environment"
8
+ require "rails/test_help"
9
+ require "orm/#{DEVISE_ORM}"
8
10
 
11
+ I18n.load_path << File.expand_path("../support/locale/en.yml", __FILE__)
9
12
  require 'mocha'
10
13
 
11
14
  ActionMailer::Base.delivery_method = :test