Mercurial > genshi > mirror
comparison examples/trac/trac/ticket/tests/model.py @ 39:93b4dcbafd7b trunk
Copy Trac to main branch.
author | cmlenz |
---|---|
date | Mon, 03 Jul 2006 18:53:27 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
38:ee669cb9cccc | 39:93b4dcbafd7b |
---|---|
1 from trac.config import Configuration | |
2 from trac.core import TracError | |
3 from trac.ticket.model import Ticket, Component, Milestone, Priority, Type | |
4 from trac.test import EnvironmentStub | |
5 | |
6 import unittest | |
7 | |
8 | |
9 class TicketTestCase(unittest.TestCase): | |
10 | |
11 def setUp(self): | |
12 self.env = EnvironmentStub(default_data=True) | |
13 self.env.config.set('ticket-custom', 'foo', 'text') | |
14 self.env.config.set('ticket-custom', 'cbon', 'checkbox') | |
15 self.env.config.set('ticket-custom', 'cboff', 'checkbox') | |
16 | |
17 def _insert_ticket(self, summary, **kw): | |
18 """Helper for inserting a ticket into the database""" | |
19 ticket = Ticket(self.env) | |
20 for k,v in kw.items(): | |
21 ticket[k] = v | |
22 return ticket.insert() | |
23 | |
24 def _create_a_ticket(self): | |
25 # 1. Creating ticket | |
26 ticket = Ticket(self.env) | |
27 ticket['reporter'] = 'santa' | |
28 ticket['summary'] = 'Foo' | |
29 ticket['foo'] = 'This is a custom field' | |
30 return ticket | |
31 | |
32 def test_create_ticket_1(self): | |
33 ticket = self._create_a_ticket() | |
34 self.assertEqual('santa', ticket['reporter']) | |
35 self.assertEqual('Foo', ticket['summary']) | |
36 self.assertEqual('This is a custom field', ticket['foo']) | |
37 ticket.insert() | |
38 | |
39 def test_create_ticket_2(self): | |
40 ticket = self._create_a_ticket() | |
41 ticket.insert() | |
42 # Retrieving ticket | |
43 ticket2 = Ticket(self.env, 1) | |
44 self.assertEqual(1, ticket2.id) | |
45 self.assertEqual('santa', ticket2['reporter']) | |
46 self.assertEqual('Foo', ticket2['summary']) | |
47 self.assertEqual('This is a custom field', ticket2['foo']) | |
48 | |
49 def _modify_a_ticket(self): | |
50 ticket2 = self._create_a_ticket() | |
51 ticket2.insert() | |
52 ticket2['summary'] = 'Bar' | |
53 ticket2['foo'] = 'New value' | |
54 ticket2.save_changes('santa', 'this is my comment') | |
55 return ticket2 | |
56 | |
57 def test_create_ticket_3(self): | |
58 self._modify_a_ticket() | |
59 # Retrieving ticket | |
60 ticket3 = Ticket(self.env, 1) | |
61 self.assertEqual(1, ticket3.id) | |
62 self.assertEqual(ticket3['reporter'], 'santa') | |
63 self.assertEqual(ticket3['summary'], 'Bar') | |
64 self.assertEqual(ticket3['foo'], 'New value') | |
65 | |
66 def test_create_ticket_4(self): | |
67 ticket3 = self._modify_a_ticket() | |
68 # Testing get_changelog() | |
69 log = ticket3.get_changelog() | |
70 self.assertEqual(len(log), 3) | |
71 ok_vals = ['foo', 'summary', 'comment'] | |
72 self.failUnless(log[0][2] in ok_vals) | |
73 self.failUnless(log[1][2] in ok_vals) | |
74 self.failUnless(log[2][2] in ok_vals) | |
75 | |
76 def test_create_ticket_5(self): | |
77 ticket3 = self._modify_a_ticket() | |
78 # Testing delete() | |
79 ticket3.delete() | |
80 log = ticket3.get_changelog() | |
81 self.assertEqual(len(log), 0) | |
82 self.assertRaises(TracError, Ticket, self.env, 1) | |
83 | |
84 def test_ticket_default_values(self): | |
85 """ | |
86 Verify that a ticket uses default values specified in the configuration | |
87 when created. | |
88 """ | |
89 # Set defaults for some standard fields | |
90 self.env.config.set('ticket', 'default_type', 'defect') | |
91 self.env.config.set('ticket', 'default_component', 'component1') | |
92 | |
93 # Add a custom field of type 'text' with a default value | |
94 self.env.config.set('ticket-custom', 'foo', 'text') | |
95 self.env.config.set('ticket-custom', 'foo.value', 'Something') | |
96 | |
97 # Add a custom field of type 'select' with a default value specified as | |
98 # the value itself | |
99 self.env.config.set('ticket-custom', 'bar', 'select') | |
100 self.env.config.set('ticket-custom', 'bar.options', 'one|two|three') | |
101 self.env.config.set('ticket-custom', 'bar.value', 'two') | |
102 | |
103 # Add a custom field of type 'select' with a default value specified as | |
104 # index into the options list | |
105 self.env.config.set('ticket-custom', 'baz', 'select') | |
106 self.env.config.set('ticket-custom', 'baz.options', 'one|two|three') | |
107 self.env.config.set('ticket-custom', 'baz.value', '2') | |
108 | |
109 ticket = Ticket(self.env) | |
110 self.assertEqual('defect', ticket['type']) | |
111 self.assertEqual('component1', ticket['component']) | |
112 self.assertEqual('Something', ticket['foo']) | |
113 self.assertEqual('two', ticket['bar']) | |
114 self.assertEqual('three', ticket['baz']) | |
115 | |
116 def test_set_field_stripped(self): | |
117 """ | |
118 Verify that whitespace around ticket fields is stripped, except for | |
119 textarea fields. | |
120 """ | |
121 ticket = Ticket(self.env) | |
122 ticket['component'] = ' foo ' | |
123 ticket['description'] = ' bar ' | |
124 self.assertEqual('foo', ticket['component']) | |
125 self.assertEqual(' bar ', ticket['description']) | |
126 | |
127 def test_owner_from_component(self): | |
128 """ | |
129 Verify that the owner of a new ticket is set to the owner of the | |
130 component. | |
131 """ | |
132 component = Component(self.env) | |
133 component.name = 'test' | |
134 component.owner = 'joe' | |
135 component.insert() | |
136 | |
137 ticket = Ticket(self.env) | |
138 ticket['reporter'] = 'santa' | |
139 ticket['summary'] = 'Foo' | |
140 ticket['component'] = 'test' | |
141 ticket.insert() | |
142 self.assertEqual('joe', ticket['owner']) | |
143 | |
144 def test_owner_from_changed_component(self): | |
145 """ | |
146 Verify that the owner of a new ticket is updated when the component is | |
147 changed. | |
148 """ | |
149 component1 = Component(self.env) | |
150 component1.name = 'test1' | |
151 component1.owner = 'joe' | |
152 component1.insert() | |
153 | |
154 component2 = Component(self.env) | |
155 component2.name = 'test2' | |
156 component2.owner = 'kate' | |
157 component2.insert() | |
158 | |
159 ticket = Ticket(self.env) | |
160 ticket['reporter'] = 'santa' | |
161 ticket['summary'] = 'Foo' | |
162 ticket['component'] = 'test1' | |
163 ticket['status'] = 'new' | |
164 tktid = ticket.insert() | |
165 | |
166 ticket = Ticket(self.env, tktid) | |
167 ticket['component'] = 'test2' | |
168 ticket.save_changes('jane', 'Testing') | |
169 self.assertEqual('kate', ticket['owner']) | |
170 | |
171 def test_populate_ticket(self): | |
172 data = {'summary': 'Hello world', 'reporter': 'john', 'foo': 'bar', | |
173 'foo': 'bar', 'checkbox_cbon': '', 'cbon': 'on', | |
174 'checkbox_cboff': ''} | |
175 ticket = Ticket(self.env) | |
176 ticket.populate(data) | |
177 | |
178 # Standard fields | |
179 self.assertEqual('Hello world', ticket['summary']) | |
180 self.assertEqual('john', ticket['reporter']) | |
181 | |
182 # An unknown field | |
183 self.assertRaises(KeyError, ticket.__getitem__, 'bar') | |
184 | |
185 # Custom field | |
186 self.assertEqual('bar', ticket['foo']) | |
187 | |
188 # Custom field of type 'checkbox' | |
189 self.assertEqual('on', ticket['cbon']) | |
190 self.assertEqual('0', ticket['cboff']) | |
191 | |
192 def test_changelog(self): | |
193 tkt_id = self._insert_ticket('Test', reporter='joe', component='foo', | |
194 milestone='bar') | |
195 ticket = Ticket(self.env, tkt_id) | |
196 ticket['component'] = 'bar' | |
197 ticket['milestone'] = 'foo' | |
198 ticket.save_changes('jane', 'Testing', when=42) | |
199 for t, author, field, old, new, permanent in ticket.get_changelog(): | |
200 self.assertEqual((42, 'jane', True), (t, author, permanent)) | |
201 if field == 'component': | |
202 self.assertEqual(('foo', 'bar'), (old, new)) | |
203 elif field == 'milestone': | |
204 self.assertEqual(('bar', 'foo'), (old, new)) | |
205 elif field == 'comment': | |
206 self.assertEqual(('', 'Testing'), (old, new)) | |
207 else: | |
208 self.fail('Unexpected change (%s)' | |
209 % ((t, author, field, old, new),)) | |
210 | |
211 def test_changelog_with_reverted_change(self): | |
212 tkt_id = self._insert_ticket('Test', reporter='joe', component='foo') | |
213 ticket = Ticket(self.env, tkt_id) | |
214 ticket['component'] = 'bar' | |
215 ticket['component'] = 'foo' | |
216 ticket.save_changes('jane', 'Testing', when=42) | |
217 for t, author, field, old, new, permanent in ticket.get_changelog(): | |
218 self.assertEqual((42, 'jane', True), (t, author, permanent)) | |
219 if field == 'comment': | |
220 self.assertEqual(('', 'Testing'), (old, new)) | |
221 else: | |
222 self.fail('Unexpected change (%s)' | |
223 % ((t, author, field, old, new),)) | |
224 | |
225 | |
226 class EnumTestCase(unittest.TestCase): | |
227 | |
228 def setUp(self): | |
229 self.env = EnvironmentStub(default_data=True) | |
230 | |
231 def test_priority_fetch(self): | |
232 prio = Priority(self.env, 'major') | |
233 self.assertEqual(prio.name, 'major') | |
234 self.assertEqual(prio.value, '3') | |
235 | |
236 def test_priority_insert(self): | |
237 prio = Priority(self.env) | |
238 prio.name = 'foo' | |
239 prio.insert() | |
240 self.assertEqual(True, prio.exists) | |
241 | |
242 def test_priority_insert_with_value(self): | |
243 prio = Priority(self.env) | |
244 prio.name = 'bar' | |
245 prio.value = 100 | |
246 prio.insert() | |
247 self.assertEqual(True, prio.exists) | |
248 | |
249 def test_priority_update(self): | |
250 prio = Priority(self.env, 'major') | |
251 prio.name = 'foo' | |
252 prio.update() | |
253 Priority(self.env, 'foo') | |
254 self.assertRaises(TracError, Priority, self.env, 'major') | |
255 | |
256 def test_priority_delete(self): | |
257 prio = Priority(self.env, 'major') | |
258 prio.delete() | |
259 self.assertEqual(False, prio.exists) | |
260 self.assertRaises(TracError, Priority, self.env, 'major') | |
261 | |
262 def test_ticket_type_update(self): | |
263 tkttype = Type(self.env, 'task') | |
264 self.assertEqual(tkttype.name, 'task') | |
265 self.assertEqual(tkttype.value, '3') | |
266 tkttype.name = 'foo' | |
267 tkttype.update() | |
268 Type(self.env, 'foo') | |
269 | |
270 | |
271 class MilestoneTestCase(unittest.TestCase): | |
272 | |
273 def setUp(self): | |
274 self.env = EnvironmentStub(default_data=True) | |
275 self.db = self.env.get_db_cnx() | |
276 | |
277 def test_new_milestone(self): | |
278 milestone = Milestone(self.env) | |
279 self.assertEqual(False, milestone.exists) | |
280 self.assertEqual(None, milestone.name) | |
281 self.assertEqual(0, milestone.due) | |
282 self.assertEqual(0, milestone.completed) | |
283 self.assertEqual('', milestone.description) | |
284 | |
285 def test_new_milestone_empty_name(self): | |
286 """ | |
287 Verifies that specifying an empty milestone name results in the | |
288 milestone being correctly detected as non-existent. | |
289 """ | |
290 milestone = Milestone(self.env, '') | |
291 self.assertEqual(False, milestone.exists) | |
292 self.assertEqual(None, milestone.name) | |
293 self.assertEqual(0, milestone.due) | |
294 self.assertEqual(0, milestone.completed) | |
295 self.assertEqual('', milestone.description) | |
296 | |
297 def test_existing_milestone(self): | |
298 cursor = self.db.cursor() | |
299 cursor.execute("INSERT INTO milestone (name) VALUES ('Test')") | |
300 cursor.close() | |
301 | |
302 milestone = Milestone(self.env, 'Test') | |
303 self.assertEqual(True, milestone.exists) | |
304 self.assertEqual('Test', milestone.name) | |
305 self.assertEqual(0, milestone.due) | |
306 self.assertEqual(0, milestone.completed) | |
307 self.assertEqual('', milestone.description) | |
308 | |
309 def test_create_milestone(self): | |
310 milestone = Milestone(self.env) | |
311 milestone.name = 'Test' | |
312 milestone.insert() | |
313 | |
314 cursor = self.db.cursor() | |
315 cursor.execute("SELECT name,due,completed,description FROM milestone " | |
316 "WHERE name='Test'") | |
317 self.assertEqual(('Test', 0, 0, ''), cursor.fetchone()) | |
318 | |
319 def test_create_milestone_without_name(self): | |
320 milestone = Milestone(self.env) | |
321 self.assertRaises(AssertionError, milestone.insert) | |
322 | |
323 def test_delete_milestone(self): | |
324 cursor = self.db.cursor() | |
325 cursor.execute("INSERT INTO milestone (name) VALUES ('Test')") | |
326 cursor.close() | |
327 | |
328 milestone = Milestone(self.env, 'Test') | |
329 milestone.delete() | |
330 | |
331 cursor = self.db.cursor() | |
332 cursor.execute("SELECT * FROM milestone WHERE name='Test'") | |
333 self.assertEqual(None, cursor.fetchone()) | |
334 | |
335 def test_delete_milestone_retarget_tickets(self): | |
336 cursor = self.db.cursor() | |
337 cursor.execute("INSERT INTO milestone (name) VALUES ('Test')") | |
338 cursor.close() | |
339 | |
340 tkt1 = Ticket(self.env) | |
341 tkt1.populate({'summary': 'Foo', 'milestone': 'Test'}) | |
342 tkt1.insert() | |
343 tkt2 = Ticket(self.env) | |
344 tkt2.populate({'summary': 'Bar', 'milestone': 'Test'}) | |
345 tkt2.insert() | |
346 | |
347 milestone = Milestone(self.env, 'Test') | |
348 milestone.delete(retarget_to='Other') | |
349 | |
350 self.assertEqual('Other', Ticket(self.env, tkt1.id)['milestone']) | |
351 self.assertEqual('Other', Ticket(self.env, tkt2.id)['milestone']) | |
352 | |
353 def test_update_milestone(self): | |
354 cursor = self.db.cursor() | |
355 cursor.execute("INSERT INTO milestone (name) VALUES ('Test')") | |
356 cursor.close() | |
357 | |
358 milestone = Milestone(self.env, 'Test') | |
359 milestone.due = 42 | |
360 milestone.completed = 43 | |
361 milestone.description = 'Foo bar' | |
362 milestone.update() | |
363 | |
364 cursor = self.db.cursor() | |
365 cursor.execute("SELECT * FROM milestone WHERE name='Test'") | |
366 self.assertEqual(('Test', 42, 43, 'Foo bar'), cursor.fetchone()) | |
367 | |
368 def test_update_milestone_without_name(self): | |
369 cursor = self.db.cursor() | |
370 cursor.execute("INSERT INTO milestone (name) VALUES ('Test')") | |
371 cursor.close() | |
372 | |
373 milestone = Milestone(self.env, 'Test') | |
374 milestone.name = None | |
375 self.assertRaises(AssertionError, milestone.update) | |
376 | |
377 def test_update_milestone_update_tickets(self): | |
378 cursor = self.db.cursor() | |
379 cursor.execute("INSERT INTO milestone (name) VALUES ('Test')") | |
380 cursor.close() | |
381 | |
382 tkt1 = Ticket(self.env) | |
383 tkt1.populate({'summary': 'Foo', 'milestone': 'Test'}) | |
384 tkt1.insert() | |
385 tkt2 = Ticket(self.env) | |
386 tkt2.populate({'summary': 'Bar', 'milestone': 'Test'}) | |
387 tkt2.insert() | |
388 | |
389 milestone = Milestone(self.env, 'Test') | |
390 milestone.name = 'Testing' | |
391 milestone.update() | |
392 | |
393 self.assertEqual('Testing', Ticket(self.env, tkt1.id)['milestone']) | |
394 self.assertEqual('Testing', Ticket(self.env, tkt2.id)['milestone']) | |
395 | |
396 def test_select_milestones(self): | |
397 cursor = self.db.cursor() | |
398 cursor.executemany("INSERT INTO milestone (name) VALUES (%s)", | |
399 [('1.0',), ('2.0',)]) | |
400 cursor.close() | |
401 | |
402 milestones = list(Milestone.select(self.env)) | |
403 self.assertEqual('1.0', milestones[0].name) | |
404 assert milestones[0].exists | |
405 self.assertEqual('2.0', milestones[1].name) | |
406 assert milestones[1].exists | |
407 | |
408 | |
409 def suite(): | |
410 suite = unittest.TestSuite() | |
411 suite.addTest(unittest.makeSuite(TicketTestCase, 'test')) | |
412 suite.addTest(unittest.makeSuite(EnumTestCase, 'test')) | |
413 suite.addTest(unittest.makeSuite(MilestoneTestCase, 'test')) | |
414 return suite | |
415 | |
416 if __name__ == '__main__': | |
417 unittest.main(defaultTest='suite') |