| OLD | NEW |
| 1 # Copyright 2015 The Chromium Authors. All rights reserved. | 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 | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 | 4 |
| 5 import datetime | 5 import datetime |
| 6 import json | 6 import json |
| 7 import mock | 7 import mock |
| 8 import unittest | 8 import unittest |
| 9 | 9 |
| 10 from infra.services.builder_alerts import crbug_issues | 10 from infra.services.builder_alerts import crbug_issues |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 92 'sheriff-foobar': 'foobar'}), | 92 'sheriff-foobar': 'foobar'}), |
| 93 ] | 93 ] |
| 94 for patcher in self._patchers: | 94 for patcher in self._patchers: |
| 95 patcher.start() | 95 patcher.start() |
| 96 | 96 |
| 97 def tearDown(self): | 97 def tearDown(self): |
| 98 for patcher in self._patchers: | 98 for patcher in self._patchers: |
| 99 patcher.stop() | 99 patcher.stop() |
| 100 | 100 |
| 101 def test_correctly_sorts_issues_by_tree(self): | 101 def test_correctly_sorts_issues_by_tree(self): |
| 102 issues_by_tree = crbug_issues.query('test-account.json', False) | 102 issues_by_tree = crbug_issues.query('test-account.json') |
| 103 self.assertEqual(sorted(issues_by_tree.keys()), | 103 self.assertEqual(sorted(issues_by_tree.keys()), |
| 104 ['chromium', 'foobar', 'trooper']) | 104 ['chromium', 'foobar', 'trooper']) |
| 105 self.assertEqual(len(issues_by_tree['chromium']), 1) | 105 self.assertEqual(len(issues_by_tree['chromium']), 1) |
| 106 self.assertEqual(len(issues_by_tree['trooper']), 1) | 106 self.assertEqual(len(issues_by_tree['trooper']), 1) |
| 107 self.assertEqual(len(issues_by_tree['foobar']), 0) | 107 self.assertEqual(len(issues_by_tree['foobar']), 0) |
| 108 | 108 |
| 109 def test_retrieves_basic_issue_basic_properties(self): | 109 def test_retrieves_basic_issue_basic_properties(self): |
| 110 issues_by_tree = crbug_issues.query('test-account.json', False) | 110 issues_by_tree = crbug_issues.query('test-account.json') |
| 111 issue = issues_by_tree['chromium'][0] | 111 issue = issues_by_tree['chromium'][0] |
| 112 self.assertEqual(issue.get('key'), 'crbug_issue_id:123456') | 112 self.assertEqual(issue.get('key'), 'crbug_issue_id:123456') |
| 113 self.assertEqual(issue.get('title'), 'TestTitle') | 113 self.assertEqual(issue.get('title'), 'TestTitle') |
| 114 self.assertEqual(issue.get('body'), '') | 114 self.assertEqual(issue.get('body'), '') |
| 115 self.assertEqual( | 115 self.assertEqual( |
| 116 issue.get('links'), | 116 issue.get('links'), |
| 117 [{'title': 'crbug.com/123456', 'href': 'https://crbug.com/123456'}]) | 117 [{'title': 'crbug.com/123456', 'href': 'https://crbug.com/123456'}]) |
| 118 self.assertEqual(issue.get('start_time'), '2015-10-01T22:59:56.000Z') | 118 self.assertEqual(issue.get('start_time'), '2015-10-01T22:59:56.000Z') |
| 119 self.assertEqual(issue.get('type'), 'crbug') | 119 self.assertEqual(issue.get('type'), 'crbug') |
| 120 self.assertEqual(issue.get('severity'), 1) # highest of two priority labels | 120 self.assertEqual(issue.get('severity'), 1) # highest of two priority labels |
| 121 self.assertEqual(issue.get('tags'), ['chromium']) | 121 self.assertEqual(issue.get('tags'), ['chromium']) |
| 122 | 122 |
| 123 def test_reports_utctime_on_returned_issues(self): | 123 def test_reports_utctime_on_returned_issues(self): |
| 124 # Mock built-in datetime.datetime.utcnow manually. See | 124 # Mock built-in datetime.datetime.utcnow manually. See |
| 125 # http://stackoverflow.com/q/4481954 for more details why. | 125 # http://stackoverflow.com/q/4481954 for more details why. |
| 126 class MockDateTime(datetime.datetime): | 126 class MockDateTime(datetime.datetime): |
| 127 @classmethod | 127 @classmethod |
| 128 def utcnow(cls): | 128 def utcnow(cls): |
| 129 return datetime.datetime(2015, 10, 2, 22, 0, 0) | 129 return datetime.datetime(2015, 10, 2, 22, 0, 0) |
| 130 old_datetime = datetime.datetime | 130 old_datetime = datetime.datetime |
| 131 datetime.datetime = MockDateTime | 131 datetime.datetime = MockDateTime |
| 132 | 132 |
| 133 issues_by_tree = crbug_issues.query('test-account.json', False) | 133 issues_by_tree = crbug_issues.query('test-account.json') |
| 134 issue = issues_by_tree['chromium'][0] | 134 issue = issues_by_tree['chromium'][0] |
| 135 self.assertEqual(issue.get('time'), '2015-10-02T22:00:00Z') | 135 self.assertEqual(issue.get('time'), '2015-10-02T22:00:00Z') |
| 136 | 136 |
| 137 datetime.datetime = old_datetime | 137 datetime.datetime = old_datetime |
| 138 | 138 |
| 139 def test_parses_tags_correctly(self): | 139 def test_parses_tags_correctly(self): |
| 140 issues_by_tree = crbug_issues.query('test-account.json', False) | 140 issues_by_tree = crbug_issues.query('test-account.json') |
| 141 issue = issues_by_tree['trooper'][0] | 141 issue = issues_by_tree['trooper'][0] |
| 142 self.assertEqual(issue.get('tags'), ['trooper']) | 142 self.assertEqual(issue.get('tags'), ['trooper']) |
| 143 | 143 |
| 144 def test_correct_severity_for_issues_with_no_priority(self): | 144 def test_correct_severity_for_issues_with_no_priority(self): |
| 145 issues_by_tree = crbug_issues.query('test-account.json', False) | 145 issues_by_tree = crbug_issues.query('test-account.json') |
| 146 issue = issues_by_tree['trooper'][0] | 146 issue = issues_by_tree['trooper'][0] |
| 147 self.assertIsNone(issue.get('severity')) | 147 self.assertIsNone(issue.get('severity')) |
| 148 | 148 |
| 149 | 149 |
| 150 class CrbugIssuesListTest(unittest.TestCase): | 150 class CrbugIssuesListTest(unittest.TestCase): |
| 151 def setUp(self): | 151 def setUp(self): |
| 152 crbug_service_mock = mock.Mock() | 152 crbug_service_mock = mock.Mock() |
| 153 issues_mock = crbug_service_mock.issues.return_value | 153 issues_mock = crbug_service_mock.issues.return_value |
| 154 self.list_mock = issues_mock.list.return_value | 154 self.list_mock = issues_mock.list.return_value |
| 155 | 155 |
| 156 self._patchers = [ | 156 self._patchers = [ |
| 157 mock.patch.object(crbug_issues, '_build_crbug_service', | 157 mock.patch.object(crbug_issues, '_build_crbug_service', |
| 158 lambda _csa, _um: crbug_service_mock), | 158 lambda _csa: crbug_service_mock), |
| 159 # Tests below expect only a single sequence of calls to issue tracker | 159 # Tests below expect only a single sequence of calls to issue tracker |
| 160 # API iterating over all issues, so we mock whitelisted labels to only | 160 # API iterating over all issues, so we mock whitelisted labels to only |
| 161 # contain a single entry. | 161 # contain a single entry. |
| 162 mock.patch.object(crbug_issues, 'WHITELISTED_LABELS', | 162 mock.patch.object(crbug_issues, 'WHITELISTED_LABELS', |
| 163 {'sheriff-chromium': 'chromium'}), | 163 {'sheriff-chromium': 'chromium'}), |
| 164 ] | 164 ] |
| 165 for patcher in self._patchers: | 165 for patcher in self._patchers: |
| 166 patcher.start() | 166 patcher.start() |
| 167 | 167 |
| 168 def tearDown(self): | 168 def tearDown(self): |
| 169 for patcher in self._patchers: | 169 for patcher in self._patchers: |
| 170 patcher.stop() | 170 patcher.stop() |
| 171 | 171 |
| 172 def test_correctly_stops_on_no_results(self): | 172 def test_correctly_stops_on_no_results(self): |
| 173 self.list_mock.execute.side_effect = [ | 173 self.list_mock.execute.side_effect = [ |
| 174 {'items': [{'id': 1}, {'id': 2}, {'id': 3}]}, | 174 {'items': [{'id': 1}, {'id': 2}, {'id': 3}]}, |
| 175 {}, | 175 {}, |
| 176 {'items': [{'id': 4}]}, | 176 {'items': [{'id': 4}]}, |
| 177 ] | 177 ] |
| 178 | 178 |
| 179 issues = crbug_issues._list_issues('test-account.json', False) | 179 issues = crbug_issues._list_issues('test-account.json') |
| 180 self.assertEqual(len(issues), 3) | 180 self.assertEqual(len(issues), 3) |
| 181 | 181 |
| 182 def test_correctly_stops_on_empty_results(self): | 182 def test_correctly_stops_on_empty_results(self): |
| 183 self.list_mock.execute.side_effect = [ | 183 self.list_mock.execute.side_effect = [ |
| 184 {'items': [{'id': 1}, {'id': 2}, {'id': 3}]}, | 184 {'items': [{'id': 1}, {'id': 2}, {'id': 3}]}, |
| 185 {'items': []}, | 185 {'items': []}, |
| 186 {'items': [{'id': 4}]}, | 186 {'items': [{'id': 4}]}, |
| 187 ] | 187 ] |
| 188 | 188 |
| 189 issues = crbug_issues._list_issues('test-account.json', False) | 189 issues = crbug_issues._list_issues('test-account.json') |
| 190 self.assertEqual(len(issues), 3) | 190 self.assertEqual(len(issues), 3) |
| 191 | 191 |
| 192 def test_correctly_deduplicates_results(self): | 192 def test_correctly_deduplicates_results(self): |
| 193 self.list_mock.execute.side_effect = [ | 193 self.list_mock.execute.side_effect = [ |
| 194 {'items': [{'id': 1}, {'id': 2}, {'id': 3}]}, | 194 {'items': [{'id': 1}, {'id': 2}, {'id': 3}]}, |
| 195 {'items': [{'id': 2}, {'id': 3}, {'id': 4}]}, | 195 {'items': [{'id': 2}, {'id': 3}, {'id': 4}]}, |
| 196 {}, | 196 {}, |
| 197 ] | 197 ] |
| 198 | 198 |
| 199 issues = crbug_issues._list_issues('test-account.json', False) | 199 issues = crbug_issues._list_issues('test-account.json') |
| 200 self.assertEqual(len(issues), 4) | 200 self.assertEqual(len(issues), 4) |
| 201 self.assertEqual([1, 2, 3, 4], [issue['id'] for issue in issues]) | 201 self.assertEqual([1, 2, 3, 4], [issue['id'] for issue in issues]) |
| OLD | NEW |