source: tagsplugin/trunk/tractags/tests/ticket.py

Last change on this file was 18146, checked in by Cinc-th, 2 years ago

TagsPlugin: fixed a string/byte problem with QueryNode. Fixed some tests where we expected a list but got dict_keys instead. Fixed test where sort order of a set was assumed.

Refs #13994

File size: 6.0 KB
Line 
1# -*- coding: utf-8 -*-
2#
3# Copyright (C) 2011 Odd Simon Simonsen <oddsimons@gmail.com>
4# Copyright (C) 2012-2014 Steffen Hoffmann <hoff.st@web.de>
5# Copyright (C) 2014 Jun Omae <jun66j5@gmail.com>
6#
7# This software is licensed as described in the file COPYING, which
8# you should have received as part of this distribution.
9#
10
11import shutil
12import tempfile
13import unittest
14
15from trac.perm import PermissionError, PermissionSystem
16from trac.resource import Resource, ResourceNotFound
17from trac.test import EnvironmentStub, MockRequest
18from trac.ticket.model import Ticket
19from trac.util.text import to_unicode
20
21from tractags.api import TagSystem
22from tractags.db import TagSetup
23from tractags.ticket import TicketTagProvider
24
25try:
26    dict.iteritems
27except AttributeError:
28    # Python 3
29    def iteritems(d):
30        return iter(d.items())
31else:
32    # Python 2
33    def iteritems(d):
34        return d.iteritems()
35
36
37class TicketTagProviderTestCase(unittest.TestCase):
38
39    def setUp(self):
40        self.env = EnvironmentStub(default_data=True,
41                                   enable=['trac.*', 'tractags.*'])
42        self.env.path = tempfile.mkdtemp()
43        self.perms = PermissionSystem(self.env)
44
45        setup = TagSetup(self.env)
46        # Current tractags schema is setup with enabled component anyway.
47        #   Revert these changes for getting default permissions inserted.
48        self._revert_tractags_schema_init()
49        setup.upgrade_environment()
50
51        self.provider = TicketTagProvider(self.env)
52        self.realm = 'ticket'
53        self.tag_sys = TagSystem(self.env)
54        self.tags = ['tag1', 'tag2']
55
56        # Populate tables with initial test data.
57        self._create_ticket(self.tags)
58
59    def tearDown(self):
60        self.env.shutdown()
61        shutil.rmtree(self.env.path)
62
63    # Helpers
64
65    def _create_ticket(self, tags, **kwargs):
66        ticket = Ticket(self.env)
67        ticket['keywords'] = u' '.join(sorted(map(to_unicode, tags)))
68        ticket['summary'] = 'summary'
69        ticket['reporter'] = 'admin'
70        for name, value in iteritems(kwargs):
71            ticket[name] = value
72        ticket.insert()
73        return ticket
74
75    def _revert_tractags_schema_init(self):
76        with self.env.db_transaction as db:
77            db("DROP TABLE IF EXISTS tags")
78            db("DROP TABLE IF EXISTS tags_change")
79            db("DELETE FROM system WHERE name='tags_version'")
80            db("DELETE FROM permission WHERE action %s" % db.like(),
81               ('TAGS_%',))
82
83    def _tags(self):
84        tags = {}
85        for name, tag in self.env.db_query("""
86                SELECT name,tag FROM tags
87                """):
88            if name in tags:
89                tags[name].add(tag)
90            else:
91                tags[name] = set([tag])
92        return tags
93
94    # Tests
95
96    def test_get_tagged_resources(self):
97        # No tags, no restrictions, all resources.
98        req = MockRequest(self.env, authname='editor')
99        self.assertEquals(
100            [r for r in
101             self.provider.get_tagged_resources(req, None)][0][1],
102            set(self.tags))
103        # Force fine-grained perm-check check for all tags, not just the one
104        # from query.
105        self.provider.fast_permcheck = False
106        self.assertEquals(
107            [r for r in
108             self.provider.get_tagged_resources(req,
109                                                set(self.tags[:1]))][0][1],
110            set(self.tags))
111
112    def test_get_tags(self):
113        req = MockRequest(self.env, authname='editor')
114        resource = Resource('ticket', 2)
115        self.assertRaises(ResourceNotFound, self.provider.get_resource_tags,
116                          req, resource)
117        self._create_ticket(self.tags)
118        # provider.get_resource_tags() returns a set. Sort order is not defined
119        self.assertEqual(
120            sorted([tag for tag in
121             self.provider.get_resource_tags(req, resource)]), sorted(self.tags))
122
123    def test_set_tags(self):
124        req = MockRequest(self.env, authname='editor')
125        tags = ['tag3']
126        ticket = Ticket(self.env, 1)
127        ticket['keywords'] = tags[0]
128        # Tags get updated by TicketChangeListener method.
129        ticket.save_changes(req.authname)
130        self.assertEquals(list(self.tag_sys.get_all_tags(req).keys()), tags)
131
132    def test_remove_tags(self):
133        req = MockRequest(self.env, authname='editor')
134        anon_req = MockRequest(self.env, authname='anonymous')
135        resource = Resource('ticket', 1)
136        # Anonymous lacks required permissions.
137        self.assertRaises(PermissionError, self.provider.remove_resource_tags,
138                          anon_req, resource)
139        # Shouldn't raise an error with appropriate permission.
140        self.provider.remove_resource_tags(req, resource, 'comment')
141        ticket = Ticket(self.env, 1)
142        self.assertEquals(ticket['keywords'], '')
143
144    def test_describe_tagged_resource(self):
145        req = MockRequest(self.env, authname='editor')
146        resource = Resource('ticket', 1)
147        self.assertEquals(
148            self.provider.describe_tagged_resource(req, resource),
149            'defect: summary')
150
151    def test_create_ticket_by_anonymous(self):
152        req = MockRequest(self.env, authname='editor')
153        ticket = self._create_ticket(self.tags, reporter='anonymous')
154        tags = self.provider.get_resource_tags(req, ticket.resource)
155        self.assertEquals(tags, set(self.tags))
156
157    def test_update_ticket_by_anonymous(self):
158        req = MockRequest(self.env, authname='editor')
159        ticket = self._create_ticket([])
160        tags = self.provider.get_resource_tags(req, ticket.resource)
161        self.assertEquals(tags, set([]))
162
163        ticket['keywords'] = ', '.join(self.tags)
164        ticket.save_changes('anonymous', comment='Adding keywords')
165        tags = self.provider.get_resource_tags(req, ticket.resource)
166        self.assertEquals(tags, set(self.tags))
167
168
169def test_suite():
170    suite = unittest.TestSuite()
171    suite.addTest(unittest.makeSuite(TicketTagProviderTestCase))
172    return suite
173
174
175if __name__ == '__main__':
176    unittest.main(defaultTest='test_suite')
Note: See TracBrowser for help on using the repository browser.