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')
Copyright (C) 2012-2017 Edgewall Software