Exemple #1
0
    def test_complete_milestone_retarget_tickets(self):
        name = 'milestone1'
        target = 'milestone2'
        insert_ticket(self.env, summary='Ticket 1', milestone=name)
        insert_ticket(self.env, summary='Ticket 2', milestone=name)
        ps = PermissionSystem(self.env)
        ps.grant_permission('user1', 'TICKET_ADMIN')
        ps.grant_permission('user1', 'MILESTONE_MODIFY')
        req = MockRequest(self.env, authname='user1', method='POST',
            path_info='/admin/ticket/milestones/%s' % name,
            args=dict(action='edit', save='Submit changes', name=name,
                      description='', retarget='on', target=target,
                      comment='', completed='on',
                      completeddate='May 20, 2020, 9:07:52 PM'))

        mod = AdminModule(self.env)
        self.assertTrue(mod.match_request(req))
        with self.assertRaises(RequestDone):
            mod.process_request(req)

        self.assertEqual(2, len(req.chrome['notices']))
        self.assertEqual(
            'The open tickets associated with milestone "milestone1" '
            'have been retargeted to milestone "milestone2".',
            req.chrome['notices'][0])
        self.assertEqual('Your changes have been saved.',
                         req.chrome['notices'][1])
        self.assertEqual([], req.chrome['warnings'])
        self.assertEqual(['303 See Other'], req.status_sent)
        self.assertEqual('http://example.org/trac.cgi/admin/ticket/milestones',
                         req.headers_sent['Location'])
        self.assertTrue(Milestone(self.env, name).is_completed)
        self.assertEqual(target, Ticket(self.env, 1)['milestone'])
        self.assertEqual(target, Ticket(self.env, 2)['milestone'])
Exemple #2
0
    def setUp(self):
        self.env = EnvironmentStub(default_data=True)

        self.milestone1 = Milestone(self.env)
        self.milestone1.name = 'Test'
        self.milestone1.insert()
        self.milestone2 = Milestone(self.env)
        self.milestone2.name = 'Test2'
        self.milestone2.insert()

        tkt1 = insert_ticket(self.env,
                             summary='Foo',
                             milestone='Test',
                             owner='foman',
                             status='new')
        tkt2 = insert_ticket(self.env,
                             summary='Bar',
                             milestone='Test',
                             status='closed',
                             owner='barman')
        tkt3 = insert_ticket(self.env,
                             summary='Sum',
                             milestone='Test',
                             owner='suman',
                             status='reopened')
        self.tkt1 = tkt1
        self.tkt2 = tkt2
        self.tkt3 = tkt3

        prov = DefaultTicketGroupStatsProvider(ComponentManager())
        prov.env = self.env
        prov.config = self.env.config
        self.stats = prov.get_ticket_group_stats([tkt1.id, tkt2.id, tkt3.id])
Exemple #3
0
    def test_resource_exists_valid_resource_id(self):
        insert_ticket(self.env)
        r1 = Resource('ticket', 1)
        r2 = Resource('ticket', 2)

        self.assertTrue(self.ticket_system.resource_exists(r1))
        self.assertFalse(self.ticket_system.resource_exists(r2))
Exemple #4
0
def ticket_setup(tc):
    config = tc.env.config
    config.set('ticket-custom', 'custom1', 'text')
    config.save()
    insert_ticket(tc.env,
                  reporter='santa',
                  summary='This is the summary',
                  status='new')
Exemple #5
0
def comment_setup(tc):
    ticket1 = insert_ticket(tc.env, reporter='santa',
                            summary='This is the summary for ticket 1',
                            status='new')
    ticket1.save_changes(comment='This is the comment for ticket 1')
    ticket2 = insert_ticket(tc.env, reporter='claws',
                            summary='This is the summary for ticket 2',
                            status='closed')
    ticket2.save_changes(comment='This is the comment for ticket 2')
Exemple #6
0
def query2_setup(tc):
    insert_ticket(tc.env,
                  reporter='santa',
                  summary='This is the summary',
                  status='new')
    insert_ticket(tc.env,
                  reporter='claus',
                  summary='This is another summary',
                  status='new')
Exemple #7
0
def macro_setup(tc):
    tc.env = EnvironmentStub(enable=('trac.*',
                                     'tracopt.ticket.commit_updater.*',))
    insert_ticket(tc.env, summary='the summary', status='new')
    def _get_repository(reponame):
        return Mock(get_changeset=_get_changeset, resource=None)
    def _get_changeset(rev=None):
        return Mock(message="the message. refs #1.  ", rev=rev)
    setattr(RepositoryManager(tc.env), 'get_repository', _get_repository)
