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

Last change on this file was 16943, checked in by Ryan J Ollos, 6 years ago

TracTags 0.10dev: Make compatible with Trac 1.3.3dev

Fixes #13316.

File size: 6.5 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#
6# This software is licensed as described in the file COPYING, which
7# you should have received as part of this distribution.
8#
9
10import doctest
11import shutil
12import tempfile
13import unittest
14
15from trac.core import implements
16from trac.perm import (
17    PermissionCache, PermissionSystem, IPermissionRequestor, PermissionError)
18from trac.resource import Resource
19from trac.test import EnvironmentStub, MockRequest
20
21import tractags.api
22
23from tractags.db import TagSetup
24from tractags.ticket import TicketTagProvider
25from tractags.wiki import WikiTagProvider
26
27
28class _BaseTestCase(unittest.TestCase):
29
30    def setUp(self):
31        self.env = EnvironmentStub(default_data=True,
32                                   enable=['trac.*', 'tractags.*'])
33        self.env.path = tempfile.mkdtemp()
34        self.perms = PermissionSystem(self.env)
35
36        self.actions = ['TAGS_ADMIN', 'TAGS_MODIFY', 'TAGS_VIEW']
37        setup = TagSetup(self.env)
38        # Current tractags schema is setup with enabled component anyway.
39        #   Revert these changes for getting default permissions inserted.
40        self._revert_tractags_schema_init()
41        setup.upgrade_environment()
42        self.tag_s = tractags.api.TagSystem(self.env)
43
44    def tearDown(self):
45        # Really close db connections.
46        self.env.shutdown()
47        shutil.rmtree(self.env.path)
48
49    # Helpers
50
51    def _revert_tractags_schema_init(self):
52        with self.env.db_transaction as db:
53            db("DROP TABLE IF EXISTS tags")
54            db("DROP TABLE IF EXISTS tags_change")
55            db("DELETE FROM system WHERE name='tags_version'")
56            db("DELETE FROM permission WHERE action %s" % db.like(),
57               ('TAGS_%',))
58
59
60class TagPolicyTestCase(_BaseTestCase):
61
62    def setUp(self):
63        _BaseTestCase.setUp(self)
64        # Populate table with initial test data.
65        with self.env.db_transaction as db:
66            db.executemany("""
67                INSERT INTO tags (tagspace, name, tag)
68                VALUES (%s,%s,%s)
69                """, [('wiki', 'PublicPage', 'anonymous:modify'),
70                      ('wiki', 'RestrictedPage', 'anonymous:-view'),
71                      ('wiki', 'RestrictedPage', 'classified'),
72                      ('wiki', 'UserPage', 'private'),
73                      ('wiki', 'UserPage', 'user:admin')])
74        self.check = tractags.api.TagPolicy(self.env).check_permission
75        self.env.config.set('trac', 'permission_policies',
76                            'TagPolicy, DefaultPermissionPolicy')
77
78    # Tests
79
80    def test_action_granted(self):
81        resource = Resource('wiki', 'PublicPage')
82        self.assertEquals(self.check('WIKI_MODIFY', 'anonymous', resource,
83                                     PermissionCache(self.env)), True)
84
85    def test_action_revoked(self):
86        resource = Resource('wiki', 'RestrictedPage')
87        self.assertEquals(self.check('WIKI_VIEW', 'anonymous', resource,
88                                     PermissionCache(self.env)), False)
89
90    def test_meta_action_granted(self):
91        resource = Resource('wiki', 'UserPage')
92        self.assertEquals(self.check('WIKI_DELETE', 'user', resource,
93                                     PermissionCache(self.env,
94                                                     username='user')), True)
95        self.assertEquals(self.check('WIKI_DELETE', 'other', resource,
96                                     PermissionCache(self.env,
97                                                     username='other')), None)
98
99
100class TagSystemTestCase(_BaseTestCase):
101
102    # Tests
103
104    def test_available_actions(self):
105        for action in self.actions:
106            self.failIf(action not in self.perms.get_actions())
107
108    def test_available_providers(self):
109        # Standard implementations of DefaultTagProvider should be registered.
110        seen = []
111        for provider in [TicketTagProvider(self.env),
112                         WikiTagProvider(self.env)]:
113            self.failIf(provider not in self.tag_s.tag_providers)
114            # Ensure unique provider references, a possible bug in Trac-0.11.
115            self.failIf(provider in seen)
116            seen.append(provider)
117
118    def test_set_tags_no_perms(self):
119        resource = Resource('wiki', 'WikiStart')
120        tags = ['tag1']
121        req = MockRequest(self.env, authname='anonymous')
122        self.assertRaises(PermissionError, self.tag_s.set_tags, req,
123                          resource, tags)
124
125    def test_set_tags(self):
126        resource = Resource('wiki', 'WikiStart')
127        tags = ['tag1']
128        req = MockRequest(self.env, authname='editor')
129        # Shouldn't raise an error with appropriate permission.
130        self.tag_s.set_tags(req, resource, tags)
131
132    def test_query_no_args(self):
133        # Regression test for query without argument,
134        #   reported as th:ticket:7857.
135
136        req = MockRequest(self.env, authname='editor')
137        self.assertEquals([(res, tags) for res, tags in
138                           self.tag_s.query(req, query='')],
139                          [])
140
141    def test_get_taggable_realms(self):
142
143        class HiddenTagProvider(tractags.api.DefaultTagProvider):
144
145            implements(IPermissionRequestor)
146
147            realm = 'hidden'
148
149            # IPermissionRequestor method
150            def get_permission_actions(self):
151                return ['TEST_VIEW']
152
153            # ITagProvider method overwrite
154            def check_permission(self, perm, action):
155                """Somewhat inaccessible tag provider."""
156                return perm.has_permission('TEST_VIEW')
157
158        all_realms = set(['hidden', 'ticket', 'wiki'])
159        # Mock an anonymous request.
160        req = MockRequest(self.env, authname='anonymous')
161        self.assertEquals(all_realms - set(['hidden']),
162                          self.tag_s.get_taggable_realms(req.perm))
163
164        self.perms.grant_permission('testuser', 'TEST_VIEW')
165        req = MockRequest(self.env, authname='testuser')
166        self.assertEquals(all_realms,
167                          self.tag_s.get_taggable_realms(req.perm))
168        # Get realms unconditionally.
169        self.assertEquals(all_realms, self.tag_s.get_taggable_realms())
170
171
172def test_suite():
173    suite = unittest.TestSuite()
174    suite.addTest(doctest.DocTestSuite(module=tractags.api))
175    suite.addTest(unittest.makeSuite(TagPolicyTestCase))
176    suite.addTest(unittest.makeSuite(TagSystemTestCase))
177    return suite
178
179
180if __name__ == '__main__':
181    unittest.main(defaultTest='test_suite')
Note: See TracBrowser for help on using the repository browser.