tests/test_add_old_archive_confirmation.py::test_confirm_add_old_archive_yes
tests/test_add_old_archive_confirmation.py::test_confirm_add_old_archive_no
tests/test_add_old_archive_confirmation.py::test_confirm_add_old_archive_timeout
tests/test_add_old_archive_confirmation.py::test_confirm_add_old_archive_keyboard_interrupt
tests/test_alternate_reference_archive.py::test_diff_extected_to_work
tests/test_alternate_reference_archive.py::test_diff_missing_alternate_reference_archive
tests/test_alternate_reference_archive.py::test_incr_missing_alternate_reference_archive
tests/test_autocompletion_install.py::test_install_autocompletion_first_time
tests/test_autocompletion_install.py::test_install_autocompletion_idempotent
tests/test_autocompletion_install.py::test_uninstall_autocompletion_removes_block
tests/test_backup_timeout.py::test_backup_completes_within_generous_timeout
tests/test_backup_timeout.py::test_stalled_dar_is_killed_by_timeout
tests/test_binary_info.py::test_binary_path_exists_and_executable[dar]
tests/test_binary_info.py::test_binary_path_exists_and_executable[dar_manager]
tests/test_binary_info.py::test_binary_version_detected_and_valid[dar]
tests/test_binary_info.py::test_binary_version_detected_and_valid[dar_manager]
tests/test_binary_info.py::test_binary_info_not_found
tests/test_binary_info.py::test_binary_info_handles_run_exception
tests/test_bitrot.py::test_5_bitrot_recovery
tests/test_bitrot.py::test_25_bitrot_recovery
tests/test_clean_log.py::test_version
tests/test_clean_log.py::test_clean_log_removes_entries
tests/test_clean_log.py::test_clean_log_keeps_unrelated_entries
tests/test_clean_log.py::test_clean_log_keeps_non_info_pattern_lines
tests/test_clean_log.py::test_clean_log_empty_file
tests/test_clean_log.py::test_clean_log_multiple_files
tests/test_clean_log.py::test_clean_log_non_existent_file
tests/test_clean_log.py::test_clean_log_read_only_file
tests/test_clean_log.py::test_clean_log_dry_run_read_only_file
tests/test_clean_log.py::test_clean_log_corrupted_file
tests/test_clean_log.py::test_clean_log_dry_run
tests/test_clean_log.py::test_clean_log_uses_config_file_when_no_file_provided
tests/test_clean_log.py::test_clean_log_invalid_empty_filename
tests/test_clean_log.py::test_clean_log_missing_config_file
tests/test_clean_log.py::test_clean_log_rejects_path_traversal
tests/test_clean_log.py::test_clean_log_rejects_outside_log_dir
tests/test_clean_log.py::test_clean_log_file_missing_file
tests/test_clean_log.py::test_clean_log_file_no_read_permission
tests/test_clean_log.py::test_clean_log_rejects_non_pathlike
tests/test_clean_log.py::test_clean_log_file_handles_open_error
tests/test_clean_log.py::test_clean_log_file_in_process_removes_dar_lines
tests/test_clean_log.py::test_clean_log_file_in_process_dry_run
tests/test_clean_log.py::test_clean_log_file_write_permission_denied_in_process
tests/test_clean_log.py::test_clean_log_split_no_separator_returns_none_pair
tests/test_clean_log.py::test_clean_log_main_invalid_config_exits_127
tests/test_clean_log.py::test_clean_log_main_empty_filename_exits_1
tests/test_clean_log.py::test_clean_log_main_path_traversal_exits_1
tests/test_clean_log.py::test_clean_log_main_file_not_found_in_logdir_exits_1
tests/test_clean_log.py::test_clean_log_main_removes_dar_lines_and_keeps_others
tests/test_cleanup.py::test_cleanup_functionality
tests/test_cleanup.py::test_cleanup_specific_archives
tests/test_cleanup.py::test_cleanup_multiple_specific_archives
tests/test_cleanup.py::test_cleanup_specific_archives_dry_run
tests/test_cleanup.py::test_cleanup_alternate_dir
tests/test_cleanup.py::test_confirmation_no_stops_deleting_full
tests/test_cleanup.py::test_confirmation_yes_deletes_full
tests/test_cleanup.py::test_logs_warning_when_no_matching_archives
tests/test_cleanup.py::test_age_based_cleanup_runs_when_no_specific_archives_given
tests/test_cleanup.py::test_missing_cleanup_specific_archives_argument
tests/test_cleanup.py::test_prereq_script_success
tests/test_cleanup.py::test_cleanup_confirmation_timeout
tests/test_cleanup.py::test_cleanup_confirmation_keyboard_interrupt
tests/test_cleanup.py::test_cleanup_confirmation_none_response
tests/test_cleanup.py::test_show_version_flag_exits
tests/test_cleanup.py::test_invalid_date_in_filename
tests/test_cleanup.py::test_delete_file_permission_error
tests/test_cleanup.py::test_cleanup_deletes_per_archive_par2_in_external_dir
tests/test_cleanup.py::test_delete_catalog_failure
tests/test_cleanup.py::test_invalid_backup_type
tests/test_cleanup.py::test_postreq_script_success
tests/test_cleanup.py::test_postreq_script_failure
tests/test_cleanup.py::test_cleanup_invalid_symlink
tests/test_cleanup.py::test_cleanup_alternate_dir_missing_exits
tests/test_cleanup.py::test_cleanup_alternate_dir_not_directory_exits
tests/test_cleanup.py::test_cleanup_specific_archives_rejects_unsafe_name
tests/test_cleanup.py::test_delete_old_backups_rejects_is_archive_name_allowed
tests/test_cleanup.py::test_delete_old_backups_skips_catalog_when_remove_fails
tests/test_cleanup.py::test_delete_par2_files_skips_missing_dir
tests/test_cleanup.py::test_delete_par2_files_dry_run_does_not_delete
tests/test_cleanup.py::test_delete_old_backups_rejects_unsafe_archive
tests/test_cleanup.py::test_delete_catalog_handles_exception
tests/test_cleanup.py::test_cleanup_delete_old_diff_in_process
tests/test_cleanup.py::test_cleanup_delete_old_incr_in_process
tests/test_cleanup.py::test_cleanup_delete_old_dry_run_in_process
tests/test_cleanup.py::test_cleanup_delete_archive_in_process
tests/test_cleanup.py::test_cleanup_delete_archive_dry_run_in_process
tests/test_cleanup.py::test_cleanup_delete_archive_no_matching_files_in_process
tests/test_cleanup.py::test_cleanup_delete_old_backups_skips_nonfile_and_other_def_in_process
tests/test_cleanup.py::test_cleanup_delete_archive_skips_nonfile_in_process
tests/test_cleanup.py::test_cleanup_main_specific_archive_in_process
tests/test_cleanup.py::test_cleanup_main_age_based_in_process
tests/test_cleanup.py::test_cleanup_main_list_in_process
tests/test_cleanup.py::test_cleanup_main_all_definitions_no_dash_d_in_process
tests/test_cleanup.py::test_cleanup_main_test_mode_no_specific_archives_in_process
tests/test_cleanup.py::test_cleanup_main_alternate_archive_dir_in_process
tests/test_cleanup.py::test_cleanup_main_invalid_config_covers_error_path_in_process
tests/test_cleanup_full_archive_deletion_real.py::test_cleanup_full_archive_yes_deletes_slices_and_catalog
tests/test_cleanup_full_archive_deletion_real.py::test_cleanup_full_archive_no_keeps_slices_on_disk
tests/test_command_runner.py::test_command_runner_executes_successfully
tests/test_command_runner.py::test_logger_fallback_creates_loggers_and_files
tests/test_command_runner.py::test_logger_fallback_raises_on_filehandler_failure
tests/test_command_runner.py::test_logger_fallback_logger_names
tests/test_command_runner.py::test_logger_fallback_warns_to_stderr
tests/test_command_runner.py::test_command_runner_fallback_logger
tests/test_command_runner.py::test_command_runner_captures_all_outputs
tests/test_command_runner.py::test_command_runner_stacktrace_on_failure
tests/test_command_runner.py::test_command_runner_truncates_stdout_and_sets_note
tests/test_command_runner.py::test_command_runner_truncates_stderr_and_sets_note
tests/test_command_runner.py::test_command_runner_capture_output_zero_still_logs
tests/test_command_runner.py::test_command_runner_default_limit_zero_suppresses_stdout_and_stderr
tests/test_command_runner.py::test_command_runner_default_limit_captures_stdout_and_stderr
tests/test_command_runner.py::test_command_runner_default_limit_captures_when_log_output_false
tests/test_command_runner.py::test_command_runner_log_output_false_still_captures
tests/test_command_runner.py::test_command_runner_capture_output_false_still_logs
tests/test_command_runner.py::test_command_runner_negative_limit_unlimited
tests/test_command_runner.py::test_command_runner_truncates_stdout_and_stderr_sets_note
tests/test_command_runner.py::test_command_runner_uses_default_capture_limit
tests/test_command_runner.py::test_command_runner_unsafe_arg_returns_error
tests/test_command_runner.py::test_sanitize_cmd_rejects_control_characters[\r-carriage-return]
tests/test_command_runner.py::test_sanitize_cmd_rejects_control_characters[\x00-null-byte]
tests/test_command_runner.py::test_sanitize_cmd_accepts_safe_args[hello]
tests/test_command_runner.py::test_sanitize_cmd_accepts_safe_args[/tmp/backup_dir]
tests/test_command_runner.py::test_sanitize_cmd_accepts_safe_args[example_FULL_2024-01-01]
tests/test_command_runner.py::test_sanitize_cmd_accepts_safe_args[--config-file]
tests/test_command_runner.py::test_command_runner_log_output_false_logs_only_command_line
tests/test_command_runner.py::test_command_runner_check_true_nonzero_returns_stack
tests/test_command_runner.py::test_command_runner_text_false_returns_bytes
tests/test_command_runner.py::test_command_runner_binary_truncates_with_limit
tests/test_command_runner.py::test_command_runner_binary_log_output_false_captures
tests/test_command_runner.py::test_command_runner_binary_default_limit_truncates
tests/test_command_runner.py::test_command_runner_non_list_cmd_returns_error
tests/test_command_runner.py::test_command_runner_invalid_arg_type_returns_error
tests/test_command_runner.py::test_command_runner_timeout_returns_error
tests/test_command_runner.py::test_command_runner_negative_timeout_disables_timeout
tests/test_command_runner.py::test_command_runner_popen_failure_returns_error
tests/test_command_runner.py::test_command_runner_capture_and_log_output_disabled
tests/test_command_runner.py::test_command_runner_cwd_and_stdin_passed
tests/test_command_runner.py::test_command_runner_text_false_does_not_log_binary
tests/test_command_runner.py::test_command_runner_sanitize_failure_note_includes_command
tests/test_command_runner.py::test_command_runner_non_list_cmd_note_includes_command
tests/test_command_runner.py::test_command_runner_restores_tty_attrs
tests/test_command_runner.py::test_command_runner_termios_none_skips_tty
tests/test_command_runner.py::test_command_runner_tty_open_failure_does_not_crash
tests/test_command_runner.py::test_command_runner_wait_exception_returns_error
tests/test_command_runner.py::test_command_result_str_handles_binary
tests/test_command_runner.py::test_command_runner_real_timeout_kills_process
tests/test_command_runner.py::test_command_runner_completes_within_generous_timeout
tests/test_command_runner.py::test_command_runner_sets_lc_all_c
tests/test_command_runner.py::test_tail_assembles_line_split_at_chunk_boundary
tests/test_command_runner.py::test_command_runner_overrides_caller_locale
tests/test_concurrent_backup.py::test_concurrent_same_definition_does_not_corrupt_catalog
tests/test_concurrent_backup.py::test_concurrent_different_definitions_both_succeed
tests/test_config_comments.py::test_config_inline_comments
tests/test_config_settings.py::test_config_settings_missing_file_raises
tests/test_config_settings.py::test_config_settings_invalid_par2_enabled_value_raises
tests/test_config_settings.py::test_config_settings_optional_bool_invalid_raises
tests/test_config_settings.py::test_config_settings_optional_regex_invalid_raises
tests/test_config_settings.py::test_config_settings_optional_csv_list_parses
tests/test_config_settings.py::test_config_settings_optional_regex_compiles_case_insensitive
tests/test_config_settings.py::test_config_settings_expands_paths_and_defaults
tests/test_config_settings.py::test_get_par2_config_overrides_run_verify_and_enabled
tests/test_config_settings.py::test_get_par2_config_invalid_run_verify_value_raises
tests/test_config_settings.py::test_config_settings_repr_omits_none_fields
tests/test_config_settings.py::test_config_settings_env_timeout_overrides_config
tests/test_config_settings.py::test_config_settings_env_timeout_valid_values[-1--1]
tests/test_config_settings.py::test_config_settings_env_timeout_valid_values[300-300]
tests/test_config_settings.py::test_config_settings_env_timeout_invalid_values_raise[0]
tests/test_config_settings.py::test_config_settings_env_timeout_invalid_values_raise[banana]
tests/test_config_settings.py::test_config_settings_env_timeout_invalid_values_raise[]
tests/test_config_settings.py::test_config_settings_env_timeout_invalid_values_raise[  ]
tests/test_config_settings.py::test_config_settings_invalid_optional_ints_raise[MISC-COMMAND_CAPTURE_MAX_BYTES-not-an-int]
tests/test_config_settings.py::test_config_settings_invalid_optional_ints_raise[MISC-LOGFILE_MAX_BYTES-not-an-int]
tests/test_config_settings.py::test_config_settings_invalid_optional_ints_raise[MISC-LOGFILE_BACKUP_COUNT-not-an-int]
tests/test_config_settings.py::test_config_settings_invalid_optional_ints_raise[PAR2-PAR2_RATIO_FULL-not-an-int]
tests/test_config_settings.py::test_config_settings_diff_age_out_of_range_raises[0]
tests/test_config_settings.py::test_config_settings_diff_age_out_of_range_raises[-1]
tests/test_config_settings.py::test_config_settings_incr_age_out_of_range_raises[0]
tests/test_config_settings.py::test_config_settings_incr_age_out_of_range_raises[-1]
tests/test_config_settings.py::test_config_settings_error_correction_percent_out_of_range_raises[-1]
tests/test_config_settings.py::test_config_settings_error_correction_percent_out_of_range_raises[0]
tests/test_config_settings.py::test_config_settings_error_correction_percent_out_of_range_raises[91]
tests/test_config_settings.py::test_config_settings_error_correction_percent_out_of_range_raises[100]
tests/test_config_settings.py::test_config_settings_valid_age_values_load_cleanly[1-1]
tests/test_config_settings.py::test_config_settings_valid_age_values_load_cleanly[30-15]
tests/test_config_settings.py::test_config_settings_valid_age_values_load_cleanly[365-180]
tests/test_config_settings.py::test_config_settings_valid_error_correction_percent_loads_cleanly[1]
tests/test_config_settings.py::test_config_settings_valid_error_correction_percent_loads_cleanly[5]
tests/test_config_settings.py::test_config_settings_valid_error_correction_percent_loads_cleanly[50]
tests/test_config_settings.py::test_config_settings_valid_error_correction_percent_loads_cleanly[90]
tests/test_config_settings.py::test_config_settings_no_files_verification_out_of_range_raises[0]
tests/test_config_settings.py::test_config_settings_no_files_verification_out_of_range_raises[-1]
tests/test_config_settings.py::test_config_settings_no_files_verification_valid_values_load_cleanly[1]
tests/test_config_settings.py::test_config_settings_no_files_verification_valid_values_load_cleanly[5]
tests/test_config_settings.py::test_config_settings_no_files_verification_valid_values_load_cleanly[100]
tests/test_config_settings.py::test_config_settings_diff_age_over_365_issues_warning[366]
tests/test_config_settings.py::test_config_settings_diff_age_over_365_issues_warning[500]
tests/test_config_settings.py::test_config_settings_incr_age_over_31_issues_warning[32]
tests/test_config_settings.py::test_config_settings_incr_age_over_31_issues_warning[90]
tests/test_config_settings.py::test_config_settings_age_at_threshold_no_warning[365-31]
tests/test_config_settings.py::test_config_settings_age_at_threshold_no_warning[1-1]
tests/test_config_settings.py::test_config_settings_restore_ownership_yes
tests/test_config_settings.py::test_config_settings_restore_ownership_no
tests/test_config_settings.py::test_config_settings_restore_ownership_missing_defaults_false
tests/test_config_settings.py::test_config_settings_restore_ownership_invalid_value_raises
tests/test_corrupt_disk.py::test_generic_backup_dar_exit_5_source_unreadable_completes
tests/test_corrupt_disk.py::test_generic_backup_dar_exit_5_logs_warning_not_error
tests/test_corrupt_disk.py::test_generic_backup_dar_write_failure_raises_backup_error
tests/test_corrupt_disk.py::test_generic_backup_dar_exit_1_logs_partial_backup_error
tests/test_create_backup_command.py::test_create_backup_command_minimal_structure[FULL-False]
tests/test_create_backup_command.py::test_create_backup_command_minimal_structure[DIFF-True]
tests/test_create_backup_command.py::test_create_backup_command_minimal_structure[INCR-True]
tests/test_create_full_diff_incr_backup.py::test_backup_functionality
tests/test_create_full_diff_incr_backup.py::test_backup_functionality_short_options
tests/test_create_full_diff_incr_backup.py::test_backup_with_missing_config_file
tests/test_create_full_diff_incr_backup.py::test_backup_with_malformed_config_file
tests/test_create_full_diff_incr_backup.py::test_config_with_invalid_timeout_value
tests/test_create_full_diff_incr_backup.py::test_config_with_invalid_boolean_value
tests/test_create_full_diff_incr_backup.py::test_config_with_invalid_integer_value
tests/test_create_full_diff_incr_backup.py::test_config_missing_age_section
tests/test_create_full_diff_incr_backup.py::test_config_missing_diff_age_key
tests/test_create_full_diff_incr_backup.py::test_config_missing_incr_age
tests/test_dar_backup.py::test_verify_filecmp_mismatch_returns_false
tests/test_dar_backup.py::test_verify_filecmp_permission_error_logged
tests/test_dar_backup.py::test_verify_missing_source_file_logs_warning
tests/test_dar_backup.py::test_verify_do_not_compare_skips_verification
tests/test_dar_backup.py::test_verify_success_path_with_verbose_logging
tests/test_dar_backup.py::test_perform_backup_skips_definition_with_underscore_in_args
tests/test_dar_backup.py::test_perform_backup_skips_files_with_underscore_in_directory
tests/test_dar_backup.py::test_normalize_backup_definition_name_accepts_alnum
tests/test_dar_backup.py::test_list_definitions_filters_invalid_names
tests/test_dar_backup.py::test_list_definitions_allow_unsafe_includes_all
tests/test_dar_backup.py::test_perform_backup_skips_diff_when_no_base_backup
tests/test_dar_backup.py::test_perform_backup_skips_incr_when_no_diff_backup
tests/test_dar_backup.py::test_perform_backup_handles_failed_verification
tests/test_dar_backup.py::test_perform_backup_succeeds_when_write_metrics_row_raises
tests/test_dar_backup.py::test_perform_backup_succeeds_when_metrics_db_path_is_none
tests/test_dar_backup.py::test_perform_backup_runs_par2_after_verify
tests/test_dar_backup.py::test_perform_backup_sends_warning_for_existing_backup
tests/test_dar_backup.py::test_perform_backup_handles_exception_during_processing
tests/test_dar_backup.py::test_list_contents_with_selection_parses_and_extends_command
tests/test_dar_backup.py::test_list_contents_handles_nonzero_returncode
tests/test_dar_backup.py::test_list_contents_raises_backup_error_on_called_process_error
tests/test_dar_backup.py::test_list_contents_raises_runtime_error_on_generic_exception
tests/test_dar_backup.py::test_restore_backup_process_fails
tests/test_dar_backup.py::test_restore_backup_calledprocesserror
tests/test_dar_backup.py::test_restore_backup_oserror
tests/test_dar_backup.py::test_generic_backup_warns_on_returncode_5
tests/test_dar_backup.py::test_catalog_add_failure_handled
tests/test_dar_backup.py::test_verify_raises_error_if_no_root_path
tests/test_dar_backup.py::test_restore_backup_raises_if_restore_dir_none
tests/test_dar_backup.py::test_main_fails_when_definition_file_missing
tests/test_dar_backup.py::test_main_defensive_check_invalid_result_format
tests/test_dar_backup.py::test_test_restore_cli
tests/test_dar_backup.py::test_find_files_within_min_max_range
tests/test_dar_backup.py::test_filter_restoretest_candidates_case_insensitive
tests/test_dar_backup.py::test_restoretest_filters_and_verifies_all_good_files
tests/test_dar_backup.py::test_generic_backup_runner_exception_raises[FULL]
tests/test_dar_backup.py::test_generic_backup_runner_exception_raises[DIFF]
tests/test_dar_backup.py::test_generic_backup_runner_exception_raises[INCR]
tests/test_dar_backup.py::test_generic_backup_calledprocesserror_wrapped[FULL]
tests/test_dar_backup.py::test_generic_backup_calledprocesserror_wrapped[DIFF]
tests/test_dar_backup.py::test_generic_backup_calledprocesserror_wrapped[INCR]
tests/test_dar_backup.py::test_restore_backup_selection_and_darrc[--selections some/file.txt --selections "dir with spaces/"-expect_tokens0]
tests/test_dar_backup.py::test_restore_backup_selection_and_darrc[None-expect_tokens1]
tests/test_dar_backup.py::test_print_markdown_missing_file_exits
tests/test_dar_backup.py::test_get_backed_up_files_error_mapping[side_effect0-BackupError-Error listing backed up files]
tests/test_dar_backup.py::test_get_backed_up_files_error_mapping[side_effect1-RuntimeError-Unexpected error listing backed up files.*dummy_backup]
tests/test_dar_backup.py::test_get_backed_up_files_success_parses_xml
tests/test_dar_backup.py::test_generate_par2_files_success_invokes_par2
tests/test_dar_backup.py::test_generate_par2_files_failure_raises_calledprocesserror
tests/test_dar_backup.py::test_print_markdown_from_string_pretty_false
tests/test_dar_backup.py::test_print_markdown_pretty_falls_back_when_rich_missing
tests/test_dar_backup.py::test_select_restoretest_samples_returns_empty_when_sample_size_zero
tests/test_dar_backup.py::test_select_restoretest_samples_ignores_invalid_sizes
tests/test_dar_backup.py::test_select_restoretest_samples_reservoir_sampling_limits_size
tests/test_dar_backup.py::test_verify_skips_when_no_eligible_files_logs_info
tests/test_dar_backup.py::test_get_backed_up_files_nonzero_returncode_raises_runtime_error
tests/test_dar_backup.py::test_get_backed_up_files_timeout_raises_backup_error
tests/test_dar_backup.py::test_list_dar_slices_orders_numerically
tests/test_dar_backup.py::test_validate_slice_sequence_missing_slice_raises
tests/test_dar_backup.py::test_get_backup_type_from_archive_base_invalid_format_raises
tests/test_dar_backup.py::test_get_par2_ratio_prefers_specific_ratio
tests/test_dar_backup.py::test_restore_backup_root_warning_when_ignore_ownership
tests/test_dar_backup.py::test_restore_backup_no_warning_when_ownership_preserved
tests/test_dar_backup.py::test_restore_backup_no_warning_when_non_root
tests/test_dar_backup.py::test_restore_backup_preserve_ownership_overrides_config
tests/test_dar_backup.py::test_restore_backup_ignore_ownership_flag_injects_comparison_field
tests/test_dar_backup.py::test_restore_backup_no_deleted_injects_deleted_ignore
tests/test_dar_backup.py::test_restore_backup_no_deleted_false_omits_deleted_ignore
tests/test_dar_backup.py::test_restore_backup_overwriting_policy_removed
tests/test_dar_backup_additional_coverage.py::test_iter_files_with_paths_from_xml_streams_paths
tests/test_dar_backup_additional_coverage.py::test_filter_restoretest_candidates_logs_excluded
tests/test_dar_backup_additional_coverage.py::test_select_restoretest_samples_logs_summary
tests/test_dar_backup_additional_coverage.py::test_create_backup_command_requires_base_for_diff
tests/test_dar_backup_additional_coverage.py::test_validate_required_directories_missing
tests/test_dar_backup_additional_coverage.py::test_list_definitions_requires_dir
tests/test_dar_backup_additional_coverage.py::test_preflight_reports_missing_paths_and_permissions
tests/test_dar_backup_additional_coverage.py::test_preflight_reports_backup_dir_write_probe_failure
tests/test_dar_backup_additional_coverage.py::test_preflight_warns_when_log_directory_is_unavailable
tests/test_dar_backup_additional_coverage.py::test_preflight_reports_missing_binaries
tests/test_dar_backup_additional_coverage.py::test_preflight_reports_version_failures
tests/test_dar_backup_additional_coverage.py::test_verify_runner_exception_propagates
tests/test_dar_backup_additional_coverage.py::test_verify_restore_dir_create_error
tests/test_dar_backup_additional_coverage.py::test_verify_restore_command_nonzero_raises
tests/test_dar_backup_additional_coverage.py::test_get_backed_up_files_subprocess_success
tests/test_dar_backup_additional_coverage.py::test_get_backed_up_files_subprocess_remove_warns
tests/test_dar_backup_additional_coverage.py::test_list_contents_subprocess_success
tests/test_dar_backup_additional_coverage.py::test_list_contents_subprocess_error
tests/test_dar_backup_additional_coverage.py::test_perform_backup_alternate_reference_missing
tests/test_dar_backup_additional_coverage.py::test_validate_slice_sequence_empty_list
tests/test_dar_backup_additional_coverage.py::test_get_par2_ratio_incr_override
tests/test_dar_backup_additional_coverage.py::test_generate_par2_files_par2_disabled
tests/test_dar_backup_additional_coverage.py::test_generate_par2_files_verify_failure
tests/test_dar_backup_additional_coverage.py::test_filter_darrc_file_cleanup_on_error
tests/test_dar_backup_additional_coverage.py::test_show_examples_prints_output
tests/test_dar_backup_integration.py::test_dar_backup_list_definitions_function
tests/test_dar_backup_integration.py::test_dar_backup_list_definitions_invalid_name_skipped
tests/test_dar_backup_integration.py::test_dar_backup_print_changelog
tests/test_dar_backup_integration.py::test_dar_backup_print_readme
tests/test_dar_backup_integration.py::test_dar_backup_filter_darrc_file
tests/test_dar_backup_integration.py::test_dar_backup_clean_restore_test_directory
tests/test_dar_backup_integration.py::test_dar_backup_should_clean_for_full_backup
tests/test_dar_backup_integration.py::test_dar_backup_should_not_clean_when_do_not_compare
tests/test_dar_backup_integration.py::test_dar_backup_should_clean_restore_to_same_dir
tests/test_dar_backup_integration.py::test_dar_backup_should_not_clean_restore_to_different_dir
tests/test_dar_backup_integration.py::test_dar_backup_full_backup_with_suppress_dar_msg
tests/test_dar_backup_integration.py::test_dar_backup_list_definitions_skips_subdirectory
tests/test_dar_backup_integration.py::test_dar_backup_clean_restore_no_restore_dir_configured
tests/test_dar_backup_integration.py::test_dar_backup_clean_restore_nonexistent_path_is_noop
tests/test_dar_backup_integration.py::test_dar_backup_normalize_restore_dir_falsy_inputs
tests/test_dar_backup_integration.py::test_dar_backup_should_not_clean_when_no_operation
tests/test_dar_backup_integration.py::test_dar_backup_main_version_flag_prints_version
tests/test_dar_backup_integration.py::test_dar_backup_main_examples_flag_prints_usage
tests/test_dar_backup_integration.py::test_dar_backup_main_readme_flag_prints_content
tests/test_dar_backup_integration.py::test_dar_backup_main_changelog_flag_prints_content
tests/test_dar_backup_integration.py::test_record_prereq_failure_single_definition
tests/test_dar_backup_integration.py::test_record_prereq_failure_all_definitions
tests/test_dar_backup_integration.py::test_record_prereq_failure_sets_prereq_status_in_db
tests/test_dar_backup_integration.py::test_update_postreq_status_sets_column_in_db
tests/test_dar_backup_startup.py::test_dar_backup_unreadable_config_exits_127
tests/test_dar_backup_startup.py::test_dar_backup_warns_on_bad_logfile_location
tests/test_dar_backup_startup.py::test_dar_backup_logs_preflight_failures_to_main_log
tests/test_dar_backup_startup.py::test_locale_ok_returns_true_when_lang_is_en_us_utf8
tests/test_dar_backup_startup.py::test_locale_ok_returns_false_when_lang_is_not_en_us_utf8
tests/test_dar_backup_startup.py::test_generic_backup_calls_parse_dar_stats_when_locale_correct
tests/test_dar_backup_startup.py::test_generic_backup_calls_parse_dar_stats_regardless_of_caller_locale
tests/test_dar_backup_startup.py::test_dar_backup_preflight_check_continues_with_fallback_logging
tests/test_dar_deleted_flag.py::test_diff_restore_without_deleted_ignore_fails
tests/test_dar_deleted_flag.py::test_diff_restore_with_deleted_ignore_succeeds
tests/test_dar_deleted_flag.py::test_diff_restore_deleted_ignore_zero_deletions_logged
tests/test_dar_deleted_flag.py::test_full_restore_without_overwriting_policy_succeeds
tests/test_dar_locale.py::test_dar_summary_identical_under_c_and_en_us_locale
tests/test_dar_ownership_precedence.py::test_dar_cli_ignore_owner_without_darrc_entry_succeeds
tests/test_dar_ownership_precedence.py::test_dar_ignore_owner_in_both_darrc_and_cli_succeeds
tests/test_dar_ownership_precedence.py::test_dar_cli_owner_alongside_darrc_ignore_owner_succeeds
tests/test_dar_ownership_precedence.py::test_dar_no_comparison_field_anywhere_nonroot_behaviour
tests/test_darrc.py::test_verify_filtering
tests/test_darrc.py::test_backup_with_filtered_darrc
tests/test_dashboard.py::TestFindFreePort::test_find_free_port_returns_preferred_when_available
tests/test_dashboard.py::TestFindFreePort::test_find_free_port_skips_occupied_port
tests/test_dashboard.py::TestFindFreePort::test_find_free_port_raises_when_all_busy
tests/test_dashboard.py::TestWaitForDatasette::test_wait_for_datasette_returns_true_when_ready
tests/test_dashboard.py::TestWaitForDatasette::test_wait_for_datasette_returns_false_on_timeout
tests/test_dashboard.py::TestResolveConfigFile::test_resolve_config_file_cli_takes_precedence
tests/test_dashboard.py::TestResolveConfigFile::test_resolve_config_file_env_var_used_when_no_cli
tests/test_dashboard.py::TestResolveConfigFile::test_resolve_config_file_default_when_nothing_set
tests/test_dashboard.py::TestResolveConfigFile::test_resolve_config_file_strips_whitespace
tests/test_dashboard.py::TestResolveConfigFile::test_resolve_config_file_expands_tilde
tests/test_dashboard.py::TestResolveConfigFile::test_resolve_config_file_env_var_whitespace_stripped
tests/test_dashboard.py::TestResolveDbPath::test_resolve_db_path_arg_takes_precedence
tests/test_dashboard.py::TestResolveDbPath::test_resolve_db_path_expands_tilde_in_arg
tests/test_dashboard.py::TestResolveDbPath::test_resolve_db_path_returns_empty_when_no_config
tests/test_dashboard.py::TestResolveDbPath::test_resolve_db_path_reads_from_config
tests/test_dashboard.py::TestResolveDbPath::test_resolve_db_path_returns_empty_on_config_error
tests/test_dashboard.py::TestGetDashboardHtmlPath::test_get_dashboard_html_path_returns_string
tests/test_dashboard.py::TestGetDashboardHtmlPath::test_get_dashboard_html_path_ends_with_dashboard_html
tests/test_dashboard.py::TestGetDatasettePath::test_get_datasette_path_finds_venv_binary
tests/test_dashboard.py::TestGetDatasettePath::test_get_datasette_path_falls_back_to_which
tests/test_dashboard.py::TestGetDatasettePath::test_get_datasette_path_returns_empty_when_not_found
tests/test_dashboard.py::TestGetDatasettePath::test_check_datasette_installed_true
tests/test_dashboard.py::TestGetDatasettePath::test_check_datasette_installed_false
tests/test_dashboard.py::TestMain::test_main_exits_when_datasette_not_installed
tests/test_dashboard.py::TestMain::test_main_exits_when_db_path_empty
tests/test_dashboard.py::TestMain::test_main_exits_when_db_file_missing
tests/test_dashboard.py::TestMain::test_main_exits_when_dashboard_html_not_found
tests/test_dashboard.py::TestMain::test_main_exits_when_no_free_port
tests/test_dashboard.py::TestMain::test_main_starts_datasette_and_opens_browser
tests/test_dashboard.py::TestMain::test_main_no_browser_flag_skips_browser
tests/test_dashboard.py::TestMain::test_main_port_fallback_prints_message
tests/test_dashboard.py::TestMain::test_main_datasette_file_not_found
tests/test_dashboard.py::TestMain::test_main_datasette_timeout_still_opens_browser
tests/test_dashboard.py::TestMain::test_main_kills_datasette_on_terminate_timeout
tests/test_dashboard_html.py::TestChartJsScriptTag::test_chartjs_script_tag_exists
tests/test_dashboard_html.py::TestChartJsScriptTag::test_chartjs_onerror_sets_flag
tests/test_dashboard_html.py::TestChartJsScriptTag::test_chartjs_onerror_assigns_true
tests/test_dashboard_html.py::TestChartJsScriptTag::test_chartjs_loaded_from_cdn
tests/test_dashboard_html.py::TestRequiredDomElements::test_trend_panels_container_exists
tests/test_dashboard_html.py::TestRequiredDomElements::test_trends_section_label_exists
tests/test_dashboard_html.py::TestGranularityButtons::test_three_granularity_buttons_exist
tests/test_dashboard_html.py::TestGranularityButtons::test_weekly_button_exists
tests/test_dashboard_html.py::TestGranularityButtons::test_monthly_button_exists
tests/test_dashboard_html.py::TestGranularityButtons::test_yearly_button_exists
tests/test_dashboard_html.py::TestGranularityButtons::test_monthly_is_default_active
tests/test_dashboard_html.py::TestChartJsFailureGuard::test_guard_checks_chartjs_failed_flag
tests/test_dashboard_html.py::TestChartJsFailureGuard::test_guard_checks_typeof_chart
tests/test_dashboard_html.py::TestChartJsFailureGuard::test_guard_hides_section_label
tests/test_dashboard_html.py::TestChartJsFailureGuard::test_guard_shows_warning_message
tests/test_dashboard_html.py::TestChartJsFailureGuard::test_warning_mentions_cdn_or_internet
tests/test_dashboard_html.py::TestJsFunctionsPresent::test_build_trend_panels_defined
tests/test_dashboard_html.py::TestJsFunctionsPresent::test_period_key_defined
tests/test_dashboard_html.py::TestJsFunctionsPresent::test_worst_status_defined
tests/test_dashboard_html.py::TestJsFunctionsPresent::test_fmt_bytes_defined
tests/test_dashboard_html.py::TestTwoDatasetDesign::test_full_dataset_referenced
tests/test_dashboard_html.py::TestTwoDatasetDesign::test_incr_diff_dataset_referenced
tests/test_dashboard_html.py::TestTwoDatasetDesign::test_stepped_line_used_for_full
tests/test_dashboard_html.py::TestTwoDatasetDesign::test_two_datasets_in_chart_config
tests/test_dashboard_html.py::TestTimezoneDisplay::test_fmt_ts_uses_date_constructor
tests/test_dashboard_html.py::TestTimezoneDisplay::test_fmt_ts_does_not_use_naive_slice_as_primary_path
tests/test_dashboard_html.py::TestTimezoneDisplay::test_local_tz_abbr_function_defined
tests/test_dashboard_html.py::TestTimezoneDisplay::test_local_tz_abbr_uses_intl
tests/test_dashboard_html.py::TestTimezoneDisplay::test_started_header_shows_timezone
tests/test_dashboard_html.py::TestTimezoneDisplay::test_last_updated_includes_timezone
tests/test_dashboard_smoke.py::test_dashboard_starts_and_serves_metrics_db
tests/test_demo.py::test_demo_help_no_args
tests/test_demo.py::test_demo_generate_calls_generate_file
tests/test_demo.py::test_demo_generate_with_overrides
tests/test_demo.py::test_demo_install_ok
tests/test_demo.py::test_demo_install_existing_no_override
tests/test_demo.py::test_demo_install_override_allows_existing
tests/test_demo.py::test_demo_bad_flag
tests/test_demo.py::test_demo_requires_grouped_options
tests/test_demo.py::test_setup_dicts_updates_vars
tests/test_demo.py::test_generate_file_writes_and_respects_override
tests/test_demo.py::test_generate_file_rejects_directory_output
tests/test_demo.py::test_generate_file_render_failure
tests/test_demo.py::test_check_directories_rejects_file
tests/test_discord_webhook.py::test_render_discord_report_success_no_prereqs
tests/test_discord_webhook.py::test_render_discord_report_failure_backup
tests/test_discord_webhook.py::test_render_discord_report_warning_backup_shows_completed
tests/test_discord_webhook.py::test_render_discord_report_postreq_failure_shows_details
tests/test_discord_webhook.py::test_render_discord_report_empty_backups_shows_none
tests/test_discord_webhook.py::test_render_discord_report_backups_sorted_alphabetically
tests/test_discord_webhook.py::test_requirements_report_out_set_to_success_when_scripts_pass
tests/test_discord_webhook.py::test_requirements_report_out_set_to_failure_on_script_error
tests/test_discord_webhook.py::test_requirements_report_out_stays_none_when_no_scripts_configured
tests/test_discord_webhook.py::test_send_discord_message_prefers_env_over_config
tests/test_discord_webhook.py::test_send_discord_message_uses_env_when_no_config
tests/test_discord_webhook_integration.py::test_discord_webhook_receives_post_after_full_backup
tests/test_discord_webhook_integration.py::test_discord_report_content_includes_backup_definition_and_outcome
tests/test_discord_webhook_integration.py::test_discord_webhook_not_called_when_env_var_absent
tests/test_disk_full.py::test_enospc_during_full_backup
tests/test_doctype_handler.py::test_doctype_handler_assignment
tests/test_filter_darrc_file.py::test_filter_darrc_file_removes_verbose_flags
tests/test_generic_backup_command_execution.py::test_generic_backup_success
tests/test_generic_backup_command_execution.py::test_generic_backup_dar_stats_captured_from_stderr
tests/test_generic_backup_command_execution.py::test_generic_backup_dar_stats_captured_from_stdout
tests/test_generic_backup_command_execution.py::test_generic_backup_dar_stats_all_none_when_no_output
tests/test_generic_backup_command_execution.py::test_generic_backup_warns_when_inodes_saved_none_after_success
tests/test_generic_backup_command_execution.py::test_generic_backup_no_inodes_warning_when_stats_parsed
tests/test_get_config_file.py::test_get_config_file_defaults_to_user_config
tests/test_get_config_file.py::test_get_config_file_uses_env_override
tests/test_get_config_file.py::test_get_config_file_cli_wins_over_env
tests/test_get_config_file.py::test_get_config_file_missing_config_file_attr_uses_default
tests/test_get_config_file.py::test_get_config_file_env_none_uses_default
tests/test_get_config_file.py::test_get_config_file_ignores_whitespace_env
tests/test_get_config_file.py::test_get_config_file_whitespace_cli_uses_env
tests/test_gpt_file_compression.py::test_dar_backup_compression_exclusion
tests/test_gpt_tests.py::test_restore_functionality
tests/test_gpt_tests.py::test_invalid_backup_handling
tests/test_gpt_tests.py::test_backup_with_large_files
tests/test_gpt_tests.py::test_par2_repair_bit_rot
tests/test_gpt_tests.py::test_par2_insufficient_redundancy
tests/test_gpt_tests.py::test_extreme_restore_failure
tests/test_gpt_tests.py::test_metadata_corruption_failure
tests/test_import_archive_metrics.py::TestScanArchives::test_empty_directory_returns_empty_list
tests/test_import_archive_metrics.py::TestScanArchives::test_current_format_archive_found
tests/test_import_archive_metrics.py::TestScanArchives::test_legacy_format_archive_found
tests/test_import_archive_metrics.py::TestScanArchives::test_incr_type_matched
tests/test_import_archive_metrics.py::TestScanArchives::test_non_first_slices_are_ignored
tests/test_import_archive_metrics.py::TestScanArchives::test_unrelated_files_are_ignored
tests/test_import_archive_metrics.py::TestScanArchives::test_backup_definition_filter_exact_match
tests/test_import_archive_metrics.py::TestScanArchives::test_backup_definition_filter_no_match_returns_empty
tests/test_import_archive_metrics.py::TestScanArchives::test_results_sorted_chronologically_by_date
tests/test_import_archive_metrics.py::TestScanArchives::test_same_date_sorted_by_time
tests/test_import_archive_metrics.py::TestScanArchives::test_mixed_legacy_and_current_format_sorted
tests/test_import_archive_metrics.py::TestSliceSizes::test_single_slice_returns_correct_size_and_count
tests/test_import_archive_metrics.py::TestSliceSizes::test_multiple_slices_summed
tests/test_import_archive_metrics.py::TestSliceSizes::test_no_slices_returns_zeros
tests/test_import_archive_metrics.py::TestSliceSizes::test_other_archive_slices_not_counted
tests/test_import_archive_metrics.py::TestParseDarStats::test_all_stats_parsed_from_full_output
tests/test_import_archive_metrics.py::TestParseDarStats::test_empty_output_returns_all_none
tests/test_import_archive_metrics.py::TestParseDarStats::test_partial_output_leaves_missing_as_none
tests/test_import_archive_metrics.py::TestParseDarStats::test_returns_dict_with_all_expected_keys
tests/test_import_archive_metrics.py::TestRunDarList::test_dar_binary_not_found_returns_null_stats
tests/test_import_archive_metrics.py::TestRunDarList::test_dar_timeout_returns_null_stats
tests/test_import_archive_metrics.py::TestRunDarList::test_oserror_returns_null_stats
tests/test_import_archive_metrics.py::TestRunDarList::test_non_utf8_output_does_not_raise
tests/test_import_archive_metrics.py::TestRunDarList::test_successful_output_parsed
tests/test_import_archive_metrics.py::TestRunDarList::test_null_stats_dict_has_all_keys
tests/test_import_archive_metrics.py::TestAlreadyImported::test_returns_false_when_archive_not_in_db
tests/test_import_archive_metrics.py::TestAlreadyImported::test_returns_true_when_archive_in_db
tests/test_import_archive_metrics.py::TestAlreadyImported::test_different_archive_name_returns_false
tests/test_import_archive_metrics.py::TestInsertRow::test_row_inserted_successfully
tests/test_import_archive_metrics.py::TestInsertRow::test_null_inode_stats_accepted
tests/test_import_archive_metrics.py::TestInsertRow::test_archive_size_bytes_stored_correctly
tests/test_import_archive_metrics.py::TestInsertRow::test_run_started_at_stored_correctly
tests/test_import_archive_metrics.py::TestFmtBytes::test_gigabytes_formatted
tests/test_import_archive_metrics.py::TestFmtBytes::test_exactly_one_gigabyte
tests/test_import_archive_metrics.py::TestFmtBytes::test_megabytes_formatted
tests/test_import_archive_metrics.py::TestFmtBytes::test_kilobytes_formatted
tests/test_import_archive_metrics.py::TestFmtBytes::test_bytes_formatted
tests/test_import_archive_metrics.py::TestFmtBytes::test_zero_bytes
tests/test_import_archive_metrics.py::TestEnsureDb::test_creates_backup_runs_table
tests/test_import_archive_metrics.py::TestEnsureDb::test_idempotent_when_table_already_exists
tests/test_import_archive_metrics.py::TestMain::test_imports_single_archive_returns_0
tests/test_import_archive_metrics.py::TestMain::test_imports_legacy_filename_correctly
tests/test_import_archive_metrics.py::TestMain::test_imports_current_filename_with_timestamp
tests/test_import_archive_metrics.py::TestMain::test_status_always_success
tests/test_import_archive_metrics.py::TestMain::test_second_run_skips_already_imported
tests/test_import_archive_metrics.py::TestMain::test_backup_definition_filter_imports_only_matching
tests/test_import_archive_metrics.py::TestMain::test_dry_run_returns_0_without_writing_db
tests/test_import_archive_metrics.py::TestMain::test_no_matching_archives_returns_0
tests/test_import_archive_metrics.py::TestMain::test_archive_with_no_slices_on_disk_counts_as_error
tests/test_import_archive_metrics.py::TestMain::test_multiple_archives_all_imported
tests/test_import_archive_metrics.py::TestMain::test_archive_size_bytes_stored_as_sum_of_slices
tests/test_installer.py::test_run_installer_creates_required_dirs
tests/test_installer.py::test_run_installer_with_create_db_prints_results
tests/test_installer.py::test_run_installer_blocks_unsafe_path
tests/test_installer.py::test_installer_main_missing_config_prints_and_returns
tests/test_installer.py::test_installer_main_calls_run_installer
tests/test_installer.py::test_installer_main_install_autocompletion
tests/test_installer.py::test_installer_main_remove_autocompletion
tests/test_installer.py::test_install_autocompletion_appends_and_is_idempotent
tests/test_installer.py::test_install_autocompletion_uses_bash_profile
tests/test_installer.py::test_install_autocompletion_uses_zsh
tests/test_installer.py::test_uninstall_autocompletion_removes_block
tests/test_installer.py::test_uninstall_autocompletion_no_marker
tests/test_installer.py::test_install_autocompletion_rc_is_dir
tests/test_installer.py::test_uninstall_autocompletion_missing_rc
tests/test_installer.py::test_uninstall_autocompletion_rc_is_dir
tests/test_installer.py::test_uninstall_autocompletion_end_marker_missing
tests/test_installer.py::test_installer_creates_catalog[False]
tests/test_installer.py::test_installer_creates_catalog[True]
tests/test_iterparse_gen.py::test_doctype_stripper
tests/test_links.py::test_backup_with_broken_symlink
tests/test_list_backups_real.py::test_list_backups_shows_all_archive_types
tests/test_list_backups_real.py::test_list_backups_no_match_prints_empty_message
tests/test_list_definitions.py::test_list_definitions_outputs_backup_d_entries
tests/test_listing.py::test_list_dar_archives
tests/test_listing.py::test_list_dar_archives_short_options
tests/test_listing.py::test_list_contents_unicode_filenames
tests/test_logging_trace.py::test_dual_logging_trace_suppression
tests/test_logging_trace.py::test_dual_logging_debug_level
tests/test_manager.py::test_manager_command_capture_max_bytes_zero
tests/test_manager.py::test_manager_command_capture_max_bytes_1k_captures_stdout_stderr
tests/test_manager.py::test_manager_create_dbs
tests/test_manager.py::test_manager_version
tests/test_manager.py::test_manager_help
tests/test_manager.py::test_list_catalog
tests/test_manager.py::test_list_catalog_short_option
tests/test_manager.py::test_find_file
tests/test_manager.py::test_remove_specific_archive
tests/test_manager.py::test_list_archive_contents
tests/test_manager.py::test_add_directory_to_catalog_db
tests/test_manager.py::test_add_empty_directory_to_catalog_db
tests/test_manager.py::test_add_archive_to_catalog_db
tests/test_manager.py::test_manager_more_help
tests/test_manager.py::test_manager_add_specific_archive_empty
tests/test_manager.py::test_manager_add_and_remove_specific_archive
tests/test_manager.py::test_manager_with_alternate_archive_dir
tests/test_manager.py::test_create_db_handles_dar_manager_failure
tests/test_manager.py::test_list_catalogs_db_missing
tests/test_manager.py::test_list_catalogs_command_failure
tests/test_manager.py::test_cat_no_for_name_list_catalogs_fails
tests/test_manager.py::test_list_archive_contents_runner_fails
tests/test_manager.py::test_list_archive_contents_cat_not_found
tests/test_manager.py::test_list_archive_contents_runner_fails_isolated
tests/test_manager.py::test_find_file_db_missing
tests/test_manager.py::test_add_specific_archive_dar_not_found
tests/test_manager.py::test_add_specific_archive_success
tests/test_manager.py::test_add_specific_archive_warning
tests/test_manager.py::test_add_specific_archive_failure
tests/test_manager.py::test_add_specific_archive_unexpected_error
tests/test_manager.py::test_list_archive_contents_arg
tests/test_manager.py::test_manager_sanity_checks_exit[cli_args0-archive dir not given]
tests/test_manager.py::test_manager_sanity_checks_exit[cli_args1-specific archive to add not given]
tests/test_manager.py::test_manager_sanity_checks_exit[cli_args2-specific archive to remove not given]
tests/test_manager.py::test_manager_sanity_checks_exit[cli_args3-you can't add and remove archives]
tests/test_manager.py::test_manager_sanity_checks_exit[cli_args4-you cannot add both a directory and an archive]
tests/test_manager.py::test_manager_sanity_checks_exit[cli_args5-No backup definition given]
tests/test_manager.py::test_manager_sanity_checks_exit[cli_args6-does not exist]
tests/test_manager.py::test_manager_sanity_checks_exit[cli_args7---list-archive-contents <param> not given]
tests/test_manager.py::test_manager_sanity_checks_exit[cli_args8---find-file requires the --backup-def]
tests/test_manager.py::test_manager_sanity_checks_exit[cli_args9-Alternate archive dir '/nonexistent' does not exist]
tests/test_manager.py::test_catalog_file_not_found
tests/test_manager.py::test_catalog_command_success
tests/test_manager.py::test_catalog_command_failure
tests/test_manager.py::test_manager_db_dir_respected_by_dar_backup
tests/test_manager.py::test_manager_db_dir_invalid_path_raises
tests/test_manager.py::test_backup_def_from_archive_no_match_logs_error
tests/test_manager.py::test_list_archive_contents_subprocess_empty_prints_info
tests/test_manager.py::test_list_archive_contents_subprocess_filters_saved_lines
tests/test_manager.py::test_add_specific_archive_missing_backup_def
tests/test_manager.py::test_add_specific_archive_old_archive_declined
tests/test_manager.py::test_add_specific_archive_catalog_list_failure_logs_warning
tests/test_manager.py::test_add_directory_no_archives_logs_info
tests/test_manager.py::test_add_directory_missing_dir_raises
tests/test_manager.py::test_add_directory_sorts_by_date_then_type
tests/test_manager.py::test_remove_specific_archive_failure_returns_one
tests/test_manager.py::test_create_db_db_dir_missing
tests/test_manager.py::test_create_db_db_dir_not_directory
tests/test_manager.py::test_create_db_db_dir_not_writable
tests/test_manager.py::test_list_catalogs_success_runner_parses_and_sorts
tests/test_manager.py::test_list_catalogs_success_subprocess_parses
tests/test_manager.py::test_get_db_dir_prefers_manager_db_dir
tests/test_manager.py::test_manager_db_dir_invalid_path_without_backup_def
tests/test_manager.py::test_manager_creates_all_catalogs
tests/test_manager.py::test_manager_skips_existing_catalogs
tests/test_manager.py::test_manager_recreates_corrupted_db
tests/test_manager.py::test_manager_does_not_overwrite_healthy_db
tests/test_manager_coverage.py::test_open_command_log_returns_none_without_handler
tests/test_manager_coverage.py::test_open_command_log_writes_header
tests/test_manager_coverage.py::test_list_catalogs_runner_ignores_short_lines_and_handles_no_date
tests/test_manager_coverage.py::test_list_catalogs_subprocess_non_int_cap_and_no_stderr
tests/test_manager_coverage.py::test_list_catalogs_subprocess_truncates_stderr_and_logs
tests/test_manager_coverage.py::test_list_catalogs_subprocess_error_with_stderr_text
tests/test_manager_coverage.py::test_list_archive_contents_db_missing
tests/test_manager_coverage.py::test_list_archive_contents_runner_prints_saved_lines
tests/test_manager_coverage.py::test_list_archive_contents_runner_prints_empty_info
tests/test_manager_coverage.py::test_list_archive_contents_subprocess_stderr_none
tests/test_manager_coverage.py::test_list_archive_contents_subprocess_truncates_stderr_and_skips_stdout
tests/test_manager_coverage.py::test_list_archive_contents_subprocess_error_with_stderr_text
tests/test_manager_coverage.py::test_list_archive_contents_subprocess_timeout
tests/test_manager_coverage.py::test_add_specific_archive_old_archive_confirmed
tests/test_manager_coverage.py::test_add_specific_archive_without_date_skips_prompt
tests/test_manager_coverage.py::test_add_directory_logs_error_on_failure
tests/test_manager_coverage.py::test_confirm_add_old_archive_returns_false_on_none
tests/test_manager_coverage.py::test_manager_main_python_version_too_low
tests/test_manager_coverage.py::test_manager_main_config_missing
tests/test_manager_coverage.py::test_manager_main_logfile_dir_missing
tests/test_manager_coverage.py::test_manager_main_sanity_returns[args0]
tests/test_manager_coverage.py::test_manager_main_sanity_returns[args1]
tests/test_manager_coverage.py::test_manager_main_sanity_returns[args2]
tests/test_manager_coverage.py::test_manager_main_sanity_returns[args3]
tests/test_manager_coverage.py::test_manager_main_sanity_returns[args4]
tests/test_manager_coverage.py::test_manager_main_sanity_returns[args5]
tests/test_manager_coverage.py::test_manager_main_sanity_returns[args6]
tests/test_manager_coverage.py::test_manager_main_sanity_returns[args7]
tests/test_manager_coverage.py::test_manager_main_create_db_returns
tests/test_manager_coverage.py::test_manager_main_add_specific_archive_returns
tests/test_manager_coverage.py::test_manager_main_add_dir_returns
tests/test_manager_coverage.py::test_manager_main_list_catalogs_returns
tests/test_manager_coverage.py::test_manager_main_list_archive_contents_returns
tests/test_manager_coverage.py::test_manager_main_find_file_returns
tests/test_manager_signals.py::test_signal_during_pitr_restore_logs_error[2-SIGINT]
tests/test_manager_signals.py::test_signal_during_pitr_restore_logs_error[15-SIGTERM]
tests/test_metrics_db.py::test_ensure_metrics_db_creates_schema
tests/test_metrics_db.py::test_ensure_metrics_db_creates_indexes
tests/test_metrics_db.py::test_ensure_metrics_db_is_idempotent
tests/test_metrics_db.py::test_ensure_metrics_db_migrates_old_db_adds_new_columns
tests/test_metrics_db.py::test_ensure_metrics_db_migration_preserves_existing_rows
tests/test_metrics_db.py::test_ensure_metrics_db_migration_new_columns_are_null_for_old_rows
tests/test_metrics_db.py::test_ensure_metrics_db_migration_is_idempotent
tests/test_metrics_db.py::test_write_metrics_row_noop_when_path_is_none
tests/test_metrics_db.py::test_write_metrics_row_noop_when_path_is_empty_string
tests/test_metrics_db.py::test_write_metrics_row_creates_db_file_if_missing
tests/test_metrics_db.py::test_write_metrics_row_inserts_one_row
tests/test_metrics_db.py::test_write_metrics_row_values_round_trip
tests/test_metrics_db.py::test_write_metrics_row_multiple_rows_accumulate
tests/test_metrics_db.py::test_write_metrics_row_null_optional_fields
tests/test_metrics_db.py::test_write_metrics_row_swallows_error_on_bad_path
tests/test_metrics_db.py::test_write_metrics_row_does_not_raise_on_missing_key
tests/test_metrics_db.py::test_config_settings_metrics_db_path_parsed
tests/test_metrics_db.py::test_config_settings_metrics_db_path_absent_is_none
tests/test_metrics_db.py::test_write_metrics_row_invalid_backup_type_swallowed_and_logged
tests/test_metrics_db.py::test_write_metrics_row_invalid_status_swallowed_and_logged
tests/test_metrics_db.py::test_write_metrics_row_invalid_failed_phase_swallowed_and_logged
tests/test_metrics_db.py::test_write_metrics_row_warning_status_round_trip
tests/test_metrics_db.py::test_write_metrics_row_failed_phase_round_trip[DAR]
tests/test_metrics_db.py::test_write_metrics_row_failed_phase_round_trip[VERIFY]
tests/test_metrics_db.py::test_write_metrics_row_failed_phase_round_trip[PAR2]
tests/test_metrics_db.py::test_write_metrics_row_noop_when_config_missing_attribute
tests/test_metrics_db.py::test_write_metrics_row_expands_tilde_in_path
tests/test_metrics_db.py::test_write_metrics_row_expands_env_var_in_path
tests/test_metrics_db.py::test_write_metrics_row_undefined_env_var_swallowed_and_logged
tests/test_metrics_db.py::test_ensure_metrics_db_all_columns_present
tests/test_metrics_db.py::test_ensure_metrics_db_not_null_constraints
tests/test_metrics_diff_incr.py::test_diff_backup_metrics_row_correct_type_and_fields
tests/test_metrics_diff_incr.py::test_incr_backup_metrics_row_correct_type_and_fields
tests/test_metrics_diff_incr.py::test_diff_and_incr_metrics_rows_accumulated_in_order
tests/test_metrics_diff_incr.py::test_diff_backup_archive_size_less_than_or_equal_to_full
tests/test_metrics_inode_counts.py::TestMetricsInodeCounts::test_full_backup_populates_inode_metrics
tests/test_metrics_inode_counts.py::TestMetricsInodeCounts::test_diff_backup_reflects_new_files
tests/test_metrics_inode_counts.py::TestMetricsInodeCounts::test_incr_backup_reflects_new_files
tests/test_metrics_inode_counts.py::TestMetricsInodeCounts::test_full_backup_symlinks_counted
tests/test_metrics_inode_counts.py::TestMetricsInodeCounts::test_metrics_db_has_all_inode_columns
tests/test_metrics_inode_counts.py::TestMetricsInodeCounts::test_no_metrics_written_when_db_path_absent
tests/test_metrics_smoke.py::test_full_backup_metrics_row_has_key_fields_populated
tests/test_metrics_smoke.py::test_full_backup_writes_restore_test_samples
tests/test_par2.py::test_ordered_by_slicenumber
tests/test_par2.py::test_par2_files_created_for_full_backup
tests/test_par2.py::test_par2_verify_passes_on_intact_backup
tests/test_par2_dir_expansion.py::test_global_par2_dir_tilde_expansion
tests/test_par2_dir_expansion.py::test_global_par2_dir_env_var_expansion
tests/test_par2_dir_expansion.py::test_per_definition_par2_dir_tilde_expansion
tests/test_par2_dir_expansion.py::test_undefined_env_var_in_par2_dir_does_not_raise_unhandled_exception
tests/test_par2_manifest.py::test_par2_dir_manifest_and_repair
tests/test_par2_multi_definitions.py::test_par2_multi_definition_repair_flow
tests/test_par2_multi_definitions.py::test_par2_globally_disabled
tests/test_par2_multi_definitions.py::test_par2_disabled_per_definition
tests/test_par2_multi_definitions.py::test_par2_run_verify_triggers_on_creation
tests/test_par2_multi_definitions.py::test_par2_manifest_written_when_custom_dir
tests/test_par2_multi_definitions.py::test_par2_diff_and_incr_have_separate_par2_sets
tests/test_par2_multi_definitions.py::test_par2_definition_isolation
tests/test_par2_multi_definitions.py::test_par2_ratio_size_ordering
tests/test_par2_overrides.py::test_par2_overrides_are_applied
tests/test_par2_repair_restore_verification.py::test_par2_repair_then_extract_matches_source
tests/test_par2_repair_restore_verification.py::test_par2_repair_does_not_produce_truncated_files
tests/test_parse_dar_stats.py::test_parse_dar_stats_returns_all_keys
tests/test_parse_dar_stats.py::test_parse_dar_stats_correct_values
tests/test_parse_dar_stats.py::test_parse_dar_stats_values_are_int
tests/test_parse_dar_stats.py::test_parse_dar_stats_large_numbers
tests/test_parse_dar_stats.py::test_parse_dar_stats_empty_string_returns_all_none
tests/test_parse_dar_stats.py::test_parse_dar_stats_none_input_returns_all_none
tests/test_parse_dar_stats.py::test_parse_dar_stats_partial_output_missing_fields_are_none
tests/test_parse_dar_stats.py::test_parse_dar_stats_unrecognised_format_all_none
tests/test_parse_dar_stats.py::test_parse_dar_stats_extra_whitespace_handled
tests/test_parse_dar_stats.py::test_parse_dar_stats_mid_word_newline_returns_none
tests/test_pitr.py::test_restore_at_basic_success
tests/test_pitr.py::test_restore_at_timezone_aware_when_normalized
tests/test_pitr.py::test_restore_at_invalid_date
tests/test_pitr.py::test_restore_at_no_db
tests/test_pitr.py::test_restore_at_target_creation_fail
tests/test_pitr.py::test_restore_at_returns_restore_with_dar_code
tests/test_pitr.py::test_restore_at_existing_target_paths_abort
tests/test_pitr.py::test_restore_at_empty_target_allows_restore
tests/test_pitr.py::test_restore_at_multiple_paths_all_restored
tests/test_pitr.py::test_restore_at_multiple_paths_and_no_target
tests/test_pitr.py::test_cli_restore_path_requires_backup_def
tests/test_pitr.py::test_cli_restore_path_requires_target
tests/test_pitr.py::test_cli_pitr_report_does_not_require_target
tests/test_pitr.py::test_cli_pitr_report_first_runs_and_aborts_on_failure
tests/test_pitr.py::test_cli_pitr_report_first_runs_and_restores_on_success
tests/test_pitr.py::test_cli_pitr_report_first_requires_restore_path
tests/test_pitr.py::test_restore_at_uses_restore_with_dar
tests/test_pitr.py::test_restore_at_default_when_uses_now
tests/test_pitr.py::test_restore_with_dar_logs_candidates_and_summary
tests/test_pitr.py::test_restore_with_dar_directory_logs_chain_details
tests/test_pitr.py::test_pitr_report_directory_missing_slice_fails
tests/test_pitr.py::test_pitr_report_requires_when
tests/test_pitr.py::test_pitr_report_invalid_date
tests/test_pitr.py::test_pitr_report_empty_archive_map
tests/test_pitr.py::test_pitr_report_file_missing_archive_map_entry
tests/test_pitr.py::test_pitr_report_file_missing_slice
tests/test_pitr.py::test_pitr_report_directory_no_full_archive
tests/test_pitr.py::test_pitr_report_directory_missing_archive_map_entry
tests/test_pitr.py::test_pitr_report_directory_catalog_based_chain
tests/test_pitr.py::test_restore_with_dar_directory_missing_chain_fails
tests/test_pitr.py::test_restore_with_dar_directory_no_full_archive
tests/test_pitr.py::test_restore_with_dar_directory_missing_archive_map_entry
tests/test_pitr.py::test_restore_with_dar_directory_detected_by_catalog
tests/test_pitr.py::test_restore_with_dar_directory_no_file_versions_uses_chain
tests/test_pitr.py::test_restore_at_rejects_protected_target
tests/test_pitr.py::test_cli_restore_execution
tests/test_pitr.py::test_cli_relocate_requires_backup_def
tests/test_pitr.py::test_cli_relocate_dry_run_executes
tests/test_pitr.py::test_cli_relocate_dry_run_requires_relocate
tests/test_pitr.py::test_relocate_archive_paths_dry_run
tests/test_pitr.py::test_relocate_archive_paths_apply
tests/test_pitr.py::test_relocate_archive_paths_no_matches
tests/test_pitr.py::test_relocate_archive_paths_list_failure
tests/test_pitr.py::test_relocate_archive_paths_update_failure
tests/test_pitr.py::test_restore_with_dar_empty_archive_map
tests/test_pitr.py::test_restore_with_dar_file_missing_archive_map_entry
tests/test_pitr.py::test_restore_with_dar_file_missing_slice
tests/test_pitr.py::test_restore_with_dar_file_restore_failure
tests/test_pitr.py::TestNormalizeWhenDt::test_naive_datetime_passes_through_unchanged
tests/test_pitr.py::TestNormalizeWhenDt::test_utc_aware_datetime_converted_to_local_naive
tests/test_pitr.py::TestNormalizeWhenDt::test_utc_plus_530_aware_datetime_converted_to_utc_local
tests/test_pitr.py::TestParseWhenTimezones::test_parse_when_utc_input_normalized_to_local_naive
tests/test_pitr.py::TestParseWhenTimezones::test_parse_when_ist_input_normalized_to_utc_local
tests/test_pitr.py::TestParseWhenTimezones::test_parse_when_est_input_normalized_to_utc_local
tests/test_pitr.py::TestParseWhenTimezones::test_parse_when_edt_input_normalized_to_utc_local
tests/test_pitr.py::TestParseWhenTimezones::test_parse_when_cet_input_normalized_to_utc_local
tests/test_pitr.py::TestParseWhenTimezones::test_parse_when_cest_input_normalized_to_utc_local
tests/test_pitr.py::TestParseWhenTimezones::test_parse_when_naive_input_passes_through_unchanged
tests/test_pitr.py::TestParseWhenTimezones::test_parse_when_invalid_input_returns_none
tests/test_pitr.py::test_restore_with_dar_no_deleted_injects_deleted_ignore
tests/test_pitr.py::test_restore_with_dar_no_deleted_false_omits_deleted_ignore
tests/test_pitr_edge_cases.py::TestSelectArchiveChain::test_full_plus_incr_no_diff
tests/test_pitr_edge_cases.py::TestSelectArchiveChain::test_multiple_fulls_picks_latest
tests/test_pitr_edge_cases.py::TestSelectArchiveChain::test_all_archives_in_future_returns_empty
tests/test_pitr_edge_cases.py::TestSelectArchiveChain::test_same_day_full_and_diff_with_time_components
tests/test_pitr_edge_cases.py::TestSelectArchiveChain::test_only_full_returns_single_element_chain
tests/test_pitr_edge_cases.py::TestSelectArchiveChain::test_full_diff_incr_complete_chain
tests/test_pitr_edge_cases.py::TestSelectArchiveChain::test_multiple_incrs_picks_latest_only
tests/test_pitr_edge_cases.py::TestSelectArchiveChain::test_multiple_diffs_picks_latest_only
tests/test_pitr_edge_cases.py::TestSelectArchiveChain::test_when_dt_exactly_on_full_includes_it
tests/test_pitr_edge_cases.py::TestSelectArchiveChain::test_empty_archive_info_returns_empty
tests/test_pitr_edge_cases.py::TestSelectArchiveChain::test_diff_only_no_full_returns_empty
tests/test_pitr_edge_cases.py::TestSelectArchiveChain::test_incr_only_no_full_returns_empty
tests/test_pitr_edge_cases.py::TestParseArchiveInfo::test_archive_with_extra_suffix_after_date
tests/test_pitr_edge_cases.py::TestParseArchiveInfo::test_archive_with_time_component
tests/test_pitr_edge_cases.py::TestParseArchiveInfo::test_non_matching_archive_name_is_skipped
tests/test_pitr_edge_cases.py::TestParseArchiveInfo::test_all_three_types_parsed
tests/test_pitr_edge_cases.py::TestParseArchiveInfo::test_empty_archive_map
tests/test_pitr_edge_cases.py::TestParseFileVersions::test_empty_output
tests/test_pitr_edge_cases.py::TestParseFileVersions::test_blank_lines_ignored
tests/test_pitr_edge_cases.py::TestParseFileVersions::test_malformed_lines_ignored
tests/test_pitr_edge_cases.py::TestParseFileVersions::test_multiple_valid_versions
tests/test_pitr_edge_cases.py::TestCatalogBasedRestoreStrategy::test_dotfile_with_versions_takes_file_path
tests/test_pitr_edge_cases.py::TestCatalogBasedRestoreStrategy::test_makefile_with_versions_takes_file_path
tests/test_pitr_edge_cases.py::TestCatalogBasedRestoreStrategy::test_directory_without_versions_takes_chain_path
tests/test_pitr_edge_cases.py::TestCatalogBasedRestoreStrategy::test_extensionless_file_with_versions_takes_file_path
tests/test_pitr_edge_cases.py::TestCatalogBasedRestoreStrategy::test_file_with_extension_and_versions_takes_file_path
tests/test_pitr_edge_cases.py::TestRestoreTargetUnsafeReason::test_var_tmp_is_allowed
tests/test_pitr_edge_cases.py::TestRestoreTargetUnsafeReason::test_home_subdir_is_allowed
tests/test_pitr_edge_cases.py::TestRestoreTargetUnsafeReason::test_tmp_subdir_is_allowed
tests/test_pitr_edge_cases.py::TestRestoreTargetUnsafeReason::test_root_is_blocked
tests/test_pitr_edge_cases.py::TestRestoreTargetUnsafeReason::test_etc_is_blocked
tests/test_pitr_edge_cases.py::TestRestoreTargetUnsafeReason::test_subdir_of_protected_is_blocked
tests/test_pitr_edge_cases.py::TestRestoreTargetUnsafeReason::test_dot_dot_traversal_under_home_into_etc
tests/test_pitr_edge_cases.py::TestRestoreTargetUnsafeReason::test_dot_dot_traversal_staying_in_home
tests/test_pitr_edge_cases.py::TestRestoreTargetUnsafeReason::test_var_is_blocked_but_var_tmp_is_not
tests/test_pitr_edge_cases.py::TestNormalizeWhenDt::test_naive_datetime_passes_through
tests/test_pitr_edge_cases.py::TestNormalizeWhenDt::test_timezone_aware_is_converted_to_naive_local
tests/test_pitr_edge_cases.py::TestNormalizeWhenDt::test_utc_offset_is_applied
tests/test_pitr_edge_cases.py::TestParseWhen::test_valid_date_string
tests/test_pitr_edge_cases.py::TestParseWhen::test_invalid_date_string_returns_none
tests/test_pitr_edge_cases.py::TestParseWhen::test_returns_naive_datetime
tests/test_pitr_edge_cases.py::TestCoerceTimeout::test_none_returns_none
tests/test_pitr_edge_cases.py::TestCoerceTimeout::test_positive_int_passes_through
tests/test_pitr_edge_cases.py::TestCoerceTimeout::test_zero_returns_none
tests/test_pitr_edge_cases.py::TestCoerceTimeout::test_negative_returns_none
tests/test_pitr_edge_cases.py::TestCoerceTimeout::test_bool_true_returns_none
tests/test_pitr_edge_cases.py::TestCoerceTimeout::test_bool_false_returns_none
tests/test_pitr_edge_cases.py::TestCoerceTimeout::test_string_number_is_coerced
tests/test_pitr_edge_cases.py::TestCoerceTimeout::test_string_negative_returns_none
tests/test_pitr_edge_cases.py::TestCoerceTimeout::test_string_non_numeric_returns_none
tests/test_pitr_edge_cases.py::TestParseArchiveMap::test_header_only_returns_empty
tests/test_pitr_edge_cases.py::TestParseArchiveMap::test_spaces_in_directory_path
tests/test_pitr_edge_cases.py::TestParseArchiveMap::test_standard_output_parsed
tests/test_pitr_edge_cases.py::TestParseArchiveMap::test_empty_output
tests/test_pitr_edge_cases.py::TestParseArchiveMap::test_non_numeric_first_field_skipped
tests/test_pitr_edge_cases.py::TestRestoreWithDarFileBreakBehavior::test_file_restore_fails_fast_on_missing_archive_map_entry
tests/test_pitr_edge_cases.py::TestRestoreWithDarFileBreakBehavior::test_file_restore_fails_fast_on_missing_slice
tests/test_pitr_edge_cases.py::TestRestoreWithDarMixedPaths::test_mixed_dir_and_file_restore
tests/test_pitr_edge_cases.py::TestRestoreWithDarDarrc::test_darrc_path_included_in_dar_command
tests/test_pitr_edge_cases.py::TestRestoreWithDarDarrc::test_no_darrc_means_no_B_flag
tests/test_pitr_edge_cases.py::TestRestoreAtPathNormalization::test_leading_slash_stripped_for_exists_check
tests/test_pitr_edge_cases.py::TestRestoreAtPathNormalization::test_dot_path_skipped_in_exists_check
tests/test_pitr_edge_cases.py::TestRestoreAtPathNormalization::test_existing_target_path_aborts
tests/test_pitr_integration.py::test_pitr_integration_flow
tests/test_pitr_integration.py::test_pitr_integration_tree_structure
tests/test_pitr_integration.py::test_pitr_integration_torture_chain
tests/test_pitr_integration.py::test_pitr_integration_rename_mtime_torture
tests/test_pitr_integration.py::test_pitr_rebuild_catalog_after_loss
tests/test_pitr_integration.py::test_pitr_full_diff_incr_add_delete_mutate
tests/test_pitr_integration.py::test_pitr_multislice_archive
tests/test_pitr_integration.py::test_pitr_symlinks_and_hardlinks
tests/test_pitr_integration.py::test_pitr_special_char_filenames
tests/test_pitr_integration.py::test_pitr_multiple_full_archives_boundary
tests/test_pitr_integration.py::test_pitr_detect_directory_via_catalog_fallback
tests/test_pitr_integration.py::test_pitr_after_archive_path_relocation
tests/test_pitr_integration.py::test_pitr_report_and_pitr_report_first
tests/test_pitr_integration.py::test_pitr_when_before_any_archive
tests/test_pitr_integration.py::test_pitr_multipath_dir_and_file
tests/test_pitr_integration.py::test_pitr_file_single_version_full_only
tests/test_pitr_integration.py::test_pitr_two_backup_definitions_catalog_isolation
tests/test_pitr_integration.py::test_pitr_file_failfast_missing_diff_slice
tests/test_pitr_integration.py::test_pitr_timezone_aware_when
tests/test_postreq.py::test_postreq_success_runs_backup
tests/test_postreq.py::test_postreq_failure_aborts_backup
tests/test_preflight.py::test_preflight_passes_when_env_is_valid
tests/test_preflight.py::test_preflight_fails_when_backup_definition_missing
tests/test_preflight.py::test_preflight_fails_when_directories_missing
tests/test_prereq.py::test_prereq_success_runs_backup
tests/test_prereq.py::test_prereq_failure_aborts_backup
tests/test_readme_changelog.py::test_help_options_success[--readme]
tests/test_readme_changelog.py::test_help_options_success[--readme-pretty]
tests/test_readme_changelog.py::test_help_options_success[--changelog]
tests/test_readme_changelog.py::test_help_options_success[--changelog-pretty]
tests/test_readme_changelog.py::test_readme_missing[--readme]
tests/test_readme_changelog.py::test_readme_missing[--readme-pretty]
tests/test_readme_changelog.py::test_changelog_missing[--changelog]
tests/test_readme_changelog.py::test_changelog_missing[--changelog-pretty]
tests/test_readme_changelog.py::test_plain_output_contains_headers[--readme]
tests/test_readme_changelog.py::test_plain_output_contains_headers[--changelog]
tests/test_real_manager_and_generic_backup.py::test_generic_backup_creates_archive_and_updates_catalog
tests/test_real_manager_and_generic_backup.py::test_generic_backup_dar_stats_come_from_real_dar_output
tests/test_real_manager_and_generic_backup.py::test_manager_add_specific_archive_registers_in_catalog
tests/test_real_manager_and_generic_backup.py::test_manager_add_dir_populates_catalog
tests/test_real_manager_and_generic_backup.py::test_manager_list_catalogs_shows_real_archive
tests/test_real_manager_and_generic_backup.py::test_manager_find_file_locates_real_file
tests/test_real_manager_and_generic_backup.py::test_manager_list_archive_contents_shows_files
tests/test_real_manager_and_generic_backup.py::test_verify_raises_when_restore_dir_is_blocked
tests/test_real_manager_and_generic_backup.py::test_dar_backup_alternate_reference_missing_exits_nonzero
tests/test_real_manager_and_generic_backup.py::test_metrics_db_row_written_after_real_backup
tests/test_real_pitr_and_pipeline.py::test_pitr_restore_file_selects_archive_before_when
tests/test_real_pitr_and_pipeline.py::test_pitr_restore_directory_applies_full_then_diff_chain
tests/test_real_pitr_and_pipeline.py::test_pitr_report_first_aborts_when_archive_slice_missing
tests/test_real_pitr_and_pipeline.py::test_pitr_report_first_restores_after_successful_report
tests/test_real_pitr_and_pipeline.py::test_full_backup_verify_runs_before_par2_and_both_complete
tests/test_real_pitr_and_pipeline.py::test_full_backup_succeeds_when_metrics_db_is_unwritable
tests/test_real_pitr_and_pipeline.py::test_restore_cleans_test_restore_dir_before_restoring
tests/test_real_pitr_and_pipeline.py::test_list_contents_does_not_clean_test_restore_dir
tests/test_real_pitr_and_pipeline.py::test_manager_alternate_archive_dir_redirects_catalog_and_slices
tests/test_real_pitr_and_pipeline.py::test_cleanup_rejects_unsafe_archive_name_and_exits_cleanly
tests/test_real_verify_and_backup.py::test_verify_detects_real_file_corruption
tests/test_real_verify_and_backup.py::test_full_backup_pipeline_runs_verify
tests/test_real_verify_and_backup.py::test_verify_replaces_stale_restore_file
tests/test_real_verify_and_backup.py::test_get_backed_up_files_lists_real_archive_contents
tests/test_real_verify_and_backup.py::test_par2_verify_detects_corrupt_dar_slice
tests/test_real_verify_and_backup.py::test_list_contents_shows_real_archive_files
tests/test_real_verify_and_backup.py::test_list_contents_raises_for_nonexistent_archive
tests/test_real_verify_and_backup.py::test_backup_with_unreadable_files_exits_zero
tests/test_real_verify_and_backup.py::test_catalog_add_fails_when_db_is_readonly
tests/test_real_verify_and_backup.py::test_verify_raises_on_corrupt_archive
tests/test_relocate_archive_paths.py::test_relocate_dry_run_does_not_change_catalog
tests/test_relocate_archive_paths.py::test_relocate_rewrites_catalog_paths
tests/test_restore.py::test_restoredir_requires_value
tests/test_restore.py::test_restore_requires_value
tests/test_restore.py::test_restore_with_restoredir
tests/test_restore.py::test_restore_validatation
tests/test_restore_content_verification.py::test_restore_content_matches_source
tests/test_restore_content_verification.py::test_corrupt_restore_detected
tests/test_restore_content_verification.py::test_metadata_mismatch_detected
tests/test_restore_test_samples.py::test_ensure_metrics_db_creates_restore_test_tables
tests/test_restore_test_samples.py::test_ensure_metrics_db_seeds_all_fail_reasons
tests/test_restore_test_samples.py::test_ensure_metrics_db_seeds_are_idempotent
tests/test_restore_test_samples.py::test_write_restore_test_samples_pass_row
tests/test_restore_test_samples.py::test_write_restore_test_samples_fail_content_mismatch
tests/test_restore_test_samples.py::test_write_restore_test_samples_fail_metadata_mismatch_with_detail
tests/test_restore_test_samples.py::test_write_restore_test_samples_skip_source_missing
tests/test_restore_test_samples.py::test_write_restore_test_samples_multiple_rows_one_commit
tests/test_restore_test_samples.py::test_write_restore_test_samples_noop_when_no_db_path
tests/test_restore_test_samples.py::test_write_restore_test_samples_noop_when_samples_empty
tests/test_restore_test_samples.py::test_parse_size_bytes_mio
tests/test_restore_test_samples.py::test_parse_size_bytes_kio
tests/test_restore_test_samples.py::test_parse_size_bytes_gio
tests/test_restore_test_samples.py::test_parse_size_bytes_o
tests/test_restore_test_samples.py::test_parse_size_bytes_unknown_unit_returns_none
tests/test_restore_test_samples.py::test_parse_size_bytes_empty_returns_none
tests/test_restore_test_samples.py::test_parse_size_bytes_none_returns_none
tests/test_restoretest_exclude_integration.py::test_restoretest_exclude_prefixes_and_suffixes_end_to_end
tests/test_restoretest_exclude_integration.py::test_restoretest_exclude_regex_end_to_end
tests/test_restoretest_exclude_integration.py::test_restoretest_exclude_all_candidates_backup_still_succeeds
tests/test_run_command.py::test_stdout_1MB
tests/test_run_command.py::test_command_not_found
tests/test_run_command.py::test_check_flag_logs_error
tests/test_run_command.py::test_capture_output_false
tests/test_run_command.py::test_logger_fallback
tests/test_run_command.py::test_timeout_handling
tests/test_run_command.py::test_binary_output_mode
tests/test_sanity_checks.py::test_env_vars_in_config_file
tests/test_sanity_checks.py::test_tilde_in_config_file
tests/test_sanity_checks.py::test_clean_log_missing_logfile_location_key
tests/test_sanity_checks.py::test_clean_log_invalid_backup_dir_path
tests/test_sanity_checks.py::test_clean_log_missing_directories_section
tests/test_sanity_checks.py::test_config_parsing_missing_misc_section
tests/test_sanity_checks.py::test_dar_backup_definition_with_underscore
tests/test_sanity_checks.py::test_dar_backup_nonexistent_definition_
tests/test_sanity_checks.py::test_dar_backup_nonexistent_config_file
tests/test_sanity_checks.py::test_skip_cache_directories
tests/test_sanity_checks.py::test_validate_xml_parser
tests/test_sanity_checks.py::test_duplicate_full_backup_fails
tests/test_sanity_checks.py::test_script_shows_version[dar_backup.py-src/dar_backup/dar_backup.py]
tests/test_sanity_checks.py::test_script_shows_version[manager.py-src/dar_backup/manager.py]
tests/test_sanity_checks.py::test_script_shows_version[cleanup.py-src/dar_backup/cleanup.py]
tests/test_sanity_checks.py::test_print_aligned_settings_trimming_and_logging
tests/test_sanity_checks.py::test_logfile_rotation_and_content_integrity
tests/test_silent_dar_failure.py::test_successful_backup_records_success_in_metrics
tests/test_silent_dar_failure.py::test_dar_exits_zero_but_no_slices_records_failure
tests/test_silent_dar_failure.py::test_dar_stalls_mid_run_then_exits_zero_records_failure
tests/test_silent_dar_failure.py::test_keyboard_interrupt_during_backup_records_failure
tests/test_silent_dar_failure.py::test_sigterm_during_backup_records_failure
tests/test_silent_dar_failure.py::test_signal_during_restore_logs_error[2-SIGINT]
tests/test_silent_dar_failure.py::test_signal_during_restore_logs_error[15-SIGTERM]
tests/test_silent_dar_failure.py::test_signal_during_verify_logs_error[2-SIGINT]
tests/test_silent_dar_failure.py::test_signal_during_verify_logs_error[15-SIGTERM]
tests/test_space_definition.py::test_backup_definition_with_space
tests/test_startup_cleanup.py::test_clean_restore_test_directory_removes_files
tests/test_startup_cleanup.py::test_clean_restore_test_directory_skips_critical_paths
tests/test_startup_cleanup.py::test_clean_restore_test_directory_skips_home
tests/test_startup_cleanup.py::test_clean_restore_test_directory_skips_symlinked_critical_path
tests/test_startup_cleanup.py::test_clean_restore_test_directory_allows_subdirectory_of_critical
tests/test_startup_cleanup.py::test_clean_restore_test_directory_handles_errors
tests/test_startup_cleanup.py::test_main_cleans_restore_dir_for_default_restore
tests/test_startup_cleanup.py::test_main_skips_clean_for_list_contents
tests/test_status_indicators.py::test_show_log_driven_bar_updates_progress
tests/test_status_indicators.py::test_is_terminal_uses_console_flag
tests/test_status_indicators.py::test_get_green_shade_bounds
tests/test_status_indicators.py::test_show_log_driven_bar_skips_when_not_terminal
tests/test_status_indicators.py::test_tail_log_file_yields_after_marker
tests/test_status_indicators.py::test_tail_log_file_missing_path_stops
tests/test_status_indicators.py::test_tail_log_file_logs_read_error
tests/test_stress.py::test_backup_with_many_small_files
tests/test_systemd_unit_generation.py::TestDarBackupUnitGenerator::test_build_exec_command_with_dar
tests/test_systemd_unit_generation.py::TestDarBackupUnitGenerator::test_build_exec_command_without_dar
tests/test_systemd_unit_generation.py::TestDarBackupUnitGenerator::test_generate_cleanup_service
tests/test_systemd_unit_generation.py::TestDarBackupUnitGenerator::test_generate_service
tests/test_systemd_unit_generation.py::TestDarBackupUnitGenerator::test_generate_timer
tests/test_systemd_unit_generation.py::TestDarBackupUnitGenerator::test_write_unit_file
tests/test_systemd_unit_generation.py::test_write_unit_files_triggers_enable_and_start
tests/test_systemd_unit_generation.py::test_enable_and_start_unit_runs_systemctl
tests/test_systemd_unit_generation.py::test_write_unit_files_no_install_writes_to_cwd
tests/test_systemd_unit_generation.py::test_main_passes_args_to_write_unit_files
tests/test_systemd_unit_generation.py::test_check_locale_no_output_when_lang_correct
tests/test_systemd_unit_generation.py::test_check_locale_warns_when_lang_wrong
tests/test_systemd_unit_generation.py::test_generate_service_contains_lang_env
tests/test_systemd_unit_generation.py::test_generate_cleanup_service_contains_lang_env
tests/test_trace_logging.py::test_trace_logging_captures_all_levels_and_commands
tests/test_trace_logging.py::test_trace_log_rotation
tests/test_util.py::test_setup_logging_creates_file_and_logger
tests/test_util.py::test_setup_logging_stdout_and_file
tests/test_util.py::test_setup_logging_falls_back_on_handler_failure
tests/test_util.py::test_list_backups_ignores_files
tests/test_util.py::test_get_invocation_command_line_positive
tests/test_util.py::test_get_invocation_command_line_negative
tests/test_util.py::test_get_invocation_command_line_empty
tests/test_util.py::test_default_completer_logfile_without_getuid
tests/test_util.py::test_setup_completer_logger_fallbacks_to_nullhandler
tests/test_util.py::test_is_under_base_dir_positive
tests/test_util.py::test_is_under_base_dir_outside
tests/test_util.py::test_is_under_base_dir_symlink_escape
tests/test_util.py::test_safe_remove_file_deletes_valid
tests/test_util.py::test_safe_remove_file_refuses_outside_base
tests/test_util.py::test_safe_remove_file_refuses_bad_name
tests/test_util.py::test_safe_remove_file_refuses_symlink
tests/test_util.py::test_safe_remove_file_refuses_non_file
tests/test_util.py::test_is_archive_name_allowed_positive
tests/test_util.py::test_is_archive_name_allowed_negative
tests/test_util.py::test_is_under_base_dir_nested_positive
tests/test_util.py::test_is_archive_name_allowed_rejects_separators
tests/test_util.py::test_extract_backup_definition_fallback_dash_d
tests/test_util.py::test_extract_backup_definition_fallback_long_flag
tests/test_util.py::test_extract_backup_definition_fallback_equals
tests/test_util.py::test_split_archive_list_prefix_empty
tests/test_util.py::test_split_archive_list_prefix_single
tests/test_util.py::test_split_archive_list_prefix_strips_spaces
tests/test_util.py::test_list_archive_completer_handles_list_with_spaces
tests/test_util.py::test_list_archive_completer_cleanup_without_specific_archives
tests/test_util.py::test_send_discord_message_returns_false_without_webhook
tests/test_util.py::test_send_discord_message_http_error_logs_and_returns_false
tests/test_util.py::test_send_discord_message_unexpected_error_logs_and_returns_false
tests/test_util.py::test_add_specific_archive_completer_filters_existing_db_entries
tests/test_util.py::test_list_backups_no_backups
tests/test_util.py::test_is_safe_path_requires_absolute
tests/test_util.py::test_print_debug_includes_filename_and_repr
tests/test_util.py::test_show_scriptname_uses_sys_argv
tests/test_util.py::test_show_scriptname_returns_unknown_on_error
tests/test_util.py::test_patch_config_file_replaces_only_matching_keys
tests/test_util.py::test_patch_config_file_unwritable_directory_leaves_original_intact
tests/test_util.py::test_normalize_dir_strips_trailing_separator
tests/test_util.py::test_requirements_success_runs_real_command
tests/test_util.py::test_requirements_failure_raises_on_nonzero_exit
tests/test_util.py::test_requirements_timeout_kills_hanging_script
tests/test_util.py::test_extract_version_parses_full_semver
tests/test_util.py::test_extract_version_parses_two_part_version
tests/test_util.py::test_extract_version_returns_unknown_when_no_digits
tests/test_util.py::test_extract_version_returns_unknown_for_empty_string
tests/test_util.py::test_sort_key_standard_archive_returns_correct_tuple
tests/test_util.py::test_sort_key_definition_name_with_underscore
tests/test_util.py::test_sort_key_sorts_archives_by_definition_then_date
tests/test_util.py::test_sort_key_fewer_than_three_underscore_parts_returns_fallback
tests/test_util.py::test_sort_key_invalid_date_string_returns_fallback
tests/test_util.py::TestParseDarStats::test_empty_string_returns_all_none
tests/test_util.py::TestParseDarStats::test_none_like_empty_string_returns_all_none
tests/test_util.py::TestParseDarStats::test_garbage_output_returns_all_none
tests/test_util.py::TestParseDarStats::test_partial_output_parses_available_fields
tests/test_util.py::TestParseDarStats::test_full_dar_output_parses_correctly
tests/test_util.py::TestParseDarStats::test_returns_dict_with_all_expected_keys
tests/test_util.py::TestWriteMetricsRowGraceful::test_all_null_inode_stats_writes_row_without_error
tests/test_util.py::TestWriteMetricsRowGraceful::test_db_write_error_does_not_raise
tests/test_util.py::test_list_backups_malformed_date_does_not_crash
tests/test_util.py::test_list_backups_getsize_oserror_does_not_crash
tests/test_util.py::test_compare_metadata_permissions_mismatch_detected
tests/test_util.py::test_compare_metadata_mtime_mismatch_detected
tests/test_util.py::test_compare_metadata_uid_gid_not_checked_by_default
tests/test_util.py::test_compare_metadata_uid_gid_checked_when_ownership_preserved
tests/test_util.py::test_compare_metadata_uid_gid_match_no_false_positive
tests/test_util.py::test_compare_metadata_all_match_returns_empty
tests/test_util.py::test_list_backups_formats_sizes_correctly
tests/test_util.py::test_list_backups_does_not_corrupt_process_locale
tests/test_util_completers.py::test_expand_path
tests/test_util_completers.py::test_default_completer_logfile_includes_uid
tests/test_util_completers.py::test_setup_completer_logger_failure_does_not_raise
tests/test_util_completers.py::test_backup_definition_completer
tests/test_util_completers.py::test_list_archive_completer_with_definition
tests/test_util_completers.py::test_list_archive_completer_all_archives
tests/test_util_completers.py::test_archive_content_completer_with_mocked_db
tests/test_util_completers.py::test_archive_content_completer_global_prefix_match
tests/test_util_completers.py::test_archive_content_completer_sorting
tests/test_util_completers.py::test_add_specific_archive_completer_full_coverage
tests/test_verbose.py::test_verbose
tests/test_verbose.py::test_verbose_cleanup
tests/test_verbose.py::test_verbose_error_reporting
tests/test_verify_cleanup.py::test_verify_removes_existing_file_before_restore
tests/test_verify_metrics_isolation.py::test_verify_size_lookup_failure_does_not_break_backup
tests/test_verify_metrics_isolation.py::test_verify_parse_size_bytes_failure_does_not_break_backup
tests/test_verify_metrics_isolation.py::test_verify_samples_append_guard_does_not_drop_samples
tests/test_verify_metrics_isolation.py::test_verify_write_restore_test_samples_failure_does_not_break_backup
tests/test_xxe.py::test_python_version_is_safe_against_xxe
tests/test_xxe.py::test_doctype_stripper_removes_xxe_doctype
tests/test_xxe.py::test_iter_files_with_paths_from_xml_is_safe_against_xxe
tests/test_xxe.py::test_find_files_with_paths_is_safe_against_xxe
tests/test_zero_restoretest_candidates.py::test_zero_candidates_via_suffix_exclusion_backup_succeeds
tests/test_zero_restoretest_candidates.py::test_zero_candidates_via_size_window_backup_succeeds
tests/test_zero_restoretest_candidates.py::test_zero_candidates_log_contains_info_not_error
test_resolve_safe_path.py::TestResolveSafePathPositive::test_valid_file_is_accepted
test_resolve_safe_path.py::TestResolveSafePathPositive::test_returns_canonical_path
test_resolve_safe_path.py::TestResolveSafePathPositive::test_symlink_to_valid_file_is_accepted
test_resolve_safe_path.py::TestResolveSafePathPositive::test_blocked_path_error_is_value_error_subclass
test_resolve_safe_path.py::TestResolveSafePathPositive::test_label_appears_in_error_message
test_resolve_safe_path.py::TestResolveSafePathNotAFile::test_nonexistent_path_raises
test_resolve_safe_path.py::TestResolveSafePathNotAFile::test_directory_path_raises
test_resolve_safe_path.py::TestResolveSafePathNotAFile::test_named_pipe_raises
test_resolve_safe_path.py::TestResolveSafePathNotAFile::test_device_file_raises
test_resolve_safe_path.py::TestResolveSafePathBlockedDirs::test_blocked_system_paths_raise[/etc/passwd]
test_resolve_safe_path.py::TestResolveSafePathBlockedDirs::test_blocked_system_paths_raise[/etc/hostname]
test_resolve_safe_path.py::TestResolveSafePathBlockedDirs::test_blocked_system_paths_raise[/root/.bashrc]
test_resolve_safe_path.py::TestResolveSafePathBlockedDirs::test_blocked_system_paths_raise[/proc/version]
test_resolve_safe_path.py::TestResolveSafePathBlockedDirs::test_blocked_system_paths_raise[/sys/kernel/hostname]
test_resolve_safe_path.py::TestResolveSafePathBlockedDirs::test_blocked_system_paths_raise[/boot/grub/grub.cfg]
test_resolve_safe_path.py::TestResolveSafePathBlockedDirs::test_blocked_system_paths_raise[/run/utmp]
test_resolve_safe_path.py::TestResolveSafePathBlockedDirs::test_blocked_system_paths_raise[/usr/bin/env]
test_resolve_safe_path.py::TestResolveSafePathBlockedDirs::test_blocked_system_paths_raise[/bin/sh]
test_resolve_safe_path.py::TestResolveSafePathBlockedDirs::test_blocked_system_paths_raise[/sbin/init]
test_resolve_safe_path.py::TestResolveSafePathBlockedDirs::test_all_blocked_prefixes_are_covered
test_resolve_safe_path.py::TestResolveSafePathBlockedDirs::test_symlink_into_etc_is_blocked
test_resolve_safe_path.py::TestResolveSafePathBlockedDirs::test_dotdot_traversal_into_etc_is_blocked

1131/1133 tests collected (2 deselected) in 1.31s
