parlement 0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (162) hide show
  1. data/CHANGES +709 -0
  2. data/COPYING +223 -0
  3. data/README +20 -0
  4. data/Rakefile +136 -0
  5. data/app/controllers/account_controller.rb +181 -0
  6. data/app/controllers/application.rb +30 -0
  7. data/app/controllers/elt_controller.rb +83 -0
  8. data/app/helpers/account_helper.rb +2 -0
  9. data/app/helpers/application_helper.rb +4 -0
  10. data/app/helpers/elt_helper.rb +37 -0
  11. data/app/helpers/live_tree.rb +238 -0
  12. data/app/helpers/mailman.rb +96 -0
  13. data/app/models/attachment.rb +4 -0
  14. data/app/models/elt.rb +17 -0
  15. data/app/models/mail.rb +4 -0
  16. data/app/models/notifier.rb +13 -0
  17. data/app/models/person.rb +9 -0
  18. data/app/models/user.rb +7 -0
  19. data/app/models/user_notify.rb +75 -0
  20. data/app/views/account/_help.rhtml +23 -0
  21. data/app/views/account/_login.rhtml +57 -0
  22. data/app/views/account/_show.rhtml +31 -0
  23. data/app/views/account/logout.rhtml +10 -0
  24. data/app/views/account/signup.rhtml +17 -0
  25. data/app/views/account/welcome.rhtml +13 -0
  26. data/app/views/elt/_elt.rhtml +105 -0
  27. data/app/views/elt/_form.rhtml +31 -0
  28. data/app/views/elt/_list.rhtml +28 -0
  29. data/app/views/elt/new.rhtml +102 -0
  30. data/app/views/elt/rss.rxml +31 -0
  31. data/app/views/elt/show.rhtml +46 -0
  32. data/app/views/elt/show_tree.rhtml +8 -0
  33. data/app/views/layouts/scaffold.rhtml +13 -0
  34. data/app/views/layouts/top.rhtml +45 -0
  35. data/app/views/notifier/changeEmail.rhtml +10 -0
  36. data/config/boot.rb +17 -0
  37. data/config/database.yml +82 -0
  38. data/config/environment.rb +92 -0
  39. data/config/environments/development.rb +17 -0
  40. data/config/environments/production.rb +17 -0
  41. data/config/environments/test.rb +17 -0
  42. data/config/environments/user_environment.rb +1 -0
  43. data/config/routes.rb +28 -0
  44. data/db/ROOT/CV.txt +166 -0
  45. data/db/ROOT/IP.txt +3 -0
  46. data/db/ROOT/parleR.txt +3 -0
  47. data/db/ROOT/parlement/security.txt +34 -0
  48. data/db/ROOT/parlement/test.txt +4 -0
  49. data/db/ROOT/parlement.txt +51 -0
  50. data/db/ROOT/perso.txt +215 -0
  51. data/db/schema.sql +127 -0
  52. data/lib/data_import.rb +54 -0
  53. data/lib/file_column.rb +263 -0
  54. data/lib/file_column_helper.rb +45 -0
  55. data/lib/localization.rb +88 -0
  56. data/lib/localizer.rb +88 -0
  57. data/lib/login_system.rb +87 -0
  58. data/lib/rails_file_column.rb +19 -0
  59. data/lib/user_system.rb +101 -0
  60. data/public/404.html +8 -0
  61. data/public/500.html +8 -0
  62. data/public/dispatch.cgi +10 -0
  63. data/public/dispatch.fcgi +24 -0
  64. data/public/dispatch.rb +10 -0
  65. data/public/engine_files/README +5 -0
  66. data/public/engine_files/login_engine/stylesheets/login_engine.css +81 -0
  67. data/public/favicon.ico +0 -0
  68. data/public/favicon.png +0 -0
  69. data/public/images/live_tree_branch_collapsed_icon.gif +0 -0
  70. data/public/images/live_tree_branch_expanded_icon.gif +0 -0
  71. data/public/images/live_tree_leaf_icon.gif +0 -0
  72. data/public/images/live_tree_loading_spinner.gif +0 -0
  73. data/public/images/webfeed.gif +0 -0
  74. data/public/javascripts/controls.js +721 -0
  75. data/public/javascripts/dragdrop.js +519 -0
  76. data/public/javascripts/effects.js +992 -0
  77. data/public/javascripts/live_tree.js +749 -0
  78. data/public/javascripts/prototype.js +1726 -0
  79. data/public/javascripts/scriptaculous.js +47 -0
  80. data/public/javascripts/slider.js +258 -0
  81. data/public/oldREADME +190 -0
  82. data/public/oldindex.html +78 -0
  83. data/public/robots.txt +1 -0
  84. data/public/stylesheets/default.css +238 -0
  85. data/public/stylesheets/live_tree.css +62 -0
  86. data/public/stylesheets/scaffold.css +74 -0
  87. data/script/about +3 -0
  88. data/script/benchmarker +19 -0
  89. data/script/breakpointer +3 -0
  90. data/script/console +3 -0
  91. data/script/create_db +7 -0
  92. data/script/destroy +3 -0
  93. data/script/generate +3 -0
  94. data/script/performance/benchmarker +3 -0
  95. data/script/performance/profiler +3 -0
  96. data/script/plugin +3 -0
  97. data/script/process/reaper +3 -0
  98. data/script/process/spawner +3 -0
  99. data/script/process/spinner +3 -0
  100. data/script/profiler +34 -0
  101. data/script/runner +3 -0
  102. data/script/server +3 -0
  103. data/test/fixtures/attachments.yml +10 -0
  104. data/test/fixtures/elts.yml +15 -0
  105. data/test/fixtures/mails.yml +7 -0
  106. data/test/fixtures/people.yml +49 -0
  107. data/test/fixtures/users.yml +41 -0
  108. data/test/functional/account_controller_test.rb +239 -0
  109. data/test/functional/elt_controller_test.rb +18 -0
  110. data/test/mocks/test/time.rb +17 -0
  111. data/test/mocks/test/user_notify.rb +16 -0
  112. data/test/test_helper.rb +28 -0
  113. data/test/unit/attachment_test.rb +14 -0
  114. data/test/unit/elt_test.rb +14 -0
  115. data/test/unit/mail_test.rb +14 -0
  116. data/test/unit/notifier_test.rb +31 -0
  117. data/test/unit/person_test.rb +24 -0
  118. data/test/unit/user_test.rb +94 -0
  119. data/vendor/plugins/engines/CHANGELOG +7 -0
  120. data/vendor/plugins/engines/README +128 -0
  121. data/vendor/plugins/engines/init.rb +33 -0
  122. data/vendor/plugins/engines/lib/action_mailer_extensions.rb +160 -0
  123. data/vendor/plugins/engines/lib/action_view_extensions.rb +130 -0
  124. data/vendor/plugins/engines/lib/dependencies_extensions.rb +56 -0
  125. data/vendor/plugins/engines/lib/engines.rb +292 -0
  126. data/vendor/plugins/engines/lib/ruby_extensions.rb +127 -0
  127. data/vendor/plugins/engines/lib/testing_extensions.rb +33 -0
  128. data/vendor/plugins/engines/test/ruby_extensions_test.rb +94 -0
  129. data/vendor/plugins/login_engine/README +258 -0
  130. data/vendor/plugins/login_engine/app/controllers/user_controller.rb +248 -0
  131. data/vendor/plugins/login_engine/app/helpers/user_helper.rb +88 -0
  132. data/vendor/plugins/login_engine/app/models/user.rb +7 -0
  133. data/vendor/plugins/login_engine/app/models/user_notify.rb +75 -0
  134. data/vendor/plugins/login_engine/app/views/user/_edit.rhtml +11 -0
  135. data/vendor/plugins/login_engine/app/views/user/_password.rhtml +9 -0
  136. data/vendor/plugins/login_engine/app/views/user/change_password.rhtml +17 -0
  137. data/vendor/plugins/login_engine/app/views/user/edit.rhtml +23 -0
  138. data/vendor/plugins/login_engine/app/views/user/forgot_password.rhtml +18 -0
  139. data/vendor/plugins/login_engine/app/views/user/home.rhtml +7 -0
  140. data/vendor/plugins/login_engine/app/views/user/login.rhtml +17 -0
  141. data/vendor/plugins/login_engine/app/views/user/logout.rhtml +8 -0
  142. data/vendor/plugins/login_engine/app/views/user/signup.rhtml +17 -0
  143. data/vendor/plugins/login_engine/app/views/user_notify/change_password.rhtml +10 -0
  144. data/vendor/plugins/login_engine/app/views/user_notify/delete.rhtml +5 -0
  145. data/vendor/plugins/login_engine/app/views/user_notify/forgot_password.rhtml +11 -0
  146. data/vendor/plugins/login_engine/app/views/user_notify/pending_delete.rhtml +9 -0
  147. data/vendor/plugins/login_engine/app/views/user_notify/signup.rhtml +12 -0
  148. data/vendor/plugins/login_engine/db/schema.rb +25 -0
  149. data/vendor/plugins/login_engine/init_engine.rb +10 -0
  150. data/vendor/plugins/login_engine/lib/login_engine/authenticated_system.rb +107 -0
  151. data/vendor/plugins/login_engine/lib/login_engine/authenticated_user.rb +149 -0
  152. data/vendor/plugins/login_engine/lib/login_engine.rb +58 -0
  153. data/vendor/plugins/login_engine/public/stylesheets/login_engine.css +81 -0
  154. data/vendor/plugins/login_engine/tasks/tasks.rake +4 -0
  155. data/vendor/plugins/login_engine/test/fixtures/templates/users.yml +41 -0
  156. data/vendor/plugins/login_engine/test/fixtures/users.yml +41 -0
  157. data/vendor/plugins/login_engine/test/functional/user_controller_test.rb +533 -0
  158. data/vendor/plugins/login_engine/test/mocks/mail.rb +14 -0
  159. data/vendor/plugins/login_engine/test/mocks/time.rb +19 -0
  160. data/vendor/plugins/login_engine/test/test_helper.rb +15 -0
  161. data/vendor/plugins/login_engine/test/unit/user_test.rb +94 -0
  162. metadata +276 -0
@@ -0,0 +1,533 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+ require_dependency 'user_controller'
3
+ require 'breakpoint'
4
+
5
+
6
+ # Raise errors beyond the default web-based presentation
7
+ class UserController; def rescue_action(e) raise e end; end
8
+
9
+ class UserControllerTest < Test::Unit::TestCase
10
+
11
+ fixtures LoginEngine.config(:user_table).to_sym
12
+
13
+ def setup
14
+
15
+ LoginEngine::CONFIG[:salt] = "test-salt"
16
+
17
+ @controller = UserController.new
18
+ @request, @response = ActionController::TestRequest.new, ActionController::TestResponse.new
19
+ @request.host = "localhost"
20
+ end
21
+
22
+
23
+
24
+ #==========================================================================
25
+ #
26
+ # Login/Logout
27
+ #
28
+ #==========================================================================
29
+
30
+ def test_home_without_login
31
+ get :home
32
+ assert_redirected_to :action => "login"
33
+ end
34
+
35
+ def test_invalid_login
36
+ post :login, :user => { :login => "bob", :password => "wrong_password" }
37
+ assert_response :success
38
+
39
+ assert_session_has_no :user
40
+ assert_template "login"
41
+ end
42
+
43
+ def test_login
44
+ @request.session['return-to'] = "/bogus/location"
45
+
46
+ post :login, :user => { :login => "bob", :password => "atest" }
47
+
48
+ assert_response 302 # redirect
49
+ assert_session_has :user
50
+ assert_equal fixture_object(LoginEngine.config(:user_table).to_sym, :bob), session[:user]
51
+
52
+ assert_redirect_url "http://#{@request.host}/bogus/location"
53
+ end
54
+
55
+ def test_login_logoff
56
+
57
+ post :login, :user => { :login => "bob", :password => "atest" }
58
+ assert_session_has :user
59
+
60
+ get :logout
61
+ assert_session_has_no :user
62
+
63
+ end
64
+
65
+
66
+ #==========================================================================
67
+ #
68
+ # Signup
69
+ #
70
+ #==========================================================================
71
+
72
+ def test_signup
73
+ LoginEngine::CONFIG[:use_email_notification] = true
74
+
75
+ ActionMailer::Base.deliveries = []
76
+
77
+ @request.session['return-to'] = "/bogus/location"
78
+
79
+ assert_equal 5, User.count
80
+ post :signup, :user => { :login => "newbob", :password => "newpassword", :password_confirmation => "newpassword", :email => "newbob@test.com" }
81
+ assert_session_has_no :user
82
+
83
+ assert_redirect_url(@controller.url_for(:action => "login"))
84
+ assert_equal 1, ActionMailer::Base.deliveries.size
85
+ mail = ActionMailer::Base.deliveries[0]
86
+ assert_equal "newbob@test.com", mail.to_addrs[0].to_s
87
+ assert_match /login:\s+\w+\n/, mail.encoded
88
+ assert_match /password:\s+\w+\n/, mail.encoded
89
+ mail.encoded =~ /key=(.*?)"/
90
+ key = $1
91
+
92
+ user = User.find_by_email("newbob@test.com")
93
+ assert_not_nil user
94
+ assert_equal 0, user.verified
95
+
96
+ # First past the expiration.
97
+ Time.advance_by_days = 1
98
+ get :home, :user=> { "id" => "#{user.id}" }, "key" => "#{key}"
99
+ Time.advance_by_days = 0
100
+ user = User.find_by_email("newbob@test.com")
101
+ assert_equal 0, user.verified
102
+
103
+ # Then a bogus key.
104
+ get :home, :user=> { "id" => "#{user.id}" }, "key" => "boguskey"
105
+ user = User.find_by_email("newbob@test.com")
106
+ assert_equal 0, user.verified
107
+
108
+ # Now the real one.
109
+ get :home, :user=> { "id" => "#{user.id}" }, "key" => "#{key}"
110
+ user = User.find_by_email("newbob@test.com")
111
+ assert_equal 1, user.verified
112
+
113
+ post :login, :user => { :login => "newbob", :password => "newpassword" }
114
+ assert_session_has :user
115
+ get :logout
116
+
117
+ end
118
+
119
+ def test_signup_bad_password
120
+ LoginEngine::CONFIG[:use_email_notification] = true
121
+ ActionMailer::Base.deliveries = []
122
+
123
+ @request.session['return-to'] = "/bogus/location"
124
+ post :signup, :user => { :login => "newbob", :password => "bad", :password_confirmation => "bad", :email => "newbob@test.com" }
125
+ assert_session_has_no :user
126
+ assert_invalid_column_on_record "user", "password"
127
+ assert_success
128
+ assert_equal 0, ActionMailer::Base.deliveries.size
129
+ end
130
+
131
+ def test_signup_bad_email
132
+ LoginEngine::CONFIG[:use_email_notification] = true
133
+ ActionMailer::Base.deliveries = []
134
+
135
+ @request.session['return-to'] = "/bogus/location"
136
+
137
+ ActionMailer::Base.inject_one_error = true
138
+ post :signup, :user => { :login => "newbob", :password => "newpassword", :password_confirmation => "newpassword", :email => "newbob@test.com" }
139
+ assert_session_has_no :user
140
+ assert_equal 0, ActionMailer::Base.deliveries.size
141
+ end
142
+
143
+ def test_signup_without_email
144
+ LoginEngine::CONFIG[:use_email_notification] = false
145
+
146
+ @request.session['return-to'] = "/bogus/location"
147
+
148
+ post :signup, :user => { :login => "newbob", :password => "newpassword", :password_confirmation => "newpassword", :email => "newbob@test.com" }
149
+
150
+ assert_redirect_url(@controller.url_for(:action => "login"))
151
+ assert_session_has_no :user
152
+ assert_match /Signup successful/, flash[:notice]
153
+
154
+ assert_not_nil User.find_by_login("newbob")
155
+
156
+ user = User.find_by_email("newbob@test.com")
157
+ assert_not_nil user
158
+
159
+ post :login, :user => { :login => "newbob", :password => "newpassword" }
160
+ assert_session_has :user
161
+ get :logout
162
+ end
163
+
164
+ def test_signup_bad_details
165
+ @request.session['return-to'] = "/bogus/location"
166
+
167
+ # mismatched password
168
+ post :signup, :user => { :login => "newbob", :password => "newpassword", :password_confirmation => "wrong" }
169
+ assert_invalid_column_on_record "user", "password"
170
+ assert_success
171
+
172
+ # login not long enough
173
+ post :signup, :user => { :login => "yo", :password => "newpassword", :password_confirmation => "newpassword" }
174
+ assert_invalid_column_on_record "user", "login"
175
+ assert_success
176
+
177
+ # both
178
+ post :signup, :user => { :login => "yo", :password => "newpassword", :password_confirmation => "wrong" }
179
+ assert_invalid_column_on_record "user", ["login", "password"]
180
+ assert_success
181
+
182
+ # existing user
183
+ post :signup, :user => { :login => "bob", :password => "doesnt_matter", :password_confirmation => "doesnt_matter" }
184
+ assert_invalid_column_on_record "user", "login"
185
+ assert_success
186
+
187
+ # existing email
188
+ post :signup, :user => { :login => "newbob", :email => "longbob@test.com", :password => "doesnt_matter", :password_confirmation => "doesnt_matter" }
189
+ assert_invalid_column_on_record "user", "email"
190
+ assert_success
191
+
192
+ end
193
+
194
+
195
+ #==========================================================================
196
+ #
197
+ # Edit
198
+ #
199
+ #==========================================================================
200
+
201
+ def test_edit
202
+ post :login, :user => { :login => "bob", :password => "atest" }
203
+ assert_session_has :user
204
+
205
+ post :edit, :user => { "firstname" => "Bob", "form" => "edit" }
206
+ assert_equal @response.session[:user].firstname, "Bob"
207
+
208
+ post :edit, :user => { "firstname" => "", "form" => "edit" }
209
+ assert_equal @response.session[:user].firstname, ""
210
+
211
+ get :logout
212
+ end
213
+
214
+
215
+
216
+ #==========================================================================
217
+ #
218
+ # Delete
219
+ #
220
+ #==========================================================================
221
+
222
+ def test_delete
223
+ LoginEngine::CONFIG[:use_email_notification] = true
224
+ # Immediate delete
225
+ post :login, :user => { :login => "deletebob1", :password => "alongtest" }
226
+ assert_session_has :user
227
+
228
+ LoginEngine.config :delayed_delete, false, :force
229
+ post :delete
230
+ assert_equal 1, ActionMailer::Base.deliveries.size
231
+ assert_session_has_no :user
232
+
233
+ # try and login in again, we should fail.
234
+ post :login, :user => { :login => "deletebob1", :password => "alongtest" }
235
+ assert_session_has_no :user
236
+ assert_template_has "login"
237
+
238
+
239
+ # Now try delayed delete
240
+ ActionMailer::Base.deliveries = []
241
+
242
+ post :login, :user => { :login => "deletebob2", :password => "alongtest" }
243
+ assert_session_has :user
244
+
245
+ LoginEngine.config :delayed_delete, true, :force
246
+ post :delete
247
+ assert_equal 1, ActionMailer::Base.deliveries.size
248
+ mail = ActionMailer::Base.deliveries[0]
249
+ mail.encoded =~ /user\[id\]=(.*?)&key=(.*?)"/
250
+ id = $1
251
+ key = $2
252
+
253
+ post :restore_deleted, :user => { "id" => "#{id}" }, "key" => "badkey"
254
+ assert_session_has_no :user
255
+
256
+ # Advance the time past the delete date
257
+ Time.advance_by_days = LoginEngine.config :delayed_delete_days
258
+ post :restore_deleted, :user => { "id" => "#{id}" }, "key" => "#{key}"
259
+ assert_session_has_no :user
260
+ Time.advance_by_days = 0
261
+
262
+ post :restore_deleted, :user => { "id" => "#{id}" }, "key" => "#{key}"
263
+ assert_session_has :user
264
+ end
265
+
266
+ def test_delete_without_email
267
+ LoginEngine::CONFIG[:use_email_notification] = false
268
+ ActionMailer::Base.deliveries = []
269
+
270
+ # Immediate delete
271
+ post :login, :user => { :login => "deletebob1", :password => "alongtest" }
272
+ assert_session_has :user
273
+
274
+ LoginEngine.config :delayed_delete, false, :force
275
+ post :delete
276
+ assert_session_has_no :user
277
+ assert_nil User.find_by_login("deletebob1")
278
+
279
+ # try and login in again, we should fail.
280
+ post :login, :user => { :login => "deletebob1", :password => "alongtest" }
281
+ assert_session_has_no :user
282
+ assert_template_has "login"
283
+
284
+
285
+ # Now try delayed delete
286
+ ActionMailer::Base.deliveries = []
287
+
288
+ post :login, :user => { :login => "deletebob2", :password => "alongtest" }
289
+ assert_session_has :user
290
+
291
+ # delayed delete is not really relevant currently without email.
292
+ LoginEngine.config :delayed_delete, true, :force
293
+ post :delete
294
+ assert_equal 1, User.find_by_login("deletebob2").deleted
295
+ end
296
+
297
+
298
+
299
+ #==========================================================================
300
+ #
301
+ # Change Password
302
+ #
303
+ #==========================================================================
304
+
305
+ def test_change_valid_password
306
+
307
+ LoginEngine::CONFIG[:use_email_notification] = true
308
+
309
+ ActionMailer::Base.deliveries = []
310
+
311
+ post :login, :user => { :login => "bob", :password => "atest" }
312
+ assert_session_has :user
313
+
314
+ post :change_password, :user => { :password => "changed_password", :password_confirmation => "changed_password" }
315
+
316
+ assert_equal 1, ActionMailer::Base.deliveries.size
317
+ mail = ActionMailer::Base.deliveries[0]
318
+ assert_equal "bob@test.com", mail.to_addrs[0].to_s
319
+ assert_match /login:\s+\w+\n/, mail.encoded
320
+ assert_match /password:\s+\w+\n/, mail.encoded
321
+
322
+ post :login, :user => { :login => "bob", :password => "changed_password" }
323
+ assert_session_has :user
324
+ post :change_password, :user => { :password => "atest", :password_confirmation => "atest" }
325
+ get :logout
326
+
327
+ post :login, :user => { :login => "bob", :password => "atest" }
328
+ assert_session_has :user
329
+
330
+ get :logout
331
+ end
332
+
333
+ def test_change_valid_password_without_email
334
+
335
+ LoginEngine::CONFIG[:use_email_notification] = false
336
+
337
+ ActionMailer::Base.deliveries = []
338
+
339
+ post :login, :user => { :login => "bob", :password => "atest" }
340
+ assert_session_has :user
341
+
342
+ post :change_password, :user => { :password => "changed_password", :password_confirmation => "changed_password" }
343
+
344
+ assert_success
345
+
346
+ post :login, :user => { :login => "bob", :password => "changed_password" }
347
+ assert_session_has :user
348
+ post :change_password, :user => { :password => "atest", :password_confirmation => "atest" }
349
+ get :logout
350
+
351
+ post :login, :user => { :login => "bob", :password => "atest" }
352
+ assert_session_has :user
353
+
354
+ get :logout
355
+ end
356
+
357
+ def test_change_short_password
358
+ LoginEngine::CONFIG[:use_email_notification] = true
359
+ ActionMailer::Base.deliveries = []
360
+
361
+ post :login, :user => { :login => "bob", :password => "atest" }
362
+ assert_session_has :user
363
+
364
+ post :change_password, :user => { :password => "bad", :password_confirmation => "bad" }
365
+ assert_invalid_column_on_record "user", "password"
366
+ assert_success
367
+ assert_equal 0, ActionMailer::Base.deliveries.size
368
+
369
+ post :login, :user => { :login => "bob", :password => "atest" }
370
+ assert_session_has :user
371
+
372
+ get :logout
373
+ end
374
+
375
+ def test_change_short_password_without_email
376
+ LoginEngine::CONFIG[:use_email_notification] = false
377
+ post :login, :user => { :login => "bob", :password => "atest" }
378
+ assert_session_has :user
379
+
380
+ post :change_password, :user => { :password => "bad", :password_confirmation => "bad" }
381
+ assert_invalid_column_on_record "user", "password"
382
+ assert_success
383
+
384
+ post :login, :user => { :login => "bob", :password => "atest" }
385
+ assert_session_has :user
386
+
387
+ get :logout
388
+ end
389
+
390
+
391
+ def test_change_password_with_bad_email
392
+ LoginEngine::CONFIG[:use_email_notification] = true
393
+ ActionMailer::Base.deliveries = []
394
+
395
+ # log in
396
+ post :login, :user => { :login => "bob", :password => "atest" }
397
+ assert_session_has :user
398
+
399
+ # change the password, but the email delivery will fail
400
+ ActionMailer::Base.inject_one_error = true
401
+ post :change_password, :user => { :password => "changed_password", :password_confirmation => "changed_password" }
402
+ assert_equal 0, ActionMailer::Base.deliveries.size
403
+ assert_match /Password could not be changed/, flash[:warning]
404
+
405
+ # logout
406
+ get :logout
407
+ assert_session_has_no :user
408
+
409
+ # ensure we can log in with our original password
410
+ # TODO: WHY DOES THIS FAIL!! It looks like the transaction stuff in UserController#change_password isn't actually rolling back changes.
411
+ post :login, :user => { :login => "bob", :password => "atest" }
412
+ assert_session_has :user
413
+
414
+ get :logout
415
+ end
416
+
417
+
418
+
419
+
420
+ #==========================================================================
421
+ #
422
+ # Forgot Password
423
+ #
424
+ #==========================================================================
425
+
426
+ def test_forgot_password
427
+ LoginEngine::CONFIG[:use_email_notification] = true
428
+
429
+ do_forgot_password(false, false, false)
430
+ do_forgot_password(false, false, true)
431
+ do_forgot_password(true, false, false)
432
+ do_forgot_password(false, true, false)
433
+ end
434
+
435
+ def do_forgot_password(bad_address, bad_email, logged_in)
436
+ ActionMailer::Base.deliveries = []
437
+
438
+ if logged_in
439
+ post :login, :user => { :login => "bob", :password => "atest" }
440
+ assert_session_has :user
441
+ end
442
+
443
+ @request.session['return-to'] = "/bogus/location"
444
+ if not bad_address and not bad_email
445
+ post :forgot_password, :user => { :email => "bob@test.com" }
446
+ password = "anewpassword"
447
+ if logged_in
448
+ assert_equal 0, ActionMailer::Base.deliveries.size
449
+ assert_redirect_url(@controller.url_for(:action => "change_password"))
450
+ post :change_password, :user => { :password => "#{password}", :password_confirmation => "#{password}" }
451
+ else
452
+ assert_equal 1, ActionMailer::Base.deliveries.size
453
+ mail = ActionMailer::Base.deliveries[0]
454
+ assert_equal "bob@test.com", mail.to_addrs[0].to_s
455
+ mail.encoded =~ /user\[id\]=(.*?)&key=(.*?)"/
456
+ id = $1
457
+ key = $2
458
+ post :change_password, :user => { :password => "#{password}", :password_confirmation => "#{password}", :id => "#{id}" }, :key => "#{key}"
459
+ assert_session_has :user
460
+ get :logout
461
+ end
462
+ elsif bad_address
463
+ post :forgot_password, :user => { :email => "bademail@test.com" }
464
+ assert_equal 0, ActionMailer::Base.deliveries.size
465
+ elsif bad_email
466
+ ActionMailer::Base.inject_one_error = true
467
+ post :forgot_password, :user => { :email => "bob@test.com" }
468
+ assert_equal 0, ActionMailer::Base.deliveries.size
469
+ else
470
+ # Invalid test case
471
+ assert false
472
+ end
473
+
474
+ if not bad_address and not bad_email
475
+ if logged_in
476
+ get :logout
477
+ else
478
+ assert_redirect_url(@controller.url_for(:action => "login"))
479
+ end
480
+ post :login, :user => { :login => "bob", :password => "#{password}" }
481
+ else
482
+ # Okay, make sure the database did not get changed
483
+ if logged_in
484
+ get :logout
485
+ end
486
+ post :login, :user => { :login => "bob", :password => "atest" }
487
+ end
488
+
489
+ assert_session_has :user
490
+
491
+ # Put the old settings back
492
+ if not bad_address and not bad_email
493
+ post :change_password, :user => { :password => "atest", :password_confirmation => "atest" }
494
+ end
495
+
496
+ get :logout
497
+ end
498
+
499
+ def test_forgot_password_without_email_and_logged_in
500
+ LoginEngine::CONFIG[:use_email_notification] = false
501
+
502
+ post :login, :user => { :login => "bob", :password => "atest" }
503
+ assert_session_has :user
504
+
505
+ @request.session['return-to'] = "/bogus/location"
506
+ post :forgot_password, :user => { :email => "bob@test.com" }
507
+ password = "anewpassword"
508
+ assert_redirect_url(@controller.url_for(:action => "change_password"))
509
+ post :change_password, :user => { :password => "#{password}", :password_confirmation => "#{password}" }
510
+
511
+ get :logout
512
+
513
+ post :login, :user => { :login => "bob", :password => "#{password}" }
514
+
515
+ assert_session_has :user
516
+
517
+ get :logout
518
+ end
519
+
520
+ def forgot_password_without_email_and_not_logged_in
521
+ LoginEngine::CONFIG[:use_email_notification] = false
522
+
523
+ @request.session['return-to'] = "/bogus/location"
524
+ post :forgot_password, :user => { :email => "bob@test.com" }
525
+ password = "anewpassword"
526
+
527
+ # wothout email, you can't retrieve your forgotten password...
528
+ assert_match /Please contact the system admin/, flash[:message]
529
+ assert_session_has_no :user
530
+
531
+ assert_redirect_url "http://#{@request.host}/bogus/location"
532
+ end
533
+ end
@@ -0,0 +1,14 @@
1
+ ActionMailer::Base.class_eval {
2
+ @@inject_one_error = false
3
+ cattr_accessor :inject_one_error
4
+
5
+ private
6
+ def perform_delivery_test(mail)
7
+ if inject_one_error
8
+ ActionMailer::Base::inject_one_error = false
9
+ raise "Failed to send email" if raise_delivery_errors
10
+ else
11
+ deliveries << mail
12
+ end
13
+ end
14
+ }
@@ -0,0 +1,19 @@
1
+ require 'time'
2
+
3
+ Time.class_eval {
4
+ if !respond_to? :now_old # somehow this is getting defined many times.
5
+ @@advance_by_days = 0
6
+ cattr_accessor :advance_by_days
7
+
8
+ class << Time
9
+ alias now_old now
10
+ def now
11
+ if Time.advance_by_days != 0
12
+ return Time.at(now_old.to_i + Time.advance_by_days * 60 * 60 * 24 + 1)
13
+ else
14
+ now_old
15
+ end
16
+ end
17
+ end
18
+ end
19
+ }
@@ -0,0 +1,15 @@
1
+ require File.dirname(__FILE__) + '/../../../../test/test_helper' # the default rails helper
2
+
3
+ require File.dirname(__FILE__) + '/mocks/time'
4
+ require File.dirname(__FILE__) + '/mocks/mail'
5
+
6
+ # TODO: Add check for database-specific sql files instead
7
+ load(File.dirname(__FILE__) + "/../db/schema.rb")
8
+
9
+ # set up the fixtures location
10
+ Test::Unit::TestCase.fixture_path = File.dirname(__FILE__) + "/fixtures/"
11
+ $LOAD_PATH.unshift(Test::Unit::TestCase.fixture_path)
12
+
13
+
14
+ # declare mappings between your fixtures templates and the actual table names used.
15
+ Test::Unit::TestCase.set_fixtures_table(:users, LoginEngine.config(:user_table))
@@ -0,0 +1,94 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class UserTest < Test::Unit::TestCase
4
+
5
+ fixtures LoginEngine.config(:user_table).to_sym
6
+
7
+ def setup
8
+ LoginEngine::CONFIG[:salt] = "test-salt"
9
+ end
10
+
11
+ def test_auth
12
+ assert_equal fixture_object(LoginEngine.config(:user_table), :bob), User.authenticate("bob", "atest")
13
+ assert_nil User.authenticate("nonbob", "atest")
14
+ end
15
+
16
+
17
+ def test_passwordchange
18
+
19
+ fixture_object(LoginEngine.config(:user_table), :longbob).change_password("nonbobpasswd")
20
+ fixture_object(LoginEngine.config(:user_table), :longbob).save
21
+ assert_equal fixture_object(LoginEngine.config(:user_table), :longbob), User.authenticate("longbob", "nonbobpasswd")
22
+ assert_nil User.authenticate("longbob", "alongtest")
23
+ fixture_object(LoginEngine.config(:user_table), :longbob).change_password("alongtest")
24
+ fixture_object(LoginEngine.config(:user_table), :longbob).save
25
+ assert_equal fixture_object(LoginEngine.config(:user_table), :longbob), User.authenticate("longbob", "alongtest")
26
+ assert_nil User.authenticate("longbob", "nonbobpasswd")
27
+
28
+ end
29
+
30
+ def test_disallowed_passwords
31
+
32
+ u = User.new
33
+ u.login = "nonbob"
34
+
35
+ u.change_password("tiny")
36
+ assert !u.save
37
+ assert u.errors.invalid?('password')
38
+
39
+ u.change_password("hugehugehugehugehugehugehugehugehugehugehugehugehugehugehugehugehugehugehugehugehugehugehugehugehugehugehugehugehugehugehugehugehugehugehugehugehugehugehugehugehugehugehuge")
40
+ assert !u.save
41
+ assert u.errors.invalid?('password')
42
+
43
+ u.change_password("")
44
+ assert !u.save
45
+ assert u.errors.invalid?('password')
46
+
47
+ u.change_password("bobs_secure_password")
48
+ assert u.save
49
+ assert u.errors.empty?
50
+
51
+ end
52
+
53
+ def test_bad_logins
54
+
55
+ u = User.new
56
+ u.change_password("bobs_secure_password")
57
+
58
+ u.login = "x"
59
+ assert !u.save
60
+ assert u.errors.invalid?('login')
61
+
62
+ u.login = "hugebobhugebobhugebobhugebobhugebobhugebobhugebobhugebobhugebobhugebobhugebobhugebobhugebobhugebobhugebobhugebobhugebobhugebobhugebobhugebobhugebobhugebobhugebobhugebobhugebobhugebobhug"
63
+ assert !u.save
64
+ assert u.errors.invalid?('login')
65
+
66
+ u.login = ""
67
+ assert !u.save
68
+ assert u.errors.invalid?('login')
69
+
70
+ u.login = "okbob"
71
+ assert u.save
72
+ assert u.errors.empty?
73
+
74
+ end
75
+
76
+
77
+ def test_collision
78
+ u = User.new
79
+ u.login = "existingbob"
80
+ u.change_password("bobs_secure_password")
81
+ assert !u.save
82
+ end
83
+
84
+
85
+ def test_create
86
+ u = User.new
87
+ u.login = "nonexistingbob"
88
+ u.change_password("bobs_secure_password")
89
+
90
+ assert u.save
91
+
92
+ end
93
+
94
+ end