mischa-clearance 0.3.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. data/LICENSE +21 -0
  2. data/README.textile +136 -0
  3. data/Rakefile +83 -0
  4. data/TODO.textile +24 -0
  5. data/generators/clearance/USAGE +1 -0
  6. data/generators/clearance/clearance_generator.rb +69 -0
  7. data/generators/clearance/templates/app/controllers/application.rb +5 -0
  8. data/generators/clearance/templates/app/controllers/confirmations_controller.rb +3 -0
  9. data/generators/clearance/templates/app/controllers/passwords_controller.rb +3 -0
  10. data/generators/clearance/templates/app/controllers/sessions_controller.rb +3 -0
  11. data/generators/clearance/templates/app/controllers/users_controller.rb +3 -0
  12. data/generators/clearance/templates/app/models/clearance_mailer.rb +5 -0
  13. data/generators/clearance/templates/app/models/user.rb +3 -0
  14. data/generators/clearance/templates/app/views/clearance_mailer/change_password.html.erb +6 -0
  15. data/generators/clearance/templates/app/views/clearance_mailer/confirmation.html.erb +1 -0
  16. data/generators/clearance/templates/app/views/confirmations/new.html.erb +6 -0
  17. data/generators/clearance/templates/app/views/passwords/edit.html.erb +23 -0
  18. data/generators/clearance/templates/app/views/passwords/new.html.erb +15 -0
  19. data/generators/clearance/templates/app/views/sessions/new.html.erb +26 -0
  20. data/generators/clearance/templates/app/views/users/_form.html.erb +13 -0
  21. data/generators/clearance/templates/app/views/users/edit.html.erb +4 -0
  22. data/generators/clearance/templates/app/views/users/new.html.erb +4 -0
  23. data/generators/clearance/templates/test/factories.rb +9 -0
  24. data/generators/clearance/templates/test/functional/confirmations_controller_test.rb +5 -0
  25. data/generators/clearance/templates/test/functional/passwords_controller_test.rb +5 -0
  26. data/generators/clearance/templates/test/functional/sessions_controller_test.rb +5 -0
  27. data/generators/clearance/templates/test/functional/users_controller_test.rb +5 -0
  28. data/generators/clearance/templates/test/unit/clearance_mailer_test.rb +6 -0
  29. data/generators/clearance/templates/test/unit/user_test.rb +5 -0
  30. data/lib/clearance.rb +15 -0
  31. data/lib/clearance/app/controllers/application_controller.rb +84 -0
  32. data/lib/clearance/app/controllers/confirmations_controller.rb +46 -0
  33. data/lib/clearance/app/controllers/passwords_controller.rb +67 -0
  34. data/lib/clearance/app/controllers/sessions_controller.rb +79 -0
  35. data/lib/clearance/app/controllers/users_controller.rb +47 -0
  36. data/lib/clearance/app/models/clearance_mailer.rb +33 -0
  37. data/lib/clearance/app/models/user.rb +86 -0
  38. data/lib/clearance/test/functional/confirmations_controller_test.rb +85 -0
  39. data/lib/clearance/test/functional/passwords_controller_test.rb +188 -0
  40. data/lib/clearance/test/functional/sessions_controller_test.rb +148 -0
  41. data/lib/clearance/test/functional/users_controller_test.rb +69 -0
  42. data/lib/clearance/test/test_helper.rb +94 -0
  43. data/lib/clearance/test/unit/clearance_mailer_test.rb +63 -0
  44. data/lib/clearance/test/unit/user_test.rb +208 -0
  45. data/lib/clearance/version.rb +7 -0
  46. metadata +127 -0
