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

Last change on this file was 17435, checked in by Cinc-th, 4 years ago

PeerReviewPlugin: replaced deprecated env.get_red_db() and @env.with_transaction() in ReviewFileModel. Added tests.

File size: 5.1 KB
Line 
1# -*- coding: utf-8 -*-
2
3import unittest
4from collections import defaultdict
5from trac.test import EnvironmentStub, Mock, MockPerm
6from codereview.model import  PeerReviewModel, ReviewFileModel, PeerReviewModelProvider
7from codereview.peerReviewCommentCallback import PeerReviewCommentHandler
8from codereview.peerReviewPerform import get_parent_file_id
9
10
11__author__ = 'Cinc'
12__copyright__ = "Copyright 2016"
13__license__ = "BSD"
14
15
16def _prepare_file_data(env):
17    # review_id, path, start, end, revision, status
18    files = [
19        [1, '/foo/bar', 5, 100, '1234', 'new', None],
20        [1, '/foo/bar2', 6, 101, '1234', 'new', None],
21        [2, '/foo/bar', 5, 100, '1234', 'new', None],
22        [2, '/foo/bar2', 6, 101, '12346', 'new', None],
23        [2, '/foo/bar3', 7, 102, '12347', 'new', None],
24        [3, '/foo/bar2', 6, 101, '1234', 'new', None],
25        [4, '/foo/bar', 5, 100, '1234', 'new', None],
26        [4, '/foo/bar2', 6, 101, '1234', 'new', None],
27        # File list data for several projects
28        [0, '/foo/bar', 5, 100, '1234', 'new', 'PrjFoo'],
29        [0, '/foo/bar2', 6, 101, '1234', 'new', 'PrjFoo'],
30        [0, '/foo/bar', 5, 100, '1234', 'new', 'PrjBar'],
31        [0, '/foo/bar2', 6, 101, '12346', 'new', 'PrjBar'],
32        [0, '/foo/bar3', 7, 102, '12347', 'new', 'PrjFoo'],
33        [0, '/foo/bar/baz', 6, 101, '1234', 'new', 'PrjBar'],
34        [0, '/foo/bar', 5, 100, '1234', 'new', 'PrjBaz'],
35        [0, '/foo/bar2', 6, 101, '1234', 'new', 'PrjBaz'],
36    ]
37    for f in files:
38        rfm = ReviewFileModel(env)
39        rfm['review_id'] = f[0]
40        rfm['path'] = f[1]
41        rfm['line_start'] = f[2]
42        rfm['line_end'] = f[3]
43        rfm['revision'] = f[4]
44        rfm['status'] = f[5]
45        rfm['project'] = f[6]
46        rfm.insert()
47
48
49def _prepare_review_data(env):
50    # name, status
51    revs = [
52        ['name1', 'new'],
53        ['name2', 'closed'],
54        ['name3', 'new'],
55        ['name4', 'foo']
56    ]
57    for rev in revs:
58        r = PeerReviewModel(env)
59        r['name'] = rev[0]
60        r['status'] = rev[1]
61        r.insert()
62
63
64class TestReviewFileModel(unittest.TestCase):
65
66    def setUp(self):
67        self.env = EnvironmentStub(default_data=True, enable=['trac.*', 'codereview.*'])
68        PeerReviewModelProvider(self.env).environment_created()
69        _prepare_file_data(self.env)
70        _prepare_review_data(self.env)
71        self.plugin = PeerReviewCommentHandler(self.env)
72        self.req = Mock(href=Mock(), perm=MockPerm())
73        self.req.authname = 'tester'
74
75    def tearDown(self):
76        self.env.shutdown()
77
78    def test_get_parent_file_id(self):
79        class RFile(object):
80            pass
81
82        rf_old = ReviewFileModel(self.env)
83        rf_old['path'] = '/foo/bar'
84        rf_old['line_start'] = 5
85        rf_old['line_end'] = 100
86        self.assertEqual(1, get_parent_file_id(self.env, rf_old, 1))
87        self.assertEqual(3, get_parent_file_id(self.env, rf_old, 2))
88        self.assertEqual(0, get_parent_file_id(self.env, rf_old, 3))
89        self.assertEqual(7, get_parent_file_id(self.env, rf_old, 4))
90
91    def test_file_dict_by_review(self):
92        fdict = ReviewFileModel.file_dict_by_review(self.env)
93        self.assertEqual(4, len(fdict))
94        for k, val in fdict.items():
95            self.assertIsInstance(k, int)
96            for item in val:
97                self.assertIsInstance(item, ReviewFileModel)
98        # Check number of files for the given review fdict[x]
99        self.assertEqual(2, len(fdict[1]))
100        self.assertEqual(3, len(fdict[2]))
101        self.assertEqual(1, len(fdict[3]))
102        self.assertEqual(2, len(fdict[4]))
103        # We don't check every file here...
104        self.assertEqual('/foo/bar', fdict[1][0]['path'])
105        self.assertEqual('1234', fdict[1][0]['revision'])
106        self.assertEqual('/foo/bar2', fdict[1][1]['path'])
107
108    def test_select_by_review(self):
109        files = list(ReviewFileModel.select_by_review(self.env, 2))
110        self.assertEqual(3, len(files))
111        fdata = {'/foo/bar': [5, 100, '1234', 'new'],
112                 '/foo/bar2': [6, 101, '12346', 'new'],
113                 '/foo/bar3': [7, 102, '12347', 'new']}
114        for file_ in files:
115            self.assertEqual(fdata[file_['path']][2], file_['revision'])
116            self.assertEqual(fdata[file_['path']][0], file_['line_start'])
117
118    def test_delete_files_by_project_name(self):
119        files = list(ReviewFileModel.select_by_review(self.env, 0))
120        self.assertEqual(8, len(files))
121        ReviewFileModel.delete_files_by_project_name(self.env, 'PrjFoo')
122        files = list(ReviewFileModel.select_by_review(self.env, 0))
123        self.assertEqual(5, len(files))
124        fdict = defaultdict(list)
125        # Make dict with key: project name, val: list of file objects
126        for file_ in files:
127            fdict[file_['project']].append(file_)
128        self.assertEqual(3, len(fdict['PrjBar']))
129        self.assertEqual(2, len(fdict['PrjBaz']))
130
131
132def reviewfile_model_suite():
133    suite = unittest.TestSuite()
134
135    suite.addTest(unittest.makeSuite(TestReviewFileModel))
136
137    return suite
Note: See TracBrowser for help on using the repository browser.