Exemple #8
0
 def _make_tickets(self, num):
     self.tickets = []
     for i in xrange(num):
         ticket = insert_ticket(self.env,
                                reporter='someone',
                                summary=random_sentence())
         self.tickets.append(ticket)
Exemple #9
0
    def test_component_change(self):
        """New ticket owner is updated when the component is changed.
        """
        self._add_component('component3', 'cowner3')
        self._add_component('component4', 'cowner4')

        ticket = insert_ticket(self.env,
                               reporter='reporter1',
                               summary='the summary',
                               component='component3',
                               owner='cowner3',
                               status='new')

        req = MockRequest(self.env,
                          method='POST',
                          args={
                              'id':
                              ticket.id,
                              'field_component':
                              'component4',
                              'submit':
                              True,
                              'action':
                              'leave',
                              'view_time':
                              str(to_utimestamp(ticket['changetime'])),
                          })
        self.assertRaises(RequestDone, self.ticket_module.process_request, req)
        ticket = Ticket(self.env, ticket.id)

        self.assertEqual('component4', ticket['component'])
        self.assertEqual('cowner4', ticket['owner'])
Exemple #10
0
 def test_ticket_comment_remove_error_invalid_comment_id(self):
     """ResourceNotFound error reported when comment does not exist."""
     ticket = insert_ticket(self.env)
     ticket.save_changes('user1', 'the comment')
     rv, output = self.execute('ticket remove_comment 1 2')
     self.assertEqual(2, rv, output)
     self.assertExpectedResult(output)
Exemple #11
0
 def test_get_actions_by_operation_for_req(self):
     """Request with no permission checking."""
     req = MockRequest(self.env, path_info='/ticket/1')
     ticket = insert_ticket(self.env, status='new')
     actions = self.ctlr.get_actions_by_operation_for_req(req, ticket,
                                                          'set_owner')
     self.assertEqual([(0, u'change_owner'), (0, u'reassign')], actions)
Exemple #12
0
 def _create_a_ticket_with_email(self):
     return insert_ticket(self.env,
                          owner='*****@*****.**',
                          reporter='*****@*****.**',
                          cc='cc1, [email protected]',
                          summary='Foo',
                          description='Bar')
Exemple #13
0
 def _create_a_ticket(self):
     return insert_ticket(self.env,
                          owner='',
                          reporter='santa',
                          summary='Foo',
                          description='Bar',
                          foo='This is a custom field')
Exemple #14
0
 def test_ticket_comment_remove_ok(self):
     """Ticket comment is successfully deleted."""
     ticket = insert_ticket(self.env)
     ticket.save_changes('user1', 'the comment')
     rv, output = self.execute('ticket remove_comment 1 1')
     self.assertEqual(0, rv, output)
     self.assertExpectedResult(output)
Exemple #15
0
 def setUp(self):
     self.env = EnvironmentStub(default_data=True)
     self.perm_sys = PermissionSystem(self.env)
     self.ctlr = TicketSystem(self.env).action_controllers[0]
     self.req1 = MockRequest(self.env, authname='user1')
     self.req2 = MockRequest(self.env, authname='user2')
     self.ticket = insert_ticket(self.env, status='invalid')
Exemple #16
0
 def test_get_actions_by_operation_for_req_with_ticket_modify(self):
     """User without TICKET_MODIFY won't have reassign action."""
     req = MockRequest(self.env, authname='user1', path_info='/ticket/1')
     ticket = insert_ticket(self.env, status='new')
     actions = self.ctlr.get_actions_by_operation_for_req(req, ticket,
                                                          'set_owner')
     self.assertEqual([(0, u'change_owner')], actions)
Exemple #17
0
 def test_get_actions_by_operation_for_req_without_ticket_modify(self):
     """User with TICKET_MODIFY will have reassign action."""
     PermissionSystem(self.env).grant_permission('user1', 'TICKET_MODIFY')
     req = MockRequest(self.env, authname='user1', path_info='/ticket/1')
     ticket = insert_ticket(self.env, status='new')
     actions = self.ctlr.get_actions_by_operation_for_req(req, ticket,
                                                          'set_owner')
     self.assertEqual([(0, u'change_owner'), (0, u'reassign')], actions)
