blob: 208ba442c167a3aed53fe73bc375919fb097b6ad [file] [log] [blame]
# Copyright 2018 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import unittest
import httplib2
import mock
from core.services import dashboard_service
from core.services import request
def TestResponse(code, content):
def Request(url, *args, **kwargs):
del args # Unused.
del kwargs # Unused.
response = httplib2.Response({'status': str(code)})
if code != 200:
raise request.BuildRequestError(url, response, content)
else:
return content
return Request
class TestDashboardApi(unittest.TestCase):
def setUp(self):
self.mock_request = mock.patch('core.services.request.Request').start()
self.mock_request.side_effect = TestResponse(200, 'OK')
def tearDown(self):
mock.patch.stopall()
def testDescribe(self):
self.assertEqual(dashboard_service.Describe('my_test'), 'OK')
self.mock_request.assert_called_once_with(
dashboard_service.SERVICE_URL + '/describe', method='POST',
params={'test_suite': 'my_test'}, use_auth=True, accept='json')
def testListTestPaths(self):
self.assertEqual(
dashboard_service.ListTestPaths('my_test', 'a_rotation'), 'OK')
self.mock_request.assert_called_once_with(
dashboard_service.SERVICE_URL + '/list_timeseries/my_test',
method='POST', params={'sheriff': 'a_rotation'}, use_auth=True,
accept='json')
def testTimeseries2(self):
response = dashboard_service.Timeseries2(
test_suite='loading.mobile',
measurement='timeToFirstContenrfulPaint',
bot='ChromiumPerf:androd-go-perf',
columns='revision,avg')
self.assertEqual(response, 'OK')
self.mock_request.assert_called_once_with(
dashboard_service.SERVICE_URL + '/timeseries2',
params={'test_suite': 'loading.mobile',
'measurement': 'timeToFirstContenrfulPaint',
'bot': 'ChromiumPerf:androd-go-perf',
'columns': 'revision,avg'},
method='POST', use_auth=True, accept='json')
def testTimeseries2_notFoundRaisesKeyError(self):
self.mock_request.side_effect = TestResponse(404, 'Not found')
with self.assertRaises(KeyError):
dashboard_service.Timeseries2(
test_suite='loading.mobile',
measurement='timeToFirstContenrfulPaint',
bot='ChromiumPerf:androd-go-perf',
columns='revision,avg')
def testTimeseries2_missingArgsRaisesTypeError(self):
with self.assertRaises(TypeError):
dashboard_service.Timeseries2(
test_suite='loading.mobile',
measurement='timeToFirstContenrfulPaint')
def testTimeseries(self):
response = dashboard_service.Timeseries('some test path')
self.assertEqual(response, 'OK')
self.mock_request.assert_called_once_with(
dashboard_service.SERVICE_URL + '/timeseries/some%20test%20path',
params={'num_days': 30}, method='POST', use_auth=True, accept='json')
def testTimeseries_notFoundRaisesKeyError(self):
self.mock_request.side_effect = TestResponse(
400, '{"error": "Invalid test_path"}')
with self.assertRaises(KeyError):
dashboard_service.Timeseries('some test path')
def testBugs(self):
self.assertEqual(dashboard_service.Bugs(123), 'OK')
self.mock_request.assert_called_once_with(
dashboard_service.SERVICE_URL + '/bugs/123', method='POST',
use_auth=True, accept='json')
def testIterAlerts(self):
pages = {'page1': {'data': 'foo', 'next_cursor': 'page2'},
'page2': {'data': 'bar'}}
def RequestStub(endpoint, method=None, params=None, **kwargs):
del kwargs # Unused.
self.assertEqual(endpoint, dashboard_service.SERVICE_URL + '/alerts')
self.assertEqual(method, 'POST')
self.assertDictContainsSubset(
{'test_suite': 'loading.mobile', 'limit': 1000}, params)
cursor = params.get('cursor', 'page1')
return pages[cursor]
self.mock_request.side_effect = RequestStub
response = [
resp['data']
for resp in dashboard_service.IterAlerts(test_suite='loading.mobile')]
self.assertEqual(response, ['foo', 'bar'])
self.assertEqual(self.mock_request.call_count, 2)