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