Exemple #18
0
    def test_timeline_events(self):
        """Regression test for #11288"""
        req1 = MockRequest(self.env)
        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(req1, start, stop,
                                            ['ticket_details'])
        self.assertTrue(all(ev[0] != 'batchmodify' for ev in events))

        prio_ids = {}
        for i in xrange(20):
            priority = ('', 'minor', 'major', 'critical')[i % 4]
            t = insert_ticket(self.env, summary='Ticket %d' % i,
                              priority=priority)
            prio_ids.setdefault(t['priority'], []).append(t.id)
        tktids = prio_ids['critical'] + prio_ids['major'] + \
                 prio_ids['minor'] + prio_ids['']

        req2 = MockRequest(self.env, method='POST', authname='has_ta_&_bm',
                          path_info='/batchmodify', args={
            'batchmod_value_summary': 'batch updated ticket',
            'batchmod_value_owner': 'ticket11288',
            'batchmod_value_reporter': 'ticket11288',
            'action': 'leave',
            'selected_tickets': ','.join(str(t) for t in tktids),
        })

        batch = BatchModifyModule(self.env)
        self.assertTrue(batch.match_request(req2))
        with self.assertRaises(RequestDone):
            batch.process_request(req2)

        # 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(req1, 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('has_ta_&_bm', batch_ev[2])
        self.assertEqual(tktids, batch_ev[3][0])
        self.assertEqual('updated', batch_ev[3][1])

        context = web_context(req2)
        self.assertEqual(req2.href.query(id=','.join(str(t) for t in tktids)),
                         tktmod.render_timeline_event(context, 'url',
                                                      batch_ev))
Exemple #19
0
 def _create_ticket_with_change(self, old_props, new_props,
                                author='anonymous'):
     """Create a ticket with `old_props` and apply properties
     in `new_props`.
     """
     t = insert_ticket(self.env, **old_props)
     comment = new_props.pop('comment', None)
     t.populate(new_props)
     t.save_changes(author, comment=comment)
     return t
Exemple #20
0
 def _test_get_allowed_owners(self):
     ticket = insert_ticket(self.env, summary='Ticket 1')
     self.env.insert_users([('user1', None, None, 1),
                            ('user2', None, None, 1),
                            ('user3', None, None, 1)])
     ps = PermissionSystem(self.env)
     for user in ('user1', 'user3'):
         ps.grant_permission(user, 'TICKET_MODIFY')
     self.env.config.set('ticket', 'restrict_owner', True)
     return ticket
Exemple #21
0
 def test_title_and_description_with_sub_vars(self):
     with self.env.db_transaction:
         id_ = self._insert_report(
             'Tickets on $M for $USER',
             'SELECT * FROM ticket WHERE milestone=$M AND owner=$USER',
             'Show tickets on $M for $USER')
         for milestone in ('milestone1', 'milestone2'):
             insert_ticket(self.env, status='new', summary='Test 1',
                           owner='joe', milestone=milestone)
     req = MockRequest(self.env, path_info='/report/%d' % id_,
                       authname='joe', args={'M': 'milestone2'})
     self.assertTrue(self.report_module.match_request(req))
     data = self.report_module.process_request(req)[1]
     self.assertEqual('{%d} Tickets on milestone2 for joe' % id_,
                      data['title'])
     self.assertEqual('Show tickets on milestone2 for joe',
                      data['description'])
     self.assertIsNone(data['message'])
     self.assertEqual(1, data['numrows'])
Exemple #22
0
 def _setup_env_and_req(self, max_size, field_value):
     self.env.config.set('ticket-custom', 'text1', 'text')
     self.env.config.set('ticket-custom', 'text1.max_size', max_size)
     ticket = insert_ticket(self.env, summary='summary', text1='init')
     change_time = Ticket(self.env, ticket.id)['changetime']
     view_time = str(to_utimestamp(change_time))
     req = MockRequest(
         self.env, method='POST', path_info='/ticket/%d' % ticket.id,
         args={'submit': 'Submit changes', 'field_text1': field_value,
               'action': 'leave', 'view_time': view_time})
     return req
