| # Copyright 2016 The Chromium Authors |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| """Unittests for the issueexport servlet.""" |
| from __future__ import print_function |
| from __future__ import division |
| from __future__ import absolute_import |
| |
| import six |
| import unittest |
| |
| from mock import Mock, patch |
| |
| from framework import permissions |
| from mrproto import tracker_pb2 |
| from services import service_manager |
| from testing import testing_helpers |
| from testing import fake |
| from tracker import issueexport |
| |
| |
| class IssueExportTest(unittest.TestCase): |
| |
| def setUp(self): |
| self.services = service_manager.Services( |
| config=fake.ConfigService(), |
| project=fake.ProjectService(), |
| issue=fake.IssueService(), |
| user=fake.UserService(), |
| issue_star=fake.IssueStarService(), |
| ) |
| self.cnxn = 'fake connection' |
| self.project = self.services.project.TestAddProject('proj', project_id=789) |
| self.servlet = issueexport.IssueExport(services=self.services) |
| self.jsonfeed = issueexport.IssueExportJSON(services=self.services) |
| self.mr = testing_helpers.MakeMonorailRequest( |
| project=self.project, perms=permissions.OWNER_ACTIVE_PERMISSIONSET) |
| self.mr.can = 1 |
| |
| def testAssertBasePermission(self): |
| self.assertRaises(permissions.PermissionException, |
| self.servlet.AssertBasePermission, self.mr) |
| self.mr.auth.user_pb.is_site_admin = True |
| self.servlet.AssertBasePermission(self.mr) |
| |
| @patch('time.time') |
| def testHandleRequest(self, mockTime): |
| mockTime.return_value = 1234 |
| self.services.issue.GetAllIssuesInProject = Mock(return_value=[]) |
| self.services.issue.GetCommentsForIssues = Mock(return_value={}) |
| self.services.issue_star.LookupItemsStarrers = Mock(return_value={}) |
| self.services.user.LookupUserEmails = Mock( |
| return_value={111: 'user1@test.com', 222: 'user2@test.com'}) |
| |
| self.mr.project_name = self.project.project_name |
| json_data = self.jsonfeed.HandleRequest(self.mr) |
| |
| self.assertEqual(json_data['metadata'], |
| {'version': 1, 'who': None, 'when': 1234, |
| 'project': 'proj', 'start': 0, 'num': 100}) |
| self.assertEqual(json_data['issues'], []) |
| six.assertCountEqual( |
| self, json_data['emails'], ['user1@test.com', 'user2@test.com']) |
| |
| # TODO(jojwang): test attachments, amendments, comment details |
| def testMakeIssueJSON(self): |
| config = self.services.config.GetProjectConfig( |
| self.cnxn, 789) |
| config.field_defs.extend( |
| [tracker_pb2.FieldDef( |
| field_id=1, field_name='UXReview', |
| field_type=tracker_pb2.FieldTypes.APPROVAL_TYPE), |
| tracker_pb2.FieldDef( |
| field_id=2, field_name='approvalsubfield', |
| field_type=tracker_pb2.FieldTypes.STR_TYPE, approval_id=1), |
| tracker_pb2.FieldDef( |
| field_id=3, field_name='phasefield', |
| field_type=tracker_pb2.FieldTypes.INT_TYPE, is_phase_field=True), |
| tracker_pb2.FieldDef( |
| field_id=4, field_name='normalfield', |
| field_type=tracker_pb2.FieldTypes.STR_TYPE) |
| ]) |
| self.services.config.StoreConfig(self.cnxn, config) |
| |
| phases = [tracker_pb2.Phase(phase_id=1, name='Phase1', rank=1), |
| tracker_pb2.Phase(phase_id=2, name='Phase2', rank=2)] |
| avs = [tracker_pb2.ApprovalValue( |
| approval_id=1, status=tracker_pb2.ApprovalStatus.APPROVED, |
| setter_id=111, set_on=7, approver_ids=[333, 444], phase_id=1)] |
| fvs = [tracker_pb2.FieldValue(field_id=2, str_value='two'), |
| tracker_pb2.FieldValue(field_id=3, int_value=3, phase_id=2), |
| tracker_pb2.FieldValue(field_id=4, str_value='four')] |
| labels = ['test', 'Type-FLT-Launch'] |
| |
| issue = fake.MakeTestIssue( |
| self.project.project_id, 1, 'summary', 'Open', 111, labels=labels, |
| issue_id=78901, reporter_id=222, opened_timestamp=1, |
| closed_timestamp=2, modified_timestamp=3, project_name='project', |
| field_values=fvs, phases=phases, approval_values=avs) |
| |
| email_dict = {111: 'user1@test.com', 222: 'user2@test.com', |
| 333: 'user3@test.com', 444: 'user4@test.com'} |
| comment_list = [ |
| tracker_pb2.IssueComment(content='simple'), |
| tracker_pb2.IssueComment( |
| content='issue desc', is_description=True)] |
| starrer_id_list = [222, 333] |
| |
| issue_JSON = self.jsonfeed._MakeIssueJSON( |
| self.mr, issue, email_dict, comment_list, starrer_id_list) |
| expected_JSON = { |
| 'local_id': 1, |
| 'reporter': 'user2@test.com', |
| 'summary': 'summary', |
| 'owner': 'user1@test.com', |
| 'status': 'Open', |
| 'cc': [], |
| 'labels': labels, |
| 'phases': [{'id': 1, 'name': 'Phase1', 'rank': 1}, |
| {'id': 2, 'name': 'Phase2', 'rank': 2}], |
| 'fields': [ |
| {'field': 'approvalsubfield', |
| 'phase': None, |
| 'approval': 'UXReview', |
| 'str_value': 'two'}, |
| {'field': 'phasefield', |
| 'phase': 'Phase2', |
| 'int_value': 3}, |
| {'field': 'normalfield', |
| 'phase': None, |
| 'str_value': 'four'}], |
| 'approvals': [ |
| {'approval': 'UXReview', |
| 'status': 'APPROVED', |
| 'setter': 'user1@test.com', |
| 'set_on': 7, |
| 'approvers': ['user3@test.com', 'user4@test.com'], |
| 'phase': 'Phase1'} |
| ], |
| 'starrers': ['user2@test.com', 'user3@test.com'], |
| 'comments': [ |
| {'content': 'simple', |
| 'timestamp': None, |
| 'amendments': [], |
| 'commenter': None, |
| 'attachments': [], |
| 'description_num': None}, |
| {'content': 'issue desc', |
| 'timestamp': None, |
| 'amendments': [], |
| 'commenter': None, |
| 'attachments': [], |
| 'description_num': '1'}, |
| ], |
| 'opened': 1, |
| 'modified': 3, |
| 'closed': 2, |
| } |
| |
| self.assertEqual(expected_JSON, issue_JSON) |