1
from trac.config import Configuration
2
from trac.test import EnvironmentStub
3
from trac.ticket.roadmap import *
4
from trac.core import ComponentManager
8
class TicketGroupStatsTestCase(unittest.TestCase):
11
self.stats = TicketGroupStats('title', 'unit')
14
self.assertEquals('title', self.stats.title, 'title incorrect')
15
self.assertEquals('unit', self.stats.unit, 'unit incorrect')
16
self.assertEquals(0, self.stats.count, 'count not zero')
17
self.assertEquals(0, len(self.stats.intervals), 'intervals not empty')
19
def test_add_iterval(self):
20
self.stats.add_interval('intTitle', 3, {'k1': 'v1'}, 'css', 0)
21
self.stats.refresh_calcs()
22
self.assertEquals(3, self.stats.count, 'count not incremented')
23
int = self.stats.intervals[0]
24
self.assertEquals('intTitle', int['title'], 'title incorrect')
25
self.assertEquals(3, int['count'], 'count incorrect')
26
self.assertEquals({'k1': 'v1'}, int['qry_args'], 'query args incorrect')
27
self.assertEquals('css', int['css_class'], 'css class incorrect')
28
self.assertEquals(100, int['percent'], 'percent incorrect')
29
self.stats.add_interval('intTitle', 3, {'k1': 'v1'}, 'css', 0)
30
self.stats.refresh_calcs()
31
self.assertEquals(50, int['percent'], 'percent not being updated')
33
def test_add_interval_no_prog(self):
34
self.stats.add_interval('intTitle', 3, {'k1': 'v1'}, 'css', 0)
35
self.stats.add_interval('intTitle', 5, {'k1': 'v1'}, 'css', 0)
36
self.stats.refresh_calcs()
37
int = self.stats.intervals[1]
38
self.assertEquals(0, self.stats.done_count, 'count added for no prog')
39
self.assertEquals(0, self.stats.done_percent, 'percent incremented')
41
def test_add_interval_prog(self):
42
self.stats.add_interval('intTitle', 3, {'k1': 'v1'}, 'css', 0)
43
self.stats.add_interval('intTitle', 1, {'k1': 'v1'}, 'css', 1)
44
self.stats.refresh_calcs()
45
self.assertEquals(4, self.stats.count, 'count not incremented')
46
self.assertEquals(1, self.stats.done_count, 'count not added to prog')
47
self.assertEquals(25, self.stats.done_percent, 'done percent not incr')
49
def test_add_interval_fudging(self):
50
self.stats.add_interval('intTitle', 3, {'k1': 'v1'}, 'css', 0)
51
self.stats.add_interval('intTitle', 5, {'k1': 'v1'}, 'css', 1)
52
self.stats.refresh_calcs()
53
self.assertEquals(8, self.stats.count, 'count not incremented')
54
self.assertEquals(5, self.stats.done_count, 'count not added to prog')
55
self.assertEquals(62, self.stats.done_percent,
56
'done percnt not fudged downward')
57
self.assertEquals(62, self.stats.intervals[1]['percent'],
58
'interval percent not fudged downward')
59
self.assertEquals(38, self.stats.intervals[0]['percent'],
60
'interval percent not fudged upward')
63
class DefaultTicketGroupStatsProviderTestCase(unittest.TestCase):
66
self.env = EnvironmentStub(default_data=True)
68
self.milestone1 = Milestone(self.env)
69
self.milestone1.name = 'Test'
70
self.milestone1.insert()
71
self.milestone2 = Milestone(self.env)
72
self.milestone2.name = 'Test2'
73
self.milestone2.insert()
75
tkt1 = Ticket(self.env)
76
tkt1.populate({'summary': 'Foo', 'milestone': 'Test', 'owner': 'foman',
79
tkt2 = Ticket(self.env)
80
tkt2.populate({'summary': 'Bar', 'milestone': 'Test',
81
'status': 'closed', 'owner': 'barman'})
83
tkt3 = Ticket(self.env)
84
tkt3.populate({'summary': 'Sum', 'milestone': 'Test', 'owner': 'suman',
85
'status': 'reopened'})
91
prov = DefaultTicketGroupStatsProvider(ComponentManager())
93
prov.config = self.env.config
94
self.stats = prov.get_ticket_group_stats([tkt1.id, tkt2.id, tkt3.id])
97
self.assertEquals(self.stats.title, 'ticket status', 'title incorrect')
98
self.assertEquals(self.stats.unit, 'ticket', 'unit incorrect')
99
self.assertEquals(2, len(self.stats.intervals), 'more than 2 intervals')
101
def test_closed_interval(self):
102
closed = self.stats.intervals[0]
103
self.assertEquals('closed', closed['title'], 'closed title incorrect')
104
self.assertEquals('closed', closed['css_class'], 'closed class incorrect')
105
self.assertEquals(True, closed['overall_completion'],
106
'closed should contribute to overall completion')
107
self.assertEquals({'status': ['closed'], 'group': 'resolution'},
108
closed['qry_args'], 'qry_args incorrect')
109
self.assertEquals(1, closed['count'], 'closed count incorrect')
110
self.assertEquals(33, closed['percent'], 'closed percent incorrect')
112
def test_open_interval(self):
113
open = self.stats.intervals[1]
114
self.assertEquals('active', open['title'], 'open title incorrect')
115
self.assertEquals('open', open['css_class'], 'open class incorrect')
116
self.assertEquals(False, open['overall_completion'],
117
"open shouldn't contribute to overall completion")
118
self.assertEquals({'status':
119
[u'assigned', u'new', u'accepted', u'reopened']},
120
open['qry_args'], 'qry_args incorrect')
121
self.assertEquals(2, open['count'], 'open count incorrect')
122
self.assertEquals(67, open['percent'], 'open percent incorrect')
125
def in_tlist(ticket, list):
126
return len([t for t in list if t['id'] == ticket.id]) > 0
129
suite = unittest.TestSuite()
130
suite.addTest(unittest.makeSuite(TicketGroupStatsTestCase, 'test'))
131
suite.addTest(unittest.makeSuite(DefaultTicketGroupStatsProviderTestCase,
135
if __name__ == '__main__':
136
unittest.main(defaultTest='suite')