• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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