def test_scale_weekends(self): chart = BurndownChart(self.env) # 7 days, monday -> sunday this week now = datetime.now(utc).date() day1 = now - timedelta(days=now.weekday()) day2 = day1 + timedelta(days=1) day3 = day1 + timedelta(days=2) day4 = day1 + timedelta(days=3) day5 = day1 + timedelta(days=4) day6 = day1 + timedelta(days=5) day7 = day1 + timedelta(days=6) options = {'startdate': day1, 'enddate': day7, 'today': day7} timetable = { day1: Decimal(70), day2: Decimal(60), day3: Decimal(50), day4: Decimal(40), day5: Decimal(30), day6: Decimal(20), day7: Decimal(10) } self.assertEquals( chart._scale_data(timetable, options), (['0.00', '16.67', '33.33', '50.00', '66.67', '83.33', '100.00'], [ '100.00', '85.71', '71.43', '57.14', '42.86', '28.57', '14.29' ], Decimal('70')))
def test_calculate_timetable_without_milestone(self): chart = BurndownChart(self.env) day1 = datetime.now(utc).date() day2 = day1 + timedelta(days=1) day3 = day2 + timedelta(days=1) options = {'today': day3, 'startdate': day1, 'enddate': day3} self._insert_ticket('10') timetable, _ = chart._calculate_timetable(options, {}, self.req) self.assertEqual(timetable, {day1: Decimal(10), day2: Decimal(10), day3: Decimal(10)})
def test_build_empty_chart(self): chart = BurndownChart(self.env) db = self.env.get_db_cnx() options, query_args = parse_options(db, "milestone=milestone1, startdate=2008-02-20, enddate=2008-02-28", {}) timetable = chart._calculate_timetable(options, query_args, self.req) xdata, ydata, maxhours = chart._scale_data(timetable, options) self.assertEqual(xdata, ['0.00', '12.50', '25.00', '37.50', '50.00', '62.50', '75.00', '87.50', '100.00']) self.assertEqual(ydata, ['0.00', '0.00', '0.00', '0.00', '0.00', '0.00', '0.00', '0.00', '0.00']) self.assertEqual(maxhours, Decimal(100))
def test_build_empty_chart(self): chart = BurndownChart(self.env) db = self.env.get_db_cnx() options, query_args = parse_options(db, "milestone=milestone1, startdate=2008-02-20, enddate=2008-02-28", {}) timetable, _ = chart._calculate_timetable(options, query_args, self.req) dates = sorted(timetable.keys()) xdata, ydata, maxhours = chart._scale_data(timetable, dates, Decimal(0), options) self.assertEqual(xdata, ['0.00', '12.50', '25.00', '37.50', '50.00', '62.50', '75.00', '87.50', '100.00']) self.assertEqual(ydata, ['0.00', '0.00', '0.00', '0.00', '0.00', '0.00', '0.00', '0.00', '0.00']) self.assertEqual(maxhours, Decimal(100))
def test_calculate_timetable_simple(self): chart = BurndownChart(self.env) day1 = datetime.now(utc).date() day2 = day1 + timedelta(days=1) day3 = day2 + timedelta(days=1) options = {'today': day3, 'startdate': day1, 'enddate': day3, 'closedstates': ['closed']} query_args = {'milestone': "milestone1"} self._insert_ticket('10') timetable = chart._calculate_timetable(options, query_args, self.req) self.assertEqual(timetable, {day1: Decimal(10), day2: Decimal(10), day3: Decimal(10)})
def test_calculate_timetable_with_gibberish_estimates(self): chart = BurndownChart(self.env) day1 = datetime.now(utc).date() day2 = day1 + timedelta(days=1) day3 = day2 + timedelta(days=1) options = {'today': day3, 'startdate': day1, 'enddate': day3} query_args = {'milestone': "milestone1"} ticket1 = self._insert_ticket('10') self._change_ticket_estimations(ticket1, {day2: 'IGNOREME', day3:'5'}) timetable, _ = chart._calculate_timetable(options, query_args, self.req) self.assertEqual(timetable, {day1: Decimal(10), day2: Decimal(10), day3: Decimal(5)})
def test_url_encode(self): start = datetime.now(utc).date() end = (start + timedelta(days=5)).strftime('%Y-%m-%d') start = start.strftime('%Y-%m-%d') chart = BurndownChart(self.env) t = Ticket(self.env, self._insert_ticket('12')) result = chart.expand_macro(self.formatter, 'BurndownChart', "milestone=milestone1, startdate=%s, enddate=%s" % (start, end)) self.failUnless("&chtt=milestone1&" in str(result)) result = chart.expand_macro(self.formatter, 'BurndownChart', "milestone=One & Two, startdate=%s, enddate=%s" % (start, end)) self.failUnless("&chtt=One+%26+Two&" in str(result))
def test_build_empty_chart(self): chart = BurndownChart(self.env) str = "milestone=milestone1, startdate=2008-02-20, enddate=2008-02-28" options, query_args = parse_options(self.env, str, {}) timetable = chart._calculate_timetable(options, query_args, self.req) xdata, ydata, maxhours = chart._scale_data(timetable, options) self.assertEqual(xdata, ['0.00', '12.50', '25.00', '37.50', '50.00', '62.50', '75.00', '87.50', '100.00']) self.assertEqual(ydata, ['0.00', '0.00', '0.00', '0.00', '0.00', '0.00', '0.00', '0.00', '0.00']) self.assertEqual(maxhours, Decimal(100))
def test_calculate_timetable_with_closed_and_reopened_ticket(self): chart = BurndownChart(self.env) day1 = datetime.now(utc).date() day2 = day1 + timedelta(days=1) day3 = day2 + timedelta(days=1) day4 = day3 + timedelta(days=1) options = {'today': day4, 'startdate': day1, 'enddate': day4} query_args = {'milestone': "milestone1"} ticket1 = self._insert_ticket('10') self._change_ticket_estimations(ticket1, {day3:'5'}) self._change_ticket_states(ticket1, {day2: 'closed', day4: 'new'}) timetable, _ = chart._calculate_timetable(options, query_args, self.req) self.assertEqual(timetable, {day1: Decimal(10), day2: Decimal(0), day3: Decimal(0), day4: Decimal(5)})
def test_expected_y_axis(self): start = datetime.now(utc).date() end = (start + timedelta(days=5)).strftime('%Y-%m-%d') start = start.strftime('%Y-%m-%d') chart = BurndownChart(self.env) t = Ticket(self.env, self._insert_ticket('12')) # Test without expected result = chart.expand_macro(self.formatter, 'BurndownChart', "startdate=%s, enddate=%s" % (start, end)) self.assertEquals(self._extract_query(result)['chxr'], [u'2,0,12']) # Confirm Y axis changes with new higher expected result = chart.expand_macro(self.formatter, 'BurndownChart', "startdate=%s, enddate=%s, expected=200" % (start, end)) self.assertEquals(self._extract_query(result)['chxr'], [u'2,0,200'])
def test_calculate_timetable_with_simple_changes_2(self): chart = BurndownChart(self.env) day1 = datetime.now(utc).date() day2 = day1 + timedelta(days=1) day3 = day2 + timedelta(days=1) options = {'today': day3, 'startdate': day1, 'enddate': day3, 'closedstates': ['closed']} query_args = {'milestone': "milestone1"} ticket1 = self._insert_ticket('10') self._change_ticket_estimations(ticket1, {day2:'5', day3:''}) ticket2 = self._insert_ticket('0') self._change_ticket_estimations(ticket2, {day2:'1', day3:'2'}) timetable = chart._calculate_timetable(options, query_args, self.req) self.assertEqual(timetable, {day1: Decimal(10), day2: Decimal(6), day3: Decimal(2)})
def test_url_encode(self): start = datetime.now(utc).date() end = (start + timedelta(days=5)).strftime('%Y-%m-%d') start = start.strftime('%Y-%m-%d') chart = BurndownChart(self.env) t = Ticket(self.env, self._insert_ticket('12')) result = chart.expand_macro( self.formatter, 'BurndownChart', "milestone=milestone1, startdate=%s, enddate=%s" % (start, end)) self.failUnless("&chtt=milestone1&" in str(result)) result = chart.expand_macro( self.formatter, 'BurndownChart', "milestone=One & Two, startdate=%s, enddate=%s" % (start, end)) self.failUnless("&chtt=One+%26+Two&" in str(result))
def test_expected_y_axis(self): start = datetime.now(utc).date() end = (start + timedelta(days=5)).strftime('%Y-%m-%d') start = start.strftime('%Y-%m-%d') chart = BurndownChart(self.env) t = Ticket(self.env, self._insert_ticket('12')) # Test without expected result = chart.expand_macro(self.formatter, 'BurndownChart', "startdate=%s, enddate=%s" % (start, end)) self.assertEquals(self._extract_query(result)['chxr'], [u'2,0,12']) # Confirm Y axis changes with new higher expected result = chart.expand_macro( self.formatter, 'BurndownChart', "startdate=%s, enddate=%s, expected=200" % (start, end)) self.assertEquals(self._extract_query(result)['chxr'], [u'2,0,200'])
def test_calculate_delta_no_new_or_changed(self): chart = BurndownChart(self.env) day1 = datetime.now(utc).date() day2 = day1 + timedelta(days=1) day3 = day2 + timedelta(days=1) options = {'today': day3, 'startdate': day1, 'enddate': day3, 'change': True} query_args = {'milestone': "milestone1"} ticket1 = self._insert_ticket('10') self._change_ticket_estimations(ticket1, {day2:'5', day3:''}) ticket2 = self._insert_ticket('0') self._change_ticket_estimations(ticket2, {day2:'1', day3:'2'}) timetable, delta = chart._calculate_timetable(options, query_args, self.req) self.assertEqual(timetable, {day1: Decimal(10), day2: Decimal(6), day3: Decimal(2)}) self.assertEqual(delta, {day1: Decimal(0), day2: Decimal(0), day3: Decimal(0)})
def test_url_encode_parenthesis(self): # http://trac-hacks.org/ticket/8299 start = (datetime.now(utc).date() - timedelta(days=1)).strftime('%Y-%m-%d') end = (datetime.now(utc).date() + timedelta(days=1)).strftime('%Y-%m-%d') chart = BurndownChart(self.env) def verify_milestone(milestone): t = Ticket(self.env, self._insert_ticket('12')) t['milestone'] = milestone t.save_changes('', '') result = chart.expand_macro(self.formatter, 'BurndownChart', "milestone=%s, startdate=%s, enddate=%s" \ % (milestone, start, end)) args = self._extract_query(result) # data self.assertEquals( (milestone, args['chd']), (milestone, [u't:0.00,50.00,100.00|0.00,100.00,-1'])) # scaling / axis self.assertEquals((milestone, args['chxr']), (milestone, [u'2,0,12'])) # title self.assertEquals(args['chtt'], [milestone]) verify_milestone('Test') verify_milestone('T(es)t') verify_milestone('(Test)')
def test_calculate_timetable_with_simple_changes_2(self): chart = BurndownChart(self.env) day1 = datetime.now(utc).date() day2 = day1 + timedelta(days=1) day3 = day2 + timedelta(days=1) options = {'today': day3, 'startdate': day1, 'enddate': day3, 'closedstates': ['closed']} query_args = {'milestone': "milestone1"} ticket1 = self._insert_ticket('10') self._change_ticket_estimations(ticket1, {day2: '5', day3: ''}) ticket2 = self._insert_ticket('0') self._change_ticket_estimations(ticket2, {day2: '1', day3: '2'}) timetable = chart._calculate_timetable(options, query_args, self.req) self.assertEqual(timetable, {day1: Decimal(10), day2: Decimal(6), day3: Decimal(2)})
def test_date_intervals(self): chart = BurndownChart(self.env) day1 = datetime.now(utc).date() day2 = day1 + timedelta(days=1) day3 = day2 + timedelta(days=1) day4 = day3 + timedelta(days=1) day5 = day4 + timedelta(days=1) options = {'today': day5, 'startdate': day1, 'enddate': day5, 'interval_days': 2} query_args = {'milestone': "milestone1"} ticket1 = self._insert_ticket('10') ticket2 = self._insert_ticket('5') self._change_ticket_estimations(ticket2, {day3:'1', day4:'2', day5:'3'}) timetable, delta = chart._calculate_timetable(options, query_args, self.req) self.assertEqual(timetable, {day1: Decimal(15), day3: Decimal(11), day5: Decimal(13)}) self.assertEqual(delta, {day1: Decimal(0), day3: Decimal(0), day5: Decimal(0)})
def test_calculate_delta_with_changed_estimates(self): chart = BurndownChart(self.env) day1 = datetime.now(utc).date() day2 = day1 + timedelta(days=1) day3 = day2 + timedelta(days=1) options = {'today': day3, 'startdate': day1, 'enddate': day3, 'change': True} query_args = {'milestone': "milestone1"} ticket1 = self._insert_ticket('10') ticket2 = self._insert_ticket('5') self._change_ticket_initial_estimations(ticket1, {day2:'8'}) # -2 self._change_ticket_initial_estimations(ticket2, {day3:'8'}) # +3 import time; time.sleep(1) # Avoid time resolution problem self._change_ticket_estimations(ticket2, {day2:'1', day3:'2'}) timetable, delta = chart._calculate_timetable(options, query_args, self.req) self.assertEqual(timetable, {day1: Decimal(15), day2: Decimal(11), day3: Decimal(12)}) self.assertEqual(delta, {day1: Decimal(0), day2: Decimal(-2), day3: Decimal(3)})
def test_scale_weekends(self): chart = BurndownChart(self.env) # 7 days, monday -> sunday this week now = datetime.now(utc).date() day1 = now - timedelta(days=now.weekday()) day2 = day1 + timedelta(days=1) day3 = day1 + timedelta(days=2) day4 = day1 + timedelta(days=3) day5 = day1 + timedelta(days=4) day6 = day1 + timedelta(days=5) day7 = day1 + timedelta(days=6) options = {'startdate': day1, 'enddate': day7, 'today': day7} timetable = {day1: Decimal(70), day2: Decimal(60), day3: Decimal(50), day4: Decimal(40), day5: Decimal(30), day6: Decimal(20), day7: Decimal(10)} self.assertEquals(chart._scale_data(timetable, options), (['0.00', '16.67', '33.33', '50.00', '66.67', '83.33', '100.00'], ['100.00', '85.71', '71.43', '57.14', '42.86', '28.57', '14.29'], Decimal('70')))
def test_scale_no_weekends(self): chart = BurndownChart(self.env) # 7 days, monday -> friday this week now = datetime.now(utc).date() day1 = now - timedelta(days=now.weekday()) day2 = day1 + timedelta(days=1) day3 = day1 + timedelta(days=2) day4 = day1 + timedelta(days=3) day5 = day1 + timedelta(days=4) day6 = day1 + timedelta(days=5) day7 = day1 + timedelta(days=6) options = {'startdate': day1, 'enddate': day7, 'today': day7} # no weekends option, so day6 and day7 not included timetable = {day1: Decimal(70), day2: Decimal(60), day3: Decimal(50), day4: Decimal(40), day5: Decimal(30)} self.assertEquals(chart._scale_data(timetable, options), (['0.00', '25.00', '50.00', '75.00', '100.00'], ['100.00', '85.71', '71.43', '57.14', '42.86'], Decimal('70')))
def test_build_zero_day_chart(self): chart = BurndownChart(self.env) # shouldn't throw chart.expand_macro(self.formatter, "", "startdate=2008-01-01, enddate=2008-01-01")
def test_build_zero_day_chart(self): chart = BurndownChart(self.env) # shouldn't throw chart.render_macro(self.req, "", "startdate=2008-01-01, enddate=2008-01-01")