def test_http_tagdb(self): # test http tagdb using django client db = HttpTagDB(settings) db.base_url = reverse('tagList').replace('/tags', '') db.username = '' db.password = '' # helper class to mock urllib3 response object class mockResponse(object): def __init__(self, status, data): self.status = status self.data = data # mock http request that forwards requests using django client def mockRequest(method, url, fields=None, headers=None, timeout=None): if db.username and db.password: self.assertEqual(headers, {'Authorization': 'Basic dGVzdDp0ZXN0\n'}) else: self.assertEqual(headers, {}) req_fields = {} for (field, value) in fields: if field in req_fields: req_fields[field].append(value) else: req_fields[field] = [value] if method == 'POST': result = self.client.post(url, req_fields) elif method == 'GET': result = self.client.get(url, req_fields) else: raise Exception('Invalid HTTP method %s' % method) return mockResponse(result.status_code, result.content) # use mockRequest to send http requests to live django running configured tagdb with patch('graphite.http_pool.http.request', mockRequest): self._test_tagdb(db) with self.assertRaisesRegexp(Exception, 'HTTP Error from remote tagdb: 405'): db.get_tag('delSeries') db.username = '******' db.password = '******' result = db.tag_series('test.a;hello=tiger;blah=blah') self.assertEqual(result, 'test.a;blah=blah;hello=tiger') result = db.list_values('hello') valueList = [value for value in result if value['value'] in ['tiger', 'lion']] self.assertEqual(len(valueList), 1) self.assertEqual(valueList[0]['value'], 'tiger') result = db.list_values('notarealtag') self.assertEqual(result, []) self.assertTrue(db.del_series('test.a;blah=blah;hello=tiger')) # test auto complete forwarding to remote host with self.settings(TAGDB_HTTP_AUTOCOMPLETE=True): self.maxDiff = None self._test_autocomplete(db, settings.TAGDB + '.find_series') # test auto complete using find_series with self.settings(TAGDB_HTTP_AUTOCOMPLETE=False): self._test_autocomplete(db, settings.TAGDB + '.find_series')