mischa-clearance 0.3.3

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 (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
+