@@ -0,0 +1,69 @@
1
+ module Clearance
2
+ module Test
3
+ module Functional
4
+ module UsersControllerTest
5
+
6
+ def self.included(base)
7
+ base.class_eval do
8
+ public_context do
9
+
10
+ context "on GET to /users/new" do
11
+ setup { get :new }
12
+ should_respond_with :success
13
+ should_render_template :new
14
+ should_not_set_the_flash
15
+ should_have_form :action => "users_path",
16
+ :method => :post,
17
+ :fields => { :email => :text,
18
+ :password => :password,
19
+ :password_confirmation => :password }
20
+
21
+ context "with params" do
22
+ setup do
23
+ @email = 'a@example.com'
24
+ get :new, :user => {:email => @email}
25
+ end
26
+
27
+ should_assign_to :user
28
+ should "set the @user's params" do
29
+ assert_equal @email, assigns(:user).email
30
+ end
31
+ end
32
+ end
33
+
34
+ context "on POST to /users" do
35
+ setup do
36
+ post :create, :user => {
37
+ :email => Factory.next(:email),
38
+ :password => 'skerit',
39
+ :password_confirmation => 'skerit'
40
+ }
41
+ end
42
+
43
+ should_set_the_flash_to /confirm/i
44
+ should_redirect_to "@controller.send(:url_after_create)"
45
+ should_assign_to :user
46
+ should_change 'User.count', :by => 1
47
+ end
48
+
49
+ end
50
+
51
+ logged_in_user_context do
52
+ context "GET to new" do
53
+ setup { get :new }
54
+ should_redirect_to 'root_url'
55
+ end
56
+
57
+ context "POST to create" do
58
+ setup { post :create, :user => {} }
59
+ should_redirect_to 'root_url'
60
+ end
61
+
62
+ should_filter_params :password
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,94 @@
1
+ module Clearance
2
+ module Test
3
+ module TestHelper
4
+
5
+ def self.included(base)
6
+ base.class_eval do
7
+ include InstanceMethods
8
+ extend ClassMethods
9
+ end
10
+ end
11
+
12
+ module InstanceMethods
13
+ def login_as(user = nil)
14
+ user ||= Factory(:user)
15
+ @request.session[:user_id] = user.id
16
+ return user
17
+ end
18
+
19
+ def logout
20
+ @request.session[:user_id] = nil
21
+ end
22
+ end
23
+
24
+ module ClassMethods
25
+ def should_deny_access_on(command, opts = {})
26
+
27
+ context "on #{command}" do
28
+ setup { eval command }
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
40
+ end
41
+ end
42
+
43
+ # should_have_form :action => 'admin_users_path',
44
+ # :method => :get,
45
+ # :fields => { 'email' => :text }
46
+ # TODO: http_method should be pulled out
47
+ def should_have_form(opts)
48
+ model = self.name.gsub(/ControllerTest$/, '').singularize.downcase
49
+ model = model[model.rindex('::')+2..model.size] if model.include?('::')
50
+ http_method, hidden_http_method = form_http_method opts[:method]
51
+ should "have a #{model} form" do
52
+ assert_select "form[action=?][method=#{http_method}]", eval(opts[:action]) do
53
+ if hidden_http_method
54
+ assert_select "input[type=hidden][name=_method][value=#{hidden_http_method}]"
55
+ end
56
+ opts[:fields].each do |attribute, type|
57
+ attribute = attribute.is_a?(Symbol) ? "#{model}[#{attribute.to_s}]" : attribute
58
+ assert_select "input[type=#{type.to_s}][name=?]", attribute
59
+ end
60
+ assert_select "input[type=submit]"
61
+ end
62
+ end
63
+ end
64
+
65
+ def form_http_method(http_method)
66
+ http_method = http_method.nil? ? 'post' : http_method.to_s
67
+ if http_method == "post" || http_method == "get"
68
+ return http_method, nil
69
+ else
70
+ return "post", http_method
71
+ end
72
+ end
73
+
74
+ def logged_in_user_context(&blk)
75
+ context "A logged in user" do
76
+ setup do
77
+ @user = Factory :user
78
+ login_as @user
79
+ end
80
+ merge_block(&blk)
81
+ end
82
+ end
83
+
84
+ def public_context(&blk)
85
+ context "The public" do
86
+ setup { logout }
87
+ merge_block(&blk)
88
+ end
89
+ end
90
+ end
91
+
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,63 @@
1
+ module Clearance
2
+ module Test
3
+ module Unit
4
+ module ClearanceMailerTest
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 = ClearanceMailer.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 = ClearanceMailer.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}] Account 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
@@ -0,0 +1,208 @@
1
+ module Clearance
2
+ module Test
3
+ module Unit
4
+ module UserTest
5
+
6
+ def self.included(base)
7
+ base.class_eval do
8
+ should_require_attributes :email, :password
9
+
10
+ should "require password validation on create" do
11
+ user = Factory.build(:user, :password => 'blah', :password_confirmation => 'boogidy')
12
+ assert !user.save
13
+ assert_match(/confirmation/i, user.errors.on(:password))
14
+ end
15
+
16
+ should "create a crypted_password on save" do
17
+ assert_not_nil Factory(:user, :crypted_password => nil).crypted_password
18
+ end
19
+
20
+ context 'updating a password' do
21
+ setup do
22
+ @user = Factory(:user)
23
+ assert_not_nil @user.crypted_password
24
+ @crypt = @user.crypted_password
25
+ assert_not_nil @user.salt
26
+ @salt = @user.salt
27
+ @user.password = 'a_new_password'
28
+ @user.password_confirmation = 'a_new_password'
29
+ assert @user.save
30
+ end
31
+
32
+ should 'update a crypted_password' do
33
+ @user.reload
34
+ assert @user.crypted_password != @crypt
35
+ end
36
+ end
37
+
38
+ context 'A user' do
39
+ setup do
40
+ @salt = 'salt'
41
+ User.any_instance.stubs(:initialize_salt)
42
+ @user = Factory :user, :salt => @salt
43
+ @password = @user.password
44
+ end
45
+
46
+ should "require password validation on update" do
47
+ @user.update_attributes(:password => "blah", :password_confirmation => "boogidy")
48
+ assert !@user.save
49
+ assert_match(/confirmation/i, @user.errors.on(:password))
50
+ end
51
+
52
+ should_require_unique_attributes :email
53
+
54
+ context 'authenticating a user' do
55
+ context 'with good credentials' do
56
+ setup do
57
+ @result = User.authenticate @user.email, @password
58
+ end
59
+
60
+ should 'return true' do
61
+ assert @result
62
+ end
63
+ end
64
+
65
+ context 'with bad credentials' do
66
+ setup do
67
+ @result = User.authenticate @user.email, 'horribly_wrong_password'
68
+ end
69
+
70
+ should 'return false' do
71
+ assert !@result
72
+ end
73
+ end
74
+ end
75
+
76
+ context 'authenticated?' do
77
+ context 'with good credentials' do
78
+ setup do
79
+ @result = @user.authenticated? @password
80
+ end
81
+
82
+ should 'return true' do
83
+ assert @result
84
+ end
85
+ end
86
+
87
+ context 'with bad credentials' do
88
+ setup do
89
+ @result = @user.authenticated? 'horribly_wrong_password'
90
+ end
91
+
92
+ should 'return false' do
93
+ assert !@result
94
+ end
95
+ end
96
+ end
97
+
98
+ context 'encrypt' do
99
+ setup do
100
+ @crypted = @user.encrypt(@password)
101
+ @expected = Digest::SHA1.hexdigest("--#{@salt}--#{@password}--")
102
+ end
103
+
104
+ should 'create a Hash using SHA1 encryption' do
105
+ assert_equal @expected, @crypted
106
+ assert_not_equal @password, @crypted
107
+ end
108
+ end
109
+
110
+ context 'remember_me!' do
111
+ setup do
112
+ assert_nil @user.remember_token
113
+ assert_nil @user.remember_token_expires_at
114
+ @user.remember_me!
115
+ end
116
+
117
+ should 'set the remember token and expiration date' do
118
+ assert_not_nil @user.remember_token
119
+ assert_not_nil @user.remember_token_expires_at
120
+ end
121
+
122
+ should 'remember_token?' do
123
+ assert @user.remember_token?
124
+ end
125
+
126
+ context 'forget_me!' do
127
+ setup do
128
+ @user.forget_me!
129
+ end
130
+
131
+ should 'unset the remember token and expiration date' do
132
+ assert_nil @user.remember_token
133
+ assert_nil @user.remember_token_expires_at
134
+ end
135
+
136
+ should 'not remember_token?' do
137
+ assert ! @user.remember_token?
138
+ end
139
+ end
140
+ end
141
+
142
+ context 'remember_token?' do
143
+ context 'when token expires in the future' do
144
+ setup do
145
+ @user.update_attribute :remember_token_expires_at, 2.weeks.from_now.utc
146
+ end
147
+
148
+ should 'be true' do
149
+ assert @user.remember_token?
150
+ end
151
+ end
152
+
153
+ context 'when token expired' do
154
+ setup do
155
+ @user.update_attribute :remember_token_expires_at, 2.weeks.ago.utc
156
+ end
157
+
158
+ should 'be false' do
159
+ assert ! @user.remember_token?
160
+ end
161
+ end
162
+ end
163
+
164
+ context "User.authenticate with a valid email and password" do
165
+ setup do
166
+ @found_user = User.authenticate @user.email, @user.password
167
+ end
168
+
169
+ should "find that user" do
170
+ assert_equal @user, @found_user
171
+ end
172
+ end
173
+
174
+ context "When sent authenticate with an invalid email and password" do
175
+ setup do
176
+ @found_user = User.authenticate "not", "valid"
177
+ end
178
+
179
+ should "find nothing" do
180
+ assert_nil @found_user
181
+ end
182
+ end
183
+ end
184
+
185
+ context "A user" do
186
+ setup do
187
+ @user = Factory :user
188
+ end
189
+
190
+ context 'when sent #confirm!' do
191
+ setup do
192
+ assert ! @user.confirmed?
193
+ assert @user.confirm!
194
+ @user.reload
195
+ end
196
+
197
+ should 'mark the User record as confirmed' do
198
+ assert @user.confirmed?
199
+ end
200
+ end
201
+ end
202
+ end
203
+ end
204
+
205
+ end
206
+ end
207
+ end
208
+ end
@@ -0,0 +1,7 @@
1
+ module Clearance
2
+ module Version
3
+ MAJOR = 0
4
+ MINOR = 3
5
+ PATCH = 3
6
+ end
7
+ end
metadata ADDED
@@ -0,0 +1,127 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mischa-clearance
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.3
5
+ platform: ruby
6
+ authors:
7
+ - thoughtbot, inc.
8
+ - Dan Croak
9
+ - Josh Nichols
10
+ - Jason Morrison
11
+ - Mike Burns
12
+ - Mike Breen
13
+ - Hashrocket, Inc.
14
+ - Les Hill
15
+ - Jon Larkowski
16
+ - Wes Gibbs
17
+ autorequire:
18
+ bindir: bin
19
+ cert_chain: []
20
+
21
+ date: 2008-12-15 00:00:00 -08:00
22
+ default_executable:
23
+ dependencies: []
24
+
25
+ description: Fork of clearance, not-purely-restful, but with Facebook goodness
26
+ email: info@hashrocket.com
27
+ executables: []
28
+
29
+ extensions: []
30
+
31
+ extra_rdoc_files: []
32
+
33
+ files:
34
+ - LICENSE
35
+ - Rakefile
36
+ - README.textile
37
+ - TODO.textile
38
+ - generators/clearance
39
+ - generators/clearance/clearance_generator.rb
40
+ - generators/clearance/templates
41
+ - generators/clearance/templates/app
42
+ - generators/clearance/templates/app/controllers
43
+ - generators/clearance/templates/app/controllers/application.rb
44
+ - generators/clearance/templates/app/controllers/confirmations_controller.rb
45
+ - generators/clearance/templates/app/controllers/passwords_controller.rb
46
+ - generators/clearance/templates/app/controllers/sessions_controller.rb
47
+ - generators/clearance/templates/app/controllers/users_controller.rb
48
+ - generators/clearance/templates/app/models
49
+ - generators/clearance/templates/app/models/clearance_mailer.rb
50
+ - generators/clearance/templates/app/models/user.rb
51
+ - generators/clearance/templates/app/views
52
+ - generators/clearance/templates/app/views/clearance_mailer
53
+ - generators/clearance/templates/app/views/clearance_mailer/change_password.html.erb
54
+ - generators/clearance/templates/app/views/clearance_mailer/confirmation.html.erb
55
+ - generators/clearance/templates/app/views/confirmations
56
+ - generators/clearance/templates/app/views/confirmations/new.html.erb
57
+ - generators/clearance/templates/app/views/passwords
58
+ - generators/clearance/templates/app/views/passwords/edit.html.erb
59
+ - generators/clearance/templates/app/views/passwords/new.html.erb
60
+ - generators/clearance/templates/app/views/sessions
61
+ - generators/clearance/templates/app/views/sessions/new.html.erb
62
+ - generators/clearance/templates/app/views/users
63
+ - generators/clearance/templates/app/views/users/_form.html.erb
64
+ - generators/clearance/templates/app/views/users/edit.html.erb
65
+ - generators/clearance/templates/app/views/users/new.html.erb
66
+ - generators/clearance/templates/test
67
+ - generators/clearance/templates/test/factories.rb
68
+ - generators/clearance/templates/test/functional
69
+ - generators/clearance/templates/test/functional/confirmations_controller_test.rb
70
+ - generators/clearance/templates/test/functional/passwords_controller_test.rb
71
+ - generators/clearance/templates/test/functional/sessions_controller_test.rb
72
+ - generators/clearance/templates/test/functional/users_controller_test.rb
73
+ - generators/clearance/templates/test/unit
74
+ - generators/clearance/templates/test/unit/clearance_mailer_test.rb
75
+ - generators/clearance/templates/test/unit/user_test.rb
76
+ - generators/clearance/USAGE
77
+ - lib/clearance
78
+ - lib/clearance/app
79
+ - lib/clearance/app/controllers
80
+ - lib/clearance/app/controllers/application_controller.rb
81
+ - lib/clearance/app/controllers/confirmations_controller.rb
82
+ - lib/clearance/app/controllers/passwords_controller.rb
83
+ - lib/clearance/app/controllers/sessions_controller.rb
84
+ - lib/clearance/app/controllers/users_controller.rb
85
+ - lib/clearance/app/models
86
+ - lib/clearance/app/models/clearance_mailer.rb
87
+ - lib/clearance/app/models/user.rb
88
+ - lib/clearance/test
89
+ - lib/clearance/test/functional
90
+ - lib/clearance/test/functional/confirmations_controller_test.rb
91
+ - lib/clearance/test/functional/passwords_controller_test.rb
92
+ - lib/clearance/test/functional/sessions_controller_test.rb
93
+ - lib/clearance/test/functional/users_controller_test.rb
94
+ - lib/clearance/test/test_helper.rb
95
+ - lib/clearance/test/unit
96
+ - lib/clearance/test/unit/clearance_mailer_test.rb
97
+ - lib/clearance/test/unit/user_test.rb
98
+ - lib/clearance/version.rb
99
+ - lib/clearance.rb
100
+ has_rdoc: false
101
+ homepage: http://github.com/hashrocket/clearance
102
+ post_install_message:
103
+ rdoc_options: []
104
+
105
+ require_paths:
106
+ - lib
107
+ required_ruby_version: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ version: "0"
112
+ version:
113
+ required_rubygems_version: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: "0"
118
+ version:
119
+ requirements: []
120
+
121
+ rubyforge_project:
122
+ rubygems_version: 1.2.0
123
+ signing_key:
124
+ specification_version: 2
125
+ summary: Fork of clearance
126
+ test_files: []
127
+