helper_test.py 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. # -*- coding: utf-8 -*-
  2. """Define set of helper functions for the dataframe."""
  3. import unittest
  4. import warnings
  5. import mock
  6. from influxdb.influxdb08 import SeriesHelper, InfluxDBClient
  7. from requests.exceptions import ConnectionError
  8. class TestSeriesHelper(unittest.TestCase):
  9. """Define the SeriesHelper for test."""
  10. @classmethod
  11. def setUpClass(cls):
  12. """Set up an instance of the TestSerisHelper object."""
  13. super(TestSeriesHelper, cls).setUpClass()
  14. TestSeriesHelper.client = InfluxDBClient(
  15. 'host',
  16. 8086,
  17. 'username',
  18. 'password',
  19. 'database'
  20. )
  21. class MySeriesHelper(SeriesHelper):
  22. """Define a subset SeriesHelper instance."""
  23. class Meta:
  24. """Define metadata for the TestSeriesHelper object."""
  25. client = TestSeriesHelper.client
  26. series_name = 'events.stats.{server_name}'
  27. fields = ['time', 'server_name']
  28. bulk_size = 5
  29. autocommit = True
  30. TestSeriesHelper.MySeriesHelper = MySeriesHelper
  31. def test_auto_commit(self):
  32. """Test that write_points called after the right number of events."""
  33. class AutoCommitTest(SeriesHelper):
  34. """Define an instance of SeriesHelper for AutoCommit test."""
  35. class Meta:
  36. """Define metadata AutoCommitTest object."""
  37. series_name = 'events.stats.{server_name}'
  38. fields = ['time', 'server_name']
  39. bulk_size = 5
  40. client = InfluxDBClient()
  41. autocommit = True
  42. fake_write_points = mock.MagicMock()
  43. AutoCommitTest(server_name='us.east-1', time=159)
  44. AutoCommitTest._client.write_points = fake_write_points
  45. AutoCommitTest(server_name='us.east-1', time=158)
  46. AutoCommitTest(server_name='us.east-1', time=157)
  47. AutoCommitTest(server_name='us.east-1', time=156)
  48. self.assertFalse(fake_write_points.called)
  49. AutoCommitTest(server_name='us.east-1', time=3443)
  50. self.assertTrue(fake_write_points.called)
  51. def testSingleSeriesName(self):
  52. """Test JSON conversion when there is only one series name."""
  53. TestSeriesHelper.MySeriesHelper(server_name='us.east-1', time=159)
  54. TestSeriesHelper.MySeriesHelper(server_name='us.east-1', time=158)
  55. TestSeriesHelper.MySeriesHelper(server_name='us.east-1', time=157)
  56. TestSeriesHelper.MySeriesHelper(server_name='us.east-1', time=156)
  57. expectation = [{'points': [[159, 'us.east-1'],
  58. [158, 'us.east-1'],
  59. [157, 'us.east-1'],
  60. [156, 'us.east-1']],
  61. 'name': 'events.stats.us.east-1',
  62. 'columns': ['time', 'server_name']}]
  63. rcvd = TestSeriesHelper.MySeriesHelper._json_body_()
  64. self.assertTrue(all([el in expectation for el in rcvd]) and
  65. all([el in rcvd for el in expectation]),
  66. 'Invalid JSON body of time series returned from '
  67. '_json_body_ for one series name: {0}.'.format(rcvd))
  68. TestSeriesHelper.MySeriesHelper._reset_()
  69. self.assertEqual(
  70. TestSeriesHelper.MySeriesHelper._json_body_(),
  71. [],
  72. 'Resetting helper did not empty datapoints.')
  73. def testSeveralSeriesNames(self):
  74. """Test JSON conversion when there is only one series name."""
  75. TestSeriesHelper.MySeriesHelper(server_name='us.east-1', time=159)
  76. TestSeriesHelper.MySeriesHelper(server_name='fr.paris-10', time=158)
  77. TestSeriesHelper.MySeriesHelper(server_name='lu.lux', time=157)
  78. TestSeriesHelper.MySeriesHelper(server_name='uk.london', time=156)
  79. expectation = [{'points': [[157, 'lu.lux']],
  80. 'name': 'events.stats.lu.lux',
  81. 'columns': ['time', 'server_name']},
  82. {'points': [[156, 'uk.london']],
  83. 'name': 'events.stats.uk.london',
  84. 'columns': ['time', 'server_name']},
  85. {'points': [[158, 'fr.paris-10']],
  86. 'name': 'events.stats.fr.paris-10',
  87. 'columns': ['time', 'server_name']},
  88. {'points': [[159, 'us.east-1']],
  89. 'name': 'events.stats.us.east-1',
  90. 'columns': ['time', 'server_name']}]
  91. rcvd = TestSeriesHelper.MySeriesHelper._json_body_()
  92. self.assertTrue(all([el in expectation for el in rcvd]) and
  93. all([el in rcvd for el in expectation]),
  94. 'Invalid JSON body of time series returned from '
  95. '_json_body_ for several series names: {0}.'
  96. .format(rcvd))
  97. TestSeriesHelper.MySeriesHelper._reset_()
  98. self.assertEqual(
  99. TestSeriesHelper.MySeriesHelper._json_body_(),
  100. [],
  101. 'Resetting helper did not empty datapoints.')
  102. def testInvalidHelpers(self):
  103. """Test errors in invalid helpers."""
  104. class MissingMeta(SeriesHelper):
  105. """Define SeriesHelper object for MissingMeta test."""
  106. pass
  107. class MissingClient(SeriesHelper):
  108. """Define SeriesHelper object for MissingClient test."""
  109. class Meta:
  110. """Define metadata for MissingClient object."""
  111. series_name = 'events.stats.{server_name}'
  112. fields = ['time', 'server_name']
  113. autocommit = True
  114. class MissingSeriesName(SeriesHelper):
  115. """Define SeriesHelper object for MissingSeries test."""
  116. class Meta:
  117. """Define metadata for MissingSeriesName object."""
  118. fields = ['time', 'server_name']
  119. class MissingFields(SeriesHelper):
  120. """Define SeriesHelper for MissingFields test."""
  121. class Meta:
  122. """Define metadata for MissingFields object."""
  123. series_name = 'events.stats.{server_name}'
  124. for cls in [MissingMeta, MissingClient, MissingFields,
  125. MissingSeriesName]:
  126. self.assertRaises(
  127. AttributeError, cls, **{'time': 159,
  128. 'server_name': 'us.east-1'})
  129. def testWarnBulkSizeZero(self):
  130. """Test warning for an invalid bulk size."""
  131. class WarnBulkSizeZero(SeriesHelper):
  132. """Define SeriesHelper for WarnBulkSizeZero test."""
  133. class Meta:
  134. """Define metadata for WarnBulkSizeZero object."""
  135. client = TestSeriesHelper.client
  136. series_name = 'events.stats.{server_name}'
  137. fields = ['time', 'server_name']
  138. bulk_size = 0
  139. autocommit = True
  140. with warnings.catch_warnings(record=True) as rec_warnings:
  141. warnings.simplefilter("always")
  142. # Server defined in the client is invalid, we're testing
  143. # the warning only.
  144. with self.assertRaises(ConnectionError):
  145. WarnBulkSizeZero(time=159, server_name='us.east-1')
  146. self.assertGreaterEqual(
  147. len(rec_warnings), 1,
  148. '{0} call should have generated one warning.'
  149. 'Actual generated warnings: {1}'.format(
  150. WarnBulkSizeZero, '\n'.join(map(str, rec_warnings))))
  151. expected_msg = (
  152. 'Definition of bulk_size in WarnBulkSizeZero forced to 1, '
  153. 'was less than 1.')
  154. self.assertIn(expected_msg, list(w.message.args[0]
  155. for w in rec_warnings),
  156. 'Warning message did not contain "forced to 1".')
  157. def testWarnBulkSizeNoEffect(self):
  158. """Test warning for a set bulk size but autocommit False."""
  159. class WarnBulkSizeNoEffect(SeriesHelper):
  160. """Define SeriesHelper for WarnBulkSizeNoEffect object."""
  161. class Meta:
  162. """Define metadata for WarnBulkSizeNoEffect object."""
  163. series_name = 'events.stats.{server_name}'
  164. fields = ['time', 'server_name']
  165. bulk_size = 5
  166. autocommit = False
  167. with warnings.catch_warnings(record=True) as rec_warnings:
  168. warnings.simplefilter("always")
  169. WarnBulkSizeNoEffect(time=159, server_name='us.east-1')
  170. self.assertGreaterEqual(
  171. len(rec_warnings), 1,
  172. '{0} call should have generated one warning.'
  173. 'Actual generated warnings: {1}'.format(
  174. WarnBulkSizeNoEffect, '\n'.join(map(str, rec_warnings))))
  175. expected_msg = (
  176. 'Definition of bulk_size in WarnBulkSizeNoEffect has no affect '
  177. 'because autocommit is false.')
  178. self.assertIn(expected_msg, list(w.message.args[0]
  179. for w in rec_warnings),
  180. 'Warning message did not contain the expected_msg.')
  181. if __name__ == '__main__':
  182. unittest.main()