Exemple #23
0
 def setUp(self):
     self.env = EnvironmentStub(default_data=True)
     self.perm_sys = PermissionSystem(self.env)
     self.ctlr = TicketSystem(self.env).action_controllers[0]
     self.ticket = insert_ticket(self.env, status='new')
     self.env.insert_users([
         (user, None, None) for user in ('user1', 'user2', 'user3', 'user4')
     ])
     permissions = [('user1', 'TICKET_EDIT_CC'),
                    ('user2', 'TICKET_EDIT_CC'),
                    ('user2', 'TICKET_BATCH_MODIFY'),
                    ('user3', 'TICKET_ADMIN'), ('user4', 'TICKET_VIEW'),
                    ('user1', 'group1'), ('user2', 'group1'),
                    ('user2', 'group2'), ('user3', 'group2'),
                    ('user4', 'group3')]
     for perm in permissions:
         self.perm_sys.grant_permission(*perm)
     self.req = MockRequest(self.env, authname='user1')
     self.expected = """\
Exemple #24
0
    def setUp(self):
        tmpdir = os.path.realpath(tempfile.gettempdir())
        self.env = EnvironmentStub(enable=['trac.*', AuthzPolicy], path=tmpdir)
        self.env.config.set('trac', 'permission_policies',
                            'AuthzPolicy, DefaultPermissionPolicy')
        self.env.config.set('ticket', 'restrict_owner', True)

        self.perm_sys = PermissionSystem(self.env)
        self.env.insert_users([('user1', 'User C', '*****@*****.**'),
                               ('user2', 'User A', '*****@*****.**'),
                               ('user3', 'User D', '*****@*****.**'),
                               ('user4', 'User B', '*****@*****.**')])
        self.perm_sys.grant_permission('user1', 'TICKET_MODIFY')
        self.perm_sys.grant_permission('user2', 'TICKET_VIEW')
        self.perm_sys.grant_permission('user3', 'TICKET_MODIFY')
        self.perm_sys.grant_permission('user4', 'TICKET_MODIFY')
        self.authz_file = os.path.join(tmpdir, 'trac-authz-policy')
        create_file(self.authz_file)
        self.env.config.set('authz_policy', 'authz_file', self.authz_file)
        self.ctlr = TicketSystem(self.env).action_controllers[0]
        self.req1 = MockRequest(self.env, authname='user1')
        self.ticket = insert_ticket(self.env, status='new')
Exemple #25
0
 def setUp(self):
     self.env = EnvironmentStub(default_data=True)
     self.perm_sys = PermissionSystem(self.env)
     self.ctlr = TicketSystem(self.env).action_controllers[0]
     self.ticket = insert_ticket(self.env, status='new')
     with self.env.db_transaction as db:
         for user in ('user1', 'user2', 'user3', 'user4'):
             db("INSERT INTO session VALUES (%s, %s, %s)", (user, 1, 0))
     permissions = [
         ('user1', 'TICKET_EDIT_CC'),
         ('user2', 'TICKET_EDIT_CC'),
         ('user2', 'TICKET_BATCH_MODIFY'),
         ('user3', 'TICKET_ADMIN'),
         ('user4', 'TICKET_VIEW'),
         ('user1', 'group1'),
         ('user2', 'group1'),
         ('user2', 'group2'),
         ('user3', 'group2'),
         ('user4', 'group3')
     ]
     for perm in permissions:
         self.perm_sys.grant_permission(*perm)
     self.req = MockRequest(self.env, authname='user1')
     self.expected = """\
Exemple #26
0
 def _insert_ticket(self, summary, **kw):
     """Helper for inserting a ticket into the database"""
     ticket = insert_ticket(self.env, summary=summary, **kw)
     return ticket.id
Exemple #27
0
 def test_ticket_remove_ok(self):
     """Ticket is successfully deleted."""
     insert_ticket(self.env)
     rv, output = self.execute('ticket remove 1')
     self.assertEqual(0, rv, output)
     self.assertExpectedResult(output)
Exemple #28
0
 def test_ticket_remove_error_invalid_ticket_id(self):
     """ResourceNotFound error reported when ticket does not exist."""
     insert_ticket(self.env)
     rv, output = self.execute('ticket remove 2')
     self.assertEqual(2, rv, output)
     self.assertExpectedResult(output)
Exemple #29
0
 def test_ticket_remove_error_ticket_id_not_an_int(self):
     """Error reported when ticket id is not an int."""
     insert_ticket(self.env)
     rv, output = self.execute('ticket remove a')
     self.assertEqual(2, rv, output)
     self.assertExpectedResult(output)
Exemple #30
0
 def test_ticket_comment_remove_error_no_comment_argument(self):
     """Error reported when comment# argument is missing."""
     ticket = insert_ticket(self.env)
     rv, output = self.execute('ticket remove_comment 1')
     self.assertEqual(2, rv, output)
     self.assertExpectedResult(output)