| 1 | # -*- coding: utf-8 -*- |
|---|
| 2 | |
|---|
| 3 | import unittest |
|---|
| 4 | from collections import defaultdict |
|---|
| 5 | from trac.test import EnvironmentStub, Mock, MockPerm |
|---|
| 6 | from codereview.model import PeerReviewModel, ReviewFileModel, PeerReviewModelProvider |
|---|
| 7 | from codereview.peerReviewCommentCallback import PeerReviewCommentHandler |
|---|
| 8 | from codereview.peerReviewPerform import get_parent_file_id |
|---|
| 9 | |
|---|
| 10 | |
|---|
| 11 | __author__ = 'Cinc' |
|---|
| 12 | __copyright__ = "Copyright 2016" |
|---|
| 13 | __license__ = "BSD" |
|---|
| 14 | |
|---|
| 15 | |
|---|
| 16 | def _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 | |
|---|
| 49 | def _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 | |
|---|
| 64 | class 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 | |
|---|
| 132 | def reviewfile_model_suite(): |
|---|
| 133 | suite = unittest.TestSuite() |
|---|
| 134 | |
|---|
| 135 | suite.addTest(unittest.makeSuite(TestReviewFileModel)) |
|---|
| 136 | |
|---|
| 137 | return suite |
|---|