Changesets can be listed by changeset number.
The Git repository is here.
- Revision:
- 8
- Log:
Updated to HEAD revision from SVN repository for 22-Jul-2006 at
about 6:30pm.
- Author:
- adh
- Date:
- Sat Jul 22 19:30:50 +0100 2006
- Size:
- 8867 Bytes
- Properties:
- Property svn:executable is set
1 | #!/bin/env ruby |
2 | |
3 | require File.dirname(__FILE__) + '/../test_helper' |
4 | |
5 | class UserTest < Test::Unit::TestCase |
6 | fixtures 'users', 'topics', 'posts', 'topic_subscriptions', 'topic_reads' |
7 | |
8 | def test_login |
9 | user = User.find_by_login('u', 'u') |
10 | assert_equal 'u', user.name |
11 | assert_equal User, user.class |
12 | |
13 | user = User.find_by_login('u', 'u') |
14 | assert_equal 'u', user.name |
15 | assert_equal User, user.class |
16 | |
17 | # wrong password |
18 | assert_nil User.find_by_login('u', 'wrong password') |
19 | |
20 | # invalid user |
21 | assert_nil User.find_by_login('unknown user', 'password doesnt matter') |
22 | end |
23 | |
24 | def test_create |
25 | db.execute 'DELETE FROM users' |
26 | User.create(prototype_params(User)) |
27 | user = User.find_all[0] |
28 | assert user |
29 | assert_equal prototype_params(User)['firstname'].capitalize, user.firstname |
30 | assert_equal prototype_params(User)['surname'].capitalize, user.surname |
31 | |
32 | prototype_params(User).each_pair { |k, v| |
33 | next if ['firstname', 'surname'].include? k |
34 | assert_equal v, user[k], "Value of #{k} not as expected" unless k == 'id' |
35 | } |
36 | end |
37 | |
38 | def test_create_simple_validations |
39 | assert_nothing_raised {User.create(prototype_params(User))} |
40 | # empty name |
41 | assert_validation_fails(User, prototype_params(User, 'name' => '')) |
42 | # empty email |
43 | assert_validation_fails(User, prototype_params(User, 'email' => '')) |
44 | # empty firstname |
45 | assert_validation_fails(User, prototype_params(User, 'firstname' => '')) |
46 | # empty surname |
47 | assert_validation_fails(User, prototype_params(User, 'surname' => '')) |
48 | # invalid email (unit-tested elsewhere) |
49 | assert_validation_fails(User, prototype_params(User, 'email' => 'bad@email')) |
50 | end |
51 | |
52 | def test_create_bad_firstname |
53 | # bad firstname doesn't match /^.{2,20}$/ |
54 | |
55 | # too short |
56 | db.execute('DELETE FROM users') |
57 | assert_validation_fails(User, prototype_params(User, {'firstname' => 'a'}), 'firstname') |
58 | assert_nothing_raised { User.create(prototype_params(User, {'firstname' => 'Aa'})) } |
59 | # too long |
60 | db.execute('DELETE FROM users') |
61 | assert_validation_fails(User, |
62 | prototype_params(User, 'firstname' => '123456789012345678901'), 'firstname') |
63 | assert_nothing_raised { |
64 | User.create(prototype_params(User, {'firstname' => '12345678901234567890'})) |
65 | } |
66 | end |
67 | |
68 | def test_create_bad_surname |
69 | # bad surname doesn't match /^.{2,20}$/ |
70 | |
71 | # too short |
72 | db.execute('DELETE FROM users') |
73 | assert_validation_fails(User, prototype_params(User, {'surname' => 'a'}), 'surname') |
74 | assert_nothing_raised { User.create(prototype_params(User, {'surname' => 'Aa'})) } |
75 | # too long |
76 | db.execute('DELETE FROM users') |
77 | assert_validation_fails(User, |
78 | prototype_params(User, 'surname' => '123456789012345678901'), 'surname') |
79 | assert_nothing_raised { |
80 | User.create(prototype_params(User, {'surname' => '12345678901234567890'})) |
81 | } |
82 | end |
83 | |
84 | def test_create_bad_name |
85 | # bad name doesn't match /^[a-z0-9\-]{3,15}$/i |
86 | |
87 | # too short |
88 | db.execute('DELETE FROM users') |
89 | assert_validation_fails(User, prototype_params(User, {'name' => 'aa'}), 'name') |
90 | assert_nothing_raised { User.create(prototype_params(User, {'name' => 'aAa'})) } |
91 | # too long |
92 | db.execute('DELETE FROM users') |
93 | assert_validation_fails(User, prototype_params(User, {'name' => '1234567890123456'}), 'name') |
94 | assert_nothing_raised { User.create(prototype_params(User, {'name' => '123456789012345'})) } |
95 | |
96 | # bad character |
97 | db.execute('DELETE FROM users') |
98 | assert_validation_fails(User, prototype_params(User, {'name' => 'aaa#'}), 'name') |
99 | assert_nothing_raised { User.create(prototype_params(User, {'name' => 'aZa-'})) } |
100 | end |
101 | |
102 | def test_create_duplicate_name |
103 | User.create(prototype_params(User)) |
104 | assert_validation_fails(User, prototype_params(User, {'email' => 'some@other.email'}), 'name') |
105 | end |
106 | |
107 | def test_create_duplicate_email |
108 | User.create(prototype_params(User)) |
109 | assert_validation_fails(User, prototype_params(User, {'name' => 'some other name'}), 'email') |
110 | end |
111 | |
112 | def test_update_read_time |
113 | user = User.find(1) |
114 | topic = Topic.find(2) |
115 | db.execute('DELETE FROM topic_reads') |
116 | |
117 | result = time {user.update_read_time(topic)} |
118 | |
119 | topic_reads = user.find_all_in_topic_reads |
120 | assert_equal 1, topic_reads.size |
121 | topic_read = topic_reads[0] |
122 | assert_equal topic_read, result |
123 | assert_equal_sysdate result.updated_at |
124 | assert_equal 2, result.topic_id |
125 | end |
126 | |
127 | def test_can_delete? |
128 | # post is own, has no children |
129 | assert User.find(2).can_delete?(Post.find(21)) |
130 | # post has no children but is somebody else's |
131 | assert !(User.find(3).can_delete?(Post.find(21))) |
132 | # own post, but it has children |
133 | assert !(User.find(2).can_delete?(Post.find(101))) |
134 | end |
135 | |
136 | def can_edit? |
137 | # post is own |
138 | assert User.find(2).can_edit?(Post.find(2)) |
139 | # post is somebody else's |
140 | assert !(User.find(2).can_edit?(Post.find(3))) |
141 | # anonymous post |
142 | Post.update 2, {'user_id' => nil} |
143 | assert !(User.find(2).can__edit?(Post.find(2))) |
144 | end |
145 | |
146 | def test_topic_read_times |
147 | # one topic read |
148 | assert_equal({1 => Time.mktime(2004, 10, 01, 0, 0, 0, 0)}, User.find(1).topic_read_times) |
149 | # one topic reads |
150 | expected_reads = { |
151 | 1 => Time.mktime(2004, 10, 03, 0, 0, 0, 0), |
152 | 3 => Time.mktime(2004, 10, 03, 1, 0, 0, 0), |
153 | } |
154 | assert_equal(expected_reads, User.find(3).topic_read_times) |
155 | # no topic reads |
156 | assert_equal({}, User.find(2).topic_read_times) |
157 | end |
158 | |
159 | def test_update_duplicate_validations |
160 | # update should bypass the already existing nick check |
161 | admin = User.find(1) |
162 | sergej = User.find(2) |
163 | |
164 | assert_raise(RForum::ValidationError) { User.update(2, 'name' => admin.name) } |
165 | assert_nothing_raised { User.update(2, 'name' => sergej.name) } |
166 | |
167 | # update should smartly check for the already existing email - email of another user should not |
168 | # be duplicated |
169 | assert_raise(RForum::ValidationError) { User.update(2, 'email' => admin.email) } |
170 | assert_nothing_raised { User.update(2, 'email' => sergej.email) } |
171 | end |
172 | |
173 | def test_update_nick_cannot_change |
174 | assert_raise(RForum::ValidationError) { User.update(2, 'name' => 'anothernick') } |
175 | end |
176 | |
177 | def test_create_unencrypted_password_handling |
178 | new_user = User.create(prototype_params(User)) |
179 | |
180 | password = new_user.instance_eval("@unencrypted_password") |
181 | assert_match /\w{8}/, password |
182 | assert_equal password, new_user.tell_and_forget_unencrypted_password |
183 | assert_nil new_user.instance_eval("@unencrypted_password") |
184 | end |
185 | |
186 | def test_generate_security_token |
187 | user = User.find(1) |
188 | assert_nil user.security_token |
189 | |
190 | time { user.generate_security_token } |
191 | |
192 | @start_time += RForum::CONFIG[:security_token_life_hours] * 60 * 60 |
193 | @finish_time += RForum::CONFIG[:security_token_life_hours] * 60 * 60 |
194 | |
195 | user_from_db = User.find(1) |
196 | assert user_from_db.token_expiry.to_i.between?(@start_time.to_i, @finish_time.to_i) |
197 | assert_match /\w{32}/, user_from_db.security_token |
198 | end |
199 | |
200 | def test_generate_security_token_twice |
201 | # If user clicks several times on |
202 | user = User.find(1) |
203 | token1 = user.generate_security_token |
204 | token2 = user.generate_security_token |
205 | assert_equal token1, token2 |
206 | |
207 | # but if a new security token is requested several hours later (more than half the token |
208 | # lifetime in fact), it should be generated anew, and the old one should be discarded. |
209 | token1 = user.generate_security_token |
210 | user.token_expiry = Time.at( |
211 | Time.now.to_i + RForum::CONFIG[:security_token_life_hours] * 60 * 60 / 2) |
212 | token2 = user.generate_security_token |
213 | assert token1 != token2 |
214 | end |
215 | |
216 | def test_find_by_token |
217 | user = User.find(1) |
218 | token = user.generate_security_token |
219 | |
220 | result = User.find_by_token(1, token) |
221 | |
222 | assert_equal user, result |
223 | end |
224 | |
225 | def test_find_by_token_error_handling |
226 | user = User.find(1) |
227 | token = user.generate_security_token |
228 | |
229 | assert_raise(ArgumentError) { result = User.find_by_token(1, nil) } |
230 | assert_raise(ArgumentError) { result = User.find_by_token(nil, token) } |
231 | |
232 | assert_nil User.find_by_token(1, "some_other_token") |
233 | assert_nil User.find_by_token(non_existent_user = 97531, token) |
234 | end |
235 | |
236 | def test_find_by_token_expired_token |
237 | user = User.find(1) |
238 | token = user.generate_security_token |
239 | |
240 | user.update_attribute('token_expiry', Time.at(Time.new.to_i - 1)) |
241 | |
242 | assert_nil User.find_by_token(1, token) |
243 | end |
244 | |
245 | # TODO test when token is expired |
246 | |
247 | def test_additional_information |
248 | # TODO: test if type checking works |
249 | user = User.find(1) |
250 | |
251 | user.additional_information = { 'Website' => 'http://andreas-s.net' } |
252 | user.save |
253 | |
254 | reloaded_user = User.find(1) |
255 | assert_equal user.additional_information, reloaded_user.additional_information |
256 | end |
257 | |
258 | end |