amrita2 1.9.6 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (112) hide show
  1. data/README +112 -0
  2. data/init.rb +6 -0
  3. data/lib/amrita2/gettext.rb +116 -0
  4. data/lib/amrita2/macro.rb +153 -0
  5. data/lib/amrita2/rails_bridge.rb +172 -26
  6. data/lib/amrita2/template.rb +2634 -234
  7. data/lib/amrita2/testsupport.rb +171 -0
  8. data/lib/amrita2/version.rb +3 -3
  9. data/lib/amrita2.rb +1 -0
  10. data/sample/depot/app/controllers/admin_controller.rb +59 -0
  11. data/sample/depot/app/controllers/application.rb +20 -0
  12. data/sample/depot/app/controllers/info_controller.rb +19 -0
  13. data/sample/depot/app/controllers/login_controller.rb +85 -0
  14. data/sample/depot/app/controllers/store_controller.rb +68 -0
  15. data/sample/depot/app/helpers/admin_helper.rb +7 -0
  16. data/sample/depot/app/helpers/application_helper.rb +10 -0
  17. data/sample/depot/app/helpers/ar_form.rb +169 -0
  18. data/sample/depot/app/helpers/form_tag.rb +24 -0
  19. data/sample/depot/app/helpers/info_helper.rb +7 -0
  20. data/sample/depot/app/helpers/standard_form.rb +73 -0
  21. data/sample/depot/app/helpers/store_helper.rb +14 -0
  22. data/sample/depot/app/models/cart.rb +36 -0
  23. data/sample/depot/app/models/cart_item.rb +26 -0
  24. data/sample/depot/app/models/line_item.rb +34 -0
  25. data/sample/depot/app/models/order.rb +57 -0
  26. data/sample/depot/app/models/product.rb +41 -0
  27. data/sample/depot/app/models/user.rb +83 -0
  28. data/sample/depot/config/boot.rb +49 -0
  29. data/sample/depot/config/environment.rb +83 -0
  30. data/sample/depot/config/environments/development.rb +24 -0
  31. data/sample/depot/config/environments/production.rb +24 -0
  32. data/sample/depot/config/environments/test.rb +24 -0
  33. data/sample/depot/config/routes.rb +10 -0
  34. data/sample/depot/db/migrate/001_create_products.rb +18 -0
  35. data/sample/depot/db/migrate/002_add_price.rb +14 -0
  36. data/sample/depot/db/migrate/003_add_test_data.rb +68 -0
  37. data/sample/depot/db/migrate/004_add_sessions.rb +20 -0
  38. data/sample/depot/db/migrate/005_create_orders.rb +21 -0
  39. data/sample/depot/db/migrate/006_create_line_items.rb +27 -0
  40. data/sample/depot/db/migrate/007_create_users.rb +18 -0
  41. data/sample/depot/db/schema.rb +45 -0
  42. data/sample/depot/public/dispatch.rb +15 -0
  43. data/sample/depot/test/functional/admin_controller_test.rb +54 -0
  44. data/sample/depot/test/functional/info_controller_test.rb +23 -0
  45. data/sample/depot/test/functional/login_controller_test.rb +74 -0
  46. data/sample/depot/test/functional/store_controller_test.rb +57 -0
  47. data/sample/depot/test/integration/dsl_user_stories_test.rb +126 -0
  48. data/sample/depot/test/integration/user_stories_test.rb +70 -0
  49. data/sample/depot/test/performance/order_speed_test.rb +58 -0
  50. data/sample/depot/test/test_helper.rb +16 -0
  51. data/sample/depot/test/unit/cart_test.rb +39 -0
  52. data/sample/depot/test/unit/cart_test1.rb +31 -0
  53. data/sample/depot/test/unit/line_item_test.rb +15 -0
  54. data/sample/depot/test/unit/order_test.rb +15 -0
  55. data/sample/depot/test/unit/product_test.rb +98 -0
  56. data/sample/depot/vendor/plugins/amrita2/init.rb +6 -0
  57. data/sample/hello/hello.rb +22 -0
  58. data/sample/login_engine/app/controllers/application.rb +16 -0
  59. data/sample/login_engine/app/controllers/user_controller.rb +265 -0
  60. data/sample/login_engine/app/helpers/application_helper.rb +3 -0
  61. data/sample/login_engine/app/helpers/form_tag.rb +16 -0
  62. data/sample/login_engine/app/helpers/two_columns.rb +24 -0
  63. data/sample/login_engine/app/helpers/two_columns_form.rb +47 -0
  64. data/sample/login_engine/app/helpers/user_helper.rb +88 -0
  65. data/sample/login_engine/app/models/user.rb +7 -0
  66. data/sample/login_engine/app/models/user_notify.rb +75 -0
  67. data/sample/login_engine/config/boot.rb +45 -0
  68. data/sample/login_engine/config/environment.rb +140 -0
  69. data/sample/login_engine/config/environments/development.rb +21 -0
  70. data/sample/login_engine/config/environments/production.rb +18 -0
  71. data/sample/login_engine/config/environments/test.rb +19 -0
  72. data/sample/login_engine/config/routes.rb +23 -0
  73. data/sample/login_engine/db/migrate/001_create_users.rb +25 -0
  74. data/sample/login_engine/db/schema.rb +25 -0
  75. data/sample/login_engine/lib/config.rb +113 -0
  76. data/sample/login_engine/lib/hpricot_test_extension.rb +80 -0
  77. data/sample/login_engine/lib/login_engine/authenticated_system.rb +113 -0
  78. data/sample/login_engine/lib/login_engine/authenticated_user.rb +155 -0
  79. data/sample/login_engine/lib/login_engine.rb +62 -0
  80. data/sample/login_engine/public/dispatch.rb +10 -0
  81. data/sample/login_engine/test/functional/amrita2_test.rb +267 -0
  82. data/sample/login_engine/test/functional/user_controller_test.rb +544 -0
  83. data/sample/login_engine/test/mocks/mail.rb +14 -0
  84. data/sample/login_engine/test/mocks/time.rb +19 -0
  85. data/sample/login_engine/test/test_helper.rb +31 -0
  86. data/sample/login_engine/test/unit/user_test.rb +116 -0
  87. data/sample/login_engine/vendor/plugins/amrita2/init.rb +6 -0
  88. data/specs/attribute.rb +201 -0
  89. data/specs/datatypes.rb +231 -0
  90. data/specs/dictionary.rb +68 -0
  91. data/specs/erb_cdata.rb +187 -0
  92. data/specs/filters.rb +513 -0
  93. data/specs/gettext/erb_gettext.rb +42 -0
  94. data/specs/gettext/gettext_util.rb +65 -0
  95. data/specs/gettext/static_text.rb +103 -0
  96. data/specs/impl/code_generator.rb +87 -0
  97. data/specs/impl/dynamic_element.rb +92 -0
  98. data/specs/impl/hash_delegator.rb +57 -0
  99. data/specs/impl/parse_opt.rb +34 -0
  100. data/specs/impl/preprocess.rb +823 -0
  101. data/specs/impl/testsupport.rb +89 -0
  102. data/specs/inlineruby.rb +429 -0
  103. data/specs/intro.rb +654 -0
  104. data/specs/loop.rb +203 -0
  105. data/specs/macro.rb +532 -0
  106. data/specs/sample.rb +34 -0
  107. data/specs/sanitize.rb +110 -0
  108. data/specs/template.rb +189 -0
  109. data/specs/trace.rb +97 -0
  110. metadata +138 -19
  111. data/lib/amrita2/core.rb +0 -1897
  112. data/lib/amrita2/rd.rb +0 -314
@@ -0,0 +1,544 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+ require 'user_controller'
3
+
4
+ # Re-raise errors caught by the controller.
5
+ class UserController; def rescue_action(e) raise e end; end
6
+
7
+ class UserControllerTest < Test::Unit::TestCase
8
+ fixtures :users
9
+
10
+ def setup
11
+ LoginEngine::CONFIG[:salt] = "test-salt"
12
+
13
+ @controller = UserController.new
14
+ @request, @response = ActionController::TestRequest.new, ActionController::TestResponse.new
15
+ @request.host = "localhost"
16
+ end
17
+
18
+
19
+
20
+ #==========================================================================
21
+ #
22
+ # Login/Logout
23
+ #
24
+ #==========================================================================
25
+
26
+ def test_home_without_login
27
+ get :home
28
+ assert_redirected_to :action => "login"
29
+ end
30
+
31
+ def test_invalid_login
32
+ post :login, :user => { :login => "bob", :password => "wrong_password" }
33
+ assert_response :success
34
+
35
+ assert_nil session[:user]
36
+ assert_template "login"
37
+ end
38
+
39
+ def test_login
40
+ @request.session['return-to'] = "/bogus/location"
41
+
42
+ post :login, :user => { :login => "bob", :password => "atest" }
43
+
44
+ assert_response :redirect
45
+ assert(@response.has_session_object?(:user))
46
+ assert_equal users(:bob), session[:user]
47
+
48
+ assert_equal("http://#{@request.host}/bogus/location", @response.redirect_url)
49
+ end
50
+
51
+ def test_login_logoff
52
+
53
+ post :login, :user => { :login => "bob", :password => "atest" }
54
+ assert(@response.has_session_object?(:user))
55
+
56
+ get :logout
57
+ assert_nil session[:user]
58
+
59
+ end
60
+
61
+
62
+ #==========================================================================
63
+ #
64
+ # Signup
65
+ #
66
+ #==========================================================================
67
+
68
+ def test_signup
69
+ LoginEngine::CONFIG[:use_email_notification] = true
70
+
71
+ ActionMailer::Base.deliveries = []
72
+
73
+ @request.session['return-to'] = "/bogus/location"
74
+
75
+ assert_equal 5, User.count
76
+ post :signup, :user => { :login => "newbob", :password => "newpassword", :password_confirmation => "newpassword", :email => "newbob@test.com" }
77
+ assert_nil session[:user]
78
+
79
+ assert_redirected_to :action => "login"
80
+ assert_equal 1, ActionMailer::Base.deliveries.size
81
+ mail = ActionMailer::Base.deliveries[0]
82
+ assert_equal "newbob@test.com", mail.to_addrs[0].to_s
83
+ assert_match /login:\s+\w+\n/, mail.encoded
84
+ assert_match /password:\s+\w+\n/, mail.encoded
85
+ #mail.encoded =~ /user_id=(.*?)&key=(.*?)"/
86
+ user_id = /user_id=(\d+)/.match(mail.encoded)[1]
87
+ key = /key=([a-z0-9]+)/.match(mail.encoded)[1]
88
+
89
+ assert_not_nil user_id
90
+ assert_not_nil key
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(@response.has_session_object?(: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_nil session[:user]
126
+ #assert_invalid_column_on_record "user", "password"
127
+ assert assigns["user"].errors.invalid?("password")
128
+
129
+ assert_response :success
130
+ assert_equal 0, ActionMailer::Base.deliveries.size
131
+ end
132
+
133
+ def test_signup_bad_email
134
+ LoginEngine::CONFIG[:use_email_notification] = true
135
+ ActionMailer::Base.deliveries = []
136
+
137
+ @request.session['return-to'] = "/bogus/location"
138
+
139
+ ActionMailer::Base.inject_one_error = true
140
+ post :signup, :user => { :login => "newbob", :password => "newpassword", :password_confirmation => "newpassword", :email => "newbob@test.com" }
141
+ assert_nil session[:user]
142
+ assert_equal 0, ActionMailer::Base.deliveries.size
143
+ end
144
+
145
+ def test_signup_without_email
146
+ LoginEngine::CONFIG[:use_email_notification] = false
147
+
148
+ @request.session['return-to'] = "/bogus/location"
149
+
150
+ post :signup, :user => { :login => "newbob", :password => "newpassword", :password_confirmation => "newpassword", :email => "newbob@test.com" }
151
+
152
+ assert_redirected_to :action => "login"
153
+ assert_nil session[:user]
154
+ assert_match /Signup successful/, flash[:notice]
155
+
156
+ assert_not_nil User.find_by_login("newbob")
157
+
158
+ user = User.find_by_email("newbob@test.com")
159
+ assert_not_nil user
160
+
161
+ post :login, :user => { :login => "newbob", :password => "newpassword" }
162
+ assert(@response.has_session_object?(:user))
163
+ get :logout
164
+ end
165
+
166
+ def test_signup_bad_details
167
+ @request.session['return-to'] = "/bogus/location"
168
+
169
+ # mismatched password
170
+ post :signup, :user => { :login => "newbob", :password => "newpassword", :password_confirmation => "wrong" }
171
+ #assert_invalid_column_on_record "user", "password"
172
+ assert assigns["user"].errors.invalid?("password")
173
+ assert_response :success
174
+
175
+ # login not long enough
176
+ post :signup, :user => { :login => "yo", :password => "newpassword", :password_confirmation => "newpassword" }
177
+ #assert_invalid_column_on_record "user", "login"
178
+ assert assigns["user"].errors.invalid?("login")
179
+ assert_response :success
180
+
181
+ # both
182
+ post :signup, :user => { :login => "yo", :password => "newpassword", :password_confirmation => "wrong" }
183
+ #assert_invalid_column_on_record "user", ["login", "password"]
184
+ assert assigns["user"].errors.invalid?("login")
185
+ assert assigns["user"].errors.invalid?("password")
186
+ assert_response :success
187
+
188
+ # existing user
189
+ post :signup, :user => { :login => "bob", :password => "doesnt_matter", :password_confirmation => "doesnt_matter" }
190
+ #assert_invalid_column_on_record "user", "login"
191
+ assert assigns["user"].errors.invalid?("login")
192
+ assert_response :success
193
+
194
+ # existing email
195
+ post :signup, :user => { :login => "newbob", :email => "longbob@test.com", :password => "doesnt_matter", :password_confirmation => "doesnt_matter" }
196
+ #assert_invalid_column_on_record "user", "email"
197
+ assert assigns["user"].errors.invalid?("email")
198
+ assert_response :success
199
+
200
+ end
201
+
202
+
203
+ #==========================================================================
204
+ #
205
+ # Edit
206
+ #
207
+ #==========================================================================
208
+
209
+ def test_edit
210
+ post :login, :user => { :login => "bob", :password => "atest" }
211
+ assert(@response.has_session_object?(:user))
212
+
213
+ post :edit, :user => { "firstname" => "Bob", "form" => "edit" }
214
+ assert_equal @response.session[:user].firstname, "Bob"
215
+
216
+ post :edit, :user => { "firstname" => "", "form" => "edit" }
217
+ assert_equal @response.session[:user].firstname, ""
218
+
219
+ get :logout
220
+ end
221
+
222
+
223
+
224
+ #==========================================================================
225
+ #
226
+ # Delete
227
+ #
228
+ #==========================================================================
229
+
230
+ def test_delete
231
+ LoginEngine::CONFIG[:use_email_notification] = true
232
+ # Immediate delete
233
+ post :login, :user => { :login => "deletebob1", :password => "alongtest" }
234
+ assert(@response.has_session_object?(:user))
235
+
236
+ LoginEngine.config :delayed_delete, false, :force
237
+ post :delete
238
+ assert_equal 1, ActionMailer::Base.deliveries.size
239
+ assert_nil session[:user]
240
+
241
+ # try and login in again, we should fail.
242
+ post :login, :user => { :login => "deletebob1", :password => "alongtest" }
243
+ assert_nil session[:user]
244
+ #assert_template_has "login"
245
+ assert(@response.has_template_object?("login"))
246
+
247
+ # Now try delayed delete
248
+ ActionMailer::Base.deliveries = []
249
+
250
+ post :login, :user => { :login => "deletebob2", :password => "alongtest" }
251
+ assert(@response.has_session_object?(:user))
252
+
253
+ LoginEngine.config :delayed_delete, true, :force
254
+ post :delete
255
+ assert_equal 1, ActionMailer::Base.deliveries.size
256
+ mail = ActionMailer::Base.deliveries[0]
257
+ user_id = /user_id=(\d+)/.match(mail.encoded)[1]
258
+ key = /key=([a-z0-9]+)/.match(mail.encoded)[1]
259
+
260
+ post :restore_deleted, :user_id => "#{user_id}", "key" => "badkey"
261
+ assert_nil session[:user]
262
+
263
+ # Advance the time past the delete date
264
+ Time.advance_by_days = LoginEngine.config :delayed_delete_days
265
+ post :restore_deleted, :user_id => "#{user_id}", "key" => "#{key}"
266
+ assert_nil session[:user]
267
+ Time.advance_by_days = 0
268
+
269
+ post :restore_deleted, :user_id => "#{user_id}", "key" => "#{key}"
270
+ assert(@response.has_session_object?(:user))
271
+ end
272
+
273
+ def test_delete_without_email
274
+ LoginEngine::CONFIG[:use_email_notification] = false
275
+ ActionMailer::Base.deliveries = []
276
+
277
+ # Immediate delete
278
+ post :login, :user => { :login => "deletebob1", :password => "alongtest" }
279
+ assert(@response.has_session_object?(:user))
280
+
281
+ LoginEngine.config :delayed_delete, false, :force
282
+ post :delete
283
+ assert_nil session[:user]
284
+ assert_nil User.find_by_login("deletebob1")
285
+
286
+ # try and login in again, we should fail.
287
+ post :login, :user => { :login => "deletebob1", :password => "alongtest" }
288
+ assert_nil session[:user]
289
+ #assert_template_has "login"
290
+ assert(@response.has_template_object?("login"))
291
+
292
+
293
+ # Now try delayed delete
294
+ ActionMailer::Base.deliveries = []
295
+
296
+ post :login, :user => { :login => "deletebob2", :password => "alongtest" }
297
+ assert(@response.has_session_object?(:user))
298
+
299
+ # delayed delete is not really relevant currently without email.
300
+ LoginEngine.config :delayed_delete, true, :force
301
+ post :delete
302
+ assert_equal 1, User.find_by_login("deletebob2").deleted
303
+ end
304
+
305
+
306
+
307
+ #==========================================================================
308
+ #
309
+ # Change Password
310
+ #
311
+ #==========================================================================
312
+
313
+ def test_change_valid_password
314
+
315
+ LoginEngine::CONFIG[:use_email_notification] = true
316
+
317
+ ActionMailer::Base.deliveries = []
318
+
319
+ post :login, :user => { :login => "bob", :password => "atest" }
320
+ assert(@response.has_session_object?(:user))
321
+
322
+ post :change_password, :user => { :password => "changed_password", :password_confirmation => "changed_password" }
323
+
324
+ assert_equal 1, ActionMailer::Base.deliveries.size
325
+ mail = ActionMailer::Base.deliveries[0]
326
+ assert_equal "bob@test.com", mail.to_addrs[0].to_s
327
+ assert_match /login:\s+\w+\n/, mail.encoded
328
+ assert_match /password:\s+\w+\n/, mail.encoded
329
+
330
+ post :login, :user => { :login => "bob", :password => "changed_password" }
331
+ assert(@response.has_session_object?(:user))
332
+ post :change_password, :user => { :password => "atest", :password_confirmation => "atest" }
333
+ get :logout
334
+
335
+ post :login, :user => { :login => "bob", :password => "atest" }
336
+ assert(@response.has_session_object?(:user))
337
+
338
+ get :logout
339
+ end
340
+
341
+ def test_change_valid_password_without_email
342
+
343
+ LoginEngine::CONFIG[:use_email_notification] = false
344
+
345
+ ActionMailer::Base.deliveries = []
346
+
347
+ post :login, :user => { :login => "bob", :password => "atest" }
348
+ assert(@response.has_session_object?(:user))
349
+
350
+ post :change_password, :user => { :password => "changed_password", :password_confirmation => "changed_password" }
351
+
352
+ assert_redirected_to :action => "change_password"
353
+
354
+ post :login, :user => { :login => "bob", :password => "changed_password" }
355
+ assert(@response.has_session_object?(:user))
356
+ post :change_password, :user => { :password => "atest", :password_confirmation => "atest" }
357
+ get :logout
358
+
359
+ post :login, :user => { :login => "bob", :password => "atest" }
360
+ assert(@response.has_session_object?(:user))
361
+
362
+ get :logout
363
+ end
364
+
365
+ def test_change_short_password
366
+ LoginEngine::CONFIG[:use_email_notification] = true
367
+ ActionMailer::Base.deliveries = []
368
+
369
+ post :login, :user => { :login => "bob", :password => "atest" }
370
+ assert(@response.has_session_object?(:user))
371
+
372
+ post :change_password, :user => { :password => "bad", :password_confirmation => "bad" }
373
+ #assert_invalid_column_on_record "user", "password"
374
+ assert assigns["user"].errors.invalid?("password")
375
+ assert_response :success
376
+ assert_equal 0, ActionMailer::Base.deliveries.size
377
+
378
+ post :login, :user => { :login => "bob", :password => "atest" }
379
+ assert(@response.has_session_object?(:user))
380
+
381
+ get :logout
382
+ end
383
+
384
+ def test_change_short_password_without_email
385
+ LoginEngine::CONFIG[:use_email_notification] = false
386
+ post :login, :user => { :login => "bob", :password => "atest" }
387
+ assert(@response.has_session_object?(:user))
388
+
389
+ post :change_password, :user => { :password => "bad", :password_confirmation => "bad" }
390
+ #assert_invalid_column_on_record "user", "password"
391
+ assert assigns["user"].errors.invalid?("password")
392
+ assert_response :success
393
+
394
+ post :login, :user => { :login => "bob", :password => "atest" }
395
+ assert(@response.has_session_object?(:user))
396
+
397
+ get :logout
398
+ end
399
+
400
+
401
+ def test_change_password_with_bad_email
402
+ LoginEngine::CONFIG[:use_email_notification] = true
403
+ ActionMailer::Base.deliveries = []
404
+
405
+ # log in
406
+ post :login, :user => { :login => "bob", :password => "atest" }
407
+ assert(@response.has_session_object?(:user))
408
+
409
+ # change the password, but the email delivery will fail
410
+ ActionMailer::Base.inject_one_error = true
411
+ post :change_password, :user => { :password => "changed_password", :password_confirmation => "changed_password" }
412
+ assert_equal 0, ActionMailer::Base.deliveries.size
413
+ assert_match /Password could not be changed/, flash[:warning]
414
+
415
+ # logout
416
+ get :logout
417
+ assert_nil session[:user]
418
+
419
+ # ensure we can log in with our original password
420
+ # TODO: WHY DOES THIS FAIL!! It looks like the transaction stuff in UserController#change_password isn't actually rolling back changes.
421
+ post :login, :user => { :login => "bob", :password => "atest" }
422
+ #################################################
423
+ # assert(@response.has_session_object?(:user)) #
424
+ #################################################
425
+
426
+ get :logout
427
+ end
428
+
429
+
430
+
431
+
432
+ #==========================================================================
433
+ #
434
+ # Forgot Password
435
+ #
436
+ #==========================================================================
437
+
438
+ def test_forgot_password
439
+ LoginEngine::CONFIG[:use_email_notification] = true
440
+
441
+ do_forgot_password(false, false, false)
442
+ do_forgot_password(false, false, true)
443
+ do_forgot_password(true, false, false)
444
+ do_forgot_password(false, true, false)
445
+ end
446
+
447
+ def do_forgot_password(bad_address, bad_email, logged_in)
448
+ ActionMailer::Base.deliveries = []
449
+
450
+ if logged_in
451
+ post :login, :user => { :login => "bob", :password => "atest" }
452
+ assert(@response.has_session_object?(:user))
453
+ end
454
+
455
+ @request.session['return-to'] = "/bogus/location"
456
+ if not bad_address and not bad_email
457
+ post :forgot_password, :user => { :email => "bob@test.com" }
458
+ password = "anewpassword"
459
+ if logged_in
460
+ assert_equal 0, ActionMailer::Base.deliveries.size
461
+ assert_redirected_to :action => "change_password"
462
+ post :change_password, :user => { :password => "#{password}", :password_confirmation => "#{password}" }
463
+ else
464
+ assert_equal 1, ActionMailer::Base.deliveries.size
465
+ mail = ActionMailer::Base.deliveries[0]
466
+ assert_equal "bob@test.com", mail.to_addrs[0].to_s
467
+ user_id = /user_id=(\d+)/.match(mail.encoded)[1]
468
+ key = /key=([a-z0-9]+)/.match(mail.encoded)[1]
469
+ post :change_password, :user => { :password => "#{password}", :password_confirmation => "#{password}"}, :user_id => "#{user_id}", :key => "#{key}"
470
+ assert(@response.has_session_object?(:user))
471
+ get :logout
472
+ end
473
+ elsif bad_address
474
+ post :forgot_password, :user => { :email => "bademail@test.com" }
475
+ assert_equal 0, ActionMailer::Base.deliveries.size
476
+ elsif bad_email
477
+ ActionMailer::Base.inject_one_error = true
478
+ post :forgot_password, :user => { :email => "bob@test.com" }
479
+ assert_equal 0, ActionMailer::Base.deliveries.size
480
+ else
481
+ # Invalid test case
482
+ assert false
483
+ end
484
+
485
+ if not bad_address and not bad_email
486
+ if logged_in
487
+ get :logout
488
+ else
489
+ assert_redirected_to :action => "login"
490
+ end
491
+ post :login, :user => { :login => "bob", :password => "#{password}" }
492
+ else
493
+ # Okay, make sure the database did not get changed
494
+ if logged_in
495
+ get :logout
496
+ end
497
+ post :login, :user => { :login => "bob", :password => "atest" }
498
+ end
499
+
500
+ assert(@response.has_session_object?(:user))
501
+
502
+ # Put the old settings back
503
+ if not bad_address and not bad_email
504
+ post :change_password, :user => { :password => "atest", :password_confirmation => "atest" }
505
+ end
506
+
507
+ get :logout
508
+ end
509
+
510
+ def test_forgot_password_without_email_and_logged_in
511
+ LoginEngine::CONFIG[:use_email_notification] = false
512
+
513
+ post :login, :user => { :login => "bob", :password => "atest" }
514
+ assert(@response.has_session_object?(:user))
515
+
516
+ @request.session['return-to'] = "/bogus/location"
517
+ post :forgot_password, :user => { :email => "bob@test.com" }
518
+ password = "anewpassword"
519
+ assert_redirected_to :action => "change_password"
520
+ post :change_password, :user => { :password => "#{password}", :password_confirmation => "#{password}" }
521
+
522
+ get :logout
523
+
524
+ post :login, :user => { :login => "bob", :password => "#{password}" }
525
+
526
+ assert(@response.has_session_object?(:user))
527
+
528
+ get :logout
529
+ end
530
+
531
+ def forgot_password_without_email_and_not_logged_in
532
+ LoginEngine::CONFIG[:use_email_notification] = false
533
+
534
+ @request.session['return-to'] = "/bogus/location"
535
+ post :forgot_password, :user => { :email => "bob@test.com" }
536
+ password = "anewpassword"
537
+
538
+ # wothout email, you can't retrieve your forgotten password...
539
+ assert_match /Please contact the system admin/, flash[:message]
540
+ assert_nil session[:user]
541
+
542
+ assert_equal("http://#{@request.host}/bogus/location", @response.redirect_url)
543
+ end
544
+ 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,31 @@
1
+ ENV["RAILS_ENV"] = "test"
2
+ require File.expand_path(File.dirname(__FILE__) + "/../config/environment")
3
+ require 'test_help'
4
+
5
+ class Test::Unit::TestCase
6
+ # Transactional fixtures accelerate your tests by wrapping each test method
7
+ # in a transaction that's rolled back on completion. This ensures that the
8
+ # test database remains unchanged so your fixtures don't have to be reloaded
9
+ # between every test method. Fewer database queries means faster tests.
10
+ #
11
+ # Read Mike Clark's excellent walkthrough at
12
+ # http://clarkware.com/cgi/blosxom/2005/10/24#Rails10FastTesting
13
+ #
14
+ # Every Active Record database supports transactions except MyISAM tables
15
+ # in MySQL. Turn off transactional fixtures in this case; however, if you
16
+ # don't care one way or the other, switching from MyISAM to InnoDB tables
17
+ # is recommended.
18
+ self.use_transactional_fixtures = true
19
+
20
+ # Instantiated fixtures are slow, but give you @david where otherwise you
21
+ # would need people(:david). If you don't want to migrate your existing
22
+ # test cases which use the @david style and don't mind the speed hit (each
23
+ # instantiated fixtures translates to a database query per test method),
24
+ # then set this back to true.
25
+ self.use_instantiated_fixtures = false
26
+
27
+ # Add more helper methods to be used by all tests here...
28
+ end
29
+
30
+ require File.dirname(__FILE__) + '/mocks/time'
31
+ require File.dirname(__FILE__) + '/mocks/mail'