From ab351548d2533110280dd6b24760f6910e5f9a61 Mon Sep 17 00:00:00 2001 From: Dan Helfman Date: Sun, 9 Jul 2023 17:40:02 -0700 Subject: [PATCH] Fix (some) end-to-end tests (#721). --- borgmatic/hooks/cronhub.py | 4 +- borgmatic/hooks/cronitor.py | 4 +- borgmatic/hooks/healthchecks.py | 4 +- borgmatic/hooks/ntfy.py | 4 +- borgmatic/hooks/pagerduty.py | 4 +- tests/end-to-end/test_database.py | 211 +++++++++---------- tests/end-to-end/test_validate_config.py | 1 - tests/integration/hooks/test_healthchecks.py | 4 +- tests/unit/hooks/test_healthchecks.py | 10 +- 9 files changed, 118 insertions(+), 128 deletions(-) diff --git a/borgmatic/hooks/cronhub.py b/borgmatic/hooks/cronhub.py index 170f191..bbdc19a 100644 --- a/borgmatic/hooks/cronhub.py +++ b/borgmatic/hooks/cronhub.py @@ -14,7 +14,7 @@ MONITOR_STATE_TO_CRONHUB = { def initialize_monitor( - ping_url, config_filename, monitoring_log_level, dry_run + ping_url, config, config_filename, monitoring_log_level, dry_run ): # pragma: no cover ''' No initialization is necessary for this monitor. @@ -55,7 +55,7 @@ def ping_monitor(hook_config, config, config_filename, state, monitoring_log_lev def destroy_monitor( - ping_url_or_uuid, config_filename, monitoring_log_level, dry_run + ping_url_or_uuid, config, config_filename, monitoring_log_level, dry_run ): # pragma: no cover ''' No destruction is necessary for this monitor. diff --git a/borgmatic/hooks/cronitor.py b/borgmatic/hooks/cronitor.py index d57920c..fe4cc1d 100644 --- a/borgmatic/hooks/cronitor.py +++ b/borgmatic/hooks/cronitor.py @@ -14,7 +14,7 @@ MONITOR_STATE_TO_CRONITOR = { def initialize_monitor( - ping_url, config_filename, monitoring_log_level, dry_run + ping_url, config, config_filename, monitoring_log_level, dry_run ): # pragma: no cover ''' No initialization is necessary for this monitor. @@ -50,7 +50,7 @@ def ping_monitor(hook_config, config, config_filename, state, monitoring_log_lev def destroy_monitor( - ping_url_or_uuid, config_filename, monitoring_log_level, dry_run + ping_url_or_uuid, config, config_filename, monitoring_log_level, dry_run ): # pragma: no cover ''' No destruction is necessary for this monitor. diff --git a/borgmatic/hooks/healthchecks.py b/borgmatic/hooks/healthchecks.py index 511e956..ae0772c 100644 --- a/borgmatic/hooks/healthchecks.py +++ b/borgmatic/hooks/healthchecks.py @@ -70,7 +70,7 @@ def format_buffered_logs_for_payload(): return payload -def initialize_monitor(hook_config, config_filename, monitoring_log_level, dry_run): +def initialize_monitor(hook_config, config, config_filename, monitoring_log_level, dry_run): ''' Add a handler to the root logger that stores in memory the most recent logs emitted. That way, we can send them all to Healthchecks upon a finish or failure state. But skip this if the @@ -133,7 +133,7 @@ def ping_monitor(hook_config, config, config_filename, state, monitoring_log_lev logger.warning(f'{config_filename}: Healthchecks error: {error}') -def destroy_monitor(hook_config, config_filename, monitoring_log_level, dry_run): +def destroy_monitor(hook_config, config, config_filename, monitoring_log_level, dry_run): ''' Remove the monitor handler that was added to the root logger. This prevents the handler from getting reused by other instances of this monitor. diff --git a/borgmatic/hooks/ntfy.py b/borgmatic/hooks/ntfy.py index 50aa387..abe976f 100644 --- a/borgmatic/hooks/ntfy.py +++ b/borgmatic/hooks/ntfy.py @@ -6,7 +6,7 @@ logger = logging.getLogger(__name__) def initialize_monitor( - ping_url, config_filename, monitoring_log_level, dry_run + ping_url, config, config_filename, monitoring_log_level, dry_run ): # pragma: no cover ''' No initialization is necessary for this monitor. @@ -75,7 +75,7 @@ def ping_monitor(hook_config, config, config_filename, state, monitoring_log_lev def destroy_monitor( - ping_url_or_uuid, config_filename, monitoring_log_level, dry_run + ping_url_or_uuid, config, config_filename, monitoring_log_level, dry_run ): # pragma: no cover ''' No destruction is necessary for this monitor. diff --git a/borgmatic/hooks/pagerduty.py b/borgmatic/hooks/pagerduty.py index 382a402..aeeec97 100644 --- a/borgmatic/hooks/pagerduty.py +++ b/borgmatic/hooks/pagerduty.py @@ -13,7 +13,7 @@ EVENTS_API_URL = 'https://events.pagerduty.com/v2/enqueue' def initialize_monitor( - integration_key, config_filename, monitoring_log_level, dry_run + integration_key, config, config_filename, monitoring_log_level, dry_run ): # pragma: no cover ''' No initialization is necessary for this monitor. @@ -75,7 +75,7 @@ def ping_monitor(hook_config, config, config_filename, state, monitoring_log_lev def destroy_monitor( - ping_url_or_uuid, config_filename, monitoring_log_level, dry_run + ping_url_or_uuid, config, config_filename, monitoring_log_level, dry_run ): # pragma: no cover ''' No destruction is necessary for this monitor. diff --git a/tests/end-to-end/test_database.py b/tests/end-to-end/test_database.py index 0a10339..9209ec3 100644 --- a/tests/end-to-end/test_database.py +++ b/tests/end-to-end/test_database.py @@ -22,60 +22,57 @@ def write_configuration( storing database dumps, dump format (for PostgreSQL), and encryption passphrase. ''' config = f''' -location: - source_directories: - - {source_directory} - repositories: - - {repository_path} - borgmatic_source_directory: {borgmatic_source_directory} +source_directories: + - {source_directory} +repositories: + - {repository_path} +borgmatic_source_directory: {borgmatic_source_directory} -storage: - encryption_passphrase: "test" +encryption_passphrase: "test" -hooks: - postgresql_databases: - - name: test - hostname: postgresql - username: postgres - password: test - format: {postgresql_dump_format} - - name: all - hostname: postgresql - username: postgres - password: test - - name: all - format: custom - hostname: postgresql - username: postgres - password: test - mysql_databases: - - name: test - hostname: mysql - username: root - password: test - - name: all - hostname: mysql - username: root - password: test - - name: all - format: sql - hostname: mysql - username: root - password: test - mongodb_databases: - - name: test - hostname: mongodb - username: root - password: test - authentication_database: admin - format: {mongodb_dump_format} - - name: all - hostname: mongodb - username: root - password: test - sqlite_databases: - - name: sqlite_test - path: /tmp/sqlite_test.db +postgresql_databases: + - name: test + hostname: postgresql + username: postgres + password: test + format: {postgresql_dump_format} + - name: all + hostname: postgresql + username: postgres + password: test + - name: all + format: custom + hostname: postgresql + username: postgres + password: test +mysql_databases: + - name: test + hostname: mysql + username: root + password: test + - name: all + hostname: mysql + username: root + password: test + - name: all + format: sql + hostname: mysql + username: root + password: test +mongodb_databases: + - name: test + hostname: mongodb + username: root + password: test + authentication_database: admin + format: {mongodb_dump_format} + - name: all + hostname: mongodb + username: root + password: test +sqlite_databases: + - name: sqlite_test + path: /tmp/sqlite_test.db ''' with open(config_path, 'w') as config_file: @@ -96,51 +93,48 @@ def write_custom_restore_configuration( restore_username, restore_password and restore_path. ''' config = f''' -location: - source_directories: - - {source_directory} - repositories: - - {repository_path} - borgmatic_source_directory: {borgmatic_source_directory} +source_directories: + - {source_directory} +repositories: + - {repository_path} +borgmatic_source_directory: {borgmatic_source_directory} -storage: - encryption_passphrase: "test" +encryption_passphrase: "test" -hooks: - postgresql_databases: - - name: test - hostname: postgresql - username: postgres - password: test - format: {postgresql_dump_format} - restore_hostname: postgresql2 - restore_port: 5433 - restore_username: postgres2 - restore_password: test2 - mysql_databases: - - name: test - hostname: mysql - username: root - password: test - restore_hostname: mysql2 - restore_port: 3307 - restore_username: root - restore_password: test2 - mongodb_databases: - - name: test - hostname: mongodb - username: root - password: test - authentication_database: admin - format: {mongodb_dump_format} - restore_hostname: mongodb2 - restore_port: 27018 - restore_username: root2 - restore_password: test2 - sqlite_databases: - - name: sqlite_test - path: /tmp/sqlite_test.db - restore_path: /tmp/sqlite_test2.db +postgresql_databases: + - name: test + hostname: postgresql + username: postgres + password: test + format: {postgresql_dump_format} + restore_hostname: postgresql2 + restore_port: 5433 + restore_username: postgres2 + restore_password: test2 +mysql_databases: + - name: test + hostname: mysql + username: root + password: test + restore_hostname: mysql2 + restore_port: 3307 + restore_username: root + restore_password: test2 +mongodb_databases: + - name: test + hostname: mongodb + username: root + password: test + authentication_database: admin + format: {mongodb_dump_format} + restore_hostname: mongodb2 + restore_port: 27018 + restore_username: root2 + restore_password: test2 +sqlite_databases: + - name: sqlite_test + path: /tmp/sqlite_test.db + restore_path: /tmp/sqlite_test2.db ''' with open(config_path, 'w') as config_file: @@ -161,23 +155,20 @@ def write_simple_custom_restore_configuration( these options for PostgreSQL. ''' config = f''' -location: - source_directories: - - {source_directory} - repositories: - - {repository_path} - borgmatic_source_directory: {borgmatic_source_directory} +source_directories: + - {source_directory} +repositories: + - {repository_path} +borgmatic_source_directory: {borgmatic_source_directory} -storage: - encryption_passphrase: "test" +encryption_passphrase: "test" -hooks: - postgresql_databases: - - name: test - hostname: postgresql - username: postgres - password: test - format: {postgresql_dump_format} +postgresql_databases: + - name: test + hostname: postgresql + username: postgres + password: test + format: {postgresql_dump_format} ''' with open(config_path, 'w') as config_file: diff --git a/tests/end-to-end/test_validate_config.py b/tests/end-to-end/test_validate_config.py index 4b86da4..85a2006 100644 --- a/tests/end-to-end/test_validate_config.py +++ b/tests/end-to-end/test_validate_config.py @@ -38,5 +38,4 @@ def test_validate_config_command_with_show_flag_displays_configuration(): f'validate-borgmatic-config --config {config_path} --show'.split(' ') ).decode(sys.stdout.encoding) - assert 'location:' in output assert 'repositories:' in output diff --git a/tests/integration/hooks/test_healthchecks.py b/tests/integration/hooks/test_healthchecks.py index 0c37013..687b487 100644 --- a/tests/integration/hooks/test_healthchecks.py +++ b/tests/integration/hooks/test_healthchecks.py @@ -10,7 +10,7 @@ def test_destroy_monitor_removes_healthchecks_handler(): original_handlers = list(logger.handlers) logger.addHandler(module.Forgetful_buffering_handler(byte_capacity=100, log_level=1)) - module.destroy_monitor(flexmock(), flexmock(), flexmock(), flexmock()) + module.destroy_monitor(flexmock(), flexmock(), flexmock(), flexmock(), flexmock()) assert logger.handlers == original_handlers @@ -19,6 +19,6 @@ def test_destroy_monitor_without_healthchecks_handler_does_not_raise(): logger = logging.getLogger() original_handlers = list(logger.handlers) - module.destroy_monitor(flexmock(), flexmock(), flexmock(), flexmock()) + module.destroy_monitor(flexmock(), flexmock(), flexmock(), flexmock(), flexmock()) assert logger.handlers == original_handlers diff --git a/tests/unit/hooks/test_healthchecks.py b/tests/unit/hooks/test_healthchecks.py index fd43507..e3ab438 100644 --- a/tests/unit/hooks/test_healthchecks.py +++ b/tests/unit/hooks/test_healthchecks.py @@ -86,7 +86,7 @@ def test_initialize_monitor_creates_log_handler_with_ping_body_limit(): ).once() module.initialize_monitor( - {'ping_body_limit': ping_body_limit}, 'test.yaml', monitoring_log_level, dry_run=False + {'ping_body_limit': ping_body_limit}, {}, 'test.yaml', monitoring_log_level, dry_run=False ) @@ -99,7 +99,7 @@ def test_initialize_monitor_creates_log_handler_with_default_ping_body_limit(): monitoring_log_level, ).once() - module.initialize_monitor({}, 'test.yaml', monitoring_log_level, dry_run=False) + module.initialize_monitor({}, {}, 'test.yaml', monitoring_log_level, dry_run=False) def test_initialize_monitor_creates_log_handler_with_zero_ping_body_limit(): @@ -112,7 +112,7 @@ def test_initialize_monitor_creates_log_handler_with_zero_ping_body_limit(): ).once() module.initialize_monitor( - {'ping_body_limit': ping_body_limit}, 'test.yaml', monitoring_log_level, dry_run=False + {'ping_body_limit': ping_body_limit}, {}, 'test.yaml', monitoring_log_level, dry_run=False ) @@ -121,7 +121,7 @@ def test_initialize_monitor_creates_log_handler_when_send_logs_true(): flexmock(module).should_receive('Forgetful_buffering_handler').once() module.initialize_monitor( - {'send_logs': True}, 'test.yaml', monitoring_log_level=1, dry_run=False + {'send_logs': True}, {}, 'test.yaml', monitoring_log_level=1, dry_run=False ) @@ -130,7 +130,7 @@ def test_initialize_monitor_bails_when_send_logs_false(): flexmock(module).should_receive('Forgetful_buffering_handler').never() module.initialize_monitor( - {'send_logs': False}, 'test.yaml', monitoring_log_level=1, dry_run=False + {'send_logs': False}, {}, 'test.yaml', monitoring_log_level=1, dry_run=False )