def test_save_comment(self): """Comments are saved to all selected tickets.""" first_ticket_id = self._insert_ticket('Test 1', reporter='joe') second_ticket_id = self._insert_ticket('Test 2', reporter='joe') selected_tickets = [first_ticket_id, second_ticket_id] batch = BatchModifyModule(self.env) batch._save_ticket_changes(self.req, selected_tickets, {}, 'comment', 'leave') self.assertCommentAdded(first_ticket_id, 'comment') self.assertCommentAdded(second_ticket_id, 'comment')
def test_save_values(self): """Changed values are saved to all tickets.""" first_ticket_id = self._insert_ticket('Test 1', reporter='joe', component='foo') second_ticket_id = self._insert_ticket('Test 2', reporter='joe') selected_tickets = [first_ticket_id, second_ticket_id] new_values = {'component': 'bar'} batch = BatchModifyModule(self.env) batch._save_ticket_changes(self.req, selected_tickets, new_values, '', 'leave') self.assertFieldChanged(first_ticket_id, 'component', 'bar') self.assertFieldChanged(second_ticket_id, 'component', 'bar')
def test_save_values(self): """Changed values are saved to all tickets.""" first_ticket_id = self._insert_ticket('Test 1', reporter='joe', component='foo') second_ticket_id = self._insert_ticket('Test 2', reporter='joe') selected_tickets = [first_ticket_id, second_ticket_id] new_values = { 'component' : 'bar' } batch = BatchModifyModule(self.env) batch._save_ticket_changes(self.req, selected_tickets, new_values, '', 'leave') self.assertFieldChanged(first_ticket_id, 'component', 'bar') self.assertFieldChanged(second_ticket_id, 'component', 'bar')
def test_timeline_events(self): """Regression test for #11288""" tktmod = web_ui.TicketModule(self.env) now = datetime_now(utc) start = now - timedelta(hours=1) stop = now + timedelta(hours=1) events = tktmod.get_timeline_events(self.req, start, stop, ['ticket_details']) self.assertEqual(True, all(ev[0] != 'batchmodify' for ev in events)) prio_ids = {} for i in xrange(20): t = Ticket(self.env) t['summary'] = 'Ticket %d' % i t['priority'] = ('', 'minor', 'major', 'critical')[i % 4] tktid = t.insert() prio_ids.setdefault(t['priority'], []).append(tktid) tktids = prio_ids['critical'] + prio_ids['major'] + \ prio_ids['minor'] + prio_ids[''] new_values = { 'summary': 'batch updated ticket', 'owner': 'ticket11288', 'reporter': 'ticket11288' } batch = BatchModifyModule(self.env) batch._save_ticket_changes(self.req, tktids, new_values, '', 'leave') # shuffle ticket_change records with self.env.db_transaction as db: rows = db('SELECT * FROM ticket_change') db.execute('DELETE FROM ticket_change') rows = rows[0::4] + rows[1::4] + rows[2::4] + rows[3::4] db.executemany( 'INSERT INTO ticket_change VALUES (%s)' % ','.join( ('%s', ) * len(rows[0])), rows) events = tktmod.get_timeline_events(self.req, start, stop, ['ticket_details']) events = [ev for ev in events if ev[0] == 'batchmodify'] self.assertEqual(1, len(events)) batch_ev = events[0] self.assertEqual('anonymous', batch_ev[2]) self.assertEqual(tktids, batch_ev[3][0]) self.assertEqual('updated', batch_ev[3][1]) context = web_context(self.req) self.assertEqual( self.req.href.query(id=','.join(str(t) for t in tktids)), tktmod.render_timeline_event(context, 'url', batch_ev))
def test_action_with_state_change(self): """Actions can have change status.""" self.env.config.set('ticket-workflow', 'embiggen', '* -> big') first_ticket_id = self._insert_ticket('Test 1', reporter='joe', status='small') second_ticket_id = self._insert_ticket('Test 2', reporter='joe') selected_tickets = [first_ticket_id, second_ticket_id] batch = BatchModifyModule(self.env) batch._save_ticket_changes(self.req, selected_tickets, {}, '', 'embiggen') self.assertFieldChanged(first_ticket_id, 'status', 'big') self.assertFieldChanged(second_ticket_id, 'status', 'big')
def test_action_with_side_effects(self): """Actions can have operations with side effects.""" self.env.config.set('ticket-workflow', 'buckify', '* -> *') self.env.config.set('ticket-workflow', 'buckify.operations', 'set_owner') self.req.args = {'action_buckify_reassign_owner': 'buck'} first_ticket_id = self._insert_ticket('Test 1', reporter='joe', owner='foo') second_ticket_id = self._insert_ticket('Test 2', reporter='joe') selected_tickets = [first_ticket_id, second_ticket_id] batch = BatchModifyModule(self.env) batch._save_ticket_changes(self.req, selected_tickets, {}, '', 'buckify') self.assertFieldChanged(first_ticket_id, 'owner', 'buck') self.assertFieldChanged(second_ticket_id, 'owner', 'buck')
def test_timeline_events(self): """Regression test for #11288""" tktmod = web_ui.TicketModule(self.env) now = datetime.now(utc) start = now - timedelta(hours=1) stop = now + timedelta(hours=1) events = tktmod.get_timeline_events(self.req, start, stop, ['ticket_details']) self.assertEqual(True, all(ev[0] != 'batchmodify' for ev in events)) ids = [] for i in xrange(20): ticket = Ticket(self.env) ticket['summary'] = 'Ticket %d' % i ids.append(ticket.insert()) ids.sort() new_values = {'summary': 'batch updated ticket', 'owner': 'ticket11288', 'reporter': 'ticket11288'} batch = BatchModifyModule(self.env) batch._save_ticket_changes(self.req, ids, new_values, '', 'leave') # shuffle ticket_change records with self.env.db_transaction as db: rows = db('SELECT * FROM ticket_change') db.execute('DELETE FROM ticket_change') rows = rows[0::4] + rows[1::4] + rows[2::4] + rows[3::4] db.executemany('INSERT INTO ticket_change VALUES (%s)' % ','.join(('%s',) * len(rows[0])), rows) events = tktmod.get_timeline_events(self.req, start, stop, ['ticket_details']) events = [ev for ev in events if ev[0] == 'batchmodify'] self.assertEqual(1, len(events)) batch_ev = events[0] self.assertEqual('anonymous', batch_ev[2]) self.assertEqual(ids, sorted(batch_ev[3][0])) self.assertEqual('updated', batch_ev[3][1]) context = web_context(self.req) self.assertEqual( self.req.href.query(id=','.join(str(t) for t in ids)), tktmod.render_timeline_event(context, 'url', batch_ev))
def test_save_list_fields(self): batch = BatchModifyModule(self.env) with self.env.db_transaction: ticket_ids = [ self._insert_ticket('Test 1', reporter='joe', keywords='foo'), self._insert_ticket('Test 2', reporter='joe', keywords='baz'), ] self.req.args = { 'action': 'leave', 'batchmod_mode_keywords': '+', # add 'batchmod_primary_keywords': 'baz new', 'batchmod_secondary_keywords': '*****' } batch._save_ticket_changes(self.req, ticket_ids, {}, '', 'leave') self.assertFieldChanged(ticket_ids[0], 'keywords', 'foo, baz, new') self.assertFieldChanged(ticket_ids[1], 'keywords', 'baz, new') self.req.args = { 'action': 'leave', 'batchmod_mode_keywords': '+-', # add / remove 'batchmod_primary_keywords': 'one two three', 'batchmod_secondary_keywords': 'baz missing' } batch._save_ticket_changes(self.req, ticket_ids, {}, '', 'leave') self.assertFieldChanged(ticket_ids[0], 'keywords', 'foo, new, one, two, three') self.assertFieldChanged(ticket_ids[1], 'keywords', 'new, one, two, three') self.req.args = { 'action': 'leave', 'batchmod_mode_keywords': '-', # remove 'batchmod_primary_keywords': 'new two', 'batchmod_secondary_keywords': '*****' } batch._save_ticket_changes(self.req, ticket_ids, {}, '', 'leave') self.assertFieldChanged(ticket_ids[0], 'keywords', 'foo, one, three') self.assertFieldChanged(ticket_ids[1], 'keywords', 'one, three') self.req.args = { 'action': 'leave', 'batchmod_mode_keywords': '=', # set 'batchmod_primary_keywords': 'orange', 'batchmod_secondary_keywords': '*****' } batch._save_ticket_changes(self.req, ticket_ids, {}, '', 'leave') self.assertFieldChanged(ticket_ids[0], 'keywords', 'orange') self.assertFieldChanged(ticket_ids[1], 'keywords', 'orange')