test_uptimekuma.py 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. from flexmock import flexmock
  2. import borgmatic.hooks.monitoring.monitor
  3. from borgmatic.hooks.monitoring import uptime_kuma as module
  4. DEFAULT_PUSH_URL = 'https://example.uptime.kuma/api/push/abcd1234'
  5. CUSTOM_PUSH_URL = 'https://uptime.example.com/api/push/efgh5678'
  6. def test_ping_monitor_hits_default_uptimekuma_on_fail():
  7. hook_config = {}
  8. flexmock(module.requests).should_receive('get').with_args(
  9. f'{DEFAULT_PUSH_URL}?status=down&msg=fail',
  10. verify=True,
  11. timeout=int,
  12. ).and_return(flexmock(ok=True)).once()
  13. module.ping_monitor(
  14. hook_config,
  15. {},
  16. 'config.yaml',
  17. borgmatic.hooks.monitoring.monitor.State.FAIL,
  18. monitoring_log_level=1,
  19. dry_run=False,
  20. )
  21. def test_ping_monitor_hits_custom_uptimekuma_on_fail():
  22. hook_config = {'push_url': CUSTOM_PUSH_URL}
  23. flexmock(module.requests).should_receive('get').with_args(
  24. f'{CUSTOM_PUSH_URL}?status=down&msg=fail',
  25. verify=True,
  26. timeout=int,
  27. ).and_return(flexmock(ok=True)).once()
  28. module.ping_monitor(
  29. hook_config,
  30. {},
  31. 'config.yaml',
  32. borgmatic.hooks.monitoring.monitor.State.FAIL,
  33. monitoring_log_level=1,
  34. dry_run=False,
  35. )
  36. def test_ping_monitor_custom_uptimekuma_on_start():
  37. hook_config = {'push_url': CUSTOM_PUSH_URL}
  38. flexmock(module.requests).should_receive('get').with_args(
  39. f'{CUSTOM_PUSH_URL}?status=up&msg=start',
  40. verify=True,
  41. timeout=int,
  42. ).and_return(flexmock(ok=True)).once()
  43. module.ping_monitor(
  44. hook_config,
  45. {},
  46. 'config.yaml',
  47. borgmatic.hooks.monitoring.monitor.State.START,
  48. monitoring_log_level=1,
  49. dry_run=False,
  50. )
  51. def test_ping_monitor_custom_uptimekuma_on_finish():
  52. hook_config = {'push_url': CUSTOM_PUSH_URL}
  53. flexmock(module.requests).should_receive('get').with_args(
  54. f'{CUSTOM_PUSH_URL}?status=up&msg=finish',
  55. verify=True,
  56. timeout=int,
  57. ).and_return(flexmock(ok=True)).once()
  58. module.ping_monitor(
  59. hook_config,
  60. {},
  61. 'config.yaml',
  62. borgmatic.hooks.monitoring.monitor.State.FINISH,
  63. monitoring_log_level=1,
  64. dry_run=False,
  65. )
  66. def test_ping_monitor_does_not_hit_custom_uptimekuma_on_fail_dry_run():
  67. hook_config = {'push_url': CUSTOM_PUSH_URL}
  68. flexmock(module.requests).should_receive('get').never()
  69. module.ping_monitor(
  70. hook_config,
  71. {},
  72. 'config.yaml',
  73. borgmatic.hooks.monitoring.monitor.State.FAIL,
  74. monitoring_log_level=1,
  75. dry_run=True,
  76. )
  77. def test_ping_monitor_does_not_hit_custom_uptimekuma_on_start_dry_run():
  78. hook_config = {'push_url': CUSTOM_PUSH_URL}
  79. flexmock(module.requests).should_receive('get').never()
  80. module.ping_monitor(
  81. hook_config,
  82. {},
  83. 'config.yaml',
  84. borgmatic.hooks.monitoring.monitor.State.START,
  85. monitoring_log_level=1,
  86. dry_run=True,
  87. )
  88. def test_ping_monitor_does_not_hit_custom_uptimekuma_on_finish_dry_run():
  89. hook_config = {'push_url': CUSTOM_PUSH_URL}
  90. flexmock(module.requests).should_receive('get').never()
  91. module.ping_monitor(
  92. hook_config,
  93. {},
  94. 'config.yaml',
  95. borgmatic.hooks.monitoring.monitor.State.FINISH,
  96. monitoring_log_level=1,
  97. dry_run=True,
  98. )
  99. def test_ping_monitor_with_connection_error_logs_warning():
  100. hook_config = {'push_url': CUSTOM_PUSH_URL}
  101. flexmock(module.requests).should_receive('get').with_args(
  102. f'{CUSTOM_PUSH_URL}?status=down&msg=fail',
  103. verify=True,
  104. timeout=int,
  105. ).and_raise(module.requests.exceptions.ConnectionError)
  106. flexmock(module.logger).should_receive('warning').once()
  107. module.ping_monitor(
  108. hook_config,
  109. {},
  110. 'config.yaml',
  111. borgmatic.hooks.monitoring.monitor.State.FAIL,
  112. monitoring_log_level=1,
  113. dry_run=False,
  114. )
  115. def test_ping_monitor_with_other_error_logs_warning():
  116. hook_config = {'push_url': CUSTOM_PUSH_URL}
  117. response = flexmock(ok=False)
  118. response.should_receive('raise_for_status').and_raise(
  119. module.requests.exceptions.RequestException,
  120. )
  121. flexmock(module.requests).should_receive('get').with_args(
  122. f'{CUSTOM_PUSH_URL}?status=down&msg=fail',
  123. verify=True,
  124. timeout=int,
  125. ).and_return(response)
  126. flexmock(module.logger).should_receive('warning').once()
  127. module.ping_monitor(
  128. hook_config,
  129. {},
  130. 'config.yaml',
  131. borgmatic.hooks.monitoring.monitor.State.FAIL,
  132. monitoring_log_level=1,
  133. dry_run=False,
  134. )
  135. def test_ping_monitor_with_invalid_run_state():
  136. hook_config = {'push_url': CUSTOM_PUSH_URL}
  137. flexmock(module.requests).should_receive('get').never()
  138. module.ping_monitor(
  139. hook_config,
  140. {},
  141. 'config.yaml',
  142. borgmatic.hooks.monitoring.monitor.State.LOG,
  143. monitoring_log_level=1,
  144. dry_run=True,
  145. )
  146. def test_ping_monitor_skips_ssl_verification_when_verify_tls_false():
  147. hook_config = {'push_url': CUSTOM_PUSH_URL, 'verify_tls': False}
  148. flexmock(module.requests).should_receive('get').with_args(
  149. f'{CUSTOM_PUSH_URL}?status=down&msg=fail',
  150. verify=False,
  151. timeout=int,
  152. ).and_return(flexmock(ok=True)).once()
  153. module.ping_monitor(
  154. hook_config,
  155. {},
  156. 'config.yaml',
  157. borgmatic.hooks.monitoring.monitor.State.FAIL,
  158. monitoring_log_level=1,
  159. dry_run=False,
  160. )
  161. def test_ping_monitor_executes_ssl_verification_when_verify_tls_true():
  162. hook_config = {'push_url': CUSTOM_PUSH_URL, 'verify_tls': True}
  163. flexmock(module.requests).should_receive('get').with_args(
  164. f'{CUSTOM_PUSH_URL}?status=down&msg=fail',
  165. verify=True,
  166. timeout=int,
  167. ).and_return(flexmock(ok=True)).once()
  168. module.ping_monitor(
  169. hook_config,
  170. {},
  171. 'config.yaml',
  172. borgmatic.hooks.monitoring.monitor.State.FAIL,
  173. monitoring_log_level=1,
  174. dry_run=False,
  175. )