229 lines
9 KiB
Python
229 lines
9 KiB
Python
|
# -*- coding: utf-8 -*-
|
||
|
"""Define set of helper functions for the dataframe."""
|
||
|
|
||
|
import unittest
|
||
|
import warnings
|
||
|
|
||
|
import mock
|
||
|
from influxdb.influxdb08 import SeriesHelper, InfluxDBClient
|
||
|
from requests.exceptions import ConnectionError
|
||
|
|
||
|
|
||
|
class TestSeriesHelper(unittest.TestCase):
|
||
|
"""Define the SeriesHelper for test."""
|
||
|
|
||
|
@classmethod
|
||
|
def setUpClass(cls):
|
||
|
"""Set up an instance of the TestSerisHelper object."""
|
||
|
super(TestSeriesHelper, cls).setUpClass()
|
||
|
|
||
|
TestSeriesHelper.client = InfluxDBClient(
|
||
|
'host',
|
||
|
8086,
|
||
|
'username',
|
||
|
'password',
|
||
|
'database'
|
||
|
)
|
||
|
|
||
|
class MySeriesHelper(SeriesHelper):
|
||
|
"""Define a subset SeriesHelper instance."""
|
||
|
|
||
|
class Meta:
|
||
|
"""Define metadata for the TestSeriesHelper object."""
|
||
|
|
||
|
client = TestSeriesHelper.client
|
||
|
series_name = 'events.stats.{server_name}'
|
||
|
fields = ['time', 'server_name']
|
||
|
bulk_size = 5
|
||
|
autocommit = True
|
||
|
|
||
|
TestSeriesHelper.MySeriesHelper = MySeriesHelper
|
||
|
|
||
|
def test_auto_commit(self):
|
||
|
"""Test that write_points called after the right number of events."""
|
||
|
class AutoCommitTest(SeriesHelper):
|
||
|
"""Define an instance of SeriesHelper for AutoCommit test."""
|
||
|
|
||
|
class Meta:
|
||
|
"""Define metadata AutoCommitTest object."""
|
||
|
|
||
|
series_name = 'events.stats.{server_name}'
|
||
|
fields = ['time', 'server_name']
|
||
|
bulk_size = 5
|
||
|
client = InfluxDBClient()
|
||
|
autocommit = True
|
||
|
|
||
|
fake_write_points = mock.MagicMock()
|
||
|
AutoCommitTest(server_name='us.east-1', time=159)
|
||
|
AutoCommitTest._client.write_points = fake_write_points
|
||
|
AutoCommitTest(server_name='us.east-1', time=158)
|
||
|
AutoCommitTest(server_name='us.east-1', time=157)
|
||
|
AutoCommitTest(server_name='us.east-1', time=156)
|
||
|
self.assertFalse(fake_write_points.called)
|
||
|
AutoCommitTest(server_name='us.east-1', time=3443)
|
||
|
self.assertTrue(fake_write_points.called)
|
||
|
|
||
|
def testSingleSeriesName(self):
|
||
|
"""Test JSON conversion when there is only one series name."""
|
||
|
TestSeriesHelper.MySeriesHelper(server_name='us.east-1', time=159)
|
||
|
TestSeriesHelper.MySeriesHelper(server_name='us.east-1', time=158)
|
||
|
TestSeriesHelper.MySeriesHelper(server_name='us.east-1', time=157)
|
||
|
TestSeriesHelper.MySeriesHelper(server_name='us.east-1', time=156)
|
||
|
expectation = [{'points': [[159, 'us.east-1'],
|
||
|
[158, 'us.east-1'],
|
||
|
[157, 'us.east-1'],
|
||
|
[156, 'us.east-1']],
|
||
|
'name': 'events.stats.us.east-1',
|
||
|
'columns': ['time', 'server_name']}]
|
||
|
|
||
|
rcvd = TestSeriesHelper.MySeriesHelper._json_body_()
|
||
|
self.assertTrue(all([el in expectation for el in rcvd]) and
|
||
|
all([el in rcvd for el in expectation]),
|
||
|
'Invalid JSON body of time series returned from '
|
||
|
'_json_body_ for one series name: {0}.'.format(rcvd))
|
||
|
TestSeriesHelper.MySeriesHelper._reset_()
|
||
|
self.assertEqual(
|
||
|
TestSeriesHelper.MySeriesHelper._json_body_(),
|
||
|
[],
|
||
|
'Resetting helper did not empty datapoints.')
|
||
|
|
||
|
def testSeveralSeriesNames(self):
|
||
|
"""Test JSON conversion when there is only one series name."""
|
||
|
TestSeriesHelper.MySeriesHelper(server_name='us.east-1', time=159)
|
||
|
TestSeriesHelper.MySeriesHelper(server_name='fr.paris-10', time=158)
|
||
|
TestSeriesHelper.MySeriesHelper(server_name='lu.lux', time=157)
|
||
|
TestSeriesHelper.MySeriesHelper(server_name='uk.london', time=156)
|
||
|
expectation = [{'points': [[157, 'lu.lux']],
|
||
|
'name': 'events.stats.lu.lux',
|
||
|
'columns': ['time', 'server_name']},
|
||
|
{'points': [[156, 'uk.london']],
|
||
|
'name': 'events.stats.uk.london',
|
||
|
'columns': ['time', 'server_name']},
|
||
|
{'points': [[158, 'fr.paris-10']],
|
||
|
'name': 'events.stats.fr.paris-10',
|
||
|
'columns': ['time', 'server_name']},
|
||
|
{'points': [[159, 'us.east-1']],
|
||
|
'name': 'events.stats.us.east-1',
|
||
|
'columns': ['time', 'server_name']}]
|
||
|
|
||
|
rcvd = TestSeriesHelper.MySeriesHelper._json_body_()
|
||
|
self.assertTrue(all([el in expectation for el in rcvd]) and
|
||
|
all([el in rcvd for el in expectation]),
|
||
|
'Invalid JSON body of time series returned from '
|
||
|
'_json_body_ for several series names: {0}.'
|
||
|
.format(rcvd))
|
||
|
TestSeriesHelper.MySeriesHelper._reset_()
|
||
|
self.assertEqual(
|
||
|
TestSeriesHelper.MySeriesHelper._json_body_(),
|
||
|
[],
|
||
|
'Resetting helper did not empty datapoints.')
|
||
|
|
||
|
def testInvalidHelpers(self):
|
||
|
"""Test errors in invalid helpers."""
|
||
|
class MissingMeta(SeriesHelper):
|
||
|
"""Define SeriesHelper object for MissingMeta test."""
|
||
|
|
||
|
pass
|
||
|
|
||
|
class MissingClient(SeriesHelper):
|
||
|
"""Define SeriesHelper object for MissingClient test."""
|
||
|
|
||
|
class Meta:
|
||
|
"""Define metadata for MissingClient object."""
|
||
|
|
||
|
series_name = 'events.stats.{server_name}'
|
||
|
fields = ['time', 'server_name']
|
||
|
autocommit = True
|
||
|
|
||
|
class MissingSeriesName(SeriesHelper):
|
||
|
"""Define SeriesHelper object for MissingSeries test."""
|
||
|
|
||
|
class Meta:
|
||
|
"""Define metadata for MissingSeriesName object."""
|
||
|
|
||
|
fields = ['time', 'server_name']
|
||
|
|
||
|
class MissingFields(SeriesHelper):
|
||
|
"""Define SeriesHelper for MissingFields test."""
|
||
|
|
||
|
class Meta:
|
||
|
"""Define metadata for MissingFields object."""
|
||
|
|
||
|
series_name = 'events.stats.{server_name}'
|
||
|
|
||
|
for cls in [MissingMeta, MissingClient, MissingFields,
|
||
|
MissingSeriesName]:
|
||
|
self.assertRaises(
|
||
|
AttributeError, cls, **{'time': 159,
|
||
|
'server_name': 'us.east-1'})
|
||
|
|
||
|
def testWarnBulkSizeZero(self):
|
||
|
"""Test warning for an invalid bulk size."""
|
||
|
class WarnBulkSizeZero(SeriesHelper):
|
||
|
"""Define SeriesHelper for WarnBulkSizeZero test."""
|
||
|
|
||
|
class Meta:
|
||
|
"""Define metadata for WarnBulkSizeZero object."""
|
||
|
|
||
|
client = TestSeriesHelper.client
|
||
|
series_name = 'events.stats.{server_name}'
|
||
|
fields = ['time', 'server_name']
|
||
|
bulk_size = 0
|
||
|
autocommit = True
|
||
|
|
||
|
with warnings.catch_warnings(record=True) as rec_warnings:
|
||
|
warnings.simplefilter("always")
|
||
|
# Server defined in the client is invalid, we're testing
|
||
|
# the warning only.
|
||
|
with self.assertRaises(ConnectionError):
|
||
|
WarnBulkSizeZero(time=159, server_name='us.east-1')
|
||
|
|
||
|
self.assertGreaterEqual(
|
||
|
len(rec_warnings), 1,
|
||
|
'{0} call should have generated one warning.'
|
||
|
'Actual generated warnings: {1}'.format(
|
||
|
WarnBulkSizeZero, '\n'.join(map(str, rec_warnings))))
|
||
|
|
||
|
expected_msg = (
|
||
|
'Definition of bulk_size in WarnBulkSizeZero forced to 1, '
|
||
|
'was less than 1.')
|
||
|
|
||
|
self.assertIn(expected_msg, list(w.message.args[0]
|
||
|
for w in rec_warnings),
|
||
|
'Warning message did not contain "forced to 1".')
|
||
|
|
||
|
def testWarnBulkSizeNoEffect(self):
|
||
|
"""Test warning for a set bulk size but autocommit False."""
|
||
|
class WarnBulkSizeNoEffect(SeriesHelper):
|
||
|
"""Define SeriesHelper for WarnBulkSizeNoEffect object."""
|
||
|
|
||
|
class Meta:
|
||
|
"""Define metadata for WarnBulkSizeNoEffect object."""
|
||
|
|
||
|
series_name = 'events.stats.{server_name}'
|
||
|
fields = ['time', 'server_name']
|
||
|
bulk_size = 5
|
||
|
autocommit = False
|
||
|
|
||
|
with warnings.catch_warnings(record=True) as rec_warnings:
|
||
|
warnings.simplefilter("always")
|
||
|
WarnBulkSizeNoEffect(time=159, server_name='us.east-1')
|
||
|
|
||
|
self.assertGreaterEqual(
|
||
|
len(rec_warnings), 1,
|
||
|
'{0} call should have generated one warning.'
|
||
|
'Actual generated warnings: {1}'.format(
|
||
|
WarnBulkSizeNoEffect, '\n'.join(map(str, rec_warnings))))
|
||
|
|
||
|
expected_msg = (
|
||
|
'Definition of bulk_size in WarnBulkSizeNoEffect has no affect '
|
||
|
'because autocommit is false.')
|
||
|
|
||
|
self.assertIn(expected_msg, list(w.message.args[0]
|
||
|
for w in rec_warnings),
|
||
|
'Warning message did not contain the expected_msg.')
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
unittest.main()
|