source: peerreviewplugin/trunk/codereview/tests/comment_callback.py

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

PeerReviewPlugin: you may perform a review on the changeset page now. Administration of reviews (workflows) is still done on the review page. Some refactoring and improvements to review handling on changeset pages.

Refs #14007

File size: 7.0 KB
Line 
1# -*- coding: utf-8 -*-
2
3import unittest
4from codereview.model import ReviewCommentModel, PeerReviewModel, ReviewFileModel, PeerReviewModelProvider
5from codereview.peerReviewCommentCallback import PeerReviewCommentHandler
6from datetime import datetime
7from trac.admin.console import TracAdmin
8from trac.perm import PermissionError
9from trac.test import EnvironmentStub, Mock, MockPerm, MockRequest
10from trac.util.datefmt import to_datetime, to_utimestamp
11
12
13__author__ = 'Cinc'
14__copyright__ = "Copyright 2016"
15__license__ = "BSD"
16
17
18# reviewer (name), review_id
19names = (['user1', 3], ['user2', 3], ['user3', 3],
20         ['user4', 4], ['user5', 4],
21         ['user4', 2], ['user5', 2],
22         ['user2', 1], ['user3', 1], ['user4', 1], ['user5', 1])
23
24
25def _prepare_review_data(env):
26    # owner, status, created, name, notes, parent_id
27    revs = [
28        ['Rev1', 'bar', to_utimestamp(to_datetime(datetime(2019, 2, 4))), 'name1', 'note1', 0],
29        ['Rev1', 'closed', to_utimestamp(to_datetime(datetime(2019, 3, 4))), 'name2', 'note2', 0],
30        ['Rev2', 'bar', to_utimestamp(to_datetime(datetime(2019, 3, 14))), 'name3', 'note3', 1],
31        ['Rev3', 'foo', to_utimestamp(to_datetime(datetime(2019, 4, 4))), 'name4', 'note4', 2]
32    ]
33
34    with env.db_transaction as db:
35        cursor = db.cursor()
36        for rev in revs:
37            cursor.execute("INSERT INTO peerreview (owner, status, created, name, notes, parent_id) "
38                           "VALUES (%s,%s,%s,%s,%s,%s)", rev)
39
40
41def _prepare_file_data(env):
42    # review_id, path, start, end, revision, status
43    files = [
44        [1, '/foo/bar', 5, 100, '1234', 'new'],
45        [1, '/foo/bar2', 6, 101, '1234', 'new'],
46        [2, '/foo/bar', 5, 100, '1234', 'new'],
47        [2, '/foo/bar2', 6, 101, '1234', 'new'],
48        [3, '/foo/bar', 5, 100, '1234', 'new'],
49        [3, '/foo/bar2', 6, 101, '1234', 'new'],
50        [4, '/foo/bar', 5, 100, '1234', 'new'],
51        [4, '/foo/bar2', 6, 101, '1234', 'new'],
52    ]
53    for f in files:
54        rfm = ReviewFileModel(env)
55        rfm['review_id'] = f[0]
56        rfm['path'] = f[1]
57        rfm['line_start'] = f[2]
58        rfm['line_end'] = f[3]
59        rfm['revision'] = f[4]
60        rfm['status'] = f[5]
61        rfm.insert()
62
63
64def _prepare_comment_data(env):
65    pass
66
67
68class TestCommentHelper(unittest.TestCase):
69
70    def _add_permissions(self, env):
71        admin = TracAdmin()
72        admin.env_set('Testenv', env)
73        admin.onecmd("permission add Tester TICKET_VIEW")  # User not allowed to perform code reviews
74        admin.onecmd("permission add Rev1 TRAC_ADMIN")  # This one is also an allowed user
75        admin.onecmd("permission add Rev2 TICKET_VIEW")
76        admin.onecmd("permission add Rev3 TICKET_VIEW")
77        admin.onecmd("permission add Rev1 RevGroup")
78        admin.onecmd("permission add Rev2 RevGroup")
79        for item in set([usr[0] for usr in names]):
80            admin.onecmd("permission add %s CODE_REVIEW_DEV" % item)
81
82    def setUp(self):
83        self.env = EnvironmentStub(default_data=True, enable=['trac.*',
84                                                              'codereview.model.*',
85                                                              'codereview.peerreviewnew.*',
86                                                              'codereview.peerreviewmain.*',
87                                                              'codereview.tracgenericclass.*'])
88        PeerReviewModelProvider(self.env).environment_created()
89        _prepare_file_data(self.env)
90        _prepare_review_data(self.env)
91        _prepare_comment_data(self.env)
92        self.plugin = PeerReviewCommentHandler(self.env)
93        self.req = Mock(href=Mock(), perm=MockPerm())
94        self.req.authname = 'tester'
95
96    def tearDown(self):
97        self.env.shutdown()
98
99    def test_review_is_closed(self):
100        self.req.args = {
101            'IDFile': 1
102        }
103        self.assertFalse(self.plugin.review_is_closed(self.req))
104        self.req.args = {
105            'IDFile': 4
106        }
107        self.assertTrue(self.plugin.review_is_closed(self.req))
108        self.req.args = {
109            'IDFile': 7
110        }
111        self.assertFalse(self.plugin.review_is_closed(self.req))
112
113    def test_get_comment_tree(self):
114        """Only checks if the correct review is selected from the file id."""
115        # There is no test for correct comment tree atm.
116        self.req.args = {
117            'IDFile': 3
118        }
119        data = {}
120        self.plugin.get_comment_tree(self.req, data)
121        self.assertIsNone(data.get('fileID'))
122        self.assertIsNone(data.get('review'))
123
124        self.req.args['LineNum'] = 2
125        self.plugin.get_comment_tree(self.req, data)
126        self.assertTrue(isinstance(data.get('review'), PeerReviewModel))
127        self.assertEqual(2, data.get('review')['review_id'])
128
129    def test_process_request_addcomment(self):
130        self._add_permissions(self.env)
131        # User Rev1 has TRAC_ADMIN so the user is for sure allowed to add a comment. Otherwise
132        # the request may be rejected.
133        # Insert two comments here
134        req = MockRequest(self.env, href=Mock(), authname='Rev1', method='POST',
135                          args={'addcomment': "1",
136                                'fileid': '1',
137                                'comment': "The comment text",
138                                'line': '123',
139                                'parentid': -1})
140        self.assertIsNone(self.plugin.process_request(req))
141        req = MockRequest(self.env, href=Mock(), authname='Rev1', method='POST',
142                          args={'addcomment': "1",
143                                'fileid': '1',
144                                'comment': "The comment text 2",
145                                'line': '124',
146                                'parentid': '1'})
147        self.assertIsNone(self.plugin.process_request(req))
148        # Check results.
149        comments = ReviewCommentModel.comment_ids_by_file_id(self.env)
150        self.assertEqual(2, len(comments[1]))  # comments is a dict but the keys are ints, val: list of comment ids
151        for row in self.env.db_query("SELECT * FROM peerreviewcomment"):
152            self.assertEqual(1, row[1])
153            self.assertEqual(u'Rev1', row[4])
154            if row[0] == 1:
155                self.assertEqual(-1, row[2])
156                self.assertEqual(123, row[3])
157                self.assertEqual(u"The comment text", row[5])
158            else:
159                self.assertEqual(1, row[2])
160                self.assertEqual(124, row[3])
161                self.assertEqual(u"The comment text 2", row[5])
162
163    def test_process_request_no_perm(self):
164        req = MockRequest(self.env, href=Mock(), authname='user1')
165        self.assertRaises(PermissionError, self.plugin.process_request, req)
166
167
168def comment_callback_suite():
169    suite = unittest.TestSuite()
170
171    suite.addTest(unittest.makeSuite(TestCommentHelper))
172
173    return suite
Note: See TracBrowser for help on using the repository browser.