Changesets can be listed by changeset number.
The Git repository is here.
- Revision:
- 10
- Log:
Checking in HEAD from RForum's SVN of 22-Jul-2006, 8pm (revision 906).
- Author:
- adh
- Date:
- Sat Jul 22 20:02:44 +0100 2006
- Size:
- 7407 Bytes
- Properties:
- Property svn:executable is set
1 | #!/bin/env ruby |
2 | |
3 | require File.dirname(__FILE__) + '/../test_helper' |
4 | require 'rexml/document' |
5 | require 'user_controller' |
6 | |
7 | # Raise errors beyond the default web-based presentation |
8 | class UserController; def rescue_action(e) raise e end; end |
9 | |
10 | class UserControllerTest < Test::Unit::TestCase |
11 | |
12 | def setup |
13 | setup_controller_test |
14 | setup_forum_fixture |
15 | end |
16 | |
17 | def test_login |
18 | assert_equal 0, User.find_by_login('a', 'a').activated |
19 | r = process('login', {'name' => 'a', 'password' => 'a', 'submit' => 'Login'}, |
20 | {:return_to => '/forum/forum/1'}) |
21 | assert_redirect_url_match '/forum/forum/1' |
22 | assert_equal User.find_by_login('a', 'a').id, r.session[:user_id] |
23 | assert_equal 1, User.find_by_login('a', 'a').activated |
24 | end |
25 | |
26 | def test_login_wrong_password |
27 | r = process('login', {'name' => 'a', 'password' => 'wrong', 'submit' => 'Login'}) |
28 | assert_nil r.session[:user_id] |
29 | end |
30 | |
31 | def test_logout |
32 | r = process('logout', nil, {:user_id => '1'}) |
33 | |
34 | assert_redirected_to :controller => 'forum', :action => 'list' |
35 | assert_nil r.session[:user_id] |
36 | end |
37 | |
38 | def test_logout_without_logon |
39 | r = process('logout', nil, {:user_id => nil}) |
40 | |
41 | # should not cause any problem |
42 | assert_redirected_to :controller => 'forum', :action => 'list' |
43 | assert_nil r.session[:user_id] |
44 | end |
45 | |
46 | def test_register_form |
47 | r = process('register') |
48 | |
49 | assert_success |
50 | # registration form should be shown |
51 | assert_equal User.new.attributes, r.template_objects['new_user'].attributes |
52 | |
53 | #register form should be a well-formed XML |
54 | assert_nothing_raised { REXML::Document.new(r.body) } |
55 | assert_nil r.template_objects['password_form'] |
56 | end |
57 | |
58 | def test_register_success |
59 | r = process('register', 'new_user' => prototype_params(User)) |
60 | assert_success |
61 | end |
62 | |
63 | def test_register_faked_role |
64 | user_params = prototype_params(User) |
65 | user_params['role'] = 'Admin' |
66 | r = process('register', 'new_user' => user_params) |
67 | assert_equal 'User', r.template_objects['new_user'].role |
68 | end |
69 | |
70 | def test_register_user_exist |
71 | User.create(prototype_params(User)) |
72 | |
73 | r = process('register', prototype_params(User)) |
74 | |
75 | #Get back to registration form. 2 errors: Name and Email are already exist. |
76 | # TODO rewrite assertions at the object layer |
77 | end |
78 | |
79 | def test_register_invalid_data |
80 | user_with_too_short_name = prototype_params(User, {'name' => 'a'}) |
81 | |
82 | r = process('register', 'new_user' => user_with_too_short_name) |
83 | |
84 | assert_success |
85 | assert_invalid_column_on_record('new_user', 'name') |
86 | end |
87 | |
88 | def test_edit_form |
89 | r = process('edit', {}, {:user_id => 1} ) |
90 | |
91 | assert_success |
92 | user_in_view = r.template_objects['new_user'] |
93 | assert_equal(User.find(1), user_in_view) |
94 | |
95 | #register form should be a well-formed XML |
96 | assert_nothing_raised { REXML::Document.new(r.body) } |
97 | assert_equal '', user_in_view.new_password |
98 | assert_equal '', user_in_view.retyped_password |
99 | end |
100 | |
101 | def test_edit_submit |
102 | user_attrs = attributes(User.find(2)) |
103 | user_attrs['surname'] = 'someone_else' |
104 | user_attrs['email'] = 'someone@some.domain' |
105 | user_attrs['role'] = 'Admin' |
106 | |
107 | r = process('edit', {'new_user' => user_attrs, 'form' => 'edit_user'}, |
108 | {:user_id => 1}) |
109 | |
110 | assert_redirected_to :action => 'edit' |
111 | |
112 | user = User.find(2) |
113 | |
114 | assert_equal user_attrs['surname'], user.surname |
115 | assert_not_equal Admin, user.class |
116 | assert_not_equal user_attrs['email'], user.email |
117 | end |
118 | |
119 | def test_edit_anonymous_cannot_edit |
120 | assert_raise(RForum::SecurityError) { |
121 | process('edit', {'new_user' => attributes(User.find(2)), 'form' => 'edit_user'}, |
122 | {:user_id => nil}) |
123 | } |
124 | end |
125 | |
126 | def test_edit_user_can_edit_only_self |
127 | assert_nothing_raised { |
128 | process('edit', {'new_user' => attributes(User.find(2)), 'form' => 'edit_user'}, |
129 | {:user_id => 2}) |
130 | } |
131 | assert_raise(RForum::SecurityError) { |
132 | process('edit', {'new_user' => attributes(User.find(2)), 'form' => 'edit_user'}, |
133 | {:user_id => 3}) |
134 | } |
135 | end |
136 | |
137 | def test_edit_admin_can_edit_anything |
138 | assert_nothing_raised { |
139 | process('edit', {'new_user' => attributes(User.find(1)), 'form' => 'edit_user'}, |
140 | {:user_id => 1}) |
141 | } |
142 | assert_nothing_raised { |
143 | process('edit', {'new_user' => attributes(User.find(2)), 'form' => 'edit_user'}, |
144 | {:user_id => 1}) |
145 | } |
146 | end |
147 | |
148 | def test_register_sends_an_email |
149 | ActionMailer::Base.deliveries = [] |
150 | |
151 | process('register', 'new_user' => prototype_params(User)) |
152 | |
153 | assert_equal 1, ActionMailer::Base.deliveries.size |
154 | mail = ActionMailer::Base.deliveries[0] |
155 | assert_equal 1, mail.to_addrs.size |
156 | assert_equal "ryan.platte@example.com", mail.to_addrs[0].to_s |
157 | assert_equal "[RForum] Welcome to RForum", mail.subject |
158 | # Password must be 7 characters. When this test was written, it was writing encrypted |
159 | # password to the registration email, which was much longer |
160 | assert_match /\nYour password: \w{8}\n/, mail.encoded |
161 | end |
162 | |
163 | def test_list |
164 | process('list') |
165 | assert_success |
166 | end |
167 | |
168 | def test_change_password |
169 | user = user_with_new_password('abcd1234') |
170 | |
171 | process('edit', {'form' => 'change_password', 'new_user' => user}, |
172 | {:user_id => 1, :return_to => '/forum/forum/1'}) |
173 | |
174 | assert_redirect_url_match '/forum/forum/1' |
175 | assert_equal(User.find(1), User.find_by_login('a', 'abcd1234')) |
176 | end |
177 | |
178 | def test_change_password_too_short |
179 | user = user_with_new_password('abc') |
180 | |
181 | r = process('edit', {'form' => 'change_password', 'new_user' => user}, |
182 | {:user_id => 1, :return_to => '/forum/forum/1'}) |
183 | |
184 | # no redirection |
185 | assert_success |
186 | |
187 | assert r.template_objects['new_user'].errors.on(:new_password) |
188 | end |
189 | |
190 | def test_change_password_empty_fields |
191 | |
192 | %w(new_password retyped_password).each do |attr| |
193 | user = user_with_new_password('abcd1234') |
194 | user[attr] = '' |
195 | |
196 | r = process('edit', {'form' => 'change_password', 'new_user' => user}, |
197 | {:user_id => 1, :return_to => '/forum/forum/1'}) |
198 | |
199 | # no redirection |
200 | assert_success |
201 | |
202 | assert r.template_objects['new_user'].errors.on(attr), |
203 | "Validation didn't fail as expected on field '#{attr}'" |
204 | end |
205 | |
206 | end |
207 | |
208 | def test_change_password_password_mismatch |
209 | |
210 | user = user_with_new_password('abcd1234') |
211 | user['retyped_password'] = '4321dcba' |
212 | |
213 | r = process('edit', {'form' => 'change_password', 'new_user' => user}, |
214 | {:user_id => 1, :return_to => '/forum/forum/1'}) |
215 | |
216 | # no redirection |
217 | assert_success |
218 | |
219 | assert r.template_objects['new_user'].errors.on('retyped_password') |
220 | end |
221 | |
222 | def test_forgot_password_email |
223 | ActionMailer::Base.deliveries = [] |
224 | |
225 | r = process('login', {'i_forgot_my_password' => '1', 'name' => User.find(1).name}, {:user_id => nil, :return_to => '/forum/forum/1'}) |
226 | |
227 | assert_success |
228 | assert User.find(1).security_token |
229 | assert User.find(1).token_expiry |
230 | assert_equal 1, ActionMailer::Base.deliveries.size |
231 | assert_match /http:[\w\/]*\/user\/edit\?user_id=1&key=\w{32}/, |
232 | ActionMailer::Base.deliveries[0].encoded |
233 | end |
234 | |
235 | def user_with_new_password(new_password) |
236 | user_with_new_password = attributes(User.find(1)) |
237 | user_with_new_password['new_password'] = new_password |
238 | user_with_new_password['retyped_password'] = new_password |
239 | return user_with_new_password |
240 | end |
241 | |
242 | end |