📄 model.py
字号:
from trac import corefrom trac.core import TracError, implementsfrom trac.resource import ResourceNotFoundfrom trac.ticket.model import Ticket, Component, Milestone, Priority, Type, Versionfrom trac.ticket.api import ITicketChangeListenerfrom trac.test import EnvironmentStubfrom trac.util.datefmt import utc, to_timestampfrom datetime import datetimeimport unittestclass TestTicketChangeListener(core.Component): implements(ITicketChangeListener) def ticket_created(self, ticket): self.action = 'created' self.ticket = ticket def ticket_changed(self, ticket, comment, author, old_values): self.action = 'changed' self.ticket = ticket self.comment = comment self.author = author self.old_values = old_values def ticket_deleted(self, ticket): self.action = 'deleted' self.ticket = ticketclass TicketTestCase(unittest.TestCase): def setUp(self): self.env = EnvironmentStub(default_data=True) self.env.config.set('ticket-custom', 'foo', 'text') self.env.config.set('ticket-custom', 'cbon', 'checkbox') self.env.config.set('ticket-custom', 'cboff', 'checkbox') def _insert_ticket(self, summary, **kw): """Helper for inserting a ticket into the database""" ticket = Ticket(self.env) for k,v in kw.items(): ticket[k] = v return ticket.insert() def _create_a_ticket(self): # 1. Creating ticket ticket = Ticket(self.env) ticket['reporter'] = 'santa' ticket['summary'] = 'Foo' ticket['foo'] = 'This is a custom field' return ticket def test_invalid_ticket_id(self): self.assertEqual(Ticket.id_is_valid(-1), False) self.assertEqual(Ticket.id_is_valid(0), False) self.assertEqual(Ticket.id_is_valid(1), True) self.assertEqual(Ticket.id_is_valid(1L << 31), True) self.assertEqual(Ticket.id_is_valid(1L << 32), False) self.assertRaises(ResourceNotFound, Ticket, self.env, -1) self.assertRaises(ResourceNotFound, Ticket, self.env, 1L << 32) def test_create_ticket_1(self): ticket = self._create_a_ticket() self.assertEqual('santa', ticket['reporter']) self.assertEqual('Foo', ticket['summary']) self.assertEqual('This is a custom field', ticket['foo']) ticket.insert() def test_create_ticket_2(self): ticket = self._create_a_ticket() ticket.insert() # Retrieving ticket ticket2 = Ticket(self.env, 1) self.assertEqual(1, ticket2.id) self.assertEqual('santa', ticket2['reporter']) self.assertEqual('Foo', ticket2['summary']) self.assertEqual('This is a custom field', ticket2['foo']) def _modify_a_ticket(self): ticket2 = self._create_a_ticket() ticket2.insert() ticket2['summary'] = 'Bar' ticket2['foo'] = 'New value' ticket2.save_changes('santa', 'this is my comment') return ticket2 def test_create_ticket_3(self): self._modify_a_ticket() # Retrieving ticket ticket3 = Ticket(self.env, 1) self.assertEqual(1, ticket3.id) self.assertEqual(ticket3['reporter'], 'santa') self.assertEqual(ticket3['summary'], 'Bar') self.assertEqual(ticket3['foo'], 'New value') def test_create_ticket_4(self): ticket3 = self._modify_a_ticket() # Testing get_changelog() log = ticket3.get_changelog() self.assertEqual(len(log), 3) ok_vals = ['foo', 'summary', 'comment'] self.failUnless(log[0][2] in ok_vals) self.failUnless(log[1][2] in ok_vals) self.failUnless(log[2][2] in ok_vals) def test_create_ticket_5(self): ticket3 = self._modify_a_ticket() # Testing delete() ticket3.delete() log = ticket3.get_changelog() self.assertEqual(len(log), 0) self.assertRaises(TracError, Ticket, self.env, 1) def test_ticket_default_values(self): """ Verify that a ticket uses default values specified in the configuration when created. """ # Set defaults for some standard fields self.env.config.set('ticket', 'default_type', 'defect') self.env.config.set('ticket', 'default_component', 'component1') # Add a custom field of type 'text' with a default value self.env.config.set('ticket-custom', 'foo', 'text') self.env.config.set('ticket-custom', 'foo.value', 'Something') # Add a custom field of type 'select' with a default value specified as # the value itself self.env.config.set('ticket-custom', 'bar', 'select') self.env.config.set('ticket-custom', 'bar.options', 'one|two|three') self.env.config.set('ticket-custom', 'bar.value', 'two') # Add a custom field of type 'select' with a default value specified as # index into the options list self.env.config.set('ticket-custom', 'baz', 'select') self.env.config.set('ticket-custom', 'baz.options', 'one|two|three') self.env.config.set('ticket-custom', 'baz.value', '2') ticket = Ticket(self.env) self.assertEqual('defect', ticket['type']) self.assertEqual('component1', ticket['component']) self.assertEqual('Something', ticket['foo']) self.assertEqual('two', ticket['bar']) self.assertEqual('three', ticket['baz']) def test_set_field_stripped(self): """ Verify that whitespace around ticket fields is stripped, except for textarea fields. """ ticket = Ticket(self.env) ticket['component'] = ' foo ' ticket['description'] = ' bar ' self.assertEqual('foo', ticket['component']) self.assertEqual(' bar ', ticket['description']) def test_set_field_multi(self): """ Ticket fields can't yet be multi-valued """ ticket = Ticket(self.env) def set_multi_valued(): ticket['component'] = [' foo ', ' bar '] self.assertRaises(TracError, set_multi_valued) def test_owner_from_component(self): """ Verify that the owner of a new ticket is set to the owner of the component. """ component = Component(self.env) component.name = 'test' component.owner = 'joe' component.insert() ticket = Ticket(self.env) ticket['reporter'] = 'santa' ticket['summary'] = 'Foo' ticket['component'] = 'test' ticket.insert() self.assertEqual('joe', ticket['owner']) def test_owner_from_changed_component(self): """ Verify that the owner of a new ticket is updated when the component is changed. """ component1 = Component(self.env) component1.name = 'test1' component1.owner = 'joe' component1.insert() component2 = Component(self.env) component2.name = 'test2' component2.owner = 'kate' component2.insert() ticket = Ticket(self.env) ticket['reporter'] = 'santa' ticket['summary'] = 'Foo' ticket['component'] = 'test1' ticket['status'] = 'new' tktid = ticket.insert() ticket = Ticket(self.env, tktid) ticket['component'] = 'test2' ticket.save_changes('jane', 'Testing') self.assertEqual('kate', ticket['owner']) def test_populate_ticket(self): data = {'summary': 'Hello world', 'reporter': 'john', 'foo': 'bar', 'foo': 'bar', 'checkbox_cbon': '', 'cbon': 'on', 'checkbox_cboff': ''} ticket = Ticket(self.env) ticket.populate(data) # Standard fields self.assertEqual('Hello world', ticket['summary']) self.assertEqual('john', ticket['reporter']) # An unknown field assert ticket['bar'] is None # Custom field self.assertEqual('bar', ticket['foo']) # Custom field of type 'checkbox' self.assertEqual('on', ticket['cbon']) self.assertEqual('0', ticket['cboff']) def test_changelog(self): tkt_id = self._insert_ticket('Test', reporter='joe', component='foo', milestone='bar') ticket = Ticket(self.env, tkt_id) ticket['component'] = 'bar' ticket['milestone'] = 'foo' now = datetime(2001, 1, 1, 1, 1, 1, 0, utc) ticket.save_changes('jane', 'Testing', now) for t, author, field, old, new, permanent in ticket.get_changelog(): self.assertEqual((now, 'jane', True), (t, author, permanent)) if field == 'component': self.assertEqual(('foo', 'bar'), (old, new)) elif field == 'milestone': self.assertEqual(('bar', 'foo'), (old, new)) elif field == 'comment': self.assertEqual(('', 'Testing'), (old, new)) else: self.fail('Unexpected change (%s)' % ((t, author, field, old, new),)) def test_changelog_with_reverted_change(self): tkt_id = self._insert_ticket('Test', reporter='joe', component='foo') ticket = Ticket(self.env, tkt_id) ticket['component'] = 'bar' ticket['component'] = 'foo' now = datetime(2001, 1, 1, 1, 1, 1, 0, utc) ticket.save_changes('jane', 'Testing', now) for t, author, field, old, new, permanent in ticket.get_changelog(): self.assertEqual((now, 'jane', True), (t, author, permanent)) if field == 'comment': self.assertEqual(('', 'Testing'), (old, new)) else: self.fail('Unexpected change (%s)' % ((t, author, field, old, new),)) def test_change_listener_created(self): listener = TestTicketChangeListener(self.env)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -