1# Copyright 2015 The Chromium Authors. All rights reserved. 2# Use of this source code is governed by a BSD-style license that can be 3# found in the LICENSE file. 4 5import json 6import mock 7import unittest 8 9from apiclient import errors 10 11from dashboard import issue_tracker_service 12from dashboard import testing_common 13 14 15@mock.patch('issue_tracker_service.discovery.build', mock.MagicMock()) 16class IssueTrackerServiceTest(testing_common.TestCase): 17 18 def testAddBugComment_Basic(self): 19 service = issue_tracker_service.IssueTrackerService() 20 service._MakeCommentRequest = mock.Mock() 21 self.assertTrue(service.AddBugComment(12345, 'The comment')) 22 self.assertEqual(1, service._MakeCommentRequest.call_count) 23 service._MakeCommentRequest.assert_called_with( 24 12345, {'updates': {}, 'content': 'The comment'}) 25 26 def testAddBugComment_WithNoBug_ReturnsFalse(self): 27 service = issue_tracker_service.IssueTrackerService() 28 service._MakeCommentRequest = mock.Mock() 29 self.assertFalse(service.AddBugComment(None, 'Some comment')) 30 self.assertFalse(service.AddBugComment(-1, 'Some comment')) 31 32 def testAddBugComment_WithOptionalParameters(self): 33 service = issue_tracker_service.IssueTrackerService() 34 service._MakeCommentRequest = mock.Mock() 35 self.assertTrue(service.AddBugComment( 36 12345, 'Some other comment', status='Fixed', 37 labels=['Foo'], cc_list=['someone@chromium.org'])) 38 self.assertEqual(1, service._MakeCommentRequest.call_count) 39 service._MakeCommentRequest.assert_called_with( 40 12345, 41 { 42 'updates': { 43 'status': 'Fixed', 44 'cc': ['someone@chromium.org'], 45 'labels': ['Foo'], 46 }, 47 'content': 'Some other comment' 48 }) 49 50 def testAddBugComment_MergeBug(self): 51 service = issue_tracker_service.IssueTrackerService() 52 service._MakeCommentRequest = mock.Mock() 53 self.assertTrue(service.AddBugComment(12345, 'Dupe', merge_issue=54321)) 54 self.assertEqual(1, service._MakeCommentRequest.call_count) 55 service._MakeCommentRequest.assert_called_with( 56 12345, 57 { 58 'updates': { 59 'status': 'Duplicate', 60 'mergedInto': 54321, 61 }, 62 'content': 'Dupe' 63 }) 64 65 @mock.patch('logging.error') 66 def testAddBugComment_Error(self, mock_logging_error): 67 service = issue_tracker_service.IssueTrackerService() 68 service._ExecuteRequest = mock.Mock(return_value=None) 69 self.assertFalse(service.AddBugComment(12345, 'My bug comment')) 70 self.assertEqual(1, service._ExecuteRequest.call_count) 71 self.assertEqual(1, mock_logging_error.call_count) 72 73 def testNewBug_Success_NewBugReturnsId(self): 74 service = issue_tracker_service.IssueTrackerService() 75 service._ExecuteRequest = mock.Mock(return_value={'id': 333}) 76 bug_id = service.NewBug('Bug title', 'body', owner='someone@chromium.org') 77 self.assertEqual(1, service._ExecuteRequest.call_count) 78 self.assertEqual(333, bug_id) 79 80 def testNewBug_Failure_NewBugReturnsNone(self): 81 service = issue_tracker_service.IssueTrackerService() 82 service._ExecuteRequest = mock.Mock(return_value={}) 83 bug_id = service.NewBug('Bug title', 'body', owner='someone@chromium.org') 84 self.assertEqual(1, service._ExecuteRequest.call_count) 85 self.assertIsNone(bug_id) 86 87 def testNewBug_UsesExpectedParams(self): 88 service = issue_tracker_service.IssueTrackerService() 89 service._MakeCreateRequest = mock.Mock() 90 service.NewBug('Bug title', 'body', owner='someone@chromium.org') 91 service._MakeCreateRequest.assert_called_with( 92 { 93 'title': 'Bug title', 94 'summary': 'Bug title', 95 'description': 'body', 96 'labels': [], 97 'components': [], 98 'status': 'Assigned', 99 'owner': {'name': 'someone@chromium.org'}, 100 }) 101 102 def testMakeCommentRequest_UserDoesNotExist_RetryMakeCommentRequest(self): 103 service = issue_tracker_service.IssueTrackerService() 104 error_content = { 105 'error': {'message': 'The user does not exist: test@chromium.org', 106 'code': 404} 107 } 108 service._ExecuteRequest = mock.Mock(side_effect=errors.HttpError( 109 mock.Mock(return_value={'status': 404}), json.dumps(error_content))) 110 service.AddBugComment(12345, 'The comment', cc_list='test@chromium.org', 111 owner=['test@chromium.org']) 112 self.assertEqual(2, service._ExecuteRequest.call_count) 113 114 def testMakeCommentRequest_IssueDeleted_ReturnsTrue(self): 115 service = issue_tracker_service.IssueTrackerService() 116 error_content = { 117 'error': {'message': 'User is not allowed to view this issue 12345', 118 'code': 403} 119 } 120 service._ExecuteRequest = mock.Mock(side_effect=errors.HttpError( 121 mock.Mock(return_value={'status': 403}), json.dumps(error_content))) 122 comment_posted = service.AddBugComment(12345, 'The comment', 123 owner='test@chromium.org') 124 self.assertEqual(1, service._ExecuteRequest.call_count) 125 self.assertEqual(True, comment_posted) 126 127 128if __name__ == '__main__': 129 unittest.main() 130