thoughtbot-clearance 0.3.3 → 0.3.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.
- data/Rakefile +12 -28
- data/generators/clearance/clearance_generator.rb +4 -4
- data/lib/clearance.rb +2 -2
- data/lib/clearance/app/controllers/application_controller.rb +12 -6
- data/lib/clearance/app/controllers/passwords_controller.rb +1 -1
- data/lib/clearance/app/controllers/sessions_controller.rb +14 -13
- data/lib/clearance/app/controllers/users_controller.rb +1 -1
- data/lib/clearance/test/functional/sessions_controller_test.rb +36 -13
- data/lib/clearance/test/functional/users_controller_test.rb +9 -4
- data/lib/clearance/test/test_helper.rb +11 -7
- data/test/rails_root/config/routes.rb +5 -2
- metadata +1 -1
- data/generators/clearance/templates/app/models/user_mailer.rb +0 -7
- data/generators/clearance/templates/app/views/user_mailer/change_password.html.erb +0 -6
- data/generators/clearance/templates/app/views/user_mailer/confirmation.html.erb +0 -1
- data/generators/clearance/templates/test/unit/user_mailer_test.rb +0 -6
- data/lib/clearance/app/models/user_mailer.rb +0 -33
- data/lib/clearance/test/unit/user_mailer_test.rb +0 -63
- data/test/rails_root/app/models/user_mailer.rb +0 -7
- data/test/rails_root/app/views/user_mailer/change_password.html.erb +0 -6
- data/test/rails_root/app/views/user_mailer/confirmation.html.erb +0 -1
- data/test/rails_root/test/unit/user_mailer_test.rb +0 -6
data/Rakefile
CHANGED
@@ -3,14 +3,16 @@ require 'rake/testtask'
|
|
3
3
|
require 'date'
|
4
4
|
|
5
5
|
test_files_pattern = 'test/rails_root/test/{unit,functional,other}/**/*_test.rb'
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
6
|
+
namespace :test do
|
7
|
+
Rake::TestTask.new(:all => 'generator:tests') do |t|
|
8
|
+
t.libs << 'lib'
|
9
|
+
t.pattern = test_files_pattern
|
10
|
+
t.verbose = false
|
11
|
+
end
|
10
12
|
end
|
11
13
|
|
12
14
|
desc "Run the test suite"
|
13
|
-
task :default => :
|
15
|
+
task :default => 'test:all'
|
14
16
|
|
15
17
|
spec = Gem::Specification.new do |s|
|
16
18
|
s.name = "clearance"
|
@@ -23,28 +25,10 @@ spec = Gem::Specification.new do |s|
|
|
23
25
|
end
|
24
26
|
|
25
27
|
namespace :generator do
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
files = test_files + app_files
|
32
|
-
templates_path = "generators/clearance/templates"
|
33
|
-
system `rm -rf #{templates_path}`
|
34
|
-
system `mkdir #{templates_path}`
|
35
|
-
["app", "app/controllers", "app/models", "app/views",
|
36
|
-
"test", "test/functional", "test/unit"].each do |directory|
|
37
|
-
system `mkdir #{templates_path}/#{directory}`
|
38
|
-
end
|
39
|
-
files.each do |file|
|
40
|
-
template = "generators/clearance/templates/#{file.gsub("test/rails_root/", "")}"
|
41
|
-
if File.directory?(file)
|
42
|
-
system `rm -rf #{template}`
|
43
|
-
system `mkdir #{template}`
|
44
|
-
else
|
45
|
-
system `rm #{template}` if File.exists?(template)
|
46
|
-
system `cp #{file} #{template}`
|
47
|
-
end
|
48
|
-
end
|
28
|
+
desc "Run the generator on the tests"
|
29
|
+
task :tests do
|
30
|
+
system "mkdir -p test/rails_root/vendor/plugins/clearance"
|
31
|
+
system "cp -R generators test/rails_root/vendor/plugins/clearance"
|
32
|
+
system "cd test/rails_root; ./script/generate clearance"
|
49
33
|
end
|
50
34
|
end
|
@@ -12,7 +12,7 @@ class ClearanceGenerator < Rails::Generator::Base
|
|
12
12
|
|
13
13
|
m.directory File.join("app", "models")
|
14
14
|
["app/models/user.rb",
|
15
|
-
"app/models/
|
15
|
+
"app/models/clearance_mailer.rb"].each do |file|
|
16
16
|
m.file file, file
|
17
17
|
end
|
18
18
|
|
@@ -34,8 +34,8 @@ class ClearanceGenerator < Rails::Generator::Base
|
|
34
34
|
end
|
35
35
|
|
36
36
|
m.directory File.join("app", "views", "user_mailer")
|
37
|
-
["app/views/
|
38
|
-
"app/views/
|
37
|
+
["app/views/clearance_mailer/change_password.html.erb",
|
38
|
+
"app/views/clearance_mailer/confirmation.html.erb"].each do |file|
|
39
39
|
m.file file, file
|
40
40
|
end
|
41
41
|
|
@@ -55,7 +55,7 @@ class ClearanceGenerator < Rails::Generator::Base
|
|
55
55
|
end
|
56
56
|
|
57
57
|
m.directory File.join("test", "unit")
|
58
|
-
["test/unit/
|
58
|
+
["test/unit/clearance_mailer_test.rb",
|
59
59
|
"test/unit/user_test.rb"].each do |file|
|
60
60
|
m.file file, file
|
61
61
|
end
|
data/lib/clearance.rb
CHANGED
@@ -4,12 +4,12 @@ require 'clearance/app/controllers/passwords_controller'
|
|
4
4
|
require 'clearance/app/controllers/sessions_controller'
|
5
5
|
require 'clearance/app/controllers/users_controller'
|
6
6
|
require 'clearance/app/models/user'
|
7
|
-
require 'clearance/app/models/
|
7
|
+
require 'clearance/app/models/clearance_mailer'
|
8
8
|
require 'clearance/test/functional/confirmations_controller_test'
|
9
9
|
require 'clearance/test/functional/sessions_controller_test'
|
10
10
|
require 'clearance/test/functional/users_controller_test'
|
11
11
|
require 'clearance/test/functional/passwords_controller_test'
|
12
12
|
require 'clearance/test/test_helper'
|
13
13
|
require 'clearance/test/unit/user_test'
|
14
|
-
require 'clearance/test/unit/
|
14
|
+
require 'clearance/test/unit/clearance_mailer_test'
|
15
15
|
require 'clearance/version'
|
@@ -27,7 +27,7 @@ module Clearance
|
|
27
27
|
|
28
28
|
module ProtectedInstanceMethods
|
29
29
|
def authenticate
|
30
|
-
deny_access unless
|
30
|
+
deny_access unless logged_in?
|
31
31
|
end
|
32
32
|
|
33
33
|
def user_from_session
|
@@ -39,13 +39,15 @@ module Clearance
|
|
39
39
|
user && user.remember_token? ? user : nil
|
40
40
|
end
|
41
41
|
|
42
|
-
|
43
|
-
|
44
|
-
|
42
|
+
# Level of indirection so you can easily override this method
|
43
|
+
# but also call #login .
|
44
|
+
def log_user_in(user)
|
45
|
+
login(user)
|
45
46
|
end
|
46
47
|
|
47
|
-
def
|
48
|
+
def login(user)
|
48
49
|
session[:user_id] = user.id if user
|
50
|
+
@current_user = user
|
49
51
|
end
|
50
52
|
|
51
53
|
def redirect_back_or(default)
|
@@ -62,7 +64,7 @@ module Clearance
|
|
62
64
|
end
|
63
65
|
|
64
66
|
def deny_access(flash_message = nil, opts = {})
|
65
|
-
opts[:redirect] ||=
|
67
|
+
opts[:redirect] ||= new_session_path
|
66
68
|
store_location
|
67
69
|
flash[:error] = flash_message if flash_message
|
68
70
|
redirect_to opts[:redirect]
|
@@ -71,6 +73,10 @@ module Clearance
|
|
71
73
|
def user_model
|
72
74
|
User
|
73
75
|
end
|
76
|
+
|
77
|
+
def mailer_model
|
78
|
+
ClearanceMailer
|
79
|
+
end
|
74
80
|
end
|
75
81
|
end
|
76
82
|
end
|
@@ -18,8 +18,20 @@ module Clearance
|
|
18
18
|
|
19
19
|
module InstanceMethods
|
20
20
|
def create
|
21
|
-
|
22
|
-
|
21
|
+
@user = user_model.authenticate(params[:session][:email], params[:session][:password])
|
22
|
+
if @user.nil?
|
23
|
+
login_failure
|
24
|
+
else
|
25
|
+
if @user.confirmed?
|
26
|
+
remember_me = params[:session][:remember_me] if params[:session]
|
27
|
+
remember(@user) if remember_me == '1'
|
28
|
+
log_user_in(@user)
|
29
|
+
login_successful
|
30
|
+
else
|
31
|
+
mailer_model.deliver_confirmation(@user)
|
32
|
+
deny_access('Account not confirmed. Confirmation email sent.')
|
33
|
+
end
|
34
|
+
end
|
23
35
|
end
|
24
36
|
|
25
37
|
def destroy
|
@@ -31,17 +43,6 @@ module Clearance
|
|
31
43
|
end
|
32
44
|
|
33
45
|
module PrivateInstanceMethods
|
34
|
-
def login_via_password(email, password, remember_me)
|
35
|
-
user = user_model.authenticate(email, password)
|
36
|
-
if login(user)
|
37
|
-
create_session_for(user)
|
38
|
-
remember(user) if remember_me == '1'
|
39
|
-
login_successful
|
40
|
-
else
|
41
|
-
login_failure
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
46
|
def login_successful
|
46
47
|
flash[:notice] = 'Logged in successfully'
|
47
48
|
redirect_back_or url_after_create
|
@@ -24,7 +24,7 @@ module Clearance
|
|
24
24
|
def create
|
25
25
|
@user = user_model.new params[:user]
|
26
26
|
if @user.save
|
27
|
-
|
27
|
+
ClearanceMailer.deliver_confirmation @user
|
28
28
|
flash[:notice] = "You will receive an email within the next few minutes. It contains instructions for you to confirm your account."
|
29
29
|
redirect_to url_after_create
|
30
30
|
else
|
@@ -5,22 +5,45 @@ module Clearance
|
|
5
5
|
|
6
6
|
def self.included(base)
|
7
7
|
base.class_eval do
|
8
|
-
|
9
|
-
|
8
|
+
should_filter_params :password
|
9
|
+
|
10
|
+
context "on GET to /sessions/new" do
|
11
|
+
setup { get :new }
|
12
|
+
|
13
|
+
should_respond_with :success
|
14
|
+
should_render_template :new
|
15
|
+
should_not_set_the_flash
|
16
|
+
should_have_form :action => "session_path",
|
17
|
+
:fields => { "session[email]" => :text,
|
18
|
+
"session[password]" => :password,
|
19
|
+
"session[remember_me]" => :checkbox }
|
20
|
+
end
|
10
21
|
|
11
|
-
|
22
|
+
context "Given an unconfirmed user" do
|
23
|
+
setup do
|
24
|
+
@user = Factory(:user, :confirmed => false)
|
25
|
+
end
|
12
26
|
|
13
|
-
context "
|
14
|
-
setup
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
27
|
+
context "a POST to #create with good credentials" do
|
28
|
+
setup do
|
29
|
+
ActionMailer::Base.deliveries.clear
|
30
|
+
post :create, :session => {
|
31
|
+
:email => @user.email,
|
32
|
+
:password => @user.password
|
33
|
+
}
|
34
|
+
end
|
35
|
+
|
36
|
+
should_deny_access(:flash => /confirm/i)
|
37
|
+
|
38
|
+
should "send the confirmation email" do
|
39
|
+
assert_not_nil email = ActionMailer::Base.deliveries[0]
|
40
|
+
assert_match /account confirmation/i, email.subject
|
41
|
+
end
|
23
42
|
end
|
43
|
+
end
|
44
|
+
|
45
|
+
context "Given a confirmed user" do
|
46
|
+
setup { @user = Factory(:user, :confirmed => true) }
|
24
47
|
|
25
48
|
context "a POST to #create with good credentials" do
|
26
49
|
setup do
|
@@ -49,15 +49,20 @@ module Clearance
|
|
49
49
|
end
|
50
50
|
|
51
51
|
logged_in_user_context do
|
52
|
+
context "GET to new" do
|
53
|
+
setup { get :new }
|
54
|
+
should_redirect_to 'root_url'
|
55
|
+
end
|
52
56
|
|
53
|
-
|
54
|
-
|
55
|
-
|
57
|
+
context "POST to create" do
|
58
|
+
setup { post :create, :user => {} }
|
59
|
+
should_redirect_to 'root_url'
|
60
|
+
end
|
56
61
|
|
62
|
+
should_filter_params :password
|
57
63
|
end
|
58
64
|
end
|
59
65
|
end
|
60
|
-
|
61
66
|
end
|
62
67
|
end
|
63
68
|
end
|
@@ -23,16 +23,20 @@ module Clearance
|
|
23
23
|
|
24
24
|
module ClassMethods
|
25
25
|
def should_deny_access_on(command, opts = {})
|
26
|
-
opts[:redirect] ||= "root_url"
|
27
26
|
|
28
27
|
context "on #{command}" do
|
29
28
|
setup { eval command }
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
29
|
+
should_deny_access(opts)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def should_deny_access(opts = {})
|
34
|
+
opts[:redirect] ||= "new_session_path"
|
35
|
+
should_redirect_to opts[:redirect]
|
36
|
+
if opts[:flash]
|
37
|
+
should_set_the_flash_to opts[:flash]
|
38
|
+
else
|
39
|
+
should_not_set_the_flash
|
36
40
|
end
|
37
41
|
end
|
38
42
|
|
@@ -2,12 +2,15 @@ ActionController::Routing::Routes.draw do |map|
|
|
2
2
|
|
3
3
|
map.resources :users
|
4
4
|
map.resource :session
|
5
|
+
map.resource :session_mailer_override
|
5
6
|
|
6
7
|
map.resources :users, :has_one => :password
|
7
8
|
map.resources :users, :has_one => :confirmation
|
8
9
|
|
9
10
|
map.resources :passwords
|
11
|
+
|
12
|
+
map.resource :account
|
10
13
|
|
11
|
-
map.root :controller => '
|
14
|
+
map.root :controller => 'users', :action => 'new'
|
12
15
|
|
13
|
-
end
|
16
|
+
end
|
metadata
CHANGED
@@ -1,6 +0,0 @@
|
|
1
|
-
Someone, hopefully you, has requested that we send you a link to change your password.
|
2
|
-
|
3
|
-
Here's the link:
|
4
|
-
<%= edit_user_password_url @user, :email => @user.email, :password => @user.crypted_password %>
|
5
|
-
|
6
|
-
If you didn't request this, no need to freak out, your password hasn't been changed. You can just ignore this email.
|
@@ -1 +0,0 @@
|
|
1
|
-
<%= new_user_confirmation_url :user_id => @user, :salt => @user.salt %>
|
@@ -1,33 +0,0 @@
|
|
1
|
-
module Clearance
|
2
|
-
module App
|
3
|
-
module Models
|
4
|
-
module UserMailer
|
5
|
-
|
6
|
-
def self.included(base)
|
7
|
-
base.class_eval do
|
8
|
-
|
9
|
-
include InstanceMethods
|
10
|
-
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
module InstanceMethods
|
15
|
-
def change_password(user)
|
16
|
-
from DO_NOT_REPLY
|
17
|
-
recipients user.email
|
18
|
-
subject "[#{PROJECT_NAME.humanize}] Change your password"
|
19
|
-
body :user => user
|
20
|
-
end
|
21
|
-
|
22
|
-
def confirmation(user)
|
23
|
-
recipients user.email
|
24
|
-
from DO_NOT_REPLY
|
25
|
-
subject "[#{PROJECT_NAME.humanize}] Email confirmation"
|
26
|
-
body :user => user
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
@@ -1,63 +0,0 @@
|
|
1
|
-
module Clearance
|
2
|
-
module Test
|
3
|
-
module Unit
|
4
|
-
module UserMailerTest
|
5
|
-
|
6
|
-
def self.included(base)
|
7
|
-
base.class_eval do
|
8
|
-
context "A change password email" do
|
9
|
-
setup do
|
10
|
-
@user = Factory :user
|
11
|
-
@email = UserMailer.create_change_password @user
|
12
|
-
end
|
13
|
-
|
14
|
-
should "set its from address to DO_NOT_REPLY" do
|
15
|
-
assert_equal DO_NOT_REPLY, @email.from[0]
|
16
|
-
end
|
17
|
-
|
18
|
-
should "contain a link to edit the user's password" do
|
19
|
-
host = ActionMailer::Base.default_url_options[:host]
|
20
|
-
regexp = %r{http://#{host}/users/#{@user.id}/password/edit\?email=#{@user.email.gsub("@", "%40")}&password=#{@user.crypted_password}}
|
21
|
-
assert_match regexp, @email.body
|
22
|
-
end
|
23
|
-
|
24
|
-
should "be sent to the user" do
|
25
|
-
assert_equal [@user.email], @email.to
|
26
|
-
end
|
27
|
-
|
28
|
-
should "have a subject of '[PROJECT_NAME] Change your password'" do
|
29
|
-
assert_equal @email.subject, "[#{PROJECT_NAME.humanize}] Change your password"
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
context "A confirmation email" do
|
34
|
-
setup do
|
35
|
-
@user = Factory :user
|
36
|
-
@email = UserMailer.create_confirmation @user
|
37
|
-
end
|
38
|
-
|
39
|
-
should 'set its recipient to the given user' do
|
40
|
-
assert_equal @user.email, @email.to[0]
|
41
|
-
end
|
42
|
-
|
43
|
-
should 'set its subject' do
|
44
|
-
assert_equal "[#{PROJECT_NAME.humanize}] Email confirmation", @email.subject
|
45
|
-
end
|
46
|
-
|
47
|
-
should 'set its from address to DO_NOT_REPLY' do
|
48
|
-
assert_equal DO_NOT_REPLY, @email.from[0]
|
49
|
-
end
|
50
|
-
|
51
|
-
should "contain a link to confirm the user's account" do
|
52
|
-
host = ActionMailer::Base.default_url_options[:host]
|
53
|
-
regexp = %r{http://#{host}/users/#{@user.id}/confirmation/new\?salt=#{@user.salt}}
|
54
|
-
assert_match regexp, @email.body
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
@@ -1,6 +0,0 @@
|
|
1
|
-
Someone, hopefully you, has requested that we send you a link to change your password.
|
2
|
-
|
3
|
-
Here's the link:
|
4
|
-
<%= edit_user_password_url @user, :email => @user.email, :password => @user.crypted_password %>
|
5
|
-
|
6
|
-
If you didn't request this, no need to freak out, your password hasn't been changed. You can just ignore this email.
|
@@ -1 +0,0 @@
|
|
1
|
-
<%= new_user_confirmation_url :user_id => @user, :salt => @user.salt %>
|