============================= test session starts ==============================
platform darwin -- Python 3.14.2, pytest-9.0.2, pluggy-1.6.0 -- /Users/atomasini/Development/GMailArchiver/.venv/bin/python3
cachedir: .pytest_cache
rootdir: /Users/atomasini/Development/GMailArchiver
configfile: pyproject.toml
testpaths: tests
plugins: anyio-4.12.0, asyncio-1.3.0, cov-7.0.0
asyncio: mode=Mode.AUTO, debug=False, asyncio_default_fixture_loop_scope=function, asyncio_default_test_loop_scope=function
collecting ... collected 2632 items

tests/cli/commands/test_archive_cmd.py::TestArchiveEntryPoint::test_archive_calls_asyncio_run PASSED [  0%]
tests/cli/commands/test_archive_cmd.py::TestRunArchive::test_run_archive_successful_flow PASSED [  0%]
tests/cli/commands/test_archive_cmd.py::TestRunArchive::test_run_archive_handles_value_error PASSED [  0%]
tests/cli/commands/test_archive_cmd.py::TestRunArchive::test_run_archive_handles_general_exception PASSED [  0%]
tests/cli/commands/test_archive_cmd.py::TestRunArchive::test_run_archive_dry_run_mode PASSED [  0%]
tests/cli/commands/test_archive_cmd.py::TestRunArchive::test_run_archive_interrupted PASSED [  0%]
tests/cli/commands/test_archive_cmd.py::TestRunArchive::test_run_archive_validation_failed PASSED [  0%]
tests/cli/commands/test_archive_cmd.py::TestRunArchive::test_run_archive_no_messages_found PASSED [  0%]
tests/cli/commands/test_archive_cmd.py::TestRunArchive::test_run_archive_no_new_messages PASSED [  0%]
tests/cli/commands/test_archive_cmd.py::TestRunArchive::test_run_archive_successful_with_verbose PASSED [  0%]
tests/cli/commands/test_archive_cmd.py::TestRunArchive::test_run_archive_with_deletion_after_archiving PASSED [  0%]
tests/cli/commands/test_archive_cmd.py::TestHandleDryRun::test_handle_dry_run_shows_preview PASSED [  0%]
tests/cli/commands/test_archive_cmd.py::TestHandleInterrupted::test_handle_interrupted_shows_progress_and_suggestions PASSED [  0%]
tests/cli/commands/test_archive_cmd.py::TestHandleValidationFailure::test_handle_validation_failure_without_verbose PASSED [  0%]
tests/cli/commands/test_archive_cmd.py::TestHandleValidationFailure::test_handle_validation_failure_with_verbose PASSED [  0%]
tests/cli/commands/test_archive_cmd.py::TestHandleNoNewMessages::test_handle_no_new_messages_already_archived PASSED [  0%]
tests/cli/commands/test_archive_cmd.py::TestHandleNoNewMessages::test_handle_no_new_messages_duplicates PASSED [  0%]
tests/cli/commands/test_archive_cmd.py::TestHandleNoNewMessages::test_handle_no_new_messages_mixed PASSED [  0%]
tests/cli/commands/test_archive_cmd.py::TestHandleNoNewMessages::test_handle_no_new_messages_offers_deletion_with_trash PASSED [  0%]
tests/cli/commands/test_archive_cmd.py::TestHandleNoNewMessages::test_handle_no_new_messages_offers_deletion_with_delete PASSED [  0%]
tests/cli/commands/test_archive_cmd.py::TestHandleNoNewMessages::test_handle_no_new_messages_deletion_cancelled PASSED [  0%]
tests/cli/commands/test_archive_cmd.py::TestHandleNoNewMessages::test_handle_no_new_messages_delete_wrong_confirmation PASSED [  0%]
tests/cli/commands/test_archive_cmd.py::TestHandleDeletion::test_handle_deletion_trash_confirmed PASSED [  0%]
tests/cli/commands/test_archive_cmd.py::TestHandleDeletion::test_handle_deletion_trash_cancelled PASSED [  0%]
tests/cli/commands/test_archive_cmd.py::TestHandleDeletion::test_handle_deletion_permanent_confirmed PASSED [  0%]
tests/cli/commands/test_archive_cmd.py::TestHandleDeletion::test_handle_deletion_permanent_wrong_phrase PASSED [  0%]
tests/cli/commands/test_archive_cmd.py::TestShowFinalSummary::test_show_final_summary_basic PASSED [  1%]
tests/cli/commands/test_archive_cmd.py::TestShowFinalSummary::test_show_final_summary_with_skipped PASSED [  1%]
tests/cli/commands/test_archive_cmd.py::TestShowFinalSummary::test_show_final_summary_with_custom_output_file PASSED [  1%]
tests/cli/commands/test_archive_widget_integration.py::TestArchiveCommandWidgetIntegration::test_show_final_summary_uses_report_card PASSED [  1%]
tests/cli/commands/test_archive_widget_integration.py::TestArchiveCommandWidgetIntegration::test_show_final_summary_card_contains_archived_count PASSED [  1%]
tests/cli/commands/test_archive_widget_integration.py::TestArchiveCommandWidgetIntegration::test_handle_dry_run_uses_report_card PASSED [  1%]
tests/cli/commands/test_archive_widget_integration.py::TestArchiveCommandWidgetIntegration::test_validation_failure_uses_error_panel PASSED [  1%]
tests/cli/commands/test_archive_widgets.py::TestArchiveSuccessShowsReportCard::test_archive_success_renders_report_card PASSED [  1%]
tests/cli/commands/test_archive_widgets.py::TestArchiveSuccessShowsReportCard::test_archive_success_report_card_title_contains_archive PASSED [  1%]
tests/cli/commands/test_archive_widgets.py::TestArchiveSuccessShowsReportCard::test_archive_success_report_card_shows_found_count_in_summary PASSED [  1%]
tests/cli/commands/test_archive_widgets.py::TestArchiveSuccessShowsReportCard::test_archive_success_report_card_hides_zero_counts PASSED [  1%]
tests/cli/commands/test_archive_widgets.py::TestArchiveDryRunShowsReportCard::test_archive_dry_run_shows_preview_report_card PASSED [  1%]
tests/cli/commands/test_archive_widgets.py::TestArchiveDryRunShowsReportCard::test_archive_dry_run_report_card_title_indicates_preview PASSED [  1%]
tests/cli/commands/test_archive_widgets.py::TestArchiveDryRunShowsReportCard::test_archive_dry_run_shows_all_filter_information PASSED [  1%]
tests/cli/commands/test_archive_widgets.py::TestArchiveValidationFailureShowsErrorPanel::test_archive_validation_failure_shows_error_panel PASSED [  1%]
tests/cli/commands/test_archive_widgets.py::TestArchiveValidationFailureShowsErrorPanel::test_archive_validation_error_panel_title_indicates_failure PASSED [  1%]
tests/cli/commands/test_archive_widgets.py::TestArchiveValidationFailureShowsErrorPanel::test_archive_validation_error_panel_includes_error_details PASSED [  1%]
tests/cli/commands/test_archive_widgets.py::TestArchiveValidationFailureShowsErrorPanel::test_archive_validation_error_panel_provides_next_steps PASSED [  1%]
tests/cli/commands/test_archive_widgets.py::TestArchiveValidationFailureShowsErrorPanel::test_archive_validation_error_panel_renders_with_output_manager PASSED [  1%]
tests/cli/commands/test_archive_widgets.py::TestArchiveShowsSuggestionList::test_archive_success_shows_suggestion_list PASSED [  1%]
tests/cli/commands/test_archive_widgets.py::TestArchiveShowsSuggestionList::test_archive_suggestion_list_empty_when_no_suggestions PASSED [  1%]
tests/cli/commands/test_archive_widgets.py::TestArchiveShowsSuggestionList::test_archive_suggestion_list_includes_conditional_suggestions PASSED [  1%]
tests/cli/commands/test_archive_widgets.py::TestArchiveShowsSuggestionList::test_archive_suggestion_list_renders_with_output_manager PASSED [  1%]
tests/cli/commands/test_archive_widgets.py::TestArchiveShowsSuggestionList::test_archive_suggestions_never_empty_after_successful_archive PASSED [  1%]
tests/cli/commands/test_archive_widgets.py::TestArchiveWidgetsJSONMode::test_archive_report_card_json_output PASSED [  1%]
tests/cli/commands/test_archive_widgets.py::TestArchiveWidgetsJSONMode::test_archive_error_panel_json_output PASSED [  1%]
tests/cli/commands/test_archive_widgets.py::TestArchiveWidgetsJSONMode::test_archive_suggestion_list_json_output PASSED [  2%]
tests/cli/commands/test_archive_widgets.py::TestArchiveWidgetsJSONMode::test_archive_json_mode_uses_widget_data_structures PASSED [  2%]
tests/cli/commands/test_archive_widgets.py::TestArchiveWidgetIntegration::test_archive_success_uses_report_card_and_suggestions PASSED [  2%]
tests/cli/commands/test_archive_widgets.py::TestArchiveWidgetIntegration::test_archive_failure_uses_error_panel PASSED [  2%]
tests/cli/commands/test_archive_widgets.py::TestArchiveWidgetIntegration::test_archive_interrupted_shows_progress_and_suggestions PASSED [  2%]
tests/cli/commands/test_archive_widgets.py::TestArchiveWidgetIntegration::test_archive_dry_run_shows_preview_report_with_no_suggestions PASSED [  2%]
tests/cli/commands/test_archive_widgets.py::TestArchiveWidgetBehavior::test_report_card_fluent_api_works PASSED [  2%]
tests/cli/commands/test_archive_widgets.py::TestArchiveWidgetBehavior::test_error_panel_fluent_api_works PASSED [  2%]
tests/cli/commands/test_archive_widgets.py::TestArchiveWidgetBehavior::test_suggestion_list_fluent_api_works PASSED [  2%]
tests/cli/commands/test_archive_widgets.py::TestArchiveWidgetBehavior::test_widgets_preserve_order PASSED [  2%]
tests/cli/commands/test_archive_widgets.py::TestArchiveWidgetBehavior::test_widgets_can_be_cleared_or_reset PASSED [  2%]
tests/cli/commands/test_archive_widgets.py::TestArchiveWidgetEdgeCases::test_archive_with_very_large_numbers PASSED [  2%]
tests/cli/commands/test_archive_widgets.py::TestArchiveWidgetEdgeCases::test_archive_with_special_characters_in_messages PASSED [  2%]
tests/cli/commands/test_archive_widgets.py::TestArchiveWidgetEdgeCases::test_error_panel_with_many_details PASSED [  2%]
tests/cli/commands/test_archive_widgets.py::TestArchiveWidgetEdgeCases::test_suggestion_list_with_long_suggestions PASSED [  2%]
tests/cli/commands/test_archive_widgets.py::TestArchiveWidgetEdgeCases::test_archive_with_zero_archived_messages PASSED [  2%]
tests/cli/commands/test_archive_widgets_integration.py::TestArchiveCommandUsesWidgets::test_successful_archive_calls_report_card_render PASSED [  2%]
tests/cli/commands/test_archive_widgets_integration.py::TestArchiveCommandUsesWidgets::test_dry_run_archive_calls_report_card_with_preview PASSED [  2%]
tests/cli/commands/test_archive_widgets_integration.py::TestArchiveCommandUsesWidgets::test_validation_failure_calls_error_panel PASSED [  2%]
tests/cli/commands/test_archive_widgets_integration.py::TestArchiveCommandUsesWidgets::test_success_archive_calls_suggestion_list PASSED [  2%]
tests/cli/commands/test_archive_widgets_integration.py::TestArchiveCommandUsesWidgets::test_interrupted_archive_shows_progress_report_and_suggestions PASSED [  2%]
tests/cli/commands/test_archive_widgets_integration.py::TestArchiveCommandUsesWidgets::test_no_new_messages_shows_info_and_deletion_suggestions PASSED [  2%]
tests/cli/commands/test_archive_widgets_integration.py::TestArchiveCommandRendersWidgets::test_report_card_render_method_is_called PASSED [  2%]
tests/cli/commands/test_archive_widgets_integration.py::TestArchiveCommandRendersWidgets::test_error_panel_render_method_is_called PASSED [  2%]
tests/cli/commands/test_archive_widgets_integration.py::TestArchiveCommandRendersWidgets::test_suggestion_list_render_method_is_called PASSED [  2%]
tests/cli/commands/test_archive_widgets_integration.py::TestArchiveCommandJSONModeWidgets::test_json_mode_uses_widget_to_dict PASSED [  2%]
tests/cli/commands/test_archive_widgets_integration.py::TestArchiveCommandJSONModeWidgets::test_json_mode_uses_widget_to_list PASSED [  3%]
tests/cli/commands/test_archive_widgets_integration.py::TestArchiveCommandJSONModeWidgets::test_json_mode_builds_json_from_widget_data PASSED [  3%]
tests/cli/commands/test_archive_widgets_integration.py::TestArchiveCommandPopulatesWidgetData::test_report_card_populated_with_archive_counts PASSED [  3%]
tests/cli/commands/test_archive_widgets_integration.py::TestArchiveCommandPopulatesWidgetData::test_report_card_populated_with_archive_file_path PASSED [  3%]
tests/cli/commands/test_archive_widgets_integration.py::TestArchiveCommandPopulatesWidgetData::test_error_panel_populated_with_validation_details PASSED [  3%]
tests/cli/commands/test_archive_widgets_integration.py::TestArchiveCommandPopulatesWidgetData::test_suggestion_list_populated_with_context_specific_suggestions PASSED [  3%]
tests/cli/commands/test_archive_widgets_integration.py::TestArchiveCommandConditionalWidgetContent::test_report_card_hides_skipped_when_zero PASSED [  3%]
tests/cli/commands/test_archive_widgets_integration.py::TestArchiveCommandConditionalWidgetContent::test_report_card_shows_skipped_when_nonzero PASSED [  3%]
tests/cli/commands/test_archive_widgets_integration.py::TestArchiveCommandConditionalWidgetContent::test_suggestion_list_includes_dedupe_only_when_duplicates_exist PASSED [  3%]
tests/cli/commands/test_archive_widgets_integration.py::TestArchiveCommandConditionalWidgetContent::test_error_panel_suggestion_based_on_error_type PASSED [  3%]
tests/cli/commands/test_archive_widgets_integration.py::TestArchiveCommandWidgetOutputFormats::test_rich_output_mode_uses_widget_render PASSED [  3%]
tests/cli/commands/test_archive_widgets_integration.py::TestArchiveCommandWidgetOutputFormats::test_json_output_mode_uses_widget_data_conversion PASSED [  3%]
tests/cli/commands/test_archive_widgets_integration.py::TestArchiveCommandWidgetOutputFormats::test_error_panel_structure_supports_json_serialization PASSED [  3%]
tests/cli/commands/test_doctor_cmd.py::TestDoctorCommandRegistration::test_command_is_registered PASSED [  3%]
tests/cli/commands/test_doctor_cmd.py::TestDoctorCommandRegistration::test_help_displays_usage PASSED [  3%]
tests/cli/commands/test_doctor_cmd.py::TestDoctorCommandRegistration::test_help_shows_verbose_option PASSED [  3%]
tests/cli/commands/test_doctor_cmd.py::TestDoctorCommandRegistration::test_help_shows_json_option PASSED [  3%]
tests/cli/commands/test_doctor_cmd.py::TestDoctorCommandExecution::test_command_without_database_runs PASSED [  3%]
tests/cli/commands/test_doctor_cmd.py::TestDoctorCommandExecution::test_accepts_verbose_flag PASSED [  3%]
tests/cli/commands/test_doctor_cmd.py::TestDoctorCommandExecution::test_accepts_json_flag PASSED [  3%]
tests/cli/commands/test_doctor_cmd.py::TestDoctorCommandJsonOutput::test_json_output_structure PASSED [  3%]
tests/cli/commands/test_doctor_cmd.py::TestDoctorCommandJsonOutput::test_json_checks_array_structure PASSED [  3%]
tests/cli/commands/test_doctor_cmd.py::TestDoctorCommandJsonOutput::test_json_severity_values PASSED [  3%]
tests/cli/commands/test_doctor_cmd.py::TestDoctorCommandJsonOutput::test_json_counts_are_integers PASSED [  3%]
tests/cli/commands/test_doctor_cmd.py::TestDoctorCommandJsonOutput::test_json_fixable_issues_is_list PASSED [  3%]
tests/cli/commands/test_doctor_cmd.py::TestDoctorCommandVerboseOutput::test_verbose_shows_check_details PASSED [  3%]
tests/cli/commands/test_doctor_cmd.py::TestDoctorCommandVerboseOutput::test_verbose_shows_fixable_categorization PASSED [  3%]
tests/cli/commands/test_doctor_cmd.py::TestDoctorCommandVerboseOutput::test_verbose_shows_more_than_normal PASSED [  4%]
tests/cli/commands/test_doctor_cmd.py::TestDoctorCommandVerboseOutput::test_verbose_includes_details_field PASSED [  4%]
tests/cli/commands/test_doctor_cmd.py::TestDoctorCommandRichOutput::test_shows_validation_panels PASSED [  4%]
tests/cli/commands/test_doctor_cmd.py::TestDoctorCommandRichOutput::test_shows_summary_card PASSED [  4%]
tests/cli/commands/test_doctor_cmd.py::TestDoctorCommandRichOutput::test_shows_suggestions_when_issues_found PASSED [  4%]
tests/cli/commands/test_doctor_cmd.py::TestDoctorCommandExitCodes::test_exit_code_zero_when_all_ok PASSED [  4%]
tests/cli/commands/test_doctor_cmd.py::TestDoctorCommandExitCodes::test_exit_code_nonzero_when_errors PASSED [  4%]
tests/cli/commands/test_doctor_cmd.py::TestDoctorCommandContext::test_uses_command_context_decorator PASSED [  4%]
tests/cli/commands/test_doctor_cmd.py::TestDoctorCommandContext::test_requires_storage_is_enforced PASSED [  4%]
tests/cli/commands/test_schedule_cmd.py::TestScheduleAddCommand::test_add_daily_schedule PASSED [  4%]
tests/cli/commands/test_schedule_cmd.py::TestScheduleAddCommand::test_add_weekly_schedule PASSED [  4%]
tests/cli/commands/test_schedule_cmd.py::TestScheduleAddCommand::test_add_monthly_schedule PASSED [  4%]
tests/cli/commands/test_schedule_cmd.py::TestScheduleAddCommand::test_add_with_json_output PASSED [  4%]
tests/cli/commands/test_schedule_cmd.py::TestScheduleListCommand::test_list_schedules_empty PASSED [  4%]
tests/cli/commands/test_schedule_cmd.py::TestScheduleListCommand::test_list_enabled_only PASSED [  4%]
tests/cli/commands/test_schedule_cmd.py::TestScheduleListCommand::test_list_with_json_output PASSED [  4%]
tests/cli/commands/test_schedule_cmd.py::TestScheduleRemoveCommand::test_remove_schedule PASSED [  4%]
tests/cli/commands/test_schedule_cmd.py::TestScheduleRemoveCommand::test_remove_with_json_output PASSED [  4%]
tests/cli/commands/test_schedule_cmd.py::TestScheduleEnableCommand::test_enable_schedule PASSED [  4%]
tests/cli/commands/test_schedule_cmd.py::TestScheduleEnableCommand::test_enable_with_json_output PASSED [  4%]
tests/cli/commands/test_schedule_cmd.py::TestScheduleDisableCommand::test_disable_schedule PASSED [  4%]
tests/cli/commands/test_schedule_cmd.py::TestScheduleDisableCommand::test_disable_with_json_output PASSED [  4%]
tests/cli/commands/test_status_cmd.py::TestRunStatus::test_run_status_requires_storage PASSED [  4%]
tests/cli/commands/test_status_cmd.py::TestRunStatus::test_run_status_calls_workflow PASSED [  4%]
tests/cli/commands/test_status_cmd.py::TestRunStatus::test_run_status_json_output_mode PASSED [  4%]
tests/cli/commands/test_status_cmd.py::TestRunStatus::test_run_status_shows_report_card PASSED [  4%]
tests/cli/commands/test_status_cmd.py::TestRunStatus::test_run_status_handles_exception PASSED [  5%]
tests/cli/commands/test_status_cmd.py::TestRunStatus::test_run_status_shows_recent_runs_table PASSED [  5%]
tests/cli/commands/test_status_cmd.py::TestRunStatus::test_run_status_no_recent_runs PASSED [  5%]
tests/cli/commands/test_status_cmd.py::TestDisplayRecentRunsTable::test_display_recent_runs_table_creates_widget PASSED [  5%]
tests/cli/commands/test_status_cmd.py::TestDisplayRecentRunsTable::test_display_recent_runs_table_non_verbose PASSED [  5%]
tests/cli/commands/test_status_cmd.py::TestDisplayRecentRunsTable::test_display_recent_runs_table_verbose PASSED [  5%]
tests/cli/commands/test_status_cmd.py::TestDisplayRecentRunsTable::test_display_recent_runs_table_columns_non_verbose PASSED [  5%]
tests/cli/commands/test_status_cmd.py::TestDisplayRecentRunsTable::test_display_recent_runs_table_columns_verbose PASSED [  5%]
tests/cli/commands/test_status_cmd.py::TestDisplayRecentRunsTable::test_display_recent_runs_table_truncates_timestamp PASSED [  5%]
tests/cli/commands/test_status_cmd.py::TestDisplayRecentRunsTable::test_display_recent_runs_table_query_truncation_verbose PASSED [  5%]
tests/cli/commands/test_status_cmd.py::TestDisplayRecentRunsTable::test_display_recent_runs_table_empty_runs PASSED [  5%]
tests/cli/commands/test_status_cmd.py::TestDisplayRecentRunsTable::test_display_recent_runs_table_missing_fields PASSED [  5%]
tests/cli/commands/test_status_cmd.py::TestDisplayRecentRunsTable::test_display_recent_runs_table_title_reflects_count PASSED [  5%]
tests/cli/commands/test_status_cmd.py::TestStatusCommandIntegration::test_status_workflow_called_with_correct_config PASSED [  5%]
tests/cli/commands/test_validate_cmd.py::TestValidateCommand::test_validate_archive_not_found PASSED [  5%]
tests/cli/commands/test_validate_cmd.py::TestValidateCommand::test_validate_database_not_found PASSED [  5%]
tests/cli/commands/test_validate_cmd.py::TestValidateCommand::test_validate_success_with_mock PASSED [  5%]
tests/cli/commands/test_validate_cmd.py::TestValidateCommand::test_validate_failure_database_check PASSED [  5%]
tests/cli/commands/test_validate_cmd.py::TestValidateCommand::test_validate_failure_integrity_check PASSED [  5%]
tests/cli/commands/test_validate_cmd.py::TestValidateCommand::test_validate_failure_count_check PASSED [  5%]
tests/cli/commands/test_validate_cmd.py::TestValidateCommand::test_validate_verbose_mode PASSED [  5%]
tests/cli/commands/test_validate_cmd.py::TestValidateCommand::test_validate_json_output PASSED [  5%]
tests/cli/commands/test_validate_cmd.py::TestValidateCommand::test_validate_workflow_file_not_found_exception PASSED [  5%]
tests/cli/commands/test_validate_cmd.py::TestValidateCommand::test_validate_workflow_generic_exception PASSED [  5%]
tests/cli/commands/test_validate_cmd.py::TestValidateCommand::test_validate_multiple_failure_types PASSED [  5%]
tests/cli/commands/test_validate_cmd.py::TestValidateCommand::test_validate_spot_check_failure PASSED [  5%]
tests/cli/commands/test_validate_cmd.py::TestValidateCommand::test_validate_runs_with_verbose_flag PASSED [  6%]
tests/cli/commands/test_validate_cmd.py::TestValidateCommand::test_validate_failure_always_shows_report PASSED [  6%]
tests/cli/commands/test_verify_cmd.py::TestVerifyIntegrityCommand::test_verify_integrity_success PASSED [  6%]
tests/cli/commands/test_verify_cmd.py::TestVerifyIntegrityCommand::test_verify_integrity_database_not_found PASSED [  6%]
tests/cli/commands/test_verify_cmd.py::TestVerifyIntegrityCommand::test_verify_integrity_json_output PASSED [  6%]
tests/cli/commands/test_verify_cmd.py::TestVerifyConsistencyCommand::test_verify_consistency_success PASSED [  6%]
tests/cli/commands/test_verify_cmd.py::TestVerifyConsistencyCommand::test_verify_consistency_database_not_found PASSED [  6%]
tests/cli/commands/test_verify_cmd.py::TestVerifyConsistencyCommand::test_verify_consistency_json_output PASSED [  6%]
tests/cli/commands/test_verify_cmd.py::TestVerifyOffsetsCommand::test_verify_offsets_success PASSED [  6%]
tests/cli/commands/test_verify_cmd.py::TestVerifyOffsetsCommand::test_verify_offsets_database_not_found PASSED [  6%]
tests/cli/commands/test_verify_cmd.py::TestVerifyOffsetsCommand::test_verify_offsets_json_output PASSED [  6%]
tests/cli/test_command_context.py::TestCommandContext::test_creation PASSED [  6%]
tests/cli/test_command_context.py::TestCommandContext::test_creation_with_all_options PASSED [  6%]
tests/cli/test_command_context.py::TestCommandContext::test_info_delegates_to_output PASSED [  6%]
tests/cli/test_command_context.py::TestCommandContext::test_warning_delegates_to_output PASSED [  6%]
tests/cli/test_command_context.py::TestCommandContext::test_success_delegates_to_output PASSED [  6%]
tests/cli/test_command_context.py::TestCommandContext::test_error_delegates_to_output PASSED [  6%]
tests/cli/test_command_context.py::TestCommandContext::test_show_report_delegates_to_output PASSED [  6%]
tests/cli/test_command_context.py::TestCommandContext::test_show_table_delegates_to_output PASSED [  6%]
tests/cli/test_command_context.py::TestCommandContext::test_suggest_next_steps_delegates_to_output PASSED [  6%]
tests/cli/test_command_context.py::TestCommandContext::test_fail_and_exit_raises_typer_exit PASSED [  6%]
tests/cli/test_command_context.py::TestCommandContext::test_fail_and_exit_with_suggestion PASSED [  6%]
tests/cli/test_command_context.py::TestStaticOperationHandle::test_log_info PASSED [  6%]
tests/cli/test_command_context.py::TestStaticOperationHandle::test_log_warning PASSED [  6%]
tests/cli/test_command_context.py::TestStaticOperationHandle::test_log_error PASSED [  6%]
tests/cli/test_command_context.py::TestStaticOperationHandle::test_log_success PASSED [  6%]
tests/cli/test_command_context.py::TestStaticOperationHandle::test_update_progress_with_task PASSED [  6%]
tests/cli/test_command_context.py::TestStaticOperationHandle::test_set_status PASSED [  7%]
tests/cli/test_command_context.py::TestStaticOperationHandle::test_set_total_creates_task PASSED [  7%]
tests/cli/test_command_context.py::TestStaticOperationHandle::test_succeed PASSED [  7%]
tests/cli/test_command_context.py::TestStaticOperationHandle::test_fail PASSED [  7%]
tests/cli/test_command_context.py::TestWithContextDecorator::test_basic_decorator PASSED [  7%]
tests/cli/test_command_context.py::TestWithContextDecorator::test_json_output_option PASSED [  7%]
tests/cli/test_command_context.py::TestWithContextDecorator::test_dry_run_option PASSED [  7%]
tests/cli/test_command_context.py::TestWithContextDecorator::test_requires_db_missing_file PASSED [  7%]
tests/cli/test_command_context.py::TestWithContextDecorator::test_requires_db_success PASSED [  7%]
tests/cli/test_command_context.py::TestWithContextDecorator::test_requires_schema_version_check PASSED [  7%]
tests/cli/test_command_context.py::TestWithContextDecorator::test_requires_gmail_success PASSED [  7%]
tests/cli/test_command_context.py::TestWithContextDecorator::test_requires_gmail_auth_failure PASSED [  7%]
tests/cli/test_command_context.py::TestWithContextDecorator::test_keyboard_interrupt_handling PASSED [  7%]
tests/cli/test_command_context.py::TestWithContextDecorator::test_unexpected_exception_handling PASSED [  7%]
tests/cli/test_command_context.py::TestWithContextDecorator::test_db_cleanup_on_success PASSED [  7%]
tests/cli/test_command_context.py::TestWithContextDecorator::test_db_cleanup_on_exception PASSED [  7%]
tests/cli/test_command_context.py::TestWithContextDecorator::test_preserves_function_metadata PASSED [  7%]
tests/cli/test_command_context.py::TestWithContextDecorator::test_passes_additional_args PASSED [  7%]
tests/cli/test_command_context.py::TestWithContextDecorator::test_passes_additional_kwargs PASSED [  7%]
tests/cli/test_command_context.py::TestCommandContextOperationContextManager::test_operation_with_static_context PASSED [  7%]
tests/cli/test_command_context.py::TestCommandContextOperationContextManager::test_operation_with_live_context PASSED [  7%]
tests/cli/test_command_context.py::TestStaticOperationHandleCompletePending::test_complete_pending_logs_message PASSED [  7%]
tests/cli/test_command_context.py::TestStaticOperationHandleCompletePending::test_complete_pending_default_level PASSED [  7%]
tests/cli/test_command_context.py::TestCommandContextAuthenticateGmail::test_authenticate_gmail_success PASSED [  7%]
tests/cli/test_command_context.py::TestCommandContextAuthenticateGmail::test_authenticate_gmail_file_not_found_required PASSED [  7%]
tests/cli/test_command_context.py::TestCommandContextAuthenticateGmail::test_authenticate_gmail_file_not_found_optional PASSED [  7%]
tests/cli/test_command_context.py::TestCommandContextAuthenticateGmail::test_authenticate_gmail_exception_required PASSED [  8%]
tests/cli/test_command_context.py::TestCommandContextAuthenticateGmail::test_authenticate_gmail_exception_optional PASSED [  8%]
tests/cli/test_command_context.py::TestCommandContextAuthenticateGmail::test_authenticate_gmail_validate_deletion_scope_missing PASSED [  8%]
tests/cli/test_command_context.py::TestCommandContextAuthenticateGmail::test_authenticate_gmail_validate_deletion_scope_optional PASSED [  8%]
tests/cli/test_command_context.py::TestCommandContextAuthenticateGmail::test_authenticate_gmail_with_custom_credentials PASSED [  8%]
tests/cli/test_command_context.py::TestCommandContextAuthenticateGmailAsync::test_authenticate_gmail_async_success PASSED [  8%]
tests/cli/test_command_context.py::TestCommandContextAuthenticateGmailAsync::test_authenticate_gmail_async_file_not_found_required PASSED [  8%]
tests/cli/test_command_context.py::TestCommandContextAuthenticateGmailAsync::test_authenticate_gmail_async_file_not_found_optional PASSED [  8%]
tests/cli/test_command_context.py::TestCommandContextAuthenticateGmailAsync::test_authenticate_gmail_async_exception_required PASSED [  8%]
tests/cli/test_command_context.py::TestCommandContextAuthenticateGmailAsync::test_authenticate_gmail_async_exception_optional PASSED [  8%]
tests/cli/test_command_context.py::TestCommandContextAuthenticateGmailAsync::test_authenticate_gmail_async_validate_deletion_scope_missing PASSED [  8%]
tests/cli/test_command_context.py::TestCommandContextAuthenticateGmailAsync::test_authenticate_gmail_async_validate_deletion_scope_optional PASSED [  8%]
tests/cli/test_command_context.py::TestCommandContextAuthenticateGmailAsync::test_authenticate_gmail_async_with_custom_credentials PASSED [  8%]
tests/cli/test_command_context.py::TestCommandContextGmailSessionContextManager::test_gmail_session_success PASSED [  8%]
tests/cli/test_command_context.py::TestCommandContextGmailSessionContextManager::test_gmail_session_file_not_found PASSED [  8%]
tests/cli/test_command_context.py::TestCommandContextGmailSessionContextManager::test_gmail_session_auth_exception PASSED [  8%]
tests/cli/test_command_context.py::TestCommandContextGmailSessionContextManager::test_gmail_session_validate_deletion_scope_missing PASSED [  8%]
tests/cli/test_command_context.py::TestCommandContextGmailSessionContextManager::test_gmail_session_with_custom_credentials PASSED [  8%]
tests/cli/test_command_context.py::TestCommandContextGmailSessionContextManager::test_gmail_session_stores_credentials_and_client PASSED [  8%]
tests/cli/test_command_context.py::TestCommandContextProgressMethods::test_set_progress_total_with_handle PASSED [  8%]
tests/cli/test_command_context.py::TestCommandContextProgressMethods::test_set_progress_total_without_handle PASSED [  8%]
tests/cli/test_command_context.py::TestCommandContextProgressMethods::test_advance_progress_with_handle PASSED [  8%]
tests/cli/test_command_context.py::TestCommandContextProgressMethods::test_advance_progress_without_handle PASSED [  8%]
tests/cli/test_command_context.py::TestCommandContextProgressMethods::test_advance_progress_default PASSED [  8%]
tests/cli/test_command_context.py::TestCommandContextProgressMethods::test_log_progress_with_handle PASSED [  8%]
tests/cli/test_command_context.py::TestCommandContextProgressMethods::test_log_progress_without_handle_info PASSED [  8%]
tests/cli/test_command_context.py::TestCommandContextProgressMethods::test_log_progress_without_handle_warning PASSED [  9%]
tests/cli/test_command_context.py::TestCommandContextProgressMethods::test_log_progress_without_handle_error PASSED [  9%]
tests/cli/test_command_context.py::TestCommandContextProgressMethods::test_log_progress_without_handle_success PASSED [  9%]
tests/cli/test_command_context.py::TestCommandContextUIBuilder::test_ui_builder_lazy_initialization PASSED [  9%]
tests/cli/test_command_context.py::TestCommandContextUIBuilder::test_ui_builder_returns_same_instance PASSED [  9%]
tests/cli/test_command_context.py::TestCommandContextUIBuilder::test_ui_builder_respects_json_mode PASSED [  9%]
tests/cli/test_command_context.py::TestStaticOperationHandleSetTotalWithExistingTask::test_set_total_updates_existing_task PASSED [  9%]
tests/cli/test_command_context.py::TestStaticOperationHandleSetTotalWithExistingTask::test_set_total_updates_description_only PASSED [  9%]
tests/cli/test_command_context.py::TestWithContextDecoratorOptionsReinjection::test_reinjection_of_json_output_parameter PASSED [  9%]
tests/cli/test_command_context.py::TestWithContextDecoratorOptionsReinjection::test_reinjection_of_dry_run_parameter PASSED [  9%]
tests/cli/test_command_context.py::TestWithContextDecoratorOptionsReinjection::test_reinjection_of_state_db_parameter PASSED [  9%]
tests/cli/test_command_context.py::TestWithContextDecoratorOptionsReinjection::test_reinjection_of_credentials_parameter PASSED [  9%]
tests/cli/test_command_context.py::TestWithContextDecoratorOptionsReinjection::test_reinjection_of_all_options PASSED [  9%]
tests/cli/test_command_context.py::TestWithContextDecoratorLiveMode::test_live_mode_with_progress_and_tty PASSED [  9%]
tests/cli/test_command_context.py::TestWithContextDecoratorLiveMode::test_live_mode_not_used_without_tty PASSED [  9%]
tests/cli/test_command_context.py::TestWithContextDecoratorLiveMode::test_live_mode_not_used_with_json_output PASSED [  9%]
tests/cli/test_command_context_async.py::TestCommandContextGmail::test_command_context_has_gmail_attribute PASSED [  9%]
tests/cli/test_command_context_async.py::TestCommandContextGmail::test_command_context_can_store_async_gmail_client PASSED [  9%]
tests/cli/test_command_context_async.py::TestWithContextGmailAuth::test_with_context_accepts_requires_gmail_param PASSED [  9%]
tests/cli/test_command_context_async.py::TestWithContextGmailAuth::test_with_context_initializes_async_gmail_client PASSED [  9%]
tests/cli/test_command_context_async.py::TestWithContextGmailAuth::test_async_gmail_client_properly_closed_on_exit PASSED [  9%]
tests/cli/test_command_context_async.py::TestWithContextNoGmail::test_with_context_no_gmail_required PASSED [  9%]
tests/cli/test_command_context_async.py::TestWithContextNoGmail::test_with_context_default_no_gmail PASSED [  9%]
tests/cli/test_import.py::TestDatabaseValidation::test_import_fails_when_database_not_found PASSED [  9%]
tests/cli/test_import.py::TestWorkflowIntegration::test_import_creates_workflow_with_storage PASSED [  9%]
tests/cli/test_import.py::TestWorkflowIntegration::test_import_passes_config_to_workflow PASSED [  9%]
tests/cli/test_import.py::TestErrorHandling::test_import_handles_file_not_found_error PASSED [  9%]
tests/cli/test_import.py::TestErrorHandling::test_import_handles_generic_exception PASSED [ 10%]
tests/cli/test_import.py::TestResultHandling::test_import_handles_no_files_found PASSED [ 10%]
tests/cli/test_import.py::TestResultHandling::test_import_displays_results_via_report_card PASSED [ 10%]
tests/cli/test_import.py::TestResultHandling::test_import_shows_success_message_with_counts PASSED [ 10%]
tests/cli/test_import.py::TestResultHandling::test_import_suggests_next_steps PASSED [ 10%]
tests/cli/test_import.py::TestResultHandling::test_import_shows_info_when_all_duplicates PASSED [ 10%]
tests/cli/test_migrate.py::TestDatabaseValidation::test_missing_database_fails_with_clear_error PASSED [ 10%]
tests/cli/test_migrate.py::TestDatabaseValidation::test_missing_database_provides_helpful_suggestion PASSED [ 10%]
tests/cli/test_migrate.py::TestSchemaVersionChecking::test_already_at_latest_version_returns_early PASSED [ 10%]
tests/cli/test_migrate.py::TestSchemaVersionChecking::test_already_at_latest_returns_immediately PASSED [ 10%]
tests/cli/test_migrate.py::TestSuccessfulMigration::test_successful_migration_shows_report PASSED [ 10%]
tests/cli/test_migrate.py::TestSuccessfulMigration::test_successful_migration_shows_success_message PASSED [ 10%]
tests/cli/test_migrate.py::TestSuccessfulMigration::test_successful_migration_suggests_next_steps PASSED [ 10%]
tests/cli/test_migrate.py::TestSuccessfulMigration::test_successful_migration_displays_task_completion PASSED [ 10%]
tests/cli/test_migrate.py::TestMigrationExceptionHandling::test_migration_exception_fails_with_error_message PASSED [ 10%]
tests/cli/test_migrate.py::TestMigrationExceptionHandling::test_migration_exception_suggests_rollback PASSED [ 10%]
tests/cli/test_migrate.py::TestMigrationExceptionHandling::test_migration_exception_includes_original_error_message PASSED [ 10%]
tests/cli/test_migrate.py::TestMigrationExceptionHandling::test_migration_exception_returns_early PASSED [ 10%]
tests/cli/test_migrate.py::TestWorkflowIntegration::test_creates_migrate_workflow_with_storage PASSED [ 10%]
tests/cli/test_migrate.py::TestWorkflowIntegration::test_passes_migrate_config_to_workflow PASSED [ 10%]
tests/cli/test_migrate.py::TestReportGeneration::test_report_includes_all_migration_details PASSED [ 10%]
tests/cli/test_migrate.py::TestReportGeneration::test_report_shows_na_when_no_details PASSED [ 10%]
tests/cli/test_migrate.py::TestReportGeneration::test_report_shows_na_when_no_backup_created PASSED [ 10%]
tests/cli/test_migrate.py::TestStorageContextRequirement::test_asserts_storage_is_not_none PASSED [ 10%]
tests/cli/test_migrate.py::TestEdgeCases::test_migration_with_very_long_version_strings PASSED [ 10%]
tests/cli/test_migrate.py::TestEdgeCases::test_migration_exception_with_special_characters_in_message PASSED [ 10%]
tests/cli/test_migrate.py::TestEdgeCases::test_report_with_multiline_details PASSED [ 11%]
tests/cli/test_output.py::TestOutputManager::test_init_default PASSED    [ 11%]
tests/cli/test_output.py::TestOutputManager::test_init_json_mode PASSED  [ 11%]
tests/cli/test_output.py::TestOutputManager::test_init_quiet_mode PASSED [ 11%]
tests/cli/test_output.py::TestStartOperation::test_start_operation_normal_mode PASSED [ 11%]
tests/cli/test_output.py::TestStartOperation::test_start_operation_json_mode PASSED [ 11%]
tests/cli/test_output.py::TestStartOperation::test_start_operation_quiet_mode PASSED [ 11%]
tests/cli/test_output.py::TestProgressContext::test_progress_context_json_mode PASSED [ 11%]
tests/cli/test_output.py::TestProgressContext::test_progress_context_quiet_mode PASSED [ 11%]
tests/cli/test_output.py::TestProgressContext::test_progress_context_normal_mode PASSED [ 11%]
tests/cli/test_output.py::TestProgressContext::test_progress_context_update_reflects_completed_count PASSED [ 11%]
tests/cli/test_output.py::TestProgressContext::test_progress_context_uses_progress_own_live_display PASSED [ 11%]
tests/cli/test_output.py::TestProgressContext::test_progress_context_does_not_use_external_live_wrapper PASSED [ 11%]
tests/cli/test_output.py::TestTaskComplete::test_task_complete_normal_mode PASSED [ 11%]
tests/cli/test_output.py::TestTaskComplete::test_task_complete_json_mode PASSED [ 11%]
tests/cli/test_output.py::TestShowReport::test_show_report_dict PASSED   [ 11%]
tests/cli/test_output.py::TestShowReport::test_show_report_table PASSED  [ 11%]
tests/cli/test_output.py::TestShowReport::test_show_report_json_mode PASSED [ 11%]
tests/cli/test_output.py::TestShowReport::test_show_report_quiet_mode PASSED [ 11%]
tests/cli/test_output.py::TestSuggestNextSteps::test_suggest_next_steps_normal PASSED [ 11%]
tests/cli/test_output.py::TestSuggestNextSteps::test_suggest_next_steps_json PASSED [ 11%]
tests/cli/test_output.py::TestErrorHandling::test_error_normal_mode PASSED [ 11%]
tests/cli/test_output.py::TestErrorHandling::test_error_json_mode PASSED [ 11%]
tests/cli/test_output.py::TestErrorHandling::test_error_with_exit PASSED [ 11%]
tests/cli/test_output.py::TestSuccessWarningInfo::test_success_normal PASSED [ 11%]
tests/cli/test_output.py::TestSuccessWarningInfo::test_success_json PASSED [ 11%]
tests/cli/test_output.py::TestSuccessWarningInfo::test_warning_normal PASSED [ 12%]
tests/cli/test_output.py::TestSuccessWarningInfo::test_warning_json PASSED [ 12%]
tests/cli/test_output.py::TestSuccessWarningInfo::test_info_normal PASSED [ 12%]
tests/cli/test_output.py::TestSuccessWarningInfo::test_info_json PASSED  [ 12%]
tests/cli/test_output.py::TestShowTable::test_show_table_normal_mode PASSED [ 12%]
tests/cli/test_output.py::TestShowTable::test_show_table_json_mode PASSED [ 12%]
tests/cli/test_output.py::TestEndOperation::test_end_operation_success PASSED [ 12%]
tests/cli/test_output.py::TestEndOperation::test_end_operation_failure PASSED [ 12%]
tests/cli/test_output.py::TestEndOperation::test_end_operation_json PASSED [ 12%]
tests/cli/test_output.py::TestTaskResult::test_task_result_creation PASSED [ 12%]
tests/cli/test_output.py::TestTaskResult::test_task_result_defaults PASSED [ 12%]
tests/cli/test_output.py::TestProgressTrackerEdgeCases::test_update_with_multiple_params_raises_error PASSED [ 12%]
tests/cli/test_output.py::TestProgressTrackerEdgeCases::test_update_with_no_params_does_nothing PASSED [ 12%]
tests/cli/test_output.py::TestProgressTrackerEdgeCases::test_calculate_eta_with_zero_rate PASSED [ 12%]
tests/cli/test_output.py::TestProgressTrackerEdgeCases::test_get_rate_formatted_no_rate PASSED [ 12%]
tests/cli/test_output.py::TestProgressTrackerEdgeCases::test_get_progress_string_no_start PASSED [ 12%]
tests/cli/test_output.py::TestOutputManagerEdgeCases::test_show_report_with_summary PASSED [ 12%]
tests/cli/test_output.py::TestOutputManagerEdgeCases::test_show_report_list_of_non_dicts PASSED [ 12%]
tests/cli/test_output.py::TestOutputManagerEdgeCases::test_show_table_quiet_mode_skips_output PASSED [ 12%]
tests/cli/test_output.py::TestOutputManagerEdgeCases::test_suggest_next_steps_quiet_mode PASSED [ 12%]
tests/cli/test_output.py::TestOutputManagerEdgeCases::test_error_json_mode_with_flush PASSED [ 12%]
tests/cli/test_output.py::TestOutputManagerEdgeCases::test_warning_quiet_mode PASSED [ 12%]
tests/cli/test_output.py::TestOutputManagerEdgeCases::test_info_quiet_mode PASSED [ 12%]
tests/cli/test_output.py::TestOutputManagerEdgeCases::test_end_operation_quiet_mode PASSED [ 12%]
tests/cli/test_output.py::TestOutputManagerEdgeCases::test_set_json_payload_and_flush PASSED [ 12%]
tests/cli/test_output.py::TestOutputManagerEdgeCases::test_progress_context_with_live_update PASSED [ 12%]
tests/cli/test_output.py::TestProgressTrackerSimpleCases::test_update_with_completed_param PASSED [ 12%]
tests/cli/test_output.py::TestProgressTrackerSimpleCases::test_update_with_advance_param PASSED [ 13%]
tests/cli/test_output.py::TestFlushJSON::test_flush_json_not_in_json_mode PASSED [ 13%]
tests/cli/test_output.py::TestOutputManagerEndOperation::test_end_operation_no_console_quiet_mode PASSED [ 13%]
tests/cli/test_output.py::TestOutputManagerEndOperation::test_success_quiet_mode PASSED [ 13%]
tests/cli/test_output.py::TestProgressTrackerETA::test_calculate_eta_already_complete PASSED [ 13%]
tests/cli/test_output.py::TestStatusPanel::test_output_status_panel_with_completed_tasks PASSED [ 13%]
tests/cli/test_output.py::TestLogBuffer::test_init_default PASSED        [ 13%]
tests/cli/test_output.py::TestLogBuffer::test_init_custom_size PASSED    [ 13%]
tests/cli/test_output.py::TestLogBuffer::test_init_zero_size PASSED      [ 13%]
tests/cli/test_output.py::TestLogBuffer::test_init_negative_size_raises_error PASSED [ 13%]
tests/cli/test_output.py::TestLogBuffer::test_add_single_entry PASSED    [ 13%]
tests/cli/test_output.py::TestLogBuffer::test_add_multiple_entries PASSED [ 13%]
tests/cli/test_output.py::TestLogBuffer::test_ring_buffer_overflow PASSED [ 13%]
tests/cli/test_output.py::TestLogBuffer::test_deduplication_exact_match PASSED [ 13%]
tests/cli/test_output.py::TestLogBuffer::test_deduplication_updates_timestamp PASSED [ 13%]
tests/cli/test_output.py::TestLogBuffer::test_deduplication_evicted_entry_readded PASSED [ 13%]
tests/cli/test_output.py::TestLogBuffer::test_render_empty_buffer PASSED [ 13%]
tests/cli/test_output.py::TestLogBuffer::test_render_with_entries PASSED [ 13%]
tests/cli/test_output.py::TestLogBuffer::test_render_severity_symbols PASSED [ 13%]
tests/cli/test_output.py::TestLogBuffer::test_render_with_duplicate_count PASSED [ 13%]
tests/cli/test_output.py::TestLogBuffer::test_get_all_logs_returns_copy PASSED [ 13%]
tests/cli/test_output.py::TestLogBuffer::test_clear PASSED               [ 13%]
tests/cli/test_output.py::TestLiveLayoutContextInitialization::test_init_with_all_components PASSED [ 13%]
tests/cli/test_output.py::TestLiveLayoutContextInitialization::test_init_with_default_components PASSED [ 13%]
tests/cli/test_output.py::TestLiveLayoutContextInitialization::test_init_custom_max_visible PASSED [ 13%]
tests/cli/test_output.py::TestLiveLayoutContextManager::test_context_manager_enter_exit PASSED [ 13%]
tests/cli/test_output.py::TestLiveLayoutContextManager::test_context_manager_closes_session_logger PASSED [ 14%]
tests/cli/test_output.py::TestLiveLayoutContextAddLog::test_add_log_to_both_buffers PASSED [ 14%]
tests/cli/test_output.py::TestLiveLayoutContextAddLog::test_add_log_different_levels PASSED [ 14%]
tests/cli/test_output.py::TestOutputManagerLiveLayoutContext::test_live_layout_context_returns_live_context PASSED [ 14%]
tests/cli/test_output.py::TestOutputManagerLiveLayoutContext::test_live_layout_context_auto_cleanup PASSED [ 14%]
tests/cli/test_output.py::TestOperationHandleProtocol::test_operation_handle_has_required_methods PASSED [ 14%]
tests/cli/test_output.py::TestOperationHandleProtocol::test_operation_handle_protocol_structural_typing PASSED [ 14%]
tests/cli/test_output.py::TestOutputHandlerProtocol::test_output_handler_has_required_methods PASSED [ 14%]
tests/cli/test_output.py::TestOutputHandlerProtocol::test_output_handler_protocol_structural_typing PASSED [ 14%]
tests/cli/test_output.py::TestStaticOperationHandle::test_log_method_calls_output_manager PASSED [ 14%]
tests/cli/test_output.py::TestStaticOperationHandle::test_update_progress_does_nothing_in_static_mode PASSED [ 14%]
tests/cli/test_output.py::TestStaticOperationHandle::test_set_status_does_nothing_in_static_mode PASSED [ 14%]
tests/cli/test_output.py::TestStaticOperationHandle::test_succeed_calls_success PASSED [ 14%]
tests/cli/test_output.py::TestStaticOperationHandle::test_fail_calls_error PASSED [ 14%]
tests/cli/test_output.py::TestStaticOutputHandler::test_print_delegates_to_console PASSED [ 14%]
tests/cli/test_output.py::TestStaticOutputHandler::test_start_operation_returns_static_handle PASSED [ 14%]
tests/cli/test_output.py::TestStaticOutputHandler::test_context_manager_returns_self PASSED [ 14%]
tests/cli/test_output.py::TestStaticOutputHandler::test_json_mode_respects_output_manager_mode PASSED [ 14%]
tests/cli/test_output.py::TestOutputManagerWithStaticHandler::test_output_manager_uses_static_handler_by_default PASSED [ 14%]
tests/cli/test_output.py::TestOutputManagerWithStaticHandler::test_output_manager_info_delegates_to_handler PASSED [ 14%]
tests/cli/test_output.py::TestLiveOperationHandle::test_log_adds_to_live_layout_context PASSED [ 14%]
tests/cli/test_output.py::TestLiveOperationHandle::test_update_progress_tracks_completion PASSED [ 14%]
tests/cli/test_output.py::TestLiveOperationHandle::test_set_status_updates_description PASSED [ 14%]
tests/cli/test_output.py::TestLiveOperationHandle::test_succeed_logs_success_message PASSED [ 14%]
tests/cli/test_output.py::TestLiveOperationHandle::test_fail_logs_error_message PASSED [ 14%]
tests/cli/test_output.py::TestLiveOutputHandler::test_context_manager_creates_live_layout PASSED [ 14%]
tests/cli/test_output.py::TestLiveOutputHandler::test_start_operation_returns_live_handle PASSED [ 15%]
tests/cli/test_output.py::TestLiveOutputHandler::test_print_logs_to_live_context PASSED [ 15%]
tests/cli/test_output.py::TestOutputManagerWithLiveMode::test_output_manager_uses_live_handler_when_enabled PASSED [ 15%]
tests/cli/test_output.py::TestLogBufferCompletePending::test_complete_pending_with_pending_entry PASSED [ 15%]
tests/cli/test_output.py::TestLogBufferCompletePending::test_complete_pending_without_pending_entry PASSED [ 15%]
tests/cli/test_output.py::TestLiveLayoutContextProgressETA::test_get_progress_eta_not_started PASSED [ 15%]
tests/cli/test_output.py::TestLiveLayoutContextProgressETA::test_get_progress_eta_zero_completed PASSED [ 15%]
tests/cli/test_output.py::TestLiveLayoutContextProgressETA::test_get_progress_eta_seconds_remaining PASSED [ 15%]
tests/cli/test_output.py::TestLiveLayoutContextProgressETA::test_get_progress_eta_minutes_remaining PASSED [ 15%]
tests/cli/test_output.py::TestLiveLayoutContextProgressETA::test_get_progress_eta_hours_remaining PASSED [ 15%]
tests/cli/test_output.py::TestShowErrorPanel::test_show_error_panel_json_mode PASSED [ 15%]
tests/cli/test_output.py::TestShowErrorPanel::test_show_error_panel_json_mode_with_exit PASSED [ 15%]
tests/cli/test_output.py::TestShowErrorPanel::test_show_error_panel_quiet_mode PASSED [ 15%]
tests/cli/test_output.py::TestShowErrorPanel::test_show_error_panel_quiet_mode_with_exit PASSED [ 15%]
tests/cli/test_output.py::TestShowErrorPanel::test_show_error_panel_normal_mode PASSED [ 15%]
tests/cli/test_output.py::TestShowValidationReport::test_show_validation_report_json_mode PASSED [ 15%]
tests/cli/test_output.py::TestShowValidationReport::test_show_validation_report_quiet_mode PASSED [ 15%]
tests/cli/test_output.py::TestShowValidationReport::test_show_validation_report_normal_mode_passed PASSED [ 15%]
tests/cli/test_output.py::TestShowValidationReport::test_show_validation_report_normal_mode_failed PASSED [ 15%]
tests/cli/test_output.py::TestCommandContextOperationMethods::test_set_progress_total_with_operation_handle PASSED [ 15%]
tests/cli/test_output.py::TestCommandContextOperationMethods::test_advance_progress_with_operation_handle PASSED [ 15%]
tests/cli/test_output.py::TestCommandContextOperationMethods::test_log_progress_with_operation_handle PASSED [ 15%]
tests/cli/test_output.py::TestCommandContextOperationMethods::test_log_progress_fallback_warning PASSED [ 15%]
tests/cli/test_output.py::TestCommandContextOperationMethods::test_log_progress_fallback_error PASSED [ 15%]
tests/cli/test_output.py::TestCommandContextOperationMethods::test_log_progress_fallback_success PASSED [ 15%]
tests/cli/test_output.py::TestCommandContextOperationMethods::test_log_progress_fallback_info PASSED [ 15%]
tests/cli/test_output.py::TestStaticOperationHandleSetTotal::test_set_total_creates_task_when_none_exists PASSED [ 15%]
tests/cli/test_output.py::TestStaticOperationHandleSetTotal::test_set_total_updates_existing_task PASSED [ 16%]
tests/cli/test_output.py::TestStaticOperationHandleUncovered::test_set_total_is_noop PASSED [ 16%]
tests/cli/test_output.py::TestStaticOperationHandleUncovered::test_complete_pending_logs_message PASSED [ 16%]
tests/cli/test_output_search.py::TestTruncatePreview::test_truncate_preview_none_returns_no_preview PASSED [ 16%]
tests/cli/test_output_search.py::TestTruncatePreview::test_truncate_preview_empty_string_returns_no_preview PASSED [ 16%]
tests/cli/test_output_search.py::TestTruncatePreview::test_truncate_preview_whitespace_only_returns_empty_string PASSED [ 16%]
tests/cli/test_output_search.py::TestTruncatePreview::test_truncate_preview_short_text_returned_unchanged PASSED [ 16%]
tests/cli/test_output_search.py::TestTruncatePreview::test_truncate_preview_text_at_max_length_unchanged PASSED [ 16%]
tests/cli/test_output_search.py::TestTruncatePreview::test_truncate_preview_long_text_truncated_with_ellipsis PASSED [ 16%]
tests/cli/test_output_search.py::TestTruncatePreview::test_truncate_preview_custom_max_length PASSED [ 16%]
tests/cli/test_output_search.py::TestTruncatePreview::test_truncate_preview_strips_whitespace PASSED [ 16%]
tests/cli/test_output_search.py::TestTruncatePreview::test_truncate_preview_preserves_internal_whitespace PASSED [ 16%]
tests/cli/test_output_search.py::TestTruncatePreview::test_truncate_preview_multiline_text_truncated PASSED [ 16%]
tests/cli/test_output_search.py::TestDisplaySearchResultsJson::test_display_search_results_json_empty_results PASSED [ 16%]
tests/cli/test_output_search.py::TestDisplaySearchResultsJson::test_display_search_results_json_single_result PASSED [ 16%]
tests/cli/test_output_search.py::TestDisplaySearchResultsJson::test_display_search_results_json_without_preview PASSED [ 16%]
tests/cli/test_output_search.py::TestDisplaySearchResultsJson::test_display_search_results_json_with_preview PASSED [ 16%]
tests/cli/test_output_search.py::TestDisplaySearchResultsJson::test_display_search_results_json_preview_truncation PASSED [ 16%]
tests/cli/test_output_search.py::TestDisplaySearchResultsJson::test_display_search_results_json_no_preview_for_none PASSED [ 16%]
tests/cli/test_output_search.py::TestDisplaySearchResultsJson::test_display_search_results_json_multiple_results PASSED [ 16%]
tests/cli/test_output_search.py::TestDisplaySearchResultsJson::test_display_search_results_json_includes_all_required_fields PASSED [ 16%]
tests/cli/test_output_search.py::TestDisplaySearchResultsRich::test_display_search_results_rich_json_mode_returns_early PASSED [ 16%]
tests/cli/test_output_search.py::TestDisplaySearchResultsRich::test_display_search_results_rich_quiet_mode_returns_early PASSED [ 16%]
tests/cli/test_output_search.py::TestDisplaySearchResultsRich::test_display_search_results_rich_empty_results_shows_warning PASSED [ 16%]
tests/cli/test_output_search.py::TestDisplaySearchResultsRich::test_display_search_results_rich_empty_results_returns_after_warning PASSED [ 16%]
tests/cli/test_output_search.py::TestDisplaySearchResultsRich::test_display_search_results_rich_with_preview_list_format PASSED [ 16%]
tests/cli/test_output_search.py::TestDisplaySearchResultsRich::test_display_search_results_rich_with_preview_header PASSED [ 17%]
tests/cli/test_output_search.py::TestDisplaySearchResultsRich::test_display_search_results_rich_with_preview_displays_all_fields PASSED [ 17%]
tests/cli/test_output_search.py::TestDisplaySearchResultsRich::test_display_search_results_rich_with_preview_no_subject_shows_placeholder PASSED [ 17%]
tests/cli/test_output_search.py::TestDisplaySearchResultsRich::test_display_search_results_rich_without_preview_table_format PASSED [ 17%]
tests/cli/test_output_search.py::TestDisplaySearchResultsRich::test_display_search_results_rich_without_preview_no_info_calls PASSED [ 17%]
tests/cli/test_output_search.py::TestDisplaySearchResultsRich::test_display_search_results_rich_table_format_title PASSED [ 17%]
tests/cli/test_output_search.py::TestDisplaySearchResultsRich::test_display_search_results_rich_table_format_column_specs PASSED [ 17%]
tests/cli/test_output_search.py::TestDisplaySearchResultsRich::test_display_search_results_rich_table_format_row_data PASSED [ 17%]
tests/cli/test_output_search.py::TestDisplaySearchResultsRich::test_display_search_results_rich_table_format_missing_subject PASSED [ 17%]
tests/cli/test_output_search.py::TestDisplaySearchResultsRich::test_display_search_results_rich_table_format_missing_message_id PASSED [ 17%]
tests/cli/test_output_search.py::TestDisplaySearchResultsRich::test_display_search_results_rich_table_format_missing_date PASSED [ 17%]
tests/cli/test_output_search.py::TestDisplaySearchResultsRich::test_display_search_results_rich_table_extracts_archive_basename PASSED [ 17%]
tests/cli/test_output_search.py::TestDisplaySearchResultsRich::test_display_search_results_rich_with_multiple_results_list_format PASSED [ 17%]
tests/cli/test_output_search.py::TestDisplaySearchResultsRich::test_display_search_results_rich_with_multiple_results_table_format PASSED [ 17%]
tests/cli/test_output_search.py::TestDisplaySearchResultsRich::test_display_search_results_rich_with_preview_numbered_entries PASSED [ 17%]
tests/cli/test_output_search.py::TestDisplaySearchResultsRich::test_display_search_results_rich_with_preview_empty_from_handled PASSED [ 17%]
tests/cli/test_output_search.py::TestDisplaySearchResultsRich::test_display_search_results_rich_with_preview_no_gmail_id_handled PASSED [ 17%]
tests/cli/test_output_search.py::TestDisplaySearchResultsRich::test_display_search_results_rich_with_preview_missing_date_handled PASSED [ 17%]
tests/cli/test_schedule.py::TestScheduleAddCommand::test_add_daily_schedule_success PASSED [ 17%]
tests/cli/test_schedule.py::TestScheduleAddCommand::test_add_weekly_schedule_success PASSED [ 17%]
tests/cli/test_schedule.py::TestScheduleAddCommand::test_add_monthly_schedule_success PASSED [ 17%]
tests/cli/test_schedule.py::TestScheduleAddCommand::test_add_schedule_validation_error PASSED [ 17%]
tests/cli/test_schedule.py::TestScheduleAddCommand::test_add_schedule_generic_error PASSED [ 17%]
tests/cli/test_schedule.py::TestScheduleAddCommand::test_add_schedule_requires_storage PASSED [ 17%]
tests/cli/test_schedule.py::TestScheduleListCommand::test_list_schedules_success PASSED [ 17%]
tests/cli/test_schedule.py::TestScheduleListCommand::test_list_schedules_enabled_only PASSED [ 17%]
tests/cli/test_schedule.py::TestScheduleListCommand::test_list_schedules_empty PASSED [ 18%]
tests/cli/test_schedule.py::TestScheduleListCommand::test_list_schedules_error PASSED [ 18%]
tests/cli/test_schedule.py::TestScheduleListCommand::test_list_schedules_truncates_long_commands PASSED [ 18%]
tests/cli/test_schedule.py::TestScheduleRemoveCommand::test_remove_schedule_success PASSED [ 18%]
tests/cli/test_schedule.py::TestScheduleRemoveCommand::test_remove_schedule_not_found PASSED [ 18%]
tests/cli/test_schedule.py::TestScheduleRemoveCommand::test_remove_schedule_error PASSED [ 18%]
tests/cli/test_schedule.py::TestScheduleEnableCommand::test_enable_schedule_success PASSED [ 18%]
tests/cli/test_schedule.py::TestScheduleEnableCommand::test_enable_schedule_not_found PASSED [ 18%]
tests/cli/test_schedule.py::TestScheduleEnableCommand::test_enable_schedule_error PASSED [ 18%]
tests/cli/test_schedule.py::TestScheduleDisableCommand::test_disable_schedule_success PASSED [ 18%]
tests/cli/test_schedule.py::TestScheduleDisableCommand::test_disable_schedule_not_found PASSED [ 18%]
tests/cli/test_schedule.py::TestScheduleDisableCommand::test_disable_schedule_error PASSED [ 18%]
tests/cli/test_schedule.py::TestScheduleCommandsEdgeCases::test_add_schedule_with_all_day_types PASSED [ 18%]
tests/cli/test_schedule.py::TestScheduleCommandsEdgeCases::test_list_schedules_with_all_day_abbreviations PASSED [ 18%]
tests/cli/test_schedule.py::TestScheduleCommandsEdgeCases::test_list_truncates_last_run_timestamp PASSED [ 18%]
tests/cli/test_schedule.py::TestScheduleCommandsEdgeCases::test_all_commands_require_storage PASSED [ 18%]
tests/cli/test_ui_builder.py::TestTaskStatus::test_status_values_exist PASSED [ 18%]
tests/cli/test_ui_builder.py::TestTaskStatus::test_symbols_mapping PASSED [ 18%]
tests/cli/test_ui_builder.py::TestTaskStatus::test_success_symbol_is_checkmark PASSED [ 18%]
tests/cli/test_ui_builder.py::TestTaskStatus::test_failed_symbol_is_x PASSED [ 18%]
tests/cli/test_ui_builder.py::TestTaskHandleImpl::test_complete_sets_success_status PASSED [ 18%]
tests/cli/test_ui_builder.py::TestTaskHandleImpl::test_fail_sets_failed_status PASSED [ 18%]
tests/cli/test_ui_builder.py::TestTaskHandleImpl::test_fail_without_reason PASSED [ 18%]
tests/cli/test_ui_builder.py::TestTaskHandleImpl::test_advance_increments_completed PASSED [ 18%]
tests/cli/test_ui_builder.py::TestTaskHandleImpl::test_advance_default_is_one PASSED [ 18%]
tests/cli/test_ui_builder.py::TestTaskHandleImpl::test_set_total PASSED  [ 18%]
tests/cli/test_ui_builder.py::TestTaskHandleImpl::test_log_delegates_to_sequence PASSED [ 18%]
tests/cli/test_ui_builder.py::TestTaskHandleImpl::test_set_total_with_description PASSED [ 19%]
tests/cli/test_ui_builder.py::TestTaskHandleImpl::test_set_total_without_description_preserves_original PASSED [ 19%]
tests/cli/test_ui_builder.py::TestTaskHandleImpl::test_update_progress_delegates_to_advance PASSED [ 19%]
tests/cli/test_ui_builder.py::TestTaskHandleImpl::test_update_progress_default_is_one PASSED [ 19%]
tests/cli/test_ui_builder.py::TestTaskHandleImpl::test_set_status_updates_description PASSED [ 19%]
tests/cli/test_ui_builder.py::TestTaskHandleImpl::test_succeed_delegates_to_complete PASSED [ 19%]
tests/cli/test_ui_builder.py::TestTaskHandleImpl::test_complete_pending_logs_message PASSED [ 19%]
tests/cli/test_ui_builder.py::TestTaskHandleImpl::test_complete_pending_with_custom_level PASSED [ 19%]
tests/cli/test_ui_builder.py::TestTaskSequenceImpl::test_init_sets_attributes PASSED [ 19%]
tests/cli/test_ui_builder.py::TestTaskSequenceImpl::test_json_mode_no_live_context PASSED [ 19%]
tests/cli/test_ui_builder.py::TestTaskSequenceImpl::test_task_creates_running_state PASSED [ 19%]
tests/cli/test_ui_builder.py::TestTaskSequenceImpl::test_task_with_total PASSED [ 19%]
tests/cli/test_ui_builder.py::TestTaskSequenceImpl::test_task_handle_complete PASSED [ 19%]
tests/cli/test_ui_builder.py::TestTaskSequenceImpl::test_task_handle_fail PASSED [ 19%]
tests/cli/test_ui_builder.py::TestTaskSequenceImpl::test_exception_auto_fails_task PASSED [ 19%]
tests/cli/test_ui_builder.py::TestTaskSequenceImpl::test_json_events_task_start PASSED [ 19%]
tests/cli/test_ui_builder.py::TestTaskSequenceImpl::test_json_events_task_complete PASSED [ 19%]
tests/cli/test_ui_builder.py::TestTaskSequenceImpl::test_json_events_task_failed PASSED [ 19%]
tests/cli/test_ui_builder.py::TestTaskSequenceImpl::test_multiple_tasks PASSED [ 19%]
tests/cli/test_ui_builder.py::TestTaskSequenceImpl::test_log_stores_message PASSED [ 19%]
tests/cli/test_ui_builder.py::TestTaskSequenceImpl::test_log_emits_json_event PASSED [ 19%]
tests/cli/test_ui_builder.py::TestTaskSequenceImplRendering::test_render_pending_task PASSED [ 19%]
tests/cli/test_ui_builder.py::TestTaskSequenceImplRendering::test_render_running_task PASSED [ 19%]
tests/cli/test_ui_builder.py::TestTaskSequenceImplRendering::test_render_running_task_with_progress PASSED [ 19%]
tests/cli/test_ui_builder.py::TestTaskSequenceImplRendering::test_render_success_task PASSED [ 19%]
tests/cli/test_ui_builder.py::TestTaskSequenceImplRendering::test_render_failed_task PASSED [ 19%]
tests/cli/test_ui_builder.py::TestUIBuilderImpl::test_init PASSED        [ 20%]
tests/cli/test_ui_builder.py::TestUIBuilderImpl::test_task_sequence_creates_sequence PASSED [ 20%]
tests/cli/test_ui_builder.py::TestUIBuilderImpl::test_task_sequence_propagates_json_mode PASSED [ 20%]
tests/cli/test_ui_builder.py::TestUIBuilderImpl::test_spinner_creates_single_task PASSED [ 20%]
tests/cli/test_ui_builder.py::TestUIBuilderImpl::test_spinner_task_can_complete PASSED [ 20%]
tests/cli/test_ui_builder.py::TestUIBuilderImpl::test_spinner_task_can_fail PASSED [ 20%]
tests/cli/test_ui_builder.py::TestUIBuilderImplIntegration::test_full_task_sequence_workflow PASSED [ 20%]
tests/cli/test_ui_builder.py::TestUIBuilderImplIntegration::test_task_sequence_with_failure PASSED [ 20%]
tests/cli/test_ui_builder.py::TestUIBuilderImplIntegration::test_late_bound_total PASSED [ 20%]
tests/cli/test_ui_builder.py::TestSpinnerFrames::test_spinner_frames_exist PASSED [ 20%]
tests/cli/test_ui_builder.py::TestSpinnerFrames::test_spinner_frames_are_braille PASSED [ 20%]
tests/cli/test_ui_builder.py::TestLogEntry::test_log_entry_creation PASSED [ 20%]
tests/cli/test_ui_builder.py::TestLogEntry::test_log_entry_with_timestamp PASSED [ 20%]
tests/cli/test_ui_builder.py::TestLogWindow::test_show_logs_disabled_by_default PASSED [ 20%]
tests/cli/test_ui_builder.py::TestLogWindow::test_show_logs_enabled PASSED [ 20%]
tests/cli/test_ui_builder.py::TestLogWindow::test_max_logs_default PASSED [ 20%]
tests/cli/test_ui_builder.py::TestLogWindow::test_max_logs_custom PASSED [ 20%]
tests/cli/test_ui_builder.py::TestLogWindow::test_log_adds_to_visible_buffer_when_show_logs PASSED [ 20%]
tests/cli/test_ui_builder.py::TestLogWindow::test_log_not_added_to_visible_buffer_when_show_logs_false PASSED [ 20%]
tests/cli/test_ui_builder.py::TestLogWindow::test_visible_logs_ring_buffer PASSED [ 20%]
tests/cli/test_ui_builder.py::TestLogWindow::test_render_log_info PASSED [ 20%]
tests/cli/test_ui_builder.py::TestLogWindow::test_render_log_warning PASSED [ 20%]
tests/cli/test_ui_builder.py::TestLogWindow::test_render_log_error PASSED [ 20%]
tests/cli/test_ui_builder.py::TestLogWindow::test_render_log_success PASSED [ 20%]
tests/cli/test_ui_builder.py::TestLogWindow::test_render_includes_log_window PASSED [ 20%]
tests/cli/test_ui_builder.py::TestLogWindow::test_render_no_log_window_when_disabled PASSED [ 20%]
tests/cli/test_ui_builder.py::TestLogWindowIntegration::test_task_log_appears_in_window PASSED [ 21%]
tests/cli/test_ui_builder.py::TestLogWindowIntegration::test_full_workflow_with_logs PASSED [ 21%]
tests/cli/test_ui_builder.py::TestLogWindowIntegration::test_json_events_include_logs PASSED [ 21%]
tests/cli/test_ui_builder_deprecation.py::TestUIBuilderDeprecatedImports::test_default_max_logs_imported PASSED [ 21%]
tests/cli/test_ui_builder_deprecation.py::TestUIBuilderDeprecatedImports::test_spinner_frames_imported PASSED [ 21%]
tests/cli/test_ui_builder_deprecation.py::TestUIBuilderDeprecatedImports::test_symbols_imported PASSED [ 21%]
tests/cli/test_ui_builder_deprecation.py::TestUIBuilderDeprecatedImports::test_log_entry_class_imported PASSED [ 21%]
tests/cli/test_ui_builder_deprecation.py::TestUIBuilderDeprecatedImports::test_task_handle_impl_imported PASSED [ 21%]
tests/cli/test_ui_builder_deprecation.py::TestUIBuilderDeprecatedImports::test_task_sequence_impl_imported PASSED [ 21%]
tests/cli/test_ui_builder_deprecation.py::TestUIBuilderDeprecatedImports::test_task_status_imported PASSED [ 21%]
tests/cli/test_ui_builder_deprecation.py::TestUIBuilderDeprecatedImports::test_ui_builder_impl_imported PASSED [ 21%]
tests/cli/test_ui_builder_deprecation.py::TestUIBuilderDeprecatedImports::test_all_symbols_exported PASSED [ 21%]
tests/cli/test_verify.py::TestVerifyIntegrityCommand::test_missing_database_fails_with_clear_error PASSED [ 21%]
tests/cli/test_verify.py::TestVerifyIntegrityCommand::test_successful_integrity_check_shows_report PASSED [ 21%]
tests/cli/test_verify.py::TestVerifyIntegrityCommand::test_failed_integrity_check_shows_issues_and_suggestions PASSED [ 21%]
tests/cli/test_verify.py::TestVerifyIntegrityCommand::test_workflow_exception_fails_with_error_message PASSED [ 21%]
tests/cli/test_verify.py::TestVerifyIntegrityCommand::test_creates_verify_config_with_correct_type PASSED [ 21%]
tests/cli/test_verify.py::TestVerifyConsistencyCommand::test_missing_database_fails_with_clear_error PASSED [ 21%]
tests/cli/test_verify.py::TestVerifyConsistencyCommand::test_successful_consistency_check_shows_task_completion PASSED [ 21%]
tests/cli/test_verify.py::TestVerifyConsistencyCommand::test_failed_consistency_check_shows_task_failure PASSED [ 21%]
tests/cli/test_verify.py::TestVerifyConsistencyCommand::test_workflow_exception_shows_task_failure_and_exits PASSED [ 21%]
tests/cli/test_verify.py::TestVerifyConsistencyCommand::test_creates_verify_config_with_consistency_type PASSED [ 21%]
tests/cli/test_verify.py::TestVerifyOffsetsCommand::test_missing_database_fails_with_clear_error PASSED [ 21%]
tests/cli/test_verify.py::TestVerifyOffsetsCommand::test_successful_offset_check_shows_task_completion PASSED [ 21%]
tests/cli/test_verify.py::TestVerifyOffsetsCommand::test_failed_offset_check_suggests_repair PASSED [ 21%]
tests/cli/test_verify.py::TestVerifyOffsetsCommand::test_workflow_exception_suggests_mbox_accessibility_check PASSED [ 21%]
tests/cli/test_verify.py::TestVerifyOffsetsCommand::test_creates_verify_config_with_offsets_type PASSED [ 21%]
tests/cli/test_verify.py::TestVerifyCommandsStorageRequirement::test_verify_integrity_asserts_storage_exists PASSED [ 22%]
tests/cli/test_verify.py::TestVerifyCommandsStorageRequirement::test_verify_consistency_asserts_storage_exists PASSED [ 22%]
tests/cli/test_verify.py::TestVerifyCommandsStorageRequirement::test_verify_offsets_asserts_storage_exists PASSED [ 22%]
tests/cli/test_verify.py::TestVerifyCommandsEdgeCases::test_integrity_with_zero_issues_shows_zero_in_report PASSED [ 22%]
tests/cli/test_verify.py::TestVerifyCommandsEdgeCases::test_consistency_with_empty_issues_list_shows_passed PASSED [ 22%]
tests/cli/test_verify.py::TestVerifyCommandsEdgeCases::test_offsets_verification_handles_large_issue_count PASSED [ 22%]
tests/cli/test_widgets.py::TestReportCard::test_add_field PASSED         [ 22%]
tests/cli/test_widgets.py::TestReportCard::test_fluent_chaining PASSED   [ 22%]
tests/cli/test_widgets.py::TestReportCard::test_add_conditional_field_true PASSED [ 22%]
tests/cli/test_widgets.py::TestReportCard::test_add_conditional_field_false PASSED [ 22%]
tests/cli/test_widgets.py::TestReportCard::test_set_summary PASSED       [ 22%]
tests/cli/test_widgets.py::TestReportCard::test_to_dict_preserves_order PASSED [ 22%]
tests/cli/test_widgets.py::TestReportCard::test_render_calls_show_report PASSED [ 22%]
tests/cli/test_widgets.py::TestReportCard::test_render_with_summary PASSED [ 22%]
tests/cli/test_widgets.py::TestSuggestionList::test_add_suggestion PASSED [ 22%]
tests/cli/test_widgets.py::TestSuggestionList::test_fluent_chaining PASSED [ 22%]
tests/cli/test_widgets.py::TestSuggestionList::test_add_conditional_true PASSED [ 22%]
tests/cli/test_widgets.py::TestSuggestionList::test_add_conditional_false PASSED [ 22%]
tests/cli/test_widgets.py::TestSuggestionList::test_is_empty_true PASSED [ 22%]
tests/cli/test_widgets.py::TestSuggestionList::test_is_empty_false PASSED [ 22%]
tests/cli/test_widgets.py::TestSuggestionList::test_render_calls_suggest_next_steps PASSED [ 22%]
tests/cli/test_widgets.py::TestSuggestionList::test_render_empty_does_not_call PASSED [ 22%]
tests/cli/test_widgets.py::TestErrorPanel::test_basic_error PASSED       [ 22%]
tests/cli/test_widgets.py::TestErrorPanel::test_add_detail PASSED        [ 22%]
tests/cli/test_widgets.py::TestErrorPanel::test_add_details PASSED       [ 22%]
tests/cli/test_widgets.py::TestErrorPanel::test_fluent_chaining PASSED   [ 22%]
tests/cli/test_widgets.py::TestErrorPanel::test_set_suggestion PASSED    [ 23%]
tests/cli/test_widgets.py::TestErrorPanel::test_render_calls_show_error_panel PASSED [ 23%]
tests/cli/test_widgets.py::TestErrorPanel::test_render_without_details PASSED [ 23%]
tests/cli/test_widgets.py::TestProgressSummary::test_add_stat PASSED     [ 23%]
tests/cli/test_widgets.py::TestProgressSummary::test_fluent_chaining PASSED [ 23%]
tests/cli/test_widgets.py::TestProgressSummary::test_add_conditional_stat_true PASSED [ 23%]
tests/cli/test_widgets.py::TestProgressSummary::test_add_conditional_stat_false PASSED [ 23%]
tests/cli/test_widgets.py::TestProgressSummary::test_to_report_card PASSED [ 23%]
tests/cli/test_widgets.py::TestProgressSummary::test_render_calls_show_report PASSED [ 23%]
tests/cli/test_widgets.py::TestWidgetIntegration::test_report_with_suggestions PASSED [ 23%]
tests/cli/test_widgets.py::TestWidgetIntegration::test_conditional_workflow PASSED [ 23%]
tests/cli/test_widgets_deprecation.py::TestWidgetsDeprecatedImports::test_report_card_imported PASSED [ 23%]
tests/cli/test_widgets_deprecation.py::TestWidgetsDeprecatedImports::test_suggestion_list_imported PASSED [ 23%]
tests/cli/test_widgets_deprecation.py::TestWidgetsDeprecatedImports::test_error_panel_imported PASSED [ 23%]
tests/cli/test_widgets_deprecation.py::TestWidgetsDeprecatedImports::test_progress_summary_imported PASSED [ 23%]
tests/cli/test_widgets_deprecation.py::TestWidgetsDeprecatedImports::test_all_symbols_exported PASSED [ 23%]
tests/cli/test_widgets_deprecation.py::TestWidgetsDeprecatedImports::test_widget_classes_have_expected_methods PASSED [ 23%]
tests/cli/ui/test_adapters.py::TestCLIProgressAdapter::test_info_delegates_to_output PASSED [ 23%]
tests/cli/ui/test_adapters.py::TestCLIProgressAdapter::test_warning_delegates_to_output PASSED [ 23%]
tests/cli/ui/test_adapters.py::TestCLIProgressAdapter::test_error_delegates_to_output PASSED [ 23%]
tests/cli/ui/test_adapters.py::TestCLIProgressAdapter::test_task_sequence_without_ui_returns_noop PASSED [ 23%]
tests/cli/ui/test_adapters.py::TestCLIProgressAdapter::test_task_sequence_with_ui_delegates PASSED [ 23%]
tests/cli/ui/test_adapters.py::TestCLIProgressAdapter::test_task_sequence_uses_shared_when_workflow_active PASSED [ 23%]
tests/cli/ui/test_adapters.py::TestCLIProgressAdapter::test_workflow_sequence_without_ui_returns_noop_context PASSED [ 23%]
tests/cli/ui/test_adapters.py::TestCLIProgressAdapter::test_workflow_sequence_with_ui_creates_shared_context PASSED [ 23%]
tests/cli/ui/test_adapters.py::TestCLIProgressAdapter::test_workflow_sequence_with_show_logs PASSED [ 23%]
tests/cli/ui/test_adapters.py::TestCLIProgressAdapter::test_workflow_sequence_clears_shared_on_exit PASSED [ 24%]
tests/cli/ui/test_adapters.py::TestWorkflowProgressContext::test_task_delegates_to_sequence PASSED [ 24%]
tests/cli/ui/test_adapters.py::TestWorkflowProgressContext::test_task_returns_noop_for_noop_sequence PASSED [ 24%]
tests/cli/ui/test_adapters.py::TestWorkflowProgressContext::test_info_delegates_to_output PASSED [ 24%]
tests/cli/ui/test_adapters.py::TestWorkflowProgressContext::test_warning_delegates_to_output PASSED [ 24%]
tests/cli/ui/test_adapters.py::TestWorkflowProgressContext::test_error_delegates_to_output PASSED [ 24%]
tests/cli/ui/test_builder.py::TestTaskHandleImplSetStatus::test_set_status_updates_description PASSED [ 24%]
tests/cli/ui/test_builder.py::TestTaskHandleImplSetStatus::test_set_status_preserves_status PASSED [ 24%]
tests/cli/ui/test_builder.py::TestTaskHandleImplSetStatus::test_set_status_triggers_refresh PASSED [ 24%]
tests/cli/ui/test_builder.py::TestTaskHandleImplSetStatus::test_set_status_with_empty_string PASSED [ 24%]
tests/cli/ui/test_builder.py::TestTaskHandleImplSetStatus::test_set_status_with_special_characters PASSED [ 24%]
tests/cli/ui/test_builder.py::TestTaskHandleImplSetStatus::test_set_status_multiple_times PASSED [ 24%]
tests/cli/ui/test_builder.py::TestTaskHandleImplSetStatus::test_set_status_while_task_running PASSED [ 24%]
tests/cli/ui/test_builder.py::TestTaskHandleImplSetStatus::test_set_status_with_progress PASSED [ 24%]
tests/cli/ui/test_builder.py::TestTaskHandleImplWarn::test_warn_sets_warning_status PASSED [ 24%]
tests/cli/ui/test_builder.py::TestTaskHandleImplWarn::test_warn_sets_result_message PASSED [ 24%]
tests/cli/ui/test_builder.py::TestTaskHandleImplWarn::test_warn_triggers_refresh PASSED [ 24%]
tests/cli/ui/test_builder.py::TestTaskHandleImplWarn::test_warn_preserves_description PASSED [ 24%]
tests/cli/ui/test_builder.py::TestTaskHandleImplWarn::test_warn_with_empty_message PASSED [ 24%]
tests/cli/ui/test_builder.py::TestTaskHandleImplWarn::test_warn_with_long_message PASSED [ 24%]
tests/cli/ui/test_builder.py::TestTaskHandleImplWarn::test_warn_with_special_characters PASSED [ 24%]
tests/cli/ui/test_builder.py::TestTaskHandleImplWarn::test_warn_multiple_times PASSED [ 24%]
tests/cli/ui/test_builder.py::TestTaskHandleImplWarn::test_warn_after_running PASSED [ 24%]
tests/cli/ui/test_builder.py::TestTaskHandleImplWarn::test_warn_complete_workflow PASSED [ 24%]
tests/cli/ui/test_builder.py::TestNoOpTaskHandleSetStatus::test_noop_set_status_does_nothing PASSED [ 24%]
tests/cli/ui/test_builder.py::TestNoOpTaskHandleSetStatus::test_noop_set_status_with_empty_string PASSED [ 24%]
tests/cli/ui/test_builder.py::TestNoOpTaskHandleSetStatus::test_noop_set_status_with_long_message PASSED [ 25%]
tests/cli/ui/test_builder.py::TestNoOpTaskHandleSetStatus::test_noop_set_status_multiple_calls PASSED [ 25%]
tests/cli/ui/test_builder.py::TestNoOpTaskHandleWarn::test_noop_warn_does_nothing PASSED [ 25%]
tests/cli/ui/test_builder.py::TestNoOpTaskHandleWarn::test_noop_warn_with_empty_message PASSED [ 25%]
tests/cli/ui/test_builder.py::TestNoOpTaskHandleWarn::test_noop_warn_with_special_characters PASSED [ 25%]
tests/cli/ui/test_builder.py::TestNoOpTaskHandleWarn::test_noop_warn_multiple_calls PASSED [ 25%]
tests/cli/ui/test_builder.py::TestTaskHandleImplIntegration::test_set_status_then_warn PASSED [ 25%]
tests/cli/ui/test_builder.py::TestTaskHandleImplIntegration::test_warn_with_progress_preserved PASSED [ 25%]
tests/cli/ui/test_builder.py::TestTaskHandleImplIntegration::test_multiple_status_updates_before_warn PASSED [ 25%]
tests/cli/ui/test_protocols.py::TestWidgetProtocol::test_widget_protocol_render_required PASSED [ 25%]
tests/cli/ui/test_protocols.py::TestWidgetProtocol::test_widget_protocol_to_json_required PASSED [ 25%]
tests/cli/ui/test_protocols.py::TestWidgetProtocol::test_concrete_widget_implements_protocol PASSED [ 25%]
tests/cli/ui/test_protocols.py::TestWidgetProtocol::test_widget_render_accepts_output_manager PASSED [ 25%]
tests/cli/ui/test_protocols.py::TestWidgetProtocol::test_widget_to_json_returns_dict PASSED [ 25%]
tests/cli/ui/test_protocols.py::TestWidgetProtocol::test_widget_to_json_is_serializable PASSED [ 25%]
tests/cli/ui/test_protocols.py::TestTaskHandleProtocol::test_task_handle_protocol_complete_required PASSED [ 25%]
tests/cli/ui/test_protocols.py::TestTaskHandleProtocol::test_task_handle_protocol_fail_required PASSED [ 25%]
tests/cli/ui/test_protocols.py::TestTaskHandleProtocol::test_task_handle_protocol_advance_required PASSED [ 25%]
tests/cli/ui/test_protocols.py::TestTaskHandleProtocol::test_task_handle_protocol_set_total_required PASSED [ 25%]
tests/cli/ui/test_protocols.py::TestTaskHandleProtocol::test_task_handle_protocol_log_required PASSED [ 25%]
tests/cli/ui/test_protocols.py::TestTaskHandleProtocol::test_task_handle_protocol_warn_required PASSED [ 25%]
tests/cli/ui/test_protocols.py::TestTaskHandleProtocol::test_concrete_task_handle_implements_protocol PASSED [ 25%]
tests/cli/ui/test_protocols.py::TestTaskHandleProtocol::test_task_handle_complete_changes_status PASSED [ 25%]
tests/cli/ui/test_protocols.py::TestTaskHandleProtocol::test_task_handle_fail_changes_status PASSED [ 25%]
tests/cli/ui/test_protocols.py::TestTaskHandleProtocol::test_task_handle_fail_without_reason PASSED [ 25%]
tests/cli/ui/test_protocols.py::TestTaskHandleProtocol::test_task_handle_advance_increments_progress PASSED [ 25%]
tests/cli/ui/test_protocols.py::TestTaskHandleProtocol::test_task_handle_advance_default_is_one PASSED [ 25%]
tests/cli/ui/test_protocols.py::TestTaskHandleProtocol::test_task_handle_set_total_sets_value PASSED [ 26%]
tests/cli/ui/test_protocols.py::TestTaskHandleProtocol::test_task_handle_set_total_with_description PASSED [ 26%]
tests/cli/ui/test_protocols.py::TestTaskHandleProtocol::test_task_handle_log_accepts_message_and_level PASSED [ 26%]
tests/cli/ui/test_protocols.py::TestTaskHandleProtocol::test_task_handle_warn_marks_warning_status PASSED [ 26%]
tests/cli/ui/test_protocols.py::TestTaskSequenceProtocol::test_task_sequence_protocol_task_required PASSED [ 26%]
tests/cli/ui/test_protocols.py::TestTaskSequenceProtocol::test_concrete_task_sequence_implements_protocol PASSED [ 26%]
tests/cli/ui/test_protocols.py::TestTaskSequenceProtocol::test_task_sequence_task_is_context_manager PASSED [ 26%]
tests/cli/ui/test_protocols.py::TestTaskSequenceProtocol::test_task_sequence_task_with_total PASSED [ 26%]
tests/cli/ui/test_protocols.py::TestTaskSequenceProtocol::test_task_sequence_task_without_total PASSED [ 26%]
tests/cli/ui/test_protocols.py::TestTaskSequenceProtocol::test_task_sequence_creates_multiple_tasks PASSED [ 26%]
tests/cli/ui/test_protocols.py::TestTaskSequenceProtocol::test_task_sequence_task_descriptions_preserved PASSED [ 26%]
tests/cli/ui/test_protocols.py::TestUIBuilderProtocol::test_ui_builder_protocol_task_sequence_required PASSED [ 26%]
tests/cli/ui/test_protocols.py::TestUIBuilderProtocol::test_ui_builder_protocol_spinner_required PASSED [ 26%]
tests/cli/ui/test_protocols.py::TestUIBuilderProtocol::test_concrete_ui_builder_implements_protocol PASSED [ 26%]
tests/cli/ui/test_protocols.py::TestUIBuilderProtocol::test_ui_builder_task_sequence_is_context_manager PASSED [ 26%]
tests/cli/ui/test_protocols.py::TestUIBuilderProtocol::test_ui_builder_task_sequence_with_title PASSED [ 26%]
tests/cli/ui/test_protocols.py::TestUIBuilderProtocol::test_ui_builder_task_sequence_with_show_logs PASSED [ 26%]
tests/cli/ui/test_protocols.py::TestUIBuilderProtocol::test_ui_builder_task_sequence_with_max_logs PASSED [ 26%]
tests/cli/ui/test_protocols.py::TestUIBuilderProtocol::test_ui_builder_spinner_is_context_manager PASSED [ 26%]
tests/cli/ui/test_protocols.py::TestUIBuilderProtocol::test_ui_builder_spinner_creates_single_task PASSED [ 26%]
tests/cli/ui/test_protocols.py::TestUIBuilderProtocol::test_ui_builder_task_sequence_in_task_sequence PASSED [ 26%]
tests/cli/ui/test_protocols.py::TestUIBuilderProtocol::test_ui_builder_spinner_context_manager_protocol PASSED [ 26%]
tests/cli/ui/test_protocols.py::TestProtocolComposition::test_ui_builder_creates_task_sequences PASSED [ 26%]
tests/cli/ui/test_protocols.py::TestProtocolComposition::test_task_sequence_manages_task_lifecycle PASSED [ 26%]
tests/cli/ui/test_protocols.py::TestProtocolComposition::test_task_handle_progress_tracking PASSED [ 26%]
tests/cli/ui/test_protocols.py::TestProtocolComposition::test_widget_protocol_implementations PASSED [ 26%]
tests/cli/ui/test_protocols.py::TestProtocolComposition::test_task_handle_multiple_operations PASSED [ 27%]
tests/cli/ui/test_protocols.py::TestProtocolComposition::test_protocol_duck_typing PASSED [ 27%]
tests/cli/ui/test_protocols.py::TestWidgetProtocolRendering::test_widget_render_with_different_outputs PASSED [ 27%]
tests/cli/ui/test_protocols.py::TestWidgetProtocolRendering::test_widget_json_serialization PASSED [ 27%]
tests/cli/ui/test_protocols.py::TestTaskHandleFullWorkflow::test_task_complete_with_large_numbers PASSED [ 27%]
tests/cli/ui/test_protocols.py::TestTaskHandleFullWorkflow::test_task_failure_preserves_context PASSED [ 27%]
tests/cli/ui/test_protocols.py::TestTaskSequenceAdvanced::test_task_sequence_with_multiple_sequential_operations PASSED [ 27%]
tests/cli/ui/test_protocols.py::TestTaskSequenceAdvanced::test_task_with_late_bound_total PASSED [ 27%]
tests/cli/ui/test_protocols.py::TestUIBuilderWithVariousScenarios::test_builder_empty_task_sequence PASSED [ 27%]
tests/cli/ui/test_protocols.py::TestUIBuilderWithVariousScenarios::test_builder_many_tasks PASSED [ 27%]
tests/cli/ui/test_protocols.py::TestUIBuilderWithVariousScenarios::test_spinner_with_progress PASSED [ 27%]
tests/cli/ui/test_protocols.py::TestUIBuilderWithVariousScenarios::test_mixed_task_outcomes PASSED [ 27%]
tests/cli/ui/widgets/test_log_window.py::TestLogLevelEnum::test_log_levels_defined PASSED [ 27%]
tests/cli/ui/widgets/test_log_window.py::TestLogLevelEnum::test_log_symbols_complete PASSED [ 27%]
tests/cli/ui/widgets/test_log_window.py::TestLogLevelEnum::test_log_symbols_format PASSED [ 27%]
tests/cli/ui/widgets/test_log_window.py::TestLogLevelEnum::test_log_symbol_colors PASSED [ 27%]
tests/cli/ui/widgets/test_log_window.py::TestLogLevelEnum::test_log_symbol_characters PASSED [ 27%]
tests/cli/ui/widgets/test_log_window.py::TestLogEntry::test_log_entry_creation PASSED [ 27%]
tests/cli/ui/widgets/test_log_window.py::TestLogEntry::test_log_entry_timestamp_auto_set PASSED [ 27%]
tests/cli/ui/widgets/test_log_window.py::TestLogEntry::test_log_entry_timestamp_custom PASSED [ 27%]
tests/cli/ui/widgets/test_log_window.py::TestLogEntry::test_log_entry_render_returns_text PASSED [ 27%]
tests/cli/ui/widgets/test_log_window.py::TestLogEntry::test_log_entry_render_includes_symbol PASSED [ 27%]
tests/cli/ui/widgets/test_log_window.py::TestLogEntry::test_log_entry_render_includes_message PASSED [ 27%]
tests/cli/ui/widgets/test_log_window.py::TestLogEntry::test_log_entry_render_all_levels PASSED [ 27%]
tests/cli/ui/widgets/test_log_window.py::TestLogEntry::test_log_entry_to_json PASSED [ 27%]
tests/cli/ui/widgets/test_log_window.py::TestLogEntry::test_log_entry_to_json_all_levels PASSED [ 27%]
tests/cli/ui/widgets/test_log_window.py::TestLogWindowWidgetInitialization::test_default_initialization PASSED [ 28%]
tests/cli/ui/widgets/test_log_window.py::TestLogWindowWidgetInitialization::test_custom_max_size PASSED [ 28%]
tests/cli/ui/widgets/test_log_window.py::TestLogWindowWidgetInitialization::test_separator_toggle PASSED [ 28%]
tests/cli/ui/widgets/test_log_window.py::TestLogWindowWidgetInitialization::test_initial_state PASSED [ 28%]
tests/cli/ui/widgets/test_log_window.py::TestLogWindowWidgetLogging::test_log_with_default_level PASSED [ 28%]
tests/cli/ui/widgets/test_log_window.py::TestLogWindowWidgetLogging::test_log_with_explicit_level PASSED [ 28%]
tests/cli/ui/widgets/test_log_window.py::TestLogWindowWidgetLogging::test_info_adds_info_level PASSED [ 28%]
tests/cli/ui/widgets/test_log_window.py::TestLogWindowWidgetLogging::test_success_adds_success_level PASSED [ 28%]
tests/cli/ui/widgets/test_log_window.py::TestLogWindowWidgetLogging::test_warning_adds_warning_level PASSED [ 28%]
tests/cli/ui/widgets/test_log_window.py::TestLogWindowWidgetLogging::test_error_adds_error_level PASSED [ 28%]
tests/cli/ui/widgets/test_log_window.py::TestLogWindowWidgetLogging::test_fluent_chaining PASSED [ 28%]
tests/cli/ui/widgets/test_log_window.py::TestLogWindowWidgetRingBuffer::test_entries_stay_within_max_size PASSED [ 28%]
tests/cli/ui/widgets/test_log_window.py::TestLogWindowWidgetRingBuffer::test_oldest_entries_removed PASSED [ 28%]
tests/cli/ui/widgets/test_log_window.py::TestLogWindowWidgetRingBuffer::test_all_entries_tracked PASSED [ 28%]
tests/cli/ui/widgets/test_log_window.py::TestLogWindowWidgetRingBuffer::test_max_size_one PASSED [ 28%]
tests/cli/ui/widgets/test_log_window.py::TestLogWindowWidgetRingBuffer::test_max_size_large PASSED [ 28%]
tests/cli/ui/widgets/test_log_window.py::TestLogWindowWidgetClearing::test_clear_removes_all_entries PASSED [ 28%]
tests/cli/ui/widgets/test_log_window.py::TestLogWindowWidgetClearing::test_clear_empties_total_count PASSED [ 28%]
tests/cli/ui/widgets/test_log_window.py::TestLogWindowWidgetClearing::test_clear_returns_self PASSED [ 28%]
tests/cli/ui/widgets/test_log_window.py::TestLogWindowWidgetClearing::test_can_add_after_clear PASSED [ 28%]
tests/cli/ui/widgets/test_log_window.py::TestLogWindowWidgetProperties::test_visible_count_empty PASSED [ 28%]
tests/cli/ui/widgets/test_log_window.py::TestLogWindowWidgetProperties::test_visible_count_partial PASSED [ 28%]
tests/cli/ui/widgets/test_log_window.py::TestLogWindowWidgetProperties::test_total_count_exceeds_visible PASSED [ 28%]
tests/cli/ui/widgets/test_log_window.py::TestLogWindowWidgetProperties::test_has_entries_false_when_empty PASSED [ 28%]
tests/cli/ui/widgets/test_log_window.py::TestLogWindowWidgetProperties::test_has_entries_true_when_populated PASSED [ 28%]
tests/cli/ui/widgets/test_log_window.py::TestLogWindowWidgetProperties::test_has_entries_false_after_clear PASSED [ 28%]
tests/cli/ui/widgets/test_log_window.py::TestLogWindowWidgetRendering::test_render_returns_group PASSED [ 28%]
tests/cli/ui/widgets/test_log_window.py::TestLogWindowWidgetRendering::test_render_empty_returns_group PASSED [ 29%]
tests/cli/ui/widgets/test_log_window.py::TestLogWindowWidgetRendering::test_render_includes_separator PASSED [ 29%]
tests/cli/ui/widgets/test_log_window.py::TestLogWindowWidgetRendering::test_render_no_separator_when_disabled PASSED [ 29%]
tests/cli/ui/widgets/test_log_window.py::TestLogWindowWidgetRendering::test_render_no_separator_when_empty PASSED [ 29%]
tests/cli/ui/widgets/test_log_window.py::TestLogWindowWidgetRendering::test_render_shows_visible_entries PASSED [ 29%]
tests/cli/ui/widgets/test_log_window.py::TestLogWindowWidgetRendering::test_render_scrolled_out_not_shown PASSED [ 29%]
tests/cli/ui/widgets/test_log_window.py::TestLogWindowWidgetRendering::test_render_preserves_entry_order PASSED [ 29%]
tests/cli/ui/widgets/test_log_window.py::TestLogWindowWidgetRendering::test_render_different_levels_different_symbols PASSED [ 29%]
tests/cli/ui/widgets/test_log_window.py::TestLogWindowWidgetJSON::test_to_json_returns_dict PASSED [ 29%]
tests/cli/ui/widgets/test_log_window.py::TestLogWindowWidgetJSON::test_to_json_has_type PASSED [ 29%]
tests/cli/ui/widgets/test_log_window.py::TestLogWindowWidgetJSON::test_to_json_has_metadata PASSED [ 29%]
tests/cli/ui/widgets/test_log_window.py::TestLogWindowWidgetJSON::test_to_json_includes_visible_entries PASSED [ 29%]
tests/cli/ui/widgets/test_log_window.py::TestLogWindowWidgetJSON::test_to_json_includes_all_entries PASSED [ 29%]
tests/cli/ui/widgets/test_log_window.py::TestLogWindowWidgetJSON::test_to_json_entry_structure PASSED [ 29%]
tests/cli/ui/widgets/test_log_window.py::TestLogWindowWidgetJSON::test_to_json_empty_widget PASSED [ 29%]
tests/cli/ui/widgets/test_log_window.py::TestLogWindowWidgetJSON::test_to_json_preserves_entry_data PASSED [ 29%]
tests/cli/ui/widgets/test_log_window.py::TestLogWindowWidgetEdgeCases::test_entry_with_special_characters PASSED [ 29%]
tests/cli/ui/widgets/test_log_window.py::TestLogWindowWidgetEdgeCases::test_entry_with_unicode PASSED [ 29%]
tests/cli/ui/widgets/test_log_window.py::TestLogWindowWidgetEdgeCases::test_entry_with_very_long_message PASSED [ 29%]
tests/cli/ui/widgets/test_log_window.py::TestLogWindowWidgetEdgeCases::test_many_entries_quick_succession PASSED [ 29%]
tests/cli/ui/widgets/test_log_window.py::TestLogWindowWidgetEdgeCases::test_render_after_operations PASSED [ 29%]
tests/cli/ui/widgets/test_log_window.py::TestLogWindowWidgetEdgeCases::test_json_after_clear PASSED [ 29%]
tests/cli/ui/widgets/test_log_window.py::TestLogWindowWidgetIntegration::test_workflow_add_render_json PASSED [ 29%]
tests/cli/ui/widgets/test_log_window.py::TestLogWindowWidgetIntegration::test_scrolling_workflow PASSED [ 29%]
tests/cli/ui/widgets/test_log_window.py::TestLogWindowWidgetIntegration::test_mixed_levels_workflow PASSED [ 29%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetBasics::test_initialization_defaults PASSED [ 29%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetBasics::test_initialization_with_total PASSED [ 30%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetBasics::test_set_total PASSED [ 30%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetBasics::test_set_total_fluent_chaining PASSED [ 30%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetBasics::test_advance_increments_completed PASSED [ 30%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetBasics::test_advance_with_amount PASSED [ 30%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetBasics::test_advance_multiple_times PASSED [ 30%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetBasics::test_set_progress_updates_both PASSED [ 30%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetBasics::test_set_progress_only_completed PASSED [ 30%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetBasics::test_complete_marks_complete PASSED [ 30%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetBasics::test_complete_without_message PASSED [ 30%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetBasics::test_complete_sets_progress_to_total PASSED [ 30%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetBasics::test_fail_marks_failed PASSED [ 30%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetBasics::test_fail_without_message PASSED [ 30%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetBasics::test_fluent_chaining PASSED [ 30%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetProgress::test_determinate_progress_tracking PASSED [ 30%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetProgress::test_indeterminate_progress PASSED [ 30%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetProgress::test_completed_exceeds_total PASSED [ 30%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetProgress::test_progress_caps_at_100_percent PASSED [ 30%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetProgress::test_zero_total_handled_gracefully PASSED [ 30%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetRendering::test_render_returns_text PASSED [ 30%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetRendering::test_render_running_shows_spinner PASSED [ 30%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetRendering::test_render_spinner_cycles_through_frames PASSED [ 30%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetRendering::test_render_complete_shows_checkmark PASSED [ 30%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetRendering::test_render_failed_shows_x PASSED [ 30%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetRendering::test_render_indeterminate_shows_elapsed PASSED [ 30%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetRendering::test_render_determinate_shows_bar PASSED [ 30%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetRendering::test_render_description_included PASSED [ 31%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetRendering::test_render_with_special_characters PASSED [ 31%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetRendering::test_render_complete_without_message PASSED [ 31%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetRendering::test_render_animation_wraps_correctly PASSED [ 31%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetProgressBar::test_bar_shows_percentage PASSED [ 31%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetProgressBar::test_bar_shows_count PASSED [ 31%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetProgressBar::test_bar_shows_separator_bullets PASSED [ 31%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetProgressBar::test_bar_0_percent PASSED [ 31%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetProgressBar::test_bar_100_percent PASSED [ 31%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetProgressBar::test_bar_partial_progress PASSED [ 31%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetProgressBar::test_bar_width_customizable PASSED [ 31%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetProgressBar::test_bar_with_thousands_formatting PASSED [ 31%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetETACalculation::test_eta_not_available_without_progress PASSED [ 31%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetETACalculation::test_eta_not_available_without_total PASSED [ 31%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetETACalculation::test_eta_seconds_format PASSED [ 31%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetETACalculation::test_eta_minutes_format PASSED [ 31%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetETACalculation::test_eta_hours_format PASSED [ 31%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetETACalculation::test_eta_includes_remaining_text PASSED [ 31%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetETACalculation::test_eta_in_render_output PASSED [ 31%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetTimeFormatting::test_format_time_seconds PASSED [ 31%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetTimeFormatting::test_format_time_minutes_seconds PASSED [ 31%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetTimeFormatting::test_format_time_hours_minutes PASSED [ 31%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetTimeFormatting::test_format_time_zero_seconds PASSED [ 31%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetTimeFormatting::test_format_time_fractional_seconds PASSED [ 31%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetTimeFormatting::test_format_elapsed_includes_elapsed_text PASSED [ 31%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetTimeFormatting::test_format_time_at_boundaries PASSED [ 31%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetJSON::test_to_json_running_determinate PASSED [ 31%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetJSON::test_to_json_running_indeterminate PASSED [ 32%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetJSON::test_to_json_complete PASSED [ 32%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetJSON::test_to_json_failed PASSED [ 32%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetJSON::test_to_json_zero_total PASSED [ 32%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetJSON::test_to_json_large_numbers PASSED [ 32%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetEdgeCases::test_description_with_unicode PASSED [ 32%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetEdgeCases::test_long_description PASSED [ 32%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetEdgeCases::test_complete_message_with_unicode PASSED [ 32%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetEdgeCases::test_fail_message_with_unicode PASSED [ 32%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetEdgeCases::test_status_transitions_allowed PASSED [ 32%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetEdgeCases::test_multiple_advances_accumulate PASSED [ 32%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetEdgeCases::test_render_after_complete_shows_final_state PASSED [ 32%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetEdgeCases::test_render_after_fail_shows_final_state PASSED [ 32%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetEdgeCases::test_animation_frame_beyond_spinner_length PASSED [ 32%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetEdgeCases::test_negative_completed_handled PASSED [ 32%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetEdgeCases::test_custom_bar_width PASSED [ 32%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetRealWorldScenarios::test_gmail_archive_scenario PASSED [ 32%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetRealWorldScenarios::test_import_with_unknown_total_scenario PASSED [ 32%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetRealWorldScenarios::test_rapid_progress_updates PASSED [ 32%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetRealWorldScenarios::test_spinner_animation_over_time PASSED [ 32%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetRealWorldScenarios::test_progress_bar_animation_with_eta PASSED [ 32%]
tests/cli/ui/widgets/test_progress_bar.py::TestProgressBarWidgetRealWorldScenarios::test_transition_from_indeterminate_to_determinate PASSED [ 32%]
tests/cli/ui/widgets/test_table.py::TestColumnSpec::test_column_spec_default_values PASSED [ 32%]
tests/cli/ui/widgets/test_table.py::TestColumnSpec::test_column_spec_full_content_mode PASSED [ 32%]
tests/cli/ui/widgets/test_table.py::TestColumnSpec::test_column_spec_cut_content_mode PASSED [ 32%]
tests/cli/ui/widgets/test_table.py::TestColumnSpec::test_column_spec_with_all_parameters PASSED [ 32%]
tests/cli/ui/widgets/test_table.py::TestColumnSpec::test_column_spec_custom_style PASSED [ 33%]
tests/cli/ui/widgets/test_table.py::TestTableWidget::test_table_widget_initialization PASSED [ 33%]
tests/cli/ui/widgets/test_table.py::TestTableWidget::test_table_widget_expand_disabled PASSED [ 33%]
tests/cli/ui/widgets/test_table.py::TestTableWidget::test_add_column_returns_self PASSED [ 33%]
tests/cli/ui/widgets/test_table.py::TestTableWidget::test_add_column_single PASSED [ 33%]
tests/cli/ui/widgets/test_table.py::TestTableWidget::test_add_column_multiple PASSED [ 33%]
tests/cli/ui/widgets/test_table.py::TestTableWidget::test_add_column_with_ratio PASSED [ 33%]
tests/cli/ui/widgets/test_table.py::TestTableWidget::test_add_column_full_content_mode PASSED [ 33%]
tests/cli/ui/widgets/test_table.py::TestTableWidget::test_add_row_returns_self PASSED [ 33%]
tests/cli/ui/widgets/test_table.py::TestTableWidget::test_add_row_single PASSED [ 33%]
tests/cli/ui/widgets/test_table.py::TestTableWidget::test_add_row_multiple PASSED [ 33%]
tests/cli/ui/widgets/test_table.py::TestTableWidget::test_add_row_converts_values_to_strings PASSED [ 33%]
tests/cli/ui/widgets/test_table.py::TestTableWidget::test_add_rows_returns_self PASSED [ 33%]
tests/cli/ui/widgets/test_table.py::TestTableWidget::test_add_rows_multiple_rows PASSED [ 33%]
tests/cli/ui/widgets/test_table.py::TestTableWidget::test_add_rows_empty_list PASSED [ 33%]
tests/cli/ui/widgets/test_table.py::TestTableWidget::test_add_rows_converts_to_strings PASSED [ 33%]
tests/cli/ui/widgets/test_table.py::TestTableWidget::test_method_chaining_add_column_and_row PASSED [ 33%]
tests/cli/ui/widgets/test_table.py::TestTableWidget::test_render_calls_adapter_method PASSED [ 33%]
tests/cli/ui/widgets/test_table.py::TestTableWidget::test_render_passes_column_specs PASSED [ 33%]
tests/cli/ui/widgets/test_table.py::TestTableWidget::test_render_passes_rows PASSED [ 33%]
tests/cli/ui/widgets/test_table.py::TestTableWidget::test_render_cut_content_sets_ellipsis_overflow PASSED [ 33%]
tests/cli/ui/widgets/test_table.py::TestTableWidget::test_render_full_content_sets_fold_overflow PASSED [ 33%]
tests/cli/ui/widgets/test_table.py::TestTableWidget::test_render_to_output_calls_show_smart_table PASSED [ 33%]
tests/cli/ui/widgets/test_table.py::TestTableWidget::test_render_to_output_with_multiple_columns PASSED [ 33%]
tests/cli/ui/widgets/test_table.py::TestTableWidget::test_build_rich_table_creates_rich_table PASSED [ 33%]
tests/cli/ui/widgets/test_table.py::TestTableWidget::test_build_rich_table_adds_columns PASSED [ 33%]
tests/cli/ui/widgets/test_table.py::TestTableWidget::test_build_rich_table_adds_rows PASSED [ 34%]
tests/cli/ui/widgets/test_table.py::TestTableWidget::test_build_rich_table_respects_expand PASSED [ 34%]
tests/cli/ui/widgets/test_table.py::TestTableWidget::test_build_rich_table_cut_column_settings PASSED [ 34%]
tests/cli/ui/widgets/test_table.py::TestTableWidget::test_build_rich_table_full_column_settings PASSED [ 34%]
tests/cli/ui/widgets/test_table.py::TestTableWidget::test_column_spec_with_min_width PASSED [ 34%]
tests/cli/ui/widgets/test_table.py::TestTableWidget::test_render_empty_table PASSED [ 34%]
tests/cli/ui/widgets/test_table.py::TestTableWidget::test_complex_table_with_mixed_content_modes PASSED [ 34%]
tests/cli/ui/widgets/test_task.py::TestTaskWidgetBasics::test_initialization_defaults PASSED [ 34%]
tests/cli/ui/widgets/test_task.py::TestTaskWidgetBasics::test_start_changes_status PASSED [ 34%]
tests/cli/ui/widgets/test_task.py::TestTaskWidgetBasics::test_start_updates_start_time PASSED [ 34%]
tests/cli/ui/widgets/test_task.py::TestTaskWidgetBasics::test_complete_sets_success_status PASSED [ 34%]
tests/cli/ui/widgets/test_task.py::TestTaskWidgetBasics::test_fail_sets_failed_status PASSED [ 34%]
tests/cli/ui/widgets/test_task.py::TestTaskWidgetBasics::test_fail_without_reason PASSED [ 34%]
tests/cli/ui/widgets/test_task.py::TestTaskWidgetBasics::test_warn_sets_warning_status PASSED [ 34%]
tests/cli/ui/widgets/test_task.py::TestTaskWidgetBasics::test_fluent_chaining PASSED [ 34%]
tests/cli/ui/widgets/test_task.py::TestTaskWidgetProgress::test_set_progress_updates_both PASSED [ 34%]
tests/cli/ui/widgets/test_task.py::TestTaskWidgetProgress::test_set_progress_only_completed PASSED [ 34%]
tests/cli/ui/widgets/test_task.py::TestTaskWidgetProgress::test_advance_increments_completed PASSED [ 34%]
tests/cli/ui/widgets/test_task.py::TestTaskWidgetProgress::test_advance_with_amount PASSED [ 34%]
tests/cli/ui/widgets/test_task.py::TestTaskWidgetProgress::test_advance_multiple_times PASSED [ 34%]
tests/cli/ui/widgets/test_task.py::TestTaskWidgetRendering::test_render_returns_text PASSED [ 34%]
tests/cli/ui/widgets/test_task.py::TestTaskWidgetRendering::test_render_pending_shows_dim_circle PASSED [ 34%]
tests/cli/ui/widgets/test_task.py::TestTaskWidgetRendering::test_render_running_shows_spinner PASSED [ 34%]
tests/cli/ui/widgets/test_task.py::TestTaskWidgetRendering::test_render_running_with_different_frames PASSED [ 34%]
tests/cli/ui/widgets/test_task.py::TestTaskWidgetRendering::test_render_success_shows_checkmark PASSED [ 34%]
tests/cli/ui/widgets/test_task.py::TestTaskWidgetRendering::test_render_failed_shows_x PASSED [ 34%]
tests/cli/ui/widgets/test_task.py::TestTaskWidgetRendering::test_render_warning_shows_triangle PASSED [ 34%]
tests/cli/ui/widgets/test_task.py::TestTaskWidgetRendering::test_render_running_without_progress PASSED [ 35%]
tests/cli/ui/widgets/test_task.py::TestTaskWidgetRendering::test_render_running_with_progress PASSED [ 35%]
tests/cli/ui/widgets/test_task.py::TestTaskWidgetRendering::test_render_success_with_message PASSED [ 35%]
tests/cli/ui/widgets/test_task.py::TestTaskWidgetRendering::test_render_success_without_message PASSED [ 35%]
tests/cli/ui/widgets/test_task.py::TestTaskWidgetETACalculation::test_eta_not_available_without_progress PASSED [ 35%]
tests/cli/ui/widgets/test_task.py::TestTaskWidgetETACalculation::test_eta_not_available_without_total PASSED [ 35%]
tests/cli/ui/widgets/test_task.py::TestTaskWidgetETACalculation::test_eta_seconds_format PASSED [ 35%]
tests/cli/ui/widgets/test_task.py::TestTaskWidgetETACalculation::test_eta_minutes_format PASSED [ 35%]
tests/cli/ui/widgets/test_task.py::TestTaskWidgetETACalculation::test_eta_hours_format PASSED [ 35%]
tests/cli/ui/widgets/test_task.py::TestTaskWidgetETACalculation::test_eta_zero_rate_returns_none PASSED [ 35%]
tests/cli/ui/widgets/test_task.py::TestTaskWidgetProgressRendering::test_progress_bar_empty PASSED [ 35%]
tests/cli/ui/widgets/test_task.py::TestTaskWidgetProgressRendering::test_progress_bar_full PASSED [ 35%]
tests/cli/ui/widgets/test_task.py::TestTaskWidgetProgressRendering::test_progress_bar_partial PASSED [ 35%]
tests/cli/ui/widgets/test_task.py::TestTaskWidgetProgressRendering::test_progress_shows_count PASSED [ 35%]
tests/cli/ui/widgets/test_task.py::TestTaskWidgetProgressRendering::test_progress_with_small_total PASSED [ 35%]
tests/cli/ui/widgets/test_task.py::TestTaskWidgetJSON::test_to_json_pending PASSED [ 35%]
tests/cli/ui/widgets/test_task.py::TestTaskWidgetJSON::test_to_json_running PASSED [ 35%]
tests/cli/ui/widgets/test_task.py::TestTaskWidgetJSON::test_to_json_success PASSED [ 35%]
tests/cli/ui/widgets/test_task.py::TestTaskWidgetJSON::test_to_json_failed PASSED [ 35%]
tests/cli/ui/widgets/test_task.py::TestTaskWidgetJSON::test_to_json_warning PASSED [ 35%]
tests/cli/ui/widgets/test_task.py::TestTaskWidgetStatusSymbols::test_status_symbols_defined PASSED [ 35%]
tests/cli/ui/widgets/test_task.py::TestTaskWidgetStatusSymbols::test_pending_symbol PASSED [ 35%]
tests/cli/ui/widgets/test_task.py::TestTaskWidgetStatusSymbols::test_success_symbol PASSED [ 35%]
tests/cli/ui/widgets/test_task.py::TestTaskWidgetStatusSymbols::test_failed_symbol PASSED [ 35%]
tests/cli/ui/widgets/test_task.py::TestTaskWidgetStatusSymbols::test_warning_symbol PASSED [ 35%]
tests/cli/ui/widgets/test_task.py::TestTaskWidgetStatusSymbols::test_running_symbol PASSED [ 35%]
tests/cli/ui/widgets/test_task.py::TestSpinnerFrames::test_spinner_frames_defined PASSED [ 36%]
tests/cli/ui/widgets/test_task.py::TestSpinnerFrames::test_spinner_frames_are_unique PASSED [ 36%]
tests/cli/ui/widgets/test_task.py::TestSpinnerFrames::test_spinner_frames_are_strings PASSED [ 36%]
tests/cli/ui/widgets/test_task.py::TestSpinnerFrames::test_animation_frame_wraps_around PASSED [ 36%]
tests/cli/ui/widgets/test_task.py::TestTaskWidgetEdgeCases::test_task_description_with_special_characters PASSED [ 36%]
tests/cli/ui/widgets/test_task.py::TestTaskWidgetEdgeCases::test_task_result_with_unicode PASSED [ 36%]
tests/cli/ui/widgets/test_task.py::TestTaskWidgetEdgeCases::test_task_failure_reason_very_long PASSED [ 36%]
tests/cli/ui/widgets/test_task.py::TestTaskWidgetEdgeCases::test_task_zero_total PASSED [ 36%]
tests/cli/ui/widgets/test_task.py::TestTaskWidgetEdgeCases::test_task_completed_exceeds_total PASSED [ 36%]
tests/cli/ui/widgets/test_task.py::TestTaskWidgetEdgeCases::test_task_status_transitions PASSED [ 36%]
tests/cli/ui/widgets/test_workflow_progress.py::TestWorkflowProgressWidgetInitialization::test_default_initialization PASSED [ 36%]
tests/cli/ui/widgets/test_workflow_progress.py::TestWorkflowProgressWidgetInitialization::test_custom_initialization PASSED [ 36%]
tests/cli/ui/widgets/test_workflow_progress.py::TestWorkflowProgressWidgetInitialization::test_log_window_initialized PASSED [ 36%]
tests/cli/ui/widgets/test_workflow_progress.py::TestWorkflowProgressWidgetInitialization::test_tasks_list_empty_initially PASSED [ 36%]
tests/cli/ui/widgets/test_workflow_progress.py::TestWorkflowProgressWidgetTaskManagement::test_add_task_returns_widget PASSED [ 36%]
tests/cli/ui/widgets/test_workflow_progress.py::TestWorkflowProgressWidgetTaskManagement::test_add_task_increments_count PASSED [ 36%]
tests/cli/ui/widgets/test_workflow_progress.py::TestWorkflowProgressWidgetTaskManagement::test_add_multiple_tasks PASSED [ 36%]
tests/cli/ui/widgets/test_workflow_progress.py::TestWorkflowProgressWidgetTaskManagement::test_current_task_returns_running_task PASSED [ 36%]
tests/cli/ui/widgets/test_workflow_progress.py::TestWorkflowProgressWidgetTaskManagement::test_current_task_returns_none_when_no_running_task PASSED [ 36%]
tests/cli/ui/widgets/test_workflow_progress.py::TestWorkflowProgressWidgetTaskManagement::test_current_task_returns_most_recent_running PASSED [ 36%]
tests/cli/ui/widgets/test_workflow_progress.py::TestWorkflowProgressWidgetTaskManagement::test_current_task_none_when_empty PASSED [ 36%]
tests/cli/ui/widgets/test_workflow_progress.py::TestWorkflowProgressWidgetLogging::test_log_adds_entry PASSED [ 36%]
tests/cli/ui/widgets/test_workflow_progress.py::TestWorkflowProgressWidgetLogging::test_log_with_custom_level PASSED [ 36%]
tests/cli/ui/widgets/test_workflow_progress.py::TestWorkflowProgressWidgetLogging::test_log_returns_self PASSED [ 36%]
tests/cli/ui/widgets/test_workflow_progress.py::TestWorkflowProgressWidgetLogging::test_log_success_adds_success_entry PASSED [ 36%]
tests/cli/ui/widgets/test_workflow_progress.py::TestWorkflowProgressWidgetLogging::test_log_warning_adds_warning_entry PASSED [ 36%]
tests/cli/ui/widgets/test_workflow_progress.py::TestWorkflowProgressWidgetLogging::test_log_error_adds_error_entry PASSED [ 37%]
tests/cli/ui/widgets/test_workflow_progress.py::TestWorkflowProgressWidgetLogging::test_log_info_adds_info_entry PASSED [ 37%]
tests/cli/ui/widgets/test_workflow_progress.py::TestWorkflowProgressWidgetLogging::test_log_methods_return_self PASSED [ 37%]
tests/cli/ui/widgets/test_workflow_progress.py::TestWorkflowProgressWidgetLogging::test_fluent_chaining_logging PASSED [ 37%]
tests/cli/ui/widgets/test_workflow_progress.py::TestWorkflowProgressWidgetLogging::test_logging_disabled_when_show_logs_false PASSED [ 37%]
tests/cli/ui/widgets/test_workflow_progress.py::TestWorkflowProgressWidgetLogging::test_logging_enabled_when_show_logs_true PASSED [ 37%]
tests/cli/ui/widgets/test_workflow_progress.py::TestWorkflowProgressWidgetProperties::test_task_count_property PASSED [ 37%]
tests/cli/ui/widgets/test_workflow_progress.py::TestWorkflowProgressWidgetProperties::test_log_count_property PASSED [ 37%]
tests/cli/ui/widgets/test_workflow_progress.py::TestWorkflowProgressWidgetProperties::test_log_count_exceeds_visible PASSED [ 37%]
tests/cli/ui/widgets/test_workflow_progress.py::TestWorkflowProgressWidgetRendering::test_render_returns_group PASSED [ 37%]
tests/cli/ui/widgets/test_workflow_progress.py::TestWorkflowProgressWidgetRendering::test_render_empty_widget PASSED [ 37%]
tests/cli/ui/widgets/test_workflow_progress.py::TestWorkflowProgressWidgetRendering::test_render_single_task PASSED [ 37%]
tests/cli/ui/widgets/test_workflow_progress.py::TestWorkflowProgressWidgetRendering::test_render_multiple_tasks PASSED [ 37%]
tests/cli/ui/widgets/test_workflow_progress.py::TestWorkflowProgressWidgetRendering::test_render_with_animation_frame PASSED [ 37%]
tests/cli/ui/widgets/test_workflow_progress.py::TestWorkflowProgressWidgetRendering::test_render_includes_log_window_when_enabled PASSED [ 37%]
tests/cli/ui/widgets/test_workflow_progress.py::TestWorkflowProgressWidgetRendering::test_render_excludes_log_window_when_disabled PASSED [ 37%]
tests/cli/ui/widgets/test_workflow_progress.py::TestWorkflowProgressWidgetRendering::test_render_excludes_empty_log_window PASSED [ 37%]
tests/cli/ui/widgets/test_workflow_progress.py::TestWorkflowProgressWidgetRendering::test_render_different_animation_frames PASSED [ 37%]
tests/cli/ui/widgets/test_workflow_progress.py::TestWorkflowProgressWidgetJSON::test_to_json_returns_dict PASSED [ 37%]
tests/cli/ui/widgets/test_workflow_progress.py::TestWorkflowProgressWidgetJSON::test_to_json_empty_widget PASSED [ 37%]
tests/cli/ui/widgets/test_workflow_progress.py::TestWorkflowProgressWidgetJSON::test_to_json_with_tasks PASSED [ 37%]
tests/cli/ui/widgets/test_workflow_progress.py::TestWorkflowProgressWidgetJSON::test_to_json_with_logs_enabled PASSED [ 37%]
tests/cli/ui/widgets/test_workflow_progress.py::TestWorkflowProgressWidgetJSON::test_to_json_with_logs_disabled PASSED [ 37%]
tests/cli/ui/widgets/test_workflow_progress.py::TestWorkflowProgressWidgetJSON::test_to_json_structure PASSED [ 37%]
tests/cli/ui/widgets/test_workflow_progress.py::TestWorkflowProgressWidgetIntegration::test_full_workflow_archive PASSED [ 37%]
tests/cli/ui/widgets/test_workflow_progress.py::TestWorkflowProgressWidgetIntegration::test_workflow_with_failure PASSED [ 37%]
tests/cli/ui/widgets/test_workflow_progress.py::TestWorkflowProgressWidgetIntegration::test_workflow_with_warnings PASSED [ 37%]
tests/cli/ui/widgets/test_workflow_progress.py::TestWorkflowProgressWidgetIntegration::test_fluent_workflow_building PASSED [ 38%]
tests/cli/ui/widgets/test_workflow_progress.py::TestWorkflowProgressWidgetIntegration::test_workflow_logging_with_different_levels PASSED [ 38%]
tests/cli/ui/widgets/test_workflow_progress.py::TestWorkflowProgressWidgetIntegration::test_workflow_render_sequence PASSED [ 38%]
tests/cli/ui/widgets/test_workflow_progress.py::TestWorkflowProgressWidgetIntegration::test_multiple_workflows_independent PASSED [ 38%]
tests/cli/ui/widgets/test_workflow_progress.py::TestWorkflowProgressWidgetIntegration::test_workflow_json_export PASSED [ 38%]
tests/cli/ui/widgets/test_workflow_progress.py::TestWorkflowProgressWidgetEdgeCases::test_task_with_long_description PASSED [ 38%]
tests/cli/ui/widgets/test_workflow_progress.py::TestWorkflowProgressWidgetEdgeCases::test_log_with_unicode_characters PASSED [ 38%]
tests/cli/ui/widgets/test_workflow_progress.py::TestWorkflowProgressWidgetEdgeCases::test_many_tasks PASSED [ 38%]
tests/cli/ui/widgets/test_workflow_progress.py::TestWorkflowProgressWidgetEdgeCases::test_log_window_overflow PASSED [ 38%]
tests/cli/ui/widgets/test_workflow_progress.py::TestWorkflowProgressWidgetEdgeCases::test_render_no_crash_with_mixed_states PASSED [ 38%]
tests/cli/ui/widgets/test_workflow_progress.py::TestWorkflowProgressWidgetEdgeCases::test_current_task_with_all_status_types PASSED [ 38%]
tests/cli/ui/widgets/test_workflow_progress.py::TestWorkflowProgressWidgetEdgeCases::test_task_status_transitions PASSED [ 38%]
tests/cli/ui/widgets/test_workflow_progress.py::TestWorkflowProgressWidgetEdgeCases::test_empty_widget_json PASSED [ 38%]
tests/connectors/test_auth.py::TestGmailAuthenticatorInit::test_default_initialization PASSED [ 38%]
tests/connectors/test_auth.py::TestGmailAuthenticatorInit::test_custom_file_paths PASSED [ 38%]
tests/connectors/test_auth.py::TestGmailAuthenticatorInit::test_path_traversal_blocked_credentials PASSED [ 38%]
tests/connectors/test_auth.py::TestGmailAuthenticatorInit::test_path_traversal_blocked_token PASSED [ 38%]
tests/connectors/test_auth.py::TestGmailAuthenticatorInit::test_absolute_path_outside_cwd_blocked PASSED [ 38%]
tests/connectors/test_auth.py::TestGmailAuthenticatorAuthenticate::test_load_existing_token_json PASSED [ 38%]
tests/connectors/test_auth.py::TestGmailAuthenticatorAuthenticate::test_missing_credentials_file_error PASSED [ 38%]
tests/connectors/test_auth.py::TestGmailAuthenticatorAuthenticate::test_refresh_expired_token PASSED [ 38%]
tests/connectors/test_auth.py::TestGmailAuthenticatorAuthenticate::test_save_token_as_json PASSED [ 38%]
tests/connectors/test_auth.py::TestGmailAuthenticatorAuthenticate::test_credentials_property PASSED [ 38%]
tests/connectors/test_auth.py::TestGmailAuthenticatorRevoke::test_revoke_deletes_token_file PASSED [ 38%]
tests/connectors/test_auth.py::TestGmailAuthenticatorRevoke::test_revoke_nonexistent_token_file PASSED [ 38%]
tests/connectors/test_auth.py::TestBackwardCompatibility::test_migration_from_pickle_to_json PASSED [ 38%]
tests/connectors/test_auth.py::TestAuthErrorPaths::test_corrupt_token_json PASSED [ 39%]
tests/connectors/test_auth.py::TestAuthErrorPaths::test_token_refresh_failure PASSED [ 39%]
tests/connectors/test_auth.py::TestAuthErrorPaths::test_oauth_flow_failure PASSED [ 39%]
tests/connectors/test_auth.py::TestAuthErrorPaths::test_token_save_failure PASSED [ 39%]
tests/connectors/test_auth_scopes.py::TestOAuthScopes::test_scopes_include_full_gmail_access PASSED [ 39%]
tests/connectors/test_auth_scopes.py::TestScopeValidation::test_validate_scopes_with_full_access PASSED [ 39%]
tests/connectors/test_auth_scopes.py::TestScopeValidation::test_validate_scopes_missing_required PASSED [ 39%]
tests/connectors/test_auth_scopes.py::TestScopeValidation::test_validate_scopes_no_credentials PASSED [ 39%]
tests/connectors/test_auth_scopes.py::TestScopeValidation::test_validate_scopes_credentials_without_scopes PASSED [ 39%]
tests/connectors/test_auth_scopes.py::TestScopeValidation::test_validate_scopes_full_access_covers_subset PASSED [ 39%]
tests/connectors/test_auth_scopes.py::TestScopeValidation::test_validate_scopes_specific_scopes_check PASSED [ 39%]
tests/connectors/test_gmail_client.py::TestAdaptiveRateLimiterInit::test_init_with_defaults PASSED [ 39%]
tests/connectors/test_gmail_client.py::TestAdaptiveRateLimiterInit::test_init_with_custom_params PASSED [ 39%]
tests/connectors/test_gmail_client.py::TestAdaptiveRateLimiterAcquire::test_acquire_with_available_tokens PASSED [ 39%]
tests/connectors/test_gmail_client.py::TestAdaptiveRateLimiterAcquire::test_acquire_decrements_tokens PASSED [ 39%]
tests/connectors/test_gmail_client.py::TestAdaptiveRateLimiterAcquire::test_acquire_waits_when_no_tokens PASSED [ 39%]
tests/connectors/test_gmail_client.py::TestAdaptiveRateLimiterOnSuccess::test_on_success_increments_counter PASSED [ 39%]
tests/connectors/test_gmail_client.py::TestAdaptiveRateLimiterOnSuccess::test_on_success_increases_rate_after_threshold PASSED [ 39%]
tests/connectors/test_gmail_client.py::TestAdaptiveRateLimiterOnSuccess::test_on_success_respects_max_rate PASSED [ 39%]
tests/connectors/test_gmail_client.py::TestAdaptiveRateLimiterOnRateLimit::test_on_rate_limit_reduces_rate PASSED [ 39%]
tests/connectors/test_gmail_client.py::TestAdaptiveRateLimiterOnRateLimit::test_on_rate_limit_respects_minimum PASSED [ 39%]
tests/connectors/test_gmail_client.py::TestAdaptiveRateLimiterOnRateLimit::test_on_rate_limit_resets_success_counter PASSED [ 39%]
tests/connectors/test_gmail_client.py::TestAdaptiveRateLimiterOnRateLimit::test_on_rate_limit_returns_retry_after PASSED [ 39%]
tests/connectors/test_gmail_client.py::TestAdaptiveRateLimiterOnRateLimit::test_on_rate_limit_returns_backoff_when_no_retry_after PASSED [ 39%]
tests/connectors/test_gmail_client.py::TestAdaptiveRateLimiterOnServerError::test_on_server_error_does_not_reduce_rate PASSED [ 39%]
tests/connectors/test_gmail_client.py::TestAdaptiveRateLimiterOnServerError::test_on_server_error_returns_backoff PASSED [ 39%]
tests/connectors/test_gmail_client.py::TestGmailClientInit::test_init_stores_credentials PASSED [ 40%]
tests/connectors/test_gmail_client.py::TestGmailClientInit::test_init_with_custom_params PASSED [ 40%]
tests/connectors/test_gmail_client.py::TestGmailClientInit::test_init_creates_rate_limiter PASSED [ 40%]
tests/connectors/test_gmail_client.py::TestGmailClientListMessages::test_list_messages_yields_all_messages PASSED [ 40%]
tests/connectors/test_gmail_client.py::TestGmailClientListMessages::test_list_messages_handles_pagination PASSED [ 40%]
tests/connectors/test_gmail_client.py::TestGmailClientListMessages::test_list_messages_handles_empty_response PASSED [ 40%]
tests/connectors/test_gmail_client.py::TestGmailClientListMessages::test_list_messages_builds_correct_url PASSED [ 40%]
tests/connectors/test_gmail_client.py::TestGmailClientGetMessage::test_get_message_returns_message_data PASSED [ 40%]
tests/connectors/test_gmail_client.py::TestGmailClientGetMessage::test_get_message_uses_raw_format_by_default PASSED [ 40%]
tests/connectors/test_gmail_client.py::TestGmailClientGetMessage::test_get_message_accepts_format_parameter PASSED [ 40%]
tests/connectors/test_gmail_client.py::TestGmailClientGetMessagesBatch::test_get_messages_batch_yields_all_messages PASSED [ 40%]
tests/connectors/test_gmail_client.py::TestGmailClientGetMessagesBatch::test_get_messages_batch_respects_batch_size PASSED [ 40%]
tests/connectors/test_gmail_client.py::TestGmailClientDecodeMessage::test_decode_message_raw_decodes_base64 PASSED [ 40%]
tests/connectors/test_gmail_client.py::TestGmailClientDecodeMessage::test_decode_message_raw_raises_on_missing_raw PASSED [ 40%]
tests/connectors/test_gmail_client.py::TestGmailClientTrashMessages::test_trash_messages_returns_count PASSED [ 40%]
tests/connectors/test_gmail_client.py::TestGmailClientTrashMessages::test_trash_messages_calls_correct_endpoint PASSED [ 40%]
tests/connectors/test_gmail_client.py::TestGmailClientDeleteMessagesPermanent::test_delete_permanent_returns_count PASSED [ 40%]
tests/connectors/test_gmail_client.py::TestGmailClientDeleteMessagesPermanent::test_delete_permanent_uses_batch_delete_endpoint PASSED [ 40%]
tests/connectors/test_gmail_client.py::TestGmailClientSearchByRfcMessageId::test_search_by_rfc_message_id_found PASSED [ 40%]
tests/connectors/test_gmail_client.py::TestGmailClientSearchByRfcMessageId::test_search_by_rfc_message_id_not_found PASSED [ 40%]
tests/connectors/test_gmail_client.py::TestGmailClientSearchByRfcMessageId::test_search_by_rfc_message_id_strips_brackets PASSED [ 40%]
tests/connectors/test_gmail_client.py::TestGmailClientSearchByRfcMessageId::test_search_by_rfc_message_id_handles_empty PASSED [ 40%]
tests/connectors/test_gmail_client.py::TestGmailClientCreate::test_create_returns_authenticated_client PASSED [ 40%]
tests/connectors/test_gmail_client.py::TestGmailClientCreate::test_create_uses_default_credentials PASSED [ 40%]
tests/connectors/test_gmail_client.py::TestGmailClientCreate::test_create_with_custom_credentials_file PASSED [ 40%]
tests/connectors/test_gmail_client.py::TestGmailClientCreate::test_create_propagates_auth_failure PASSED [ 40%]
tests/connectors/test_gmail_client.py::TestGmailClientCreate::test_create_client_is_connected PASSED [ 40%]
tests/connectors/test_gmail_client.py::TestGmailClientCreate::test_create_with_custom_batch_size PASSED [ 41%]
tests/connectors/test_gmail_client.py::TestGmailClientCreate::test_create_client_usable_as_context_manager PASSED [ 41%]
tests/connectors/test_gmail_client.py::TestGmailClientGetHeaders::test_get_headers_returns_authorization_header PASSED [ 41%]
tests/connectors/test_gmail_client.py::TestGmailClientEnsureValidToken::test_ensure_valid_token_returns_immediately_if_not_expired PASSED [ 41%]
tests/connectors/test_gmail_client.py::TestGmailClientEnsureValidToken::test_ensure_valid_token_returns_if_no_refresh_token PASSED [ 41%]
tests/connectors/test_gmail_client.py::TestGmailClientEnsureValidToken::test_ensure_valid_token_initializes_lock_if_missing PASSED [ 41%]
tests/connectors/test_gmail_client.py::TestGmailClientEnsureValidToken::test_ensure_valid_token_refreshes_expired_token PASSED [ 41%]
tests/connectors/test_gmail_client.py::TestGmailClientEnsureValidToken::test_ensure_valid_token_avoids_concurrent_refresh PASSED [ 41%]
tests/connectors/test_gmail_client.py::TestGmailClientRefreshTokenSync::test_refresh_token_sync_calls_credentials_refresh PASSED [ 41%]
tests/connectors/test_gmail_client.py::TestGmailClientRequestWithRetry::test_request_with_retry_raises_if_client_not_initialized PASSED [ 41%]
tests/connectors/test_gmail_client.py::TestGmailClientRequestWithRetry::test_request_with_retry_handles_429_rate_limit PASSED [ 41%]
tests/connectors/test_gmail_client.py::TestGmailClientRequestWithRetry::test_request_with_retry_handles_500_server_error PASSED [ 41%]
tests/connectors/test_gmail_client.py::TestGmailClientRequestWithRetry::test_request_with_retry_raises_for_4xx_errors PASSED [ 41%]
tests/connectors/test_gmail_client.py::TestGmailClientRequestWithRetry::test_request_with_retry_handles_timeout PASSED [ 41%]
tests/connectors/test_gmail_client.py::TestGmailClientRequestWithRetry::test_request_with_retry_raises_timeout_after_all_retries PASSED [ 41%]
tests/connectors/test_gmail_client.py::TestGmailClientRequestWithRetry::test_request_with_retry_raises_after_all_retries_exhausted PASSED [ 41%]
tests/connectors/test_gmail_client.py::TestGmailClientGetMessagesBatchErrorHandling::test_get_messages_batch_continues_on_fetch_failure PASSED [ 41%]
tests/connectors/test_gmail_client.py::TestGmailClientTrashMessagesErrorHandling::test_trash_messages_continues_on_individual_failure PASSED [ 41%]
tests/connectors/test_gmail_client.py::TestGmailClientDeleteMessagesErrorHandling::test_delete_permanent_continues_on_batch_failure PASSED [ 41%]
tests/connectors/test_gmail_client.py::TestGmailClientSearchByRfcMessageId404::test_search_by_rfc_message_id_returns_none_on_404 PASSED [ 41%]
tests/connectors/test_gmail_client.py::TestGmailClientSearchByRfcMessageId404::test_search_by_rfc_message_id_raises_on_other_http_errors PASSED [ 41%]
tests/connectors/test_gmail_client.py::TestGmailClientSearchByRfcMessageIdsBatch::test_search_batch_returns_mapping PASSED [ 41%]
tests/connectors/test_gmail_client.py::TestGmailClientSearchByRfcMessageIdsBatch::test_search_batch_calls_progress_callback PASSED [ 41%]
tests/connectors/test_gmail_client.py::TestGmailClientSearchByRfcMessageIdsBatch::test_search_batch_respects_batch_size PASSED [ 41%]
tests/connectors/test_gmail_client.py::TestGmailClientSearchByRfcMessageIdsBatch::test_search_batch_without_progress_callback PASSED [ 41%]
tests/connectors/test_platform_scheduler.py::TestPlatformDetection::test_detect_linux_platform PASSED [ 41%]
tests/connectors/test_platform_scheduler.py::TestPlatformDetection::test_detect_macos_platform PASSED [ 42%]
tests/connectors/test_platform_scheduler.py::TestPlatformDetection::test_detect_windows_platform PASSED [ 42%]
tests/connectors/test_platform_scheduler.py::TestPlatformDetection::test_unsupported_platform_raises_error PASSED [ 42%]
tests/connectors/test_platform_scheduler.py::TestSystemdScheduler::test_generate_timer_unit_daily PASSED [ 42%]
tests/connectors/test_platform_scheduler.py::TestSystemdScheduler::test_generate_timer_unit_weekly PASSED [ 42%]
tests/connectors/test_platform_scheduler.py::TestSystemdScheduler::test_generate_timer_unit_monthly PASSED [ 42%]
tests/connectors/test_platform_scheduler.py::TestSystemdScheduler::test_generate_service_unit PASSED [ 42%]
tests/connectors/test_platform_scheduler.py::TestSystemdScheduler::test_get_timer_filename PASSED [ 42%]
tests/connectors/test_platform_scheduler.py::TestSystemdScheduler::test_get_service_filename PASSED [ 42%]
tests/connectors/test_platform_scheduler.py::TestSystemdScheduler::test_get_user_systemd_directory PASSED [ 42%]
tests/connectors/test_platform_scheduler.py::TestSystemdScheduler::test_install_creates_directory PASSED [ 42%]
tests/connectors/test_platform_scheduler.py::TestSystemdScheduler::test_install_creates_timer_and_service_files PASSED [ 42%]
tests/connectors/test_platform_scheduler.py::TestSystemdScheduler::test_install_enables_and_starts_timer PASSED [ 42%]
tests/connectors/test_platform_scheduler.py::TestSystemdScheduler::test_uninstall_stops_and_disables_timer PASSED [ 42%]
tests/connectors/test_platform_scheduler.py::TestSystemdScheduler::test_uninstall_removes_files PASSED [ 42%]
tests/connectors/test_platform_scheduler.py::TestLaunchdScheduler::test_generate_plist_daily PASSED [ 42%]
tests/connectors/test_platform_scheduler.py::TestLaunchdScheduler::test_generate_plist_weekly PASSED [ 42%]
tests/connectors/test_platform_scheduler.py::TestLaunchdScheduler::test_generate_plist_monthly PASSED [ 42%]
tests/connectors/test_platform_scheduler.py::TestLaunchdScheduler::test_get_plist_filename PASSED [ 42%]
tests/connectors/test_platform_scheduler.py::TestLaunchdScheduler::test_get_launchagents_directory PASSED [ 42%]
tests/connectors/test_platform_scheduler.py::TestLaunchdScheduler::test_install_creates_directory PASSED [ 42%]
tests/connectors/test_platform_scheduler.py::TestLaunchdScheduler::test_install_creates_plist_file PASSED [ 42%]
tests/connectors/test_platform_scheduler.py::TestLaunchdScheduler::test_install_loads_plist PASSED [ 42%]
tests/connectors/test_platform_scheduler.py::TestLaunchdScheduler::test_uninstall_unloads_plist PASSED [ 42%]
tests/connectors/test_platform_scheduler.py::TestLaunchdScheduler::test_uninstall_removes_plist_file PASSED [ 42%]
tests/connectors/test_platform_scheduler.py::TestTaskSchedulerWindows::test_generate_task_xml_daily PASSED [ 42%]
tests/connectors/test_platform_scheduler.py::TestTaskSchedulerWindows::test_generate_task_xml_weekly PASSED [ 43%]
tests/connectors/test_platform_scheduler.py::TestTaskSchedulerWindows::test_generate_task_xml_monthly PASSED [ 43%]
tests/connectors/test_platform_scheduler.py::TestTaskSchedulerWindows::test_get_task_name PASSED [ 43%]
tests/connectors/test_platform_scheduler.py::TestTaskSchedulerWindows::test_install_creates_task PASSED [ 43%]
tests/connectors/test_platform_scheduler.py::TestTaskSchedulerWindows::test_uninstall_deletes_task PASSED [ 43%]
tests/connectors/test_platform_scheduler.py::TestPlatformSchedulerInterface::test_systemd_implements_install PASSED [ 43%]
tests/connectors/test_platform_scheduler.py::TestPlatformSchedulerInterface::test_systemd_implements_uninstall PASSED [ 43%]
tests/connectors/test_platform_scheduler.py::TestPlatformSchedulerInterface::test_launchd_implements_install PASSED [ 43%]
tests/connectors/test_platform_scheduler.py::TestPlatformSchedulerInterface::test_launchd_implements_uninstall PASSED [ 43%]
tests/connectors/test_platform_scheduler.py::TestPlatformSchedulerInterface::test_taskscheduler_implements_install PASSED [ 43%]
tests/connectors/test_platform_scheduler.py::TestPlatformSchedulerInterface::test_taskscheduler_implements_uninstall PASSED [ 43%]
tests/core/doctor/test_repair_manager.py::TestFixResult::test_fix_result_success PASSED [ 43%]
tests/core/doctor/test_repair_manager.py::TestFixResult::test_fix_result_failure PASSED [ 43%]
tests/core/doctor/test_repair_manager.py::TestRepairManagerInitialization::test_init_with_db_manager PASSED [ 43%]
tests/core/doctor/test_repair_manager.py::TestRepairManagerInitialization::test_init_without_db_manager PASSED [ 43%]
tests/core/doctor/test_repair_manager.py::TestRepairManagerFixMissingDatabase::test_fix_missing_database_success PASSED [ 43%]
tests/core/doctor/test_repair_manager.py::TestRepairManagerFixMissingDatabase::test_fix_missing_database_connection_fails PASSED [ 43%]
tests/core/doctor/test_repair_manager.py::TestRepairManagerFixMissingDatabase::test_fix_missing_database_pragma_fails PASSED [ 43%]
tests/core/doctor/test_repair_manager.py::TestRepairManagerFixMissingDatabase::test_fix_missing_database_conn_none PASSED [ 43%]
tests/core/doctor/test_repair_manager.py::TestRepairManagerFixOrphanedFTS::test_fix_orphaned_fts_no_db_manager PASSED [ 43%]
tests/core/doctor/test_repair_manager.py::TestRepairManagerFixOrphanedFTS::test_fix_orphaned_fts_success PASSED [ 43%]
tests/core/doctor/test_repair_manager.py::TestRepairManagerFixOrphanedFTS::test_fix_orphaned_fts_fallback_heuristic PASSED [ 43%]
tests/core/doctor/test_repair_manager.py::TestRepairManagerFixOrphanedFTS::test_fix_orphaned_fts_no_connection PASSED [ 43%]
tests/core/doctor/test_repair_manager.py::TestRepairManagerFixOrphanedFTS::test_fix_orphaned_fts_exception PASSED [ 43%]
tests/core/doctor/test_repair_manager.py::TestRepairManagerFixStaleLocks::test_fix_stale_locks_removes_lock_files PASSED [ 43%]
tests/core/doctor/test_repair_manager.py::TestRepairManagerFixStaleLocks::test_fix_stale_locks_no_lock_files PASSED [ 43%]
tests/core/doctor/test_repair_manager.py::TestRepairManagerFixStaleLocks::test_fix_stale_locks_with_memory_database PASSED [ 43%]
tests/core/doctor/test_repair_manager.py::TestRepairManagerFixStaleLocks::test_fix_stale_locks_partial_permission_failure PASSED [ 44%]
tests/core/doctor/test_repair_manager.py::TestRepairManagerFixStaleLocks::test_fix_stale_locks_nonexistent_parent_directory PASSED [ 44%]
tests/core/doctor/test_repair_manager.py::TestRepairManagerFixStaleLocks::test_fix_stale_locks_exception_handling PASSED [ 44%]
tests/core/test_archiver.py::TestArchiverFacadeInit::test_init PASSED    [ 44%]
tests/core/test_archiver.py::TestArchiverFacadeInit::test_init_default_db_path PASSED [ 44%]
tests/core/test_archiver.py::TestArchive::test_archive_no_messages_found PASSED [ 44%]
tests/core/test_archiver.py::TestArchive::test_archive_all_already_archived PASSED [ 44%]
tests/core/test_archiver.py::TestArchive::test_archive_dry_run PASSED    [ 44%]
tests/core/test_archiver.py::TestArchive::test_archive_dry_run_with_compression PASSED [ 44%]
tests/core/test_archiver.py::TestArchive::test_archive_invalid_age_threshold PASSED [ 44%]
tests/core/test_archiver.py::TestArchive::test_archive_invalid_compression PASSED [ 44%]
tests/core/test_archiver.py::TestCompressArchive::test_compress_gzip PASSED [ 44%]
tests/core/test_archiver.py::TestCompressArchive::test_compress_lzma PASSED [ 44%]
tests/core/test_archiver.py::TestCompressArchive::test_compress_zstd PASSED [ 44%]
tests/core/test_archiver.py::TestCompressArchive::test_compress_invalid_format PASSED [ 44%]
tests/core/test_archiver.py::TestValidateArchive::test_validate_archive_success PASSED [ 44%]
tests/core/test_archiver.py::TestValidateArchive::test_validate_archive_failure PASSED [ 44%]
tests/core/test_archiver.py::TestArchiveMessagesIntegration::test_archive_works PASSED [ 44%]
tests/core/test_archiver.py::TestArchiveMessagesIntegration::test_archive_with_compression_workflow PASSED [ 44%]
tests/core/test_archiver.py::TestArchiveMessagesIntegration::test_archive_with_orphaned_lock_file PASSED [ 44%]
tests/core/test_archiver.py::TestArchiveMessagesIntegration::test_archive_records_state PASSED [ 44%]
tests/core/test_archiver.py::TestArchiveMessagesIntegration::test_archive_marks_messages_in_state PASSED [ 44%]
tests/core/test_archiver.py::TestDeleteArchivedMessages::test_delete_permanent PASSED [ 44%]
tests/core/test_archiver.py::TestDeleteArchivedMessages::test_delete_trash PASSED [ 44%]
tests/core/test_archiver.py::TestAtomicOperations::test_atomic_archive_both_succeed PASSED [ 44%]
tests/core/test_archiver.py::TestAtomicOperations::test_atomic_rollback_on_database_failure PASSED [ 44%]
tests/core/test_archiver.py::TestAtomicOperations::test_automatic_validation_after_archiving PASSED [ 45%]
tests/core/test_archiver.py::TestV11OffsetTracking::test_archive_with_v1_1_schema_tracks_offsets PASSED [ 45%]
tests/core/test_archiver.py::TestExceptionHandling::test_incremental_falls_back_on_dbmanager_failure PASSED [ 45%]
tests/core/test_archiver.py::TestExceptionHandling::test_incremental_with_nonexistent_database PASSED [ 45%]
tests/core/test_archiver.py::TestExceptionHandling::test_archive_messages_falls_back_on_dbmanager_init_failure PASSED [ 45%]
tests/core/test_archiver.py::TestArchiveWithTaskHandle::test_archive_with_task_handle PASSED [ 45%]
tests/core/test_archiver.py::TestArchiveWithTaskHandle::test_archive_without_task_handle PASSED [ 45%]
tests/core/test_archiver_async_integration.py::TestArchiverFacadeWithAsyncClient::test_create_with_async_gmail_client PASSED [ 45%]
tests/core/test_archiver_async_integration.py::TestArchiverFacadeWithAsyncClient::test_list_messages_async PASSED [ 45%]
tests/core/test_archiver_async_integration.py::TestArchiverFacadeWithAsyncClient::test_delete_archived_messages_async PASSED [ 45%]
tests/core/test_archiver_async_integration.py::TestArchiverFacadeWithAsyncClient::test_delete_permanent_async PASSED [ 45%]
tests/core/test_archiver_async_integration.py::TestArchiverFacadeAsyncArchiveWorkflow::test_archive_with_async_client PASSED [ 45%]
tests/core/test_archiver_async_integration.py::TestArchiverFacadeAsyncArchiveWorkflow::test_archive_no_messages_async PASSED [ 45%]
tests/core/test_archiver_async_integration.py::TestAsyncClientUsage::test_gmail_client_is_async_gmail_client PASSED [ 45%]
tests/core/test_compressor.py::test_compress_single_mbox_to_zstd PASSED  [ 45%]
tests/core/test_compressor.py::test_compress_single_mbox_to_gzip PASSED  [ 45%]
tests/core/test_compressor.py::test_compress_single_mbox_to_lzma PASSED  [ 45%]
tests/core/test_compressor.py::test_compress_in_place PASSED             [ 45%]
tests/core/test_compressor.py::test_compress_in_place_updates_db PASSED  [ 45%]
tests/core/test_compressor.py::test_compress_in_place_keep_original_preserves_source_file PASSED [ 45%]
tests/core/test_compressor.py::test_compress_dry_run_no_actual_compression PASSED [ 45%]
tests/core/test_compressor.py::test_compress_dry_run_shows_space_savings PASSED [ 45%]
tests/core/test_compressor.py::test_compress_multiple_files PASSED       [ 45%]
tests/core/test_compressor.py::test_compress_batch_with_mixed_formats PASSED [ 45%]
tests/core/test_compressor.py::test_compress_updates_archive_file_paths PASSED [ 45%]
tests/core/test_compressor.py::test_compress_preserves_mbox_offsets PASSED [ 45%]
tests/core/test_compressor.py::test_compress_nonexistent_file PASSED     [ 46%]
tests/core/test_compressor.py::test_compress_invalid_compression_format PASSED [ 46%]
tests/core/test_compressor.py::test_compress_empty_file_list PASSED      [ 46%]
tests/core/test_compressor.py::test_compress_already_compressed_file PASSED [ 46%]
tests/core/test_compressor.py::test_compress_verifies_integrity_after_compression PASSED [ 46%]
tests/core/test_compressor.py::test_compress_rollback_on_verification_failure PASSED [ 46%]
tests/core/test_compressor.py::test_compression_result_dataclass PASSED  [ 46%]
tests/core/test_compressor.py::test_compression_summary_includes_file_details PASSED [ 46%]
tests/core/test_compressor.py::test_compress_very_small_file PASSED      [ 46%]
tests/core/test_compressor.py::test_compress_large_batch PASSED          [ 46%]
tests/core/test_compressor.py::test_compress_with_special_characters_in_filename PASSED [ 46%]
tests/core/test_compressor.py::test_compress_tracks_execution_time PASSED [ 46%]
tests/core/test_compressor.py::test_compress_different_formats_have_different_ratios PASSED [ 46%]
tests/core/test_compressor.py::test_compress_preserves_message_count PASSED [ 46%]
tests/core/test_compressor.py::test_compressor_cleanup_on_verification_failure PASSED [ 46%]
tests/core/test_compressor.py::test_unsupported_compression_format_raises_error PASSED [ 46%]
tests/core/test_consolidator.py::TestArchiveConsolidatorInit::test_init_with_valid_db PASSED [ 46%]
tests/core/test_consolidator.py::TestArchiveConsolidatorInit::test_init_with_nonexistent_db PASSED [ 46%]
tests/core/test_consolidator.py::TestBasicConsolidation::test_consolidate_two_archives PASSED [ 46%]
tests/core/test_consolidator.py::TestBasicConsolidation::test_consolidate_with_result_fields PASSED [ 46%]
tests/core/test_consolidator.py::TestBasicConsolidation::test_consolidate_empty_archives PASSED [ 46%]
tests/core/test_consolidator.py::TestBasicConsolidation::test_consolidate_single_archive PASSED [ 46%]
tests/core/test_consolidator.py::TestBasicConsolidation::test_consolidate_preserves_message_content PASSED [ 46%]
tests/core/test_consolidator.py::TestSorting::test_sort_by_date_chronological PASSED [ 46%]
tests/core/test_consolidator.py::TestSorting::test_no_sort_preserves_order PASSED [ 46%]
tests/core/test_consolidator.py::TestSorting::test_sort_handles_malformed_dates PASSED [ 46%]
tests/core/test_consolidator.py::TestDeduplication::test_deduplicate_removes_duplicates PASSED [ 46%]
tests/core/test_consolidator.py::TestDeduplication::test_deduplicate_newest_strategy PASSED [ 47%]
tests/core/test_consolidator.py::TestDeduplication::test_no_deduplicate_keeps_all PASSED [ 47%]
tests/core/test_consolidator.py::TestDeduplication::test_deduplicate_largest_strategy PASSED [ 47%]
tests/core/test_consolidator.py::TestDatabaseUpdate::test_database_updated_with_new_archive_file PASSED [ 47%]
tests/core/test_consolidator.py::TestDatabaseUpdate::test_database_updated_with_mbox_offsets PASSED [ 47%]
tests/core/test_consolidator.py::TestDatabaseUpdate::test_database_removes_duplicate_entries PASSED [ 47%]
tests/core/test_consolidator.py::TestDatabaseUpdate::test_database_preserves_metadata PASSED [ 47%]
tests/core/test_consolidator.py::TestCompression::test_consolidate_with_gzip_compression PASSED [ 47%]
tests/core/test_consolidator.py::TestCompression::test_consolidate_without_compression PASSED [ 47%]
tests/core/test_consolidator.py::TestErrorHandling::test_consolidate_missing_source_file PASSED [ 47%]
tests/core/test_consolidator.py::TestErrorHandling::test_consolidate_empty_source_list PASSED [ 47%]
tests/core/test_consolidator.py::TestErrorHandling::test_consolidate_invalid_dedupe_strategy PASSED [ 47%]
tests/core/test_consolidator.py::TestAtomicConsolidation::test_atomic_consolidation_both_succeed PASSED [ 47%]
tests/core/test_consolidator.py::TestAtomicConsolidation::test_atomic_consolidation_updates_offsets PASSED [ 47%]
tests/core/test_consolidator.py::TestAtomicConsolidation::test_consolidation_creates_audit_trail PASSED [ 47%]
tests/core/test_consolidator.py::TestAtomicConsolidation::test_consolidation_with_compression_atomic PASSED [ 47%]
tests/core/test_consolidator.py::TestAtomicConsolidation::test_deduplication_updates_database_atomically PASSED [ 47%]
tests/core/test_consolidator.py::TestAtomicConsolidation::test_consolidation_preserves_metadata PASSED [ 47%]
tests/core/test_consolidator_performance.py::test_consolidate_10k_messages_performance PASSED [ 47%]
tests/core/test_consolidator_performance.py::test_consolidate_1k_messages_quick PASSED [ 47%]
tests/core/test_deduplicator.py::TestMessageDeduplicatorInit::test_init_with_v1_1_database PASSED [ 47%]
tests/core/test_deduplicator.py::TestMessageDeduplicatorInit::test_init_rejects_v1_0_database PASSED [ 47%]
tests/core/test_deduplicator.py::TestMessageDeduplicatorInit::test_init_rejects_nonexistent_database PASSED [ 47%]
tests/core/test_deduplicator.py::TestFindDuplicates::test_find_duplicates_with_no_duplicates PASSED [ 47%]
tests/core/test_deduplicator.py::TestFindDuplicates::test_find_duplicates_with_exact_duplicates PASSED [ 47%]
tests/core/test_deduplicator.py::TestFindDuplicates::test_find_duplicates_with_partial_duplicates PASSED [ 47%]
tests/core/test_deduplicator.py::TestFindDuplicates::test_find_duplicates_with_many_groups PASSED [ 48%]
tests/core/test_deduplicator.py::TestFindDuplicates::test_find_duplicates_skips_missing_rfc_message_id PASSED [ 48%]
tests/core/test_deduplicator.py::TestGenerateReport::test_generate_report_with_duplicates PASSED [ 48%]
tests/core/test_deduplicator.py::TestGenerateReport::test_generate_report_with_no_duplicates PASSED [ 48%]
tests/core/test_deduplicator.py::TestGenerateReport::test_generate_report_handles_null_size_bytes PASSED [ 48%]
tests/core/test_deduplicator.py::TestDeduplicateStrategies::test_deduplicate_strategy_newest PASSED [ 48%]
tests/core/test_deduplicator.py::TestDeduplicateStrategies::test_deduplicate_strategy_largest PASSED [ 48%]
tests/core/test_deduplicator.py::TestDeduplicateStrategies::test_deduplicate_strategy_first PASSED [ 48%]
tests/core/test_deduplicator.py::TestDeduplicateStrategies::test_deduplicate_handles_multiple_groups PASSED [ 48%]
tests/core/test_deduplicator.py::TestDryRunMode::test_dry_run_does_not_modify_database PASSED [ 48%]
tests/core/test_deduplicator.py::TestDryRunMode::test_dry_run_reports_what_would_be_removed PASSED [ 48%]
tests/core/test_deduplicator.py::TestEdgeCases::test_empty_database PASSED [ 48%]
tests/core/test_deduplicator.py::TestEdgeCases::test_deduplicate_with_no_duplicates PASSED [ 48%]
tests/core/test_deduplicator.py::TestEdgeCases::test_invalid_strategy_raises_error PASSED [ 48%]
tests/core/test_deduplicator.py::TestEdgeCases::test_context_manager PASSED [ 48%]
tests/core/test_deduplicator.py::TestPerformance::test_performance_with_1000_messages PASSED [ 48%]
tests/core/test_doctor.py::test_check_severity_levels PASSED             [ 48%]
tests/core/test_doctor.py::test_check_result_creation PASSED             [ 48%]
tests/core/test_doctor.py::test_check_result_with_details PASSED         [ 48%]
tests/core/test_doctor.py::test_check_database_schema_v11 PASSED         [ 48%]
tests/core/test_doctor.py::test_check_database_schema_missing_database PASSED [ 48%]
tests/core/test_doctor.py::test_check_database_schema_v10 PASSED         [ 48%]
tests/core/test_doctor.py::test_check_database_integrity_ok PASSED       [ 48%]
tests/core/test_doctor.py::test_check_database_integrity_corrupted PASSED [ 48%]
tests/core/test_doctor.py::test_check_orphaned_fts_none PASSED           [ 48%]
tests/core/test_doctor.py::test_check_archive_files_exist PASSED         [ 48%]
tests/core/test_doctor.py::test_check_archive_files_missing PASSED       [ 49%]
tests/core/test_doctor.py::test_check_python_version_ok PASSED           [ 49%]
tests/core/test_doctor.py::test_check_python_version_too_old PASSED      [ 49%]
tests/core/test_doctor.py::test_check_dependencies_installed PASSED      [ 49%]
tests/core/test_doctor.py::test_check_dependencies_missing PASSED        [ 49%]
tests/core/test_doctor.py::test_check_oauth_token_missing PASSED         [ 49%]
tests/core/test_doctor.py::test_check_oauth_token_valid PASSED           [ 49%]
tests/core/test_doctor.py::test_check_oauth_token_expired PASSED         [ 49%]
tests/core/test_doctor.py::test_check_credentials_file_exists PASSED     [ 49%]
tests/core/test_doctor.py::test_check_disk_space_sufficient PASSED       [ 49%]
tests/core/test_doctor.py::test_check_disk_space_low_warning PASSED      [ 49%]
tests/core/test_doctor.py::test_check_disk_space_critical_error PASSED   [ 49%]
tests/core/test_doctor.py::test_check_write_permissions_ok PASSED        [ 49%]
tests/core/test_doctor.py::test_check_write_permissions_denied PASSED    [ 49%]
tests/core/test_doctor.py::test_check_stale_lock_files_none PASSED       [ 49%]
tests/core/test_doctor.py::test_check_stale_lock_files_found PASSED      [ 49%]
tests/core/test_doctor.py::test_check_temp_directory_accessible PASSED   [ 49%]
tests/core/test_doctor.py::test_check_temp_directory_not_accessible FAILED [ 49%]
tests/core/test_doctor.py::test_run_diagnostics_all_checks_pass PASSED   [ 49%]
tests/core/test_doctor.py::test_run_diagnostics_with_warnings PASSED     [ 49%]
tests/core/test_doctor.py::test_run_diagnostics_with_errors PASSED       [ 49%]
tests/core/test_doctor.py::test_run_diagnostics_counts_results_correctly PASSED [ 49%]
tests/core/test_doctor.py::test_auto_fix_orphaned_fts PASSED             [ 49%]
tests/core/test_doctor.py::test_auto_fix_stale_locks PASSED              [ 49%]
tests/core/test_doctor.py::test_auto_fix_create_missing_database PASSED  [ 49%]
tests/core/test_doctor.py::test_run_auto_fix_fixes_all_issues PASSED     [ 49%]
tests/core/test_doctor.py::test_doctor_report_creation PASSED            [ 50%]
tests/core/test_doctor.py::test_doctor_report_to_dict PASSED             [ 50%]
tests/core/test_doctor.py::test_doctor_with_memory_database PASSED       [ 50%]
tests/core/test_doctor.py::test_doctor_handles_permission_errors PASSED  [ 50%]
tests/core/test_doctor.py::test_multiple_diagnostics_runs_independent PASSED [ 50%]
tests/core/test_doctor.py::test_doctor_on_windows PASSED                 [ 50%]
tests/core/test_doctor.py::test_doctor_on_macos PASSED                   [ 50%]
tests/core/test_doctor.py::test_check_database_schema_unknown_version PASSED [ 50%]
tests/core/test_doctor.py::test_check_database_schema_error PASSED       [ 50%]
tests/core/test_doctor.py::test_check_orphaned_fts_not_found PASSED      [ 50%]
tests/core/test_doctor.py::test_check_archive_files_exist_with_missing_files PASSED [ 50%]
tests/core/test_doctor.py::test_check_python_version_compatibility PASSED [ 50%]
tests/core/test_doctor.py::test_check_dependencies_import_failures PASSED [ 50%]
tests/core/test_doctor.py::test_check_oauth_token_file_missing PASSED    [ 50%]
tests/core/test_doctor.py::test_check_credentials_file_missing PASSED    [ 50%]
tests/core/test_doctor.py::test_check_disk_space_insufficient PASSED     [ 50%]
tests/core/test_doctor.py::test_check_write_permissions_readonly_file PASSED [ 50%]
tests/core/test_doctor.py::test_check_stale_locks_found PASSED           [ 50%]
tests/core/test_doctor.py::test_fix_missing_database PASSED              [ 50%]
tests/core/test_doctor.py::test_run_diagnostics_full_report PASSED       [ 50%]
tests/core/test_doctor.py::test_doctor_report_dict_conversion PASSED     [ 50%]
tests/core/test_doctor.py::test_get_connection_returns_none_for_missing_db PASSED [ 50%]
tests/core/test_doctor.py::test_check_database_schema_connection_failure PASSED [ 50%]
tests/core/test_doctor.py::test_check_disk_space_exception PASSED        [ 50%]
tests/core/test_doctor.py::test_check_write_permissions_exception PASSED [ 50%]
tests/core/test_doctor.py::test_check_stale_locks_exception PASSED       [ 50%]
tests/core/test_doctor.py::test_check_temp_directory_exception PASSED    [ 50%]
tests/core/test_doctor.py::test_fix_orphaned_fts_connection_failure PASSED [ 51%]
tests/core/test_doctor.py::test_fix_stale_locks_exception PASSED         [ 51%]
tests/core/test_doctor.py::test_check_database_schema_for_connection_failures PASSED [ 51%]
tests/core/test_doctor.py::test_run_diagnostics_detects_fixable_issues PASSED [ 51%]
tests/core/test_doctor.py::test_fix_stale_locks_handles_glob_error PASSED [ 51%]
tests/core/test_extractor.py::test_init_with_existing_db PASSED          [ 51%]
tests/core/test_extractor.py::test_init_with_missing_db PASSED           [ 51%]
tests/core/test_extractor.py::test_context_manager PASSED                [ 51%]
tests/core/test_extractor.py::test_extract_by_gmail_id_success PASSED    [ 51%]
tests/core/test_extractor.py::test_extract_by_gmail_id_to_file PASSED    [ 51%]
tests/core/test_extractor.py::test_extract_by_gmail_id_not_found PASSED  [ 51%]
tests/core/test_extractor.py::test_extract_by_gmail_id_missing_archive PASSED [ 51%]
tests/core/test_extractor.py::test_extract_by_rfc_message_id_success PASSED [ 51%]
tests/core/test_extractor.py::test_extract_by_rfc_message_id_not_found PASSED [ 51%]
tests/core/test_extractor.py::test_extract_from_gzip PASSED              [ 51%]
tests/core/test_extractor.py::test_extract_from_lzma PASSED              [ 51%]
tests/core/test_extractor.py::test_compression_format_detection PASSED   [ 51%]
tests/core/test_extractor.py::test_batch_extract_success PASSED          [ 51%]
tests/core/test_extractor.py::test_batch_extract_partial_failure PASSED  [ 51%]
tests/core/test_extractor.py::test_batch_extract_creates_directory PASSED [ 51%]
tests/core/test_extractor.py::test_extract_with_invalid_offset PASSED    [ 51%]
tests/core/test_extractor.py::test_extract_from_corrupted_gzip PASSED    [ 51%]
tests/core/test_extractor.py::test_extract_empty_message PASSED          [ 51%]
tests/core/test_extractor.py::test_extract_with_special_characters_in_path PASSED [ 51%]
tests/core/test_extractor.py::test_extract_from_zstd_compressed_archive PASSED [ 51%]
tests/core/test_extractor.py::test_extract_from_compressed_with_invalid_format_raises_error PASSED [ 51%]
tests/core/test_importer.py::TestImporterFacadeInit::test_init_with_valid_db_path PASSED [ 52%]
tests/core/test_importer.py::TestImporterFacadeInit::test_init_creates_db_if_not_exists PASSED [ 52%]
tests/core/test_importer.py::TestImportSingleArchive::test_import_simple_mbox_all_messages PASSED [ 52%]
tests/core/test_importer.py::TestImportSingleArchive::test_import_verifies_database_population PASSED [ 52%]
tests/core/test_importer.py::TestImportSingleArchive::test_import_with_skip_duplicates_true PASSED [ 52%]
tests/core/test_importer.py::TestImportSingleArchive::test_import_with_skip_duplicates_false PASSED [ 52%]
tests/core/test_importer.py::TestImportSingleArchive::test_import_with_malformed_messages PASSED [ 52%]
tests/core/test_importer.py::TestImportSingleArchive::test_import_with_custom_account_id PASSED [ 52%]
tests/core/test_importer.py::TestImportSingleArchive::test_import_returns_execution_time PASSED [ 52%]
tests/core/test_importer.py::TestOffsetCalculation::test_offsets_are_accurate PASSED [ 52%]
tests/core/test_importer.py::TestOffsetCalculation::test_offsets_are_non_negative PASSED [ 52%]
tests/core/test_importer.py::TestOffsetCalculation::test_offsets_are_unique_per_message PASSED [ 52%]
tests/core/test_importer.py::TestOffsetCalculation::test_offsets_with_compressed_archive PASSED [ 52%]
tests/core/test_importer.py::TestMetadataExtraction::test_extract_all_v1_1_fields PASSED [ 52%]
tests/core/test_importer.py::TestMetadataExtraction::test_extract_thread_id_from_xgm_thrid PASSED [ 52%]
tests/core/test_importer.py::TestMetadataExtraction::test_extract_thread_id_from_references_fallback PASSED [ 52%]
tests/core/test_importer.py::TestMetadataExtraction::test_extract_thread_id_none_when_missing PASSED [ 52%]
tests/core/test_importer.py::TestMetadataExtraction::test_body_preview_multipart_with_decoding_error PASSED [ 52%]
tests/core/test_importer.py::TestMetadataExtraction::test_body_preview_non_multipart_with_decoding_error PASSED [ 52%]
tests/core/test_importer.py::TestMetadataExtraction::test_extract_rfc_message_id PASSED [ 52%]
tests/core/test_importer.py::TestMetadataExtraction::test_generate_fallback_message_id PASSED [ 52%]
tests/core/test_importer.py::TestMetadataExtraction::test_body_preview_extraction PASSED [ 52%]
tests/core/test_importer.py::TestMetadataExtraction::test_checksum_calculation PASSED [ 52%]
tests/core/test_importer.py::TestDuplicateHandling::test_skip_duplicates_on_rfc_message_id PASSED [ 52%]
tests/core/test_importer.py::TestDuplicateHandling::test_duplicate_count_in_result PASSED [ 52%]
tests/core/test_importer.py::TestDuplicateHandling::test_duplicate_handling_across_archives PASSED [ 52%]
tests/core/test_importer.py::TestCompressionSupport::test_import_gzip_compressed_archive PASSED [ 53%]
tests/core/test_importer.py::TestCompressionSupport::test_compressed_archive_stores_compressed_filename PASSED [ 53%]
tests/core/test_importer.py::TestCompressionSupport::test_compression_detection_from_extension PASSED [ 53%]
tests/core/test_importer.py::TestCompressionSupport::test_import_lzma_compressed_archive PASSED [ 53%]
tests/core/test_importer.py::TestCompressionSupport::test_import_zstd_compressed_archive PASSED [ 53%]
tests/core/test_importer.py::TestCompressionSupport::test_decompression_failure_cleanup PASSED [ 53%]
tests/core/test_importer.py::TestErrorHandling::test_continue_on_database_error PASSED [ 53%]
tests/core/test_importer.py::TestErrorHandling::test_error_handling_with_corrupt_db PASSED [ 53%]
tests/core/test_importer.py::TestErrorHandling::test_import_nonexistent_archive_raises_error PASSED [ 53%]
tests/core/test_importer.py::TestErrorHandling::test_database_query_error_handling PASSED [ 53%]
tests/core/test_importer.py::TestErrorHandling::test_database_insert_error_recovery PASSED [ 53%]
tests/core/test_importer.py::TestErrorHandling::test_import_multiple_with_file_error PASSED [ 53%]
tests/core/test_importer.py::TestErrorHandling::test_body_preview_multipart_exception_handling PASSED [ 53%]
tests/core/test_importer.py::TestErrorHandling::test_body_preview_non_multipart_exception_handling PASSED [ 53%]
tests/core/test_importer.py::TestErrorHandling::test_import_multiple_error_recovery PASSED [ 53%]
tests/core/test_importer.py::TestMultipleArchiveImport::test_import_multiple_with_glob_pattern PASSED [ 53%]
tests/core/test_importer.py::TestMultipleArchiveImport::test_import_multiple_returns_per_file_results PASSED [ 53%]
tests/core/test_importer.py::TestMultipleArchiveImport::test_import_multiple_with_no_matching_files PASSED [ 53%]
tests/core/test_importer.py::TestPerformance::test_import_1000_messages_under_6_seconds PASSED [ 53%]
tests/core/test_importer.py::TestPerformance::test_report_messages_per_second PASSED [ 53%]
tests/core/test_importer.py::TestDBManagerIntegration::test_uses_dbmanager_for_database_operations PASSED [ 53%]
tests/core/test_importer.py::TestDBManagerIntegration::test_atomic_import_operations PASSED [ 53%]
tests/core/test_importer.py::TestDBManagerIntegration::test_audit_trail_in_archive_runs PASSED [ 53%]
tests/core/test_importer.py::TestDBManagerIntegration::test_error_handling_with_rollback PASSED [ 53%]
tests/core/test_importer.py::TestDBManagerIntegration::test_no_direct_sql_queries_in_importer PASSED [ 53%]
tests/core/test_importer.py::TestDBManagerIntegration::test_extract_body_preview_multipart_exception_handling PASSED [ 53%]
tests/core/test_importer.py::TestDBManagerIntegration::test_extract_body_preview_non_multipart_exception_handling PASSED [ 53%]
tests/core/test_importer.py::test_import_handles_duplicate_messages_constraint PASSED [ 54%]
tests/core/test_importer.py::test_importer_extract_body_non_multipart_payload_exception PASSED [ 54%]
tests/core/test_importer.py::test_importer_database_constraint_violation PASSED [ 54%]
tests/core/test_importer.py::test_importer_message_processing_exception PASSED [ 54%]
tests/core/test_importer.py::test_importer_multipart_decode_exception PASSED [ 54%]
tests/core/test_importer.py::test_importer_extract_body_exception_path PASSED [ 54%]
tests/core/test_importer.py::test_count_messages_returns_zero_for_nonexistent_file PASSED [ 54%]
tests/core/test_importer.py::test_import_with_new_database_creates_schema PASSED [ 54%]
tests/core/test_importer.py::TestImporterExceptionHandling::test_count_messages_compressed_archive_cleanup PASSED [ 54%]
tests/core/test_importer_facade_coverage.py::TestScanArchiveErrorPaths::test_scan_archive_nonexistent_file_raises_error PASSED [ 54%]
tests/core/test_importer_facade_coverage.py::TestScanArchiveErrorPaths::test_scan_archive_with_progress_reporter_on_start PASSED [ 54%]
tests/core/test_importer_facade_coverage.py::TestImportArchiveProgressCallbacks::test_import_with_no_scan_result_calls_progress_info PASSED [ 54%]
tests/core/test_importer_facade_coverage.py::TestImportArchiveProgressCallbacks::test_import_all_duplicates_calls_progress_info PASSED [ 54%]
tests/core/test_importer_facade_coverage.py::TestImportArchiveProgressCallbacks::test_import_with_gmail_client_calls_progress_info PASSED [ 54%]
tests/core/test_importer_facade_coverage.py::TestImportArchiveProgressCallbacks::test_import_progress_on_successful_message_with_gmail_id PASSED [ 54%]
tests/core/test_importer_facade_coverage.py::TestImportArchiveProgressCallbacks::test_import_progress_on_failed_message_error PASSED [ 54%]
tests/core/test_importer_facade_coverage.py::TestImportArchiveOffsetMapLogic::test_import_skips_messages_not_in_offset_map PASSED [ 54%]
tests/core/test_importer_facade_coverage.py::TestImportArchiveOffsetMapLogic::test_import_with_scan_result_reuses_scan PASSED [ 54%]
tests/core/test_importer_facade_coverage.py::TestCountMessagesEdgeCases::test_count_messages_nonexistent_returns_zero PASSED [ 54%]
tests/core/test_importer_facade_coverage.py::TestGmailIdLookupPaths::test_import_reports_gmail_ids_found_and_not_found PASSED [ 54%]
tests/core/test_importer_facade_coverage.py::TestGmailIdLookupPaths::test_import_without_gmail_client_no_lookup PASSED [ 54%]
tests/core/test_importer_facade_coverage.py::TestImportMultipleAdvancedPaths::test_import_multiple_aggregates_gmail_ids PASSED [ 54%]
tests/core/test_importer_facade_coverage.py::TestImportMultipleAdvancedPaths::test_import_multiple_error_handling_continues_on_file_error PASSED [ 54%]
tests/core/test_importer_facade_coverage.py::TestMessageMetadataExtraction::test_import_with_partial_headers PASSED [ 54%]
tests/core/test_importer_facade_coverage.py::TestMessageMetadataExtraction::test_import_preserves_archive_file_path PASSED [ 54%]
tests/core/test_importer_facade_coverage.py::TestMessageMetadataExtraction::test_import_with_custom_account_id_metadata PASSED [ 54%]
tests/core/test_importer_facade_coverage.py::TestImportResultAccuracy::test_import_result_execution_time_populated PASSED [ 55%]
tests/core/test_importer_facade_coverage.py::TestImportResultAccuracy::test_import_result_error_list_populated PASSED [ 55%]
tests/core/test_importer_facade_coverage.py::TestScanResultAccuracy::test_scan_result_duplicate_count_accuracy PASSED [ 55%]
tests/core/test_importer_facade_coverage.py::TestScanResultAccuracy::test_scan_result_skip_duplicates_false_returns_all PASSED [ 55%]
tests/core/test_importer_facade_coverage.py::TestArchiveRunRecording::test_archive_run_recorded_when_messages_imported PASSED [ 55%]
tests/core/test_importer_facade_coverage.py::TestArchiveRunRecording::test_no_archive_run_when_all_duplicates PASSED [ 55%]
tests/core/test_importer_facade_coverage.py::TestDatabaseCommitBehavior::test_import_commits_transaction PASSED [ 55%]
tests/core/test_importer_facade_coverage.py::TestRemainingCoveragePaths::test_count_messages_with_compressed_archive PASSED [ 55%]
tests/core/test_importer_facade_coverage.py::TestRemainingCoveragePaths::test_import_archive_nonexistent_raises_error PASSED [ 55%]
tests/core/test_importer_facade_coverage.py::TestRemainingCoveragePaths::test_import_continue_on_message_not_in_offset_map PASSED [ 55%]
tests/core/test_importer_facade_coverage.py::TestRemainingCoveragePaths::test_import_progress_callback_on_database_error PASSED [ 55%]
tests/core/test_importer_facade_coverage.py::TestRemainingCoveragePaths::test_import_multiple_file_error_handling_continues PASSED [ 55%]
tests/core/test_importer_facade_coverage.py::TestRemainingCoveragePaths::test_import_with_gmail_client_batch_lookup_called PASSED [ 55%]
tests/core/test_importer_facade_coverage.py::TestRemainingCoveragePaths::test_import_skipped_message_counter_accuracy PASSED [ 55%]
tests/core/test_importer_facade_coverage.py::TestRemainingCoveragePaths::test_scan_archive_decompression_cleanup_on_error PASSED [ 55%]
tests/core/test_importer_facade_coverage.py::TestRemainingCoveragePaths::test_import_archive_run_recorded_with_operation_type PASSED [ 55%]
tests/core/test_lzma_compressor.py::TestLzmaVerify::test_verify_invalid_lzma_file PASSED [ 55%]
tests/core/test_lzma_compressor.py::TestLzmaVerify::test_verify_valid_lzma_file PASSED [ 55%]
tests/core/test_lzma_compressor.py::TestLzmaEstimateSize::test_estimate_size_small_sample PASSED [ 55%]
tests/core/test_lzma_compressor.py::TestLzmaEstimateSize::test_estimate_size_large_sample PASSED [ 55%]
tests/core/test_lzma_compressor.py::TestLzmaEstimateSize::test_estimate_size_temp_file_cleanup PASSED [ 55%]
tests/core/test_progress_estimation.py::TestProgressTrackerInitialization::test_init_with_total PASSED [ 55%]
tests/core/test_progress_estimation.py::TestProgressTrackerInitialization::test_init_without_total PASSED [ 55%]
tests/core/test_progress_estimation.py::TestProgressTrackerInitialization::test_init_default_unit PASSED [ 55%]
tests/core/test_progress_estimation.py::TestProgressTrackerStart::test_start_records_time PASSED [ 55%]
tests/core/test_progress_estimation.py::TestProgressTrackerStart::test_start_resets_completed PASSED [ 55%]
tests/core/test_progress_estimation.py::TestProgressTrackerUpdate::test_update_increments_completed PASSED [ 56%]
tests/core/test_progress_estimation.py::TestProgressTrackerUpdate::test_update_with_advance PASSED [ 56%]
tests/core/test_progress_estimation.py::TestProgressTrackerUpdate::test_update_calculates_rate PASSED [ 56%]
tests/core/test_progress_estimation.py::TestProgressTrackerElapsed::test_get_elapsed_before_start PASSED [ 56%]
tests/core/test_progress_estimation.py::TestProgressTrackerElapsed::test_get_elapsed_after_start PASSED [ 56%]
tests/core/test_progress_estimation.py::TestProgressTrackerElapsed::test_get_elapsed_format_seconds PASSED [ 56%]
tests/core/test_progress_estimation.py::TestProgressTrackerElapsed::test_get_elapsed_format_minutes PASSED [ 56%]
tests/core/test_progress_estimation.py::TestProgressTrackerElapsed::test_get_elapsed_format_hours PASSED [ 56%]
tests/core/test_progress_estimation.py::TestProgressTrackerETA::test_calculate_eta_before_start PASSED [ 56%]
tests/core/test_progress_estimation.py::TestProgressTrackerETA::test_calculate_eta_without_total PASSED [ 56%]
tests/core/test_progress_estimation.py::TestProgressTrackerETA::test_calculate_eta_no_progress PASSED [ 56%]
tests/core/test_progress_estimation.py::TestProgressTrackerETA::test_calculate_eta_below_minimum_samples PASSED [ 56%]
tests/core/test_progress_estimation.py::TestProgressTrackerETA::test_calculate_eta_at_50_percent PASSED [ 56%]
tests/core/test_progress_estimation.py::TestProgressTrackerETA::test_calculate_eta_at_90_percent PASSED [ 56%]
tests/core/test_progress_estimation.py::TestProgressTrackerETA::test_calculate_eta_formatted PASSED [ 56%]
tests/core/test_progress_estimation.py::TestProgressTrackerRate::test_get_rate_before_start PASSED [ 56%]
tests/core/test_progress_estimation.py::TestProgressTrackerRate::test_get_rate_no_progress PASSED [ 56%]
tests/core/test_progress_estimation.py::TestProgressTrackerRate::test_get_rate_simple_calculation PASSED [ 56%]
tests/core/test_progress_estimation.py::TestProgressTrackerRate::test_get_rate_exponential_smoothing PASSED [ 56%]
tests/core/test_progress_estimation.py::TestProgressTrackerRate::test_get_rate_formatted_messages PASSED [ 56%]
tests/core/test_progress_estimation.py::TestProgressTrackerRate::test_get_rate_formatted_megabytes PASSED [ 56%]
tests/core/test_progress_estimation.py::TestProgressTrackerProgressString::test_get_progress_string_before_start PASSED [ 56%]
tests/core/test_progress_estimation.py::TestProgressTrackerProgressString::test_get_progress_string_no_eta_yet PASSED [ 56%]
tests/core/test_progress_estimation.py::TestProgressTrackerProgressString::test_get_progress_string_with_eta PASSED [ 56%]
tests/core/test_progress_estimation.py::TestProgressTrackerProgressString::test_get_progress_string_format PASSED [ 56%]
tests/core/test_progress_estimation.py::TestProgressTrackerEdgeCases::test_zero_elapsed_time PASSED [ 56%]
tests/core/test_progress_estimation.py::TestProgressTrackerEdgeCases::test_very_fast_processing PASSED [ 56%]
tests/core/test_progress_estimation.py::TestProgressTrackerEdgeCases::test_very_slow_processing PASSED [ 57%]
tests/core/test_progress_estimation.py::TestProgressTrackerEdgeCases::test_single_item_completion PASSED [ 57%]
tests/core/test_progress_estimation.py::TestProgressTrackerEdgeCases::test_completion_beyond_total PASSED [ 57%]
tests/core/test_progress_estimation.py::TestProgressTrackerEdgeCases::test_negative_time_handling PASSED [ 57%]
tests/core/test_search.py::TestSearchEngineInit::test_init_with_valid_database PASSED [ 57%]
tests/core/test_search.py::TestSearchEngineInit::test_init_with_missing_database PASSED [ 57%]
tests/core/test_search.py::TestFullTextSearch::test_fulltext_search_single_word PASSED [ 57%]
tests/core/test_search.py::TestFullTextSearch::test_fulltext_search_phrase PASSED [ 57%]
tests/core/test_search.py::TestFullTextSearch::test_fulltext_search_field_specific PASSED [ 57%]
tests/core/test_search.py::TestFullTextSearch::test_fulltext_search_ranked_results PASSED [ 57%]
tests/core/test_search.py::TestFullTextSearch::test_fulltext_search_no_matches PASSED [ 57%]
tests/core/test_search.py::TestMetadataSearch::test_metadata_search_by_from_addr PASSED [ 57%]
tests/core/test_search.py::TestMetadataSearch::test_metadata_search_by_date_range PASSED [ 57%]
tests/core/test_search.py::TestMetadataSearch::test_metadata_search_combined_filters PASSED [ 57%]
tests/core/test_search.py::TestMetadataSearch::test_metadata_search_by_to_addr PASSED [ 57%]
tests/core/test_search.py::TestMetadataSearch::test_metadata_search_with_limit PASSED [ 57%]
tests/core/test_search.py::TestGmailStyleQuery::test_gmail_query_from_address PASSED [ 57%]
tests/core/test_search.py::TestGmailStyleQuery::test_gmail_query_combined_terms PASSED [ 57%]
tests/core/test_search.py::TestGmailStyleQuery::test_gmail_query_bare_words PASSED [ 57%]
tests/core/test_search.py::TestGmailStyleQuery::test_gmail_query_subject_term PASSED [ 57%]
tests/core/test_search.py::TestGmailStyleQuery::test_gmail_query_to_address PASSED [ 57%]
tests/core/test_search.py::TestGmailStyleQuery::test_gmail_query_date_range PASSED [ 57%]
tests/core/test_search.py::TestSearchPerformance::test_search_performance_large_dataset PASSED [ 57%]
tests/core/test_search.py::TestSearchEdgeCases::test_fts5_syntax_error_returns_empty_results PASSED [ 57%]
tests/core/test_search.py::TestSearchEdgeCases::test_invalid_fts_fields_raises_error PASSED [ 57%]
tests/core/test_search.py::TestSearchEdgeCases::test_missing_messages_table_raises_error PASSED [ 57%]
tests/core/test_search.py::TestSearchHybridFilters::test_search_with_to_filter PASSED [ 58%]
tests/core/test_search.py::TestSearchHybridFilters::test_search_with_before_filter PASSED [ 58%]
tests/core/test_search.py::TestSearchHybridFilters::test_search_with_multiple_hybrid_filters PASSED [ 58%]
tests/core/test_search_enhancements.py::TestSearchWithPreview::test_search_with_preview_shows_preview_text PASSED [ 58%]
tests/core/test_search_enhancements.py::TestSearchWithPreview::test_search_with_preview_truncates_long_text PASSED [ 58%]
tests/core/test_search_enhancements.py::TestSearchWithPreview::test_search_with_preview_handles_no_preview PASSED [ 58%]
tests/core/test_search_enhancements.py::TestSearchWithPreview::test_search_with_preview_json_output PASSED [ 58%]
tests/core/test_search_enhancements.py::TestSearchWithPreview::test_search_without_preview_no_preview_shown PASSED [ 58%]
tests/core/test_search_enhancements.py::TestSearchWithPreview::test_search_with_preview_multiple_results PASSED [ 58%]
tests/core/test_search_enhancements.py::TestSearchInteractive::test_search_interactive_allows_message_selection PASSED [ 58%]
tests/core/test_search_enhancements.py::TestSearchInteractive::test_search_interactive_no_selection_exits_gracefully PASSED [ 58%]
tests/core/test_search_enhancements.py::TestSearchInteractive::test_search_interactive_extracts_to_directory PASSED [ 58%]
tests/core/test_search_enhancements.py::TestSearchInteractive::test_search_interactive_with_no_results PASSED [ 58%]
tests/core/test_search_enhancements.py::TestSearchInteractive::test_search_interactive_shows_summary PASSED [ 58%]
tests/core/test_search_enhancements.py::TestSearchInteractive::test_search_interactive_empty_selection PASSED [ 58%]
tests/core/test_search_enhancements.py::TestSearchCombinedFlags::test_search_with_preview_and_interactive PASSED [ 58%]
tests/core/test_search_enhancements.py::TestSearchCombinedFlags::test_search_with_preview_and_json PASSED [ 58%]
tests/core/test_search_enhancements.py::TestSearchErrorHandling::test_search_interactive_without_questionary_fallback PASSED [ 58%]
tests/core/test_search_enhancements.py::TestSearchErrorHandling::test_search_interactive_extraction_failure_handling PASSED [ 58%]
tests/core/test_search_enhancements.py::TestSearchPreviewTruncation::test_preview_truncation_exactly_200_chars PASSED [ 58%]
tests/core/test_search_enhancements.py::TestSearchPreviewTruncation::test_preview_truncation_201_chars PASSED [ 58%]
tests/core/test_validator.py::TestValidatorFacadeInit::test_init PASSED  [ 58%]
tests/core/test_validator.py::TestGetMboxPath::test_get_mbox_path_uncompressed PASSED [ 58%]
tests/core/test_validator.py::TestGetMboxPath::test_get_mbox_path_gzip PASSED [ 58%]
tests/core/test_validator.py::TestGetMboxPath::test_get_mbox_path_lzma PASSED [ 58%]
tests/core/test_validator.py::TestGetMboxPath::test_get_mbox_path_zstd PASSED [ 58%]
tests/core/test_validator.py::TestGetMboxPath::test_get_mbox_path_unknown_extension PASSED [ 59%]
tests/core/test_validator.py::TestValidateComprehensive::test_validate_comprehensive_success PASSED [ 59%]
tests/core/test_validator.py::TestValidateComprehensive::test_validate_comprehensive_count_mismatch PASSED [ 59%]
tests/core/test_validator.py::TestValidateComprehensive::test_validate_comprehensive_db_not_found PASSED [ 59%]
tests/core/test_validator.py::TestValidateComprehensive::test_validate_comprehensive_invalid_mbox PASSED [ 59%]
tests/core/test_validator.py::TestValidateComprehensive::test_validate_comprehensive_empty_expected_ids PASSED [ 59%]
tests/core/test_validator.py::TestValidateCount::test_validate_count_match PASSED [ 59%]
tests/core/test_validator.py::TestValidateCount::test_validate_count_mismatch PASSED [ 59%]
tests/core/test_validator.py::TestValidateCount::test_validate_count_invalid_file PASSED [ 59%]
tests/core/test_validator.py::TestComputeChecksum::test_compute_checksum PASSED [ 59%]
tests/core/test_validator.py::TestComputeChecksum::test_compute_checksum_different_data PASSED [ 59%]
tests/core/test_validator.py::TestReport::test_report_success PASSED     [ 59%]
tests/core/test_validator.py::TestReport::test_report_failure PASSED     [ 59%]
tests/core/test_validator.py::TestOffsetVerification::test_verify_offsets_valid_offsets PASSED [ 59%]
tests/core/test_validator.py::TestOffsetVerification::test_verify_offsets_compressed_archive PASSED [ 59%]
tests/core/test_validator.py::TestOffsetVerification::test_verify_offsets_corrupted_offset PASSED [ 59%]
tests/core/test_validator.py::TestOffsetVerification::test_verify_offsets_wrong_message_id PASSED [ 59%]
tests/core/test_validator.py::TestOffsetVerification::test_verify_offsets_v10_schema PASSED [ 59%]
tests/core/test_validator.py::TestOffsetVerification::test_verify_offsets_length_mismatch PASSED [ 59%]
tests/core/test_validator.py::TestConsistencyChecks::test_verify_consistency_perfect_database PASSED [ 59%]
tests/core/test_validator.py::TestConsistencyChecks::test_verify_consistency_orphaned_records PASSED [ 59%]
tests/core/test_validator.py::TestConsistencyChecks::test_verify_consistency_missing_records PASSED [ 59%]
tests/core/test_validator.py::TestConsistencyChecks::test_verify_consistency_fts_desync PASSED [ 59%]
tests/core/test_validator.py::TestConsistencyChecks::test_verify_consistency_v10_schema PASSED [ 59%]
tests/core/test_validator.py::TestValidatorSimpleCases::test_validate_comprehensive_with_integrity_failure PASSED [ 59%]
tests/core/test_validator.py::TestValidatorSimpleCases::test_validate_comprehensive_spot_check_pass PASSED [ 59%]
tests/core/test_validator.py::TestValidatorSimpleCases::test_validate_all_exception PASSED [ 59%]
tests/core/test_validator.py::TestValidatorMissingCoverage::test_comprehensive_validation_db_fallback_v10 PASSED [ 60%]
tests/core/test_validator.py::TestValidatorMissingCoverage::test_validate_count_exception PASSED [ 60%]
tests/core/test_validator.py::TestValidatorMissingCoverage::test_validate_all_empty_archive PASSED [ 60%]
tests/core/test_validator.py::test_validator_empty_archive_integrity_check PASSED [ 60%]
tests/core/test_validator.py::test_validator_log_with_progress_reporter PASSED [ 60%]
tests/core/test_validator.py::test_validator_log_fallback_without_progress_reporter PASSED [ 60%]
tests/core/test_validator.py::test_validator_comprehensive_with_corrupt_archive PASSED [ 60%]
tests/core/test_validator.py::test_validator_comprehensive_empty_message_list PASSED [ 60%]
tests/core/test_validator.py::test_validator_comprehensive_database_missing PASSED [ 60%]
tests/core/test_validator.py::TestValidatorErrorHandling::test_integrity_check_inner_exception PASSED [ 60%]
tests/core/test_validator.py::TestValidatorErrorHandling::test_spot_check_exception PASSED [ 60%]
tests/core/test_validator.py::TestValidatorErrorHandling::test_compute_checksum_exception PASSED [ 60%]
tests/core/test_validator.py::TestValidatorErrorHandling::test_verify_offsets_read_error PASSED [ 60%]
tests/core/test_validator.py::TestValidatorErrorHandling::test_verify_consistency_no_database PASSED [ 60%]
tests/core/test_validator.py::TestValidatorErrorHandling::test_validate_mismatch_error PASSED [ 60%]
tests/core/test_validator.py::TestValidatorErrorHandling::test_checksum_content_error PASSED [ 60%]
tests/core/test_validator.py::TestValidatorErrorHandling::test_validate_all_nonexistent_file_returns_false PASSED [ 60%]
tests/core/test_validator.py::TestValidatorErrorHandling::test_validate_all_corrupted_mbox_returns_false PASSED [ 60%]
tests/core/test_validator.py::TestValidatorErrorHandling::test_consistency_check_with_no_database_returns_error PASSED [ 60%]
tests/core/test_validator.py::TestValidatorExceptionHandling::test_validate_all_with_compressed_temp_cleanup PASSED [ 60%]
tests/core/test_validator.py::TestValidatorExceptionHandling::test_verify_consistency_with_compressed_archive PASSED [ 60%]
tests/core/test_validator_additional.py::TestValidatorValidateAllExceptions::test_validate_all_decompression_exception PASSED [ 60%]
tests/core/test_validator_additional.py::TestValidatorValidateCountExceptions::test_validate_count_decompression_error PASSED [ 60%]
tests/core/test_validator_additional.py::TestValidatorComprehensiveExceptions::test_validate_comprehensive_cleanup_on_exception PASSED [ 60%]
tests/core/test_validator_additional.py::TestValidatorOffsetVerification::test_verify_offsets_no_db_manager PASSED [ 60%]
tests/core/test_validator_additional.py::TestValidatorOffsetVerification::test_verify_offsets_no_messages_table PASSED [ 60%]
tests/core/test_validator_additional.py::TestValidatorOffsetVerification::test_verify_offsets_query_exception PASSED [ 61%]
tests/core/test_validator_additional.py::TestValidatorOffsetVerification::test_verify_offsets_no_messages_for_archive PASSED [ 61%]
tests/core/test_validator_additional.py::TestValidatorOffsetVerification::test_verify_offsets_read_exception PASSED [ 61%]
tests/core/test_validator_additional.py::TestValidatorConsistencyPaths::test_verify_consistency_mbox_read_exception PASSED [ 61%]
tests/core/test_validator_additional.py::TestValidatorConsistencyPaths::test_verify_consistency_fts_exception PASSED [ 61%]
tests/core/test_validator_coverage.py::TestValidatorCloseMethod::test_close_owned_db_manager PASSED [ 61%]
tests/core/test_validator_coverage.py::TestValidatorCloseMethod::test_close_external_db_manager PASSED [ 61%]
tests/core/test_validator_coverage.py::TestValidatorGetDbManager::test_get_db_manager_exception_handling PASSED [ 61%]
tests/core/workflows/steps/test_doctor_steps.py::TestDatabaseDiagnosticStep::test_step_has_correct_name_and_description PASSED [ 61%]
tests/core/workflows/steps/test_doctor_steps.py::TestDatabaseDiagnosticStep::test_executes_check_archive_health PASSED [ 61%]
tests/core/workflows/steps/test_doctor_steps.py::TestDatabaseDiagnosticStep::test_handles_no_progress_reporter PASSED [ 61%]
tests/core/workflows/steps/test_doctor_steps.py::TestDatabaseDiagnosticStep::test_handles_with_progress_reporter PASSED [ 61%]
tests/core/workflows/steps/test_doctor_steps.py::TestDatabaseDiagnosticStep::test_returns_error_when_doctor_missing PASSED [ 61%]
tests/core/workflows/steps/test_doctor_steps.py::TestDatabaseDiagnosticStep::test_writes_checks_to_context PASSED [ 61%]
tests/core/workflows/steps/test_doctor_steps.py::TestDatabaseDiagnosticStep::test_handles_doctor_exception PASSED [ 61%]
tests/core/workflows/steps/test_doctor_steps.py::TestEnvironmentDiagnosticStep::test_step_has_correct_name_and_description PASSED [ 61%]
tests/core/workflows/steps/test_doctor_steps.py::TestEnvironmentDiagnosticStep::test_executes_check_environment_health PASSED [ 61%]
tests/core/workflows/steps/test_doctor_steps.py::TestEnvironmentDiagnosticStep::test_handles_no_progress_reporter PASSED [ 61%]
tests/core/workflows/steps/test_doctor_steps.py::TestEnvironmentDiagnosticStep::test_handles_with_progress_reporter PASSED [ 61%]
tests/core/workflows/steps/test_doctor_steps.py::TestEnvironmentDiagnosticStep::test_returns_error_when_doctor_missing PASSED [ 61%]
tests/core/workflows/steps/test_doctor_steps.py::TestEnvironmentDiagnosticStep::test_writes_checks_to_context PASSED [ 61%]
tests/core/workflows/steps/test_doctor_steps.py::TestEnvironmentDiagnosticStep::test_handles_doctor_exception PASSED [ 61%]
tests/core/workflows/steps/test_doctor_steps.py::TestSystemDiagnosticStep::test_step_has_correct_name_and_description PASSED [ 61%]
tests/core/workflows/steps/test_doctor_steps.py::TestSystemDiagnosticStep::test_executes_check_system_health PASSED [ 61%]
tests/core/workflows/steps/test_doctor_steps.py::TestSystemDiagnosticStep::test_handles_no_progress_reporter PASSED [ 61%]
tests/core/workflows/steps/test_doctor_steps.py::TestSystemDiagnosticStep::test_handles_with_progress_reporter PASSED [ 61%]
tests/core/workflows/steps/test_doctor_steps.py::TestSystemDiagnosticStep::test_returns_error_when_doctor_missing PASSED [ 62%]
tests/core/workflows/steps/test_doctor_steps.py::TestSystemDiagnosticStep::test_writes_checks_to_context PASSED [ 62%]
tests/core/workflows/steps/test_doctor_steps.py::TestSystemDiagnosticStep::test_handles_doctor_exception PASSED [ 62%]
tests/core/workflows/steps/test_filter_step.py::TestCheckDuplicatesStepBehavior::test_filters_out_duplicates PASSED [ 62%]
tests/core/workflows/steps/test_filter_step.py::TestCheckDuplicatesStepBehavior::test_all_new_when_database_empty PASSED [ 62%]
tests/core/workflows/steps/test_filter_step.py::TestCheckDuplicatesStepBehavior::test_skip_duplicates_false_keeps_all PASSED [ 62%]
tests/core/workflows/steps/test_filter_step.py::TestCheckDuplicatesStepBehavior::test_handles_empty_input PASSED [ 62%]
tests/core/workflows/steps/test_filter_step.py::TestCheckDuplicatesStepBehavior::test_reads_from_context_when_no_input PASSED [ 62%]
tests/core/workflows/steps/test_filter_step.py::TestCheckDuplicatesStepBehavior::test_accepts_list_directly PASSED [ 62%]
tests/core/workflows/steps/test_filter_step.py::TestCheckDuplicatesStepBehavior::test_stores_results_in_context PASSED [ 62%]
tests/core/workflows/steps/test_filter_step.py::TestCheckDuplicatesStepBehavior::test_step_has_descriptive_name PASSED [ 62%]
tests/core/workflows/steps/test_filter_step.py::TestCheckDuplicatesStepBehavior::test_output_has_correct_totals PASSED [ 62%]
tests/core/workflows/steps/test_filter_step.py::TestCheckDuplicatesStepWithProgress::test_reports_progress_with_duplicates PASSED [ 62%]
tests/core/workflows/steps/test_filter_step.py::TestCheckDuplicatesStepWithProgress::test_reports_progress_without_duplicates PASSED [ 62%]
tests/core/workflows/steps/test_gmail_steps.py::TestScanGmailMessagesStepBehavior::test_scans_messages_with_age_threshold PASSED [ 62%]
tests/core/workflows/steps/test_gmail_steps.py::TestScanGmailMessagesStepBehavior::test_accepts_string_input PASSED [ 62%]
tests/core/workflows/steps/test_gmail_steps.py::TestScanGmailMessagesStepBehavior::test_handles_no_messages_found PASSED [ 62%]
tests/core/workflows/steps/test_gmail_steps.py::TestScanGmailMessagesStepBehavior::test_stores_results_in_context PASSED [ 62%]
tests/core/workflows/steps/test_gmail_steps.py::TestScanGmailMessagesStepBehavior::test_handles_api_errors PASSED [ 62%]
tests/core/workflows/steps/test_gmail_steps.py::TestScanGmailMessagesStepBehavior::test_step_has_descriptive_name PASSED [ 62%]
tests/core/workflows/steps/test_gmail_steps.py::TestScanGmailMessagesStepBehavior::test_reports_progress_with_messages PASSED [ 62%]
tests/core/workflows/steps/test_gmail_steps.py::TestScanGmailMessagesStepBehavior::test_reports_progress_no_messages PASSED [ 62%]
tests/core/workflows/steps/test_gmail_steps.py::TestFilterGmailMessagesStepBehavior::test_filters_already_archived PASSED [ 62%]
tests/core/workflows/steps/test_gmail_steps.py::TestFilterGmailMessagesStepBehavior::test_accepts_list_input PASSED [ 62%]
tests/core/workflows/steps/test_gmail_steps.py::TestFilterGmailMessagesStepBehavior::test_reads_from_context PASSED [ 62%]
tests/core/workflows/steps/test_gmail_steps.py::TestFilterGmailMessagesStepBehavior::test_handles_empty_input PASSED [ 62%]
tests/core/workflows/steps/test_gmail_steps.py::TestFilterGmailMessagesStepBehavior::test_stores_results_in_context PASSED [ 62%]
tests/core/workflows/steps/test_gmail_steps.py::TestFilterGmailMessagesStepBehavior::test_step_has_descriptive_name PASSED [ 63%]
tests/core/workflows/steps/test_gmail_steps.py::TestFilterGmailMessagesStepBehavior::test_reports_progress_with_archived_and_duplicates PASSED [ 63%]
tests/core/workflows/steps/test_gmail_steps.py::TestFilterGmailMessagesStepBehavior::test_reports_progress_without_duplicates PASSED [ 63%]
tests/core/workflows/steps/test_gmail_steps.py::TestFilterGmailMessagesStepBehavior::test_handles_filter_errors PASSED [ 63%]
tests/core/workflows/steps/test_gmail_steps.py::TestFilterGmailMessagesStepBehavior::test_reads_incremental_from_context PASSED [ 63%]
tests/core/workflows/steps/test_gmail_steps.py::TestDeleteGmailMessagesStepBehavior::test_trashes_messages_by_default PASSED [ 63%]
tests/core/workflows/steps/test_gmail_steps.py::TestDeleteGmailMessagesStepBehavior::test_permanently_deletes_when_requested PASSED [ 63%]
tests/core/workflows/steps/test_gmail_steps.py::TestDeleteGmailMessagesStepBehavior::test_accepts_string_input PASSED [ 63%]
tests/core/workflows/steps/test_gmail_steps.py::TestDeleteGmailMessagesStepBehavior::test_handles_no_messages_to_delete PASSED [ 63%]
tests/core/workflows/steps/test_gmail_steps.py::TestDeleteGmailMessagesStepBehavior::test_handles_api_errors PASSED [ 63%]
tests/core/workflows/steps/test_gmail_steps.py::TestDeleteGmailMessagesStepBehavior::test_step_has_descriptive_name PASSED [ 63%]
tests/core/workflows/steps/test_gmail_steps.py::TestDeleteGmailMessagesStepBehavior::test_reports_progress_when_trashing PASSED [ 63%]
tests/core/workflows/steps/test_gmail_steps.py::TestDeleteGmailMessagesStepBehavior::test_reports_progress_when_permanently_deleting PASSED [ 63%]
tests/core/workflows/steps/test_metadata_step.py::TestRecordMetadataStepBehavior::test_imports_messages_from_filter_output PASSED [ 63%]
tests/core/workflows/steps/test_metadata_step.py::TestRecordMetadataStepBehavior::test_messages_are_persisted_to_database PASSED [ 63%]
tests/core/workflows/steps/test_metadata_step.py::TestRecordMetadataStepBehavior::test_handles_empty_input PASSED [ 63%]
tests/core/workflows/steps/test_metadata_step.py::TestRecordMetadataStepBehavior::test_reads_from_context_when_no_input PASSED [ 63%]
tests/core/workflows/steps/test_metadata_step.py::TestRecordMetadataStepBehavior::test_fails_when_no_archive_path PASSED [ 63%]
tests/core/workflows/steps/test_metadata_step.py::TestRecordMetadataStepBehavior::test_fails_when_archive_file_missing PASSED [ 63%]
tests/core/workflows/steps/test_metadata_step.py::TestRecordMetadataStepBehavior::test_stores_imported_count_in_context PASSED [ 63%]
tests/core/workflows/steps/test_metadata_step.py::TestRecordMetadataStepBehavior::test_step_has_descriptive_name PASSED [ 63%]
tests/core/workflows/steps/test_metadata_step.py::TestRecordMetadataStepBehavior::test_accepts_metadata_input_directly PASSED [ 63%]
tests/core/workflows/steps/test_metadata_step.py::TestRecordMetadataStepWithProgress::test_reports_progress_during_import PASSED [ 63%]
tests/core/workflows/steps/test_metadata_step.py::TestRecordMetadataStepWithProgress::test_reports_empty_import_progress PASSED [ 63%]
tests/core/workflows/steps/test_metadata_step.py::TestRecordMetadataStepWithProgress::test_skips_messages_not_in_offset_map_with_progress PASSED [ 63%]
tests/core/workflows/steps/test_metadata_step.py::TestRecordMetadataStepWithProgress::test_handles_write_result_skipped_with_progress PASSED [ 63%]
tests/core/workflows/steps/test_metadata_step.py::TestRecordMetadataStepWithProgress::test_handles_write_result_failed_with_progress PASSED [ 64%]
tests/core/workflows/steps/test_metadata_step.py::TestRecordMetadataStepWithProgress::test_shows_no_messages_imported_message_with_progress PASSED [ 64%]
tests/core/workflows/steps/test_metadata_step.py::TestRecordMetadataStepWithoutProgress::test_skips_messages_not_in_offset_map_without_progress PASSED [ 64%]
tests/core/workflows/steps/test_metadata_step.py::TestRecordMetadataStepWithoutProgress::test_handles_write_result_skipped_without_progress PASSED [ 64%]
tests/core/workflows/steps/test_metadata_step.py::TestRecordMetadataStepWithoutProgress::test_handles_write_result_failed_without_progress PASSED [ 64%]
tests/core/workflows/steps/test_metadata_step.py::TestRecordMetadataStepErrorHandling::test_catches_exception_during_message_processing PASSED [ 64%]
tests/core/workflows/steps/test_metadata_step.py::TestRecordMetadataStepErrorHandling::test_handles_exception_during_metadata_extraction PASSED [ 64%]
tests/core/workflows/steps/test_metadata_step.py::TestRecordMetadataStepErrorHandling::test_handles_exception_during_processing_with_progress PASSED [ 64%]
tests/core/workflows/steps/test_metadata_step.py::TestRecordMetadataStepErrorHandling::test_returns_failure_on_reader_initialization_exception PASSED [ 64%]
tests/core/workflows/steps/test_scan_step.py::TestScanMboxStepBehavior::test_scans_mbox_and_returns_message_count PASSED [ 64%]
tests/core/workflows/steps/test_scan_step.py::TestScanMboxStepBehavior::test_extracts_rfc_message_ids PASSED [ 64%]
tests/core/workflows/steps/test_scan_step.py::TestScanMboxStepBehavior::test_returns_archive_file_path PASSED [ 64%]
tests/core/workflows/steps/test_scan_step.py::TestScanMboxStepBehavior::test_handles_empty_mbox PASSED [ 64%]
tests/core/workflows/steps/test_scan_step.py::TestScanMboxStepBehavior::test_fails_gracefully_for_missing_file PASSED [ 64%]
tests/core/workflows/steps/test_scan_step.py::TestScanMboxStepBehavior::test_accepts_path_string_directly PASSED [ 64%]
tests/core/workflows/steps/test_scan_step.py::TestScanMboxStepBehavior::test_accepts_path_object_directly PASSED [ 64%]
tests/core/workflows/steps/test_scan_step.py::TestScanMboxStepBehavior::test_stores_path_in_context PASSED [ 64%]
tests/core/workflows/steps/test_scan_step.py::TestScanMboxStepBehavior::test_step_has_descriptive_name PASSED [ 64%]
tests/core/workflows/steps/test_scan_step.py::TestScanMboxStepWithProgress::test_reports_progress_during_scan PASSED [ 64%]
tests/core/workflows/steps/test_scan_step.py::TestScanMboxStepWithCompression::test_scans_gzipped_mbox PASSED [ 64%]
tests/core/workflows/steps/test_scan_step.py::TestScanMboxStepEdgeCases::test_handles_none_input_gracefully PASSED [ 64%]
tests/core/workflows/steps/test_validate_step.py::TestValidateArchiveStepBehavior::test_validates_archive_successfully PASSED [ 64%]
tests/core/workflows/steps/test_validate_step.py::TestValidateArchiveStepBehavior::test_reads_archive_path_from_context PASSED [ 64%]
tests/core/workflows/steps/test_validate_step.py::TestValidateArchiveStepBehavior::test_accepts_path_string_directly PASSED [ 64%]
tests/core/workflows/steps/test_validate_step.py::TestValidateArchiveStepBehavior::test_fails_when_no_archive_path PASSED [ 64%]
tests/core/workflows/steps/test_validate_step.py::TestValidateArchiveStepBehavior::test_fails_when_archive_file_missing PASSED [ 64%]
tests/core/workflows/steps/test_validate_step.py::TestValidateArchiveStepBehavior::test_stores_validation_result_in_context PASSED [ 65%]
tests/core/workflows/steps/test_validate_step.py::TestValidateArchiveStepBehavior::test_step_has_descriptive_name PASSED [ 65%]
tests/core/workflows/steps/test_validate_step.py::TestValidateArchiveStepBehavior::test_output_contains_check_results PASSED [ 65%]
tests/core/workflows/steps/test_validate_step.py::TestValidateArchiveStepWithEmptyArchive::test_validates_empty_archive PASSED [ 65%]
tests/core/workflows/steps/test_validate_step.py::TestValidateArchiveStepWithProgress::test_reports_progress_during_validation PASSED [ 65%]
tests/core/workflows/steps/test_validate_step.py::TestValidateArchiveStepWithProgress::test_reads_actual_file_from_context_with_fallback PASSED [ 65%]
tests/core/workflows/steps/test_validate_step.py::TestValidateArchiveStepWithProgress::test_falls_back_to_archive_file_when_actual_file_missing PASSED [ 65%]
tests/core/workflows/steps/test_validate_step.py::TestValidateArchiveStepWithProgress::test_prioritizes_actual_file_over_archive_file PASSED [ 65%]
tests/core/workflows/steps/test_write_step.py::TestWriteMessagesStepBehavior::test_archives_messages_to_file PASSED [ 65%]
tests/core/workflows/steps/test_write_step.py::TestWriteMessagesStepBehavior::test_reads_from_context PASSED [ 65%]
tests/core/workflows/steps/test_write_step.py::TestWriteMessagesStepBehavior::test_handles_empty_input PASSED [ 65%]
tests/core/workflows/steps/test_write_step.py::TestWriteMessagesStepBehavior::test_handles_interruption PASSED [ 65%]
tests/core/workflows/steps/test_write_step.py::TestWriteMessagesStepBehavior::test_stores_results_in_context PASSED [ 65%]
tests/core/workflows/steps/test_write_step.py::TestWriteMessagesStepBehavior::test_passes_compression_option PASSED [ 65%]
tests/core/workflows/steps/test_write_step.py::TestWriteMessagesStepBehavior::test_handles_errors PASSED [ 65%]
tests/core/workflows/steps/test_write_step.py::TestWriteMessagesStepBehavior::test_step_has_descriptive_name PASSED [ 65%]
tests/core/workflows/steps/test_write_step.py::TestWriteMessagesStepBehavior::test_reports_count_in_metadata PASSED [ 65%]
tests/core/workflows/steps/test_write_step.py::TestWriteMessagesStepBehavior::test_reports_progress_during_archive PASSED [ 65%]
tests/core/workflows/steps/test_write_step.py::TestWriteMessagesStepBehavior::test_reports_progress_on_interruption PASSED [ 65%]
tests/core/workflows/steps/test_write_step.py::TestWriteMessagesStepBehavior::test_reports_progress_no_messages PASSED [ 65%]
tests/core/workflows/steps/test_write_step.py::TestWriteMessagesStepBehavior::test_writes_interrupted_to_context PASSED [ 65%]
tests/core/workflows/test_archive_workflow.py::test_archive_workflow_dry_run PASSED [ 65%]
tests/core/workflows/test_archive_workflow.py::test_archive_workflow_success PASSED [ 65%]
tests/core/workflows/test_archive_workflow.py::test_archive_workflow_no_messages PASSED [ 65%]
tests/core/workflows/test_archive_workflow.py::test_archive_workflow_invalid_age_threshold PASSED [ 65%]
tests/core/workflows/test_archive_workflow.py::test_delete_messages_permanent PASSED [ 65%]
tests/core/workflows/test_archive_workflow.py::test_delete_messages_trash PASSED [ 65%]
tests/core/workflows/test_archive_workflow.py::test_delete_messages_no_archived_messages PASSED [ 66%]
tests/core/workflows/test_archive_workflow.py::test_determine_output_file_with_resumable_session PASSED [ 66%]
tests/core/workflows/test_archive_workflow.py::test_determine_output_file_gzip_compression PASSED [ 66%]
tests/core/workflows/test_archive_workflow.py::test_determine_output_file_lzma_compression PASSED [ 66%]
tests/core/workflows/test_archive_workflow.py::test_determine_output_file_zstd_compression PASSED [ 66%]
tests/core/workflows/test_archive_workflow.py::test_archive_workflow_scan_step_fails PASSED [ 66%]
tests/core/workflows/test_archive_workflow.py::test_archive_workflow_filter_step_fails PASSED [ 66%]
tests/core/workflows/test_archive_workflow.py::test_archive_workflow_with_validation_pass PASSED [ 66%]
tests/core/workflows/test_archive_workflow.py::test_delete_messages_step_fails PASSED [ 66%]
tests/core/workflows/test_composer.py::TestConditionalStepBasic::test_conditional_step_executes_when_condition_true PASSED [ 66%]
tests/core/workflows/test_composer.py::TestConditionalStepBasic::test_conditional_step_skipped_when_condition_false PASSED [ 66%]
tests/core/workflows/test_composer.py::TestConditionalStepBasic::test_conditional_step_reads_context_values PASSED [ 66%]
tests/core/workflows/test_composer.py::TestConditionalStepBasic::test_add_conditional_step_returns_self PASSED [ 66%]
tests/core/workflows/test_composer.py::TestConditionalStepBasic::test_fluent_chaining_with_conditional_steps PASSED [ 66%]
tests/core/workflows/test_composer.py::TestConditionalStepSequence::test_multiple_conditional_steps_mixed_conditions PASSED [ 66%]
tests/core/workflows/test_composer.py::TestConditionalStepSequence::test_mix_regular_and_conditional_steps PASSED [ 66%]
tests/core/workflows/test_composer.py::TestConditionalStepContextInteraction::test_conditional_step_receives_previous_step_output PASSED [ 66%]
tests/core/workflows/test_composer.py::TestConditionalStepContextInteraction::test_skipped_conditional_step_passes_previous_output PASSED [ 66%]
tests/core/workflows/test_composer.py::TestConditionalStepContextInteraction::test_condition_can_examine_all_previous_context_values PASSED [ 66%]
tests/core/workflows/test_composer.py::TestConditionalStepContextInteraction::test_conditional_step_result_stored_in_context PASSED [ 66%]
tests/core/workflows/test_composer.py::TestConditionalStepErrorHandling::test_failed_conditional_step_raises_workflow_error PASSED [ 66%]
tests/core/workflows/test_composer.py::TestConditionalStepErrorHandling::test_failed_step_before_conditional_stops_workflow PASSED [ 66%]
tests/core/workflows/test_composer.py::TestConditionalStepErrorHandling::test_conditional_step_after_failure_not_executed PASSED [ 66%]
tests/core/workflows/test_composer.py::TestConditionalStepWithProgressReporter::test_conditional_step_with_progress_reporter PASSED [ 66%]
tests/core/workflows/test_composer.py::TestConditionalStepWithProgressReporter::test_skipped_conditional_step_no_progress_report PASSED [ 66%]
tests/core/workflows/test_composer.py::TestConditionalStepDataFlow::test_condition_based_on_context_value PASSED [ 66%]
tests/core/workflows/test_composer.py::TestConditionalStepDataFlow::test_multiple_conditional_branches PASSED [ 67%]
tests/core/workflows/test_composer.py::TestConditionalStepRunWithResult::test_run_with_result_skipped_steps_not_in_results PASSED [ 67%]
tests/core/workflows/test_composer.py::TestConditionalStepRunWithResult::test_run_with_result_executed_conditional_steps_in_results PASSED [ 67%]
tests/core/workflows/test_composer.py::TestConditionalStepConditionExceptions::test_condition_function_exception_propagates PASSED [ 67%]
tests/core/workflows/test_composer.py::TestConditionalStepConditionExceptions::test_condition_exception_prevents_step_execution PASSED [ 67%]
tests/core/workflows/test_composer.py::TestConditionalStepProperties::test_steps_property_includes_conditional_steps PASSED [ 67%]
tests/core/workflows/test_composer.py::TestConditionalStepProperties::test_repr_includes_conditional_steps PASSED [ 67%]
tests/core/workflows/test_composer.py::TestConditionalStepProperties::test_len_includes_conditional_steps PASSED [ 67%]
tests/core/workflows/test_composer.py::TestConditionalStepEdgeCases::test_all_steps_conditional_all_skipped PASSED [ 67%]
tests/core/workflows/test_composer.py::TestConditionalStepEdgeCases::test_all_steps_conditional_all_skipped_with_result PASSED [ 67%]
tests/core/workflows/test_consolidate_workflow.py::TestConsolidateWorkflowBehavior::test_consolidates_multiple_archives PASSED [ 67%]
tests/core/workflows/test_consolidate_workflow.py::TestConsolidateWorkflowBehavior::test_consolidates_with_deduplication PASSED [ 67%]
tests/core/workflows/test_consolidate_workflow.py::TestConsolidateWorkflowBehavior::test_consolidates_with_sorting PASSED [ 67%]
tests/core/workflows/test_consolidate_workflow.py::TestConsolidateWorkflowBehavior::test_handles_multiple_source_files PASSED [ 67%]
tests/core/workflows/test_consolidate_workflow.py::TestConsolidateWorkflowErrors::test_raises_error_when_source_file_missing PASSED [ 67%]
tests/core/workflows/test_consolidate_workflow.py::TestConsolidateWorkflowErrors::test_raises_error_when_multiple_source_files_missing PASSED [ 67%]
tests/core/workflows/test_consolidate_workflow.py::TestConsolidateWorkflowErrors::test_raises_error_when_no_source_files PASSED [ 67%]
tests/core/workflows/test_consolidate_workflow.py::TestConsolidateWorkflowProgressReporting::test_reports_progress_with_all_options_enabled PASSED [ 67%]
tests/core/workflows/test_consolidate_workflow.py::TestConsolidateWorkflowProgressReporting::test_reports_progress_without_deduplication PASSED [ 67%]
tests/core/workflows/test_consolidate_workflow.py::TestConsolidateWorkflowProgressReporting::test_reports_duplicate_removal_in_completion_message PASSED [ 67%]
tests/core/workflows/test_consolidate_workflow.py::TestConsolidateWorkflowProgressReporting::test_works_without_progress_reporter PASSED [ 67%]
tests/core/workflows/test_consolidate_workflow.py::TestConsolidateWorkflowCompression::test_consolidates_with_gzip_compression PASSED [ 67%]
tests/core/workflows/test_consolidate_workflow.py::TestConsolidateWorkflowCompression::test_consolidates_without_compression PASSED [ 67%]
tests/core/workflows/test_consolidate_workflow.py::TestConsolidateWorkflowResults::test_result_includes_all_metadata PASSED [ 67%]
tests/core/workflows/test_consolidate_workflow.py::TestConsolidateWorkflowResults::test_result_reflects_no_sorting PASSED [ 67%]
tests/core/workflows/test_dedupe_workflow.py::TestDedupeWorkflowBehavior::test_finds_no_duplicates_when_none_exist PASSED [ 67%]
tests/core/workflows/test_dedupe_workflow.py::TestDedupeWorkflowBehavior::test_returns_empty_result_for_empty_database PASSED [ 68%]
tests/core/workflows/test_dedupe_workflow.py::TestDedupeWorkflowBehavior::test_reports_progress_when_scanning PASSED [ 68%]
tests/core/workflows/test_dedupe_workflow.py::TestDedupeWorkflowBehavior::test_respects_output_file_config PASSED [ 68%]
tests/core/workflows/test_dedupe_workflow.py::TestDedupeWorkflowBehavior::test_respects_strategy_config PASSED [ 68%]
tests/core/workflows/test_dedupe_workflow.py::TestDedupeWorkflowBehavior::test_reports_progress_when_duplicates_found PASSED [ 68%]
tests/core/workflows/test_dedupe_workflow.py::TestDedupeWorkflowBehavior::test_deduplicate_messages_with_progress PASSED [ 68%]
tests/core/workflows/test_doctor_workflow.py::TestDoctorConfig::test_config_has_required_fields PASSED [ 68%]
tests/core/workflows/test_doctor_workflow.py::TestDoctorConfig::test_config_defaults PASSED [ 68%]
tests/core/workflows/test_doctor_workflow.py::TestDoctorResult::test_result_has_required_fields PASSED [ 68%]
tests/core/workflows/test_doctor_workflow.py::TestDoctorResult::test_result_categorized_checks PASSED [ 68%]
tests/core/workflows/test_doctor_workflow.py::TestDoctorWorkflowInit::test_workflow_accepts_storage PASSED [ 68%]
tests/core/workflows/test_doctor_workflow.py::TestDoctorWorkflowExecution::test_runs_all_three_steps PASSED [ 68%]
tests/core/workflows/test_doctor_workflow.py::TestDoctorWorkflowExecution::test_aggregates_results_from_context PASSED [ 68%]
tests/core/workflows/test_doctor_workflow.py::TestDoctorWorkflowExecution::test_determines_overall_status_error PASSED [ 68%]
tests/core/workflows/test_doctor_workflow.py::TestDoctorWorkflowExecution::test_determines_overall_status_warning PASSED [ 68%]
tests/core/workflows/test_doctor_workflow.py::TestDoctorWorkflowExecution::test_determines_overall_status_ok PASSED [ 68%]
tests/core/workflows/test_doctor_workflow.py::TestDoctorWorkflowExecution::test_collects_fixable_issues PASSED [ 68%]
tests/core/workflows/test_doctor_workflow.py::TestDoctorWorkflowExecution::test_counts_are_accurate PASSED [ 68%]
tests/core/workflows/test_doctor_workflow.py::TestDoctorWorkflowExecution::test_workflow_with_progress_reporter PASSED [ 68%]
tests/core/workflows/test_doctor_workflow.py::TestDoctorWorkflowExecution::test_workflow_without_progress_reporter PASSED [ 68%]
tests/core/workflows/test_doctor_workflow.py::TestDoctorWorkflowExecution::test_creates_doctor_instance PASSED [ 68%]
tests/core/workflows/test_doctor_workflow.py::TestDoctorWorkflowExecution::test_closes_doctor_after_execution PASSED [ 68%]
tests/core/workflows/test_doctor_workflow.py::TestDoctorWorkflowEdgeCases::test_handles_empty_check_results PASSED [ 68%]
tests/core/workflows/test_doctor_workflow.py::TestDoctorWorkflowEdgeCases::test_handles_all_checks_passing PASSED [ 68%]
tests/core/workflows/test_doctor_workflow.py::TestDoctorWorkflowEdgeCases::test_handles_mixed_severity_results PASSED [ 68%]
tests/core/workflows/test_doctor_workflow.py::TestDoctorWorkflowEdgeCases::test_verbose_mode_affects_config_only PASSED [ 68%]
tests/core/workflows/test_import_workflow.py::TestImportWorkflowBehavior::test_imports_single_mbox_file PASSED [ 68%]
tests/core/workflows/test_import_workflow.py::TestImportWorkflowBehavior::test_imports_multiple_files_via_pattern PASSED [ 69%]
tests/core/workflows/test_import_workflow.py::TestImportWorkflowBehavior::test_skips_duplicates_when_dedupe_enabled PASSED [ 69%]
tests/core/workflows/test_import_workflow.py::TestImportWorkflowBehavior::test_handles_no_matching_files PASSED [ 69%]
tests/core/workflows/test_import_workflow.py::TestImportWorkflowBehavior::test_reports_progress_during_import PASSED [ 69%]
tests/core/workflows/test_import_workflow.py::TestImportWorkflowBehavior::test_aggregates_results_from_multiple_patterns PASSED [ 69%]
tests/core/workflows/test_import_workflow.py::TestImportWorkflowErrorHandling::test_handles_import_errors_with_progress PASSED [ 69%]
tests/core/workflows/test_import_workflow.py::TestImportWorkflowErrorHandling::test_handles_general_exception_with_progress PASSED [ 69%]
tests/core/workflows/test_import_workflow.py::TestImportWorkflowErrorHandling::test_collects_errors_from_single_file_result PASSED [ 69%]
tests/core/workflows/test_migrate_workflow.py::TestMigrateFromV10::test_migrates_v10_database_successfully PASSED [ 69%]
tests/core/workflows/test_migrate_workflow.py::TestMigrateFromV10::test_migrates_empty_v10_database PASSED [ 69%]
tests/core/workflows/test_migrate_workflow.py::TestMigrateFromV10::test_creates_backup_before_migration PASSED [ 69%]
tests/core/workflows/test_migrate_workflow.py::TestMigrateFromV10::test_skips_backup_when_disabled PASSED [ 69%]
tests/core/workflows/test_migrate_workflow.py::TestMigrateFromV10::test_reports_progress_during_migration PASSED [ 69%]
tests/core/workflows/test_migrate_workflow.py::TestAlreadyMigrated::test_skips_migration_when_already_current PASSED [ 69%]
tests/core/workflows/test_migrate_workflow.py::TestAlreadyMigrated::test_upgrades_v11_to_latest PASSED [ 69%]
tests/core/workflows/test_migrate_workflow.py::TestMigrationErrors::test_handles_nonexistent_database PASSED [ 69%]
tests/core/workflows/test_migrate_workflow.py::TestMigrationErrors::test_rejects_invalid_target_version PASSED [ 69%]
tests/core/workflows/test_migrate_workflow.py::TestMigrationErrors::test_rejects_downgrade_attempts PASSED [ 69%]
tests/core/workflows/test_migrate_workflow.py::TestMigrationErrors::test_provides_backup_path_on_migration_failure PASSED [ 69%]
tests/core/workflows/test_migrate_workflow.py::TestMigrationVerification::test_verifies_schema_after_migration PASSED [ 69%]
tests/core/workflows/test_migrate_workflow.py::TestMigrationVerification::test_includes_migration_details PASSED [ 69%]
tests/core/workflows/test_migrate_workflow.py::TestSchemaManagerIntegration::test_uses_schema_manager_for_version_detection PASSED [ 69%]
tests/core/workflows/test_migrate_workflow.py::TestSchemaManagerIntegration::test_supports_current_version_constant PASSED [ 69%]
tests/core/workflows/test_migrate_workflow.py::TestProgressReporting::test_works_without_progress_reporter PASSED [ 69%]
tests/core/workflows/test_migrate_workflow.py::TestProgressReporting::test_reports_errors_to_progress_on_failure PASSED [ 69%]
tests/core/workflows/test_migrate_workflow.py::TestTargetVersions::test_migrates_to_specific_version_v11 PASSED [ 69%]
tests/core/workflows/test_migrate_workflow.py::TestTargetVersions::test_migrates_to_specific_version_v13 PASSED [ 70%]
tests/core/workflows/test_migrate_workflow.py::TestExceptionHandling::test_handles_migration_exception_with_backup PASSED [ 70%]
tests/core/workflows/test_migrate_workflow.py::TestExceptionHandling::test_handles_migration_exception_without_backup PASSED [ 70%]
tests/core/workflows/test_migrate_workflow.py::TestExceptionHandling::test_reports_migration_exception_to_progress PASSED [ 70%]
tests/core/workflows/test_migrate_workflow.py::TestExceptionHandling::test_reports_verification_failure_with_progress PASSED [ 70%]
tests/core/workflows/test_repair_workflow.py::TestRepairWorkflowBasics::test_repair_with_no_issues_found PASSED [ 70%]
tests/core/workflows/test_repair_workflow.py::TestRepairWorkflowBasics::test_repair_dry_run_does_not_fix_issues PASSED [ 70%]
tests/core/workflows/test_repair_workflow.py::TestRepairWorkflowBasics::test_repair_fixes_detected_issues PASSED [ 70%]
tests/core/workflows/test_repair_workflow.py::TestRepairWorkflowBasics::test_repair_handles_partial_fix_success PASSED [ 70%]
tests/core/workflows/test_repair_workflow.py::TestRepairWorkflowBackfill::test_backfill_when_no_invalid_offsets PASSED [ 70%]
tests/core/workflows/test_repair_workflow.py::TestRepairWorkflowBackfill::test_backfill_repairs_invalid_offsets PASSED [ 70%]
tests/core/workflows/test_repair_workflow.py::TestRepairWorkflowBackfill::test_backfill_without_db_manager_returns_zero PASSED [ 70%]
tests/core/workflows/test_repair_workflow.py::TestRepairWorkflowProgress::test_repair_reports_diagnostics_progress PASSED [ 70%]
tests/core/workflows/test_repair_workflow.py::TestRepairWorkflowProgress::test_repair_reports_fix_progress PASSED [ 70%]
tests/core/workflows/test_repair_workflow.py::TestRepairWorkflowProgress::test_repair_reports_backfill_progress PASSED [ 70%]
tests/core/workflows/test_repair_workflow.py::TestRepairWorkflowErrorHandling::test_repair_closes_doctor_on_success PASSED [ 70%]
tests/core/workflows/test_repair_workflow.py::TestRepairWorkflowErrorHandling::test_repair_closes_doctor_on_exception PASSED [ 70%]
tests/core/workflows/test_repair_workflow.py::TestRepairWorkflowErrorHandling::test_repair_handles_backfill_exception PASSED [ 70%]
tests/core/workflows/test_repair_workflow.py::TestRepairWorkflowIntegration::test_repair_creates_doctor_with_correct_params PASSED [ 70%]
tests/core/workflows/test_repair_workflow.py::TestRepairWorkflowIntegration::test_repair_collects_all_check_details PASSED [ 70%]
tests/core/workflows/test_search_workflow.py::TestSearchWorkflowBehavior::test_search_returns_results PASSED [ 70%]
tests/core/workflows/test_search_workflow.py::TestSearchWorkflowBehavior::test_search_with_no_results PASSED [ 70%]
tests/core/workflows/test_search_workflow.py::TestSearchWorkflowBehavior::test_reports_progress_with_results PASSED [ 70%]
tests/core/workflows/test_search_workflow.py::TestSearchWorkflowBehavior::test_reports_progress_no_results PASSED [ 70%]
tests/core/workflows/test_search_workflow.py::TestSearchWorkflowBehavior::test_sort_ascending PASSED [ 70%]
tests/core/workflows/test_search_workflow.py::TestSearchWorkflowBehavior::test_sort_descending_default PASSED [ 70%]
tests/core/workflows/test_status_workflow.py::test_status_workflow_success PASSED [ 71%]
tests/core/workflows/test_status_workflow.py::test_status_workflow_verbose_gets_more_runs PASSED [ 71%]
tests/core/workflows/test_status_workflow.py::test_status_workflow_empty_archive PASSED [ 71%]
tests/core/workflows/test_status_workflow.py::test_status_workflow_with_progress_reporter PASSED [ 71%]
tests/core/workflows/test_status_workflow.py::test_status_result_archive_files_count_property PASSED [ 71%]
tests/core/workflows/test_step.py::TestStepResult::test_ok_creates_success_result PASSED [ 71%]
tests/core/workflows/test_step.py::TestStepResult::test_ok_with_metadata PASSED [ 71%]
tests/core/workflows/test_step.py::TestStepResult::test_fail_creates_failed_result PASSED [ 71%]
tests/core/workflows/test_step.py::TestStepResult::test_fail_with_metadata PASSED [ 71%]
tests/core/workflows/test_step.py::TestStepContext::test_set_and_get PASSED [ 71%]
tests/core/workflows/test_step.py::TestStepContext::test_get_with_default PASSED [ 71%]
tests/core/workflows/test_step.py::TestStepContext::test_contains PASSED [ 71%]
tests/core/workflows/test_step.py::TestStepContext::test_dict_style_access PASSED [ 71%]
tests/core/workflows/test_step.py::TestStepContext::test_getitem_raises_keyerror PASSED [ 71%]
tests/core/workflows/test_step.py::TestStepContext::test_keys PASSED     [ 71%]
tests/core/workflows/test_step.py::TestStepContext::test_to_dict PASSED  [ 71%]
tests/core/workflows/test_step.py::TestContextKeys::test_standard_keys_are_strings PASSED [ 71%]
tests/core/workflows/test_step.py::TestWorkflowError::test_error_with_message PASSED [ 71%]
tests/core/workflows/test_step.py::TestWorkflowError::test_error_without_message PASSED [ 71%]
tests/core/workflows/test_step.py::TestWorkflowComposer::test_add_step_returns_self PASSED [ 71%]
tests/core/workflows/test_step.py::TestWorkflowComposer::test_fluent_chaining PASSED [ 71%]
tests/core/workflows/test_step.py::TestWorkflowComposer::test_steps_property_returns_copy PASSED [ 71%]
tests/core/workflows/test_step.py::TestWorkflowComposer::test_run_executes_steps_in_order PASSED [ 71%]
tests/core/workflows/test_step.py::TestWorkflowComposer::test_run_passes_context_to_all_steps PASSED [ 71%]
tests/core/workflows/test_step.py::TestWorkflowComposer::test_run_returns_context PASSED [ 71%]
tests/core/workflows/test_step.py::TestWorkflowComposer::test_run_raises_workflow_error_on_step_failure PASSED [ 71%]
tests/core/workflows/test_step.py::TestWorkflowComposer::test_run_with_progress_reporter PASSED [ 71%]
tests/core/workflows/test_step.py::TestWorkflowComposer::test_run_with_existing_context PASSED [ 72%]
tests/core/workflows/test_step.py::TestWorkflowComposer::test_run_with_result_returns_all_results PASSED [ 72%]
tests/core/workflows/test_step.py::TestWorkflowComposer::test_len PASSED [ 72%]
tests/core/workflows/test_step.py::TestWorkflowComposer::test_repr PASSED [ 72%]
tests/core/workflows/test_step.py::TestWorkflowComposerMetadata::test_step_metadata_stored_in_context PASSED [ 72%]
tests/core/workflows/test_step.py::TestWorkflowComposerMetadata::test_multiple_steps_metadata PASSED [ 72%]
tests/core/workflows/test_validate_workflow.py::TestValidateWorkflowBehavior::test_validates_existing_archive PASSED [ 72%]
tests/core/workflows/test_validate_workflow.py::TestValidateWorkflowBehavior::test_raises_error_for_missing_archive PASSED [ 72%]
tests/core/workflows/test_validate_workflow.py::TestValidateWorkflowBehavior::test_provides_detailed_report_when_verbose PASSED [ 72%]
tests/core/workflows/test_validate_workflow.py::TestValidateWorkflowBehavior::test_reports_validation_failure_with_errors PASSED [ 72%]
tests/core/workflows/test_validate_workflow.py::TestValidateWorkflowBehavior::test_reports_progress_during_validation PASSED [ 72%]
tests/core/workflows/test_validate_workflow.py::TestValidateWorkflowBehavior::test_reports_failure_in_progress_when_validation_fails PASSED [ 72%]
tests/core/workflows/test_validate_workflow.py::TestValidateWorkflowBehavior::test_validates_without_progress_reporter PASSED [ 72%]
tests/core/workflows/test_validate_workflow.py::TestValidateWorkflowBehavior::test_validates_empty_archive_set PASSED [ 72%]
tests/core/workflows/test_validate_workflow.py::TestValidateWorkflowBehavior::test_storage_attribute_set_correctly PASSED [ 72%]
tests/core/workflows/test_validate_workflow.py::TestValidateWorkflowBehavior::test_progress_attribute_set_correctly PASSED [ 72%]
tests/core/workflows/test_validate_workflow.py::TestValidateWorkflowBehavior::test_verbose_details_include_all_checks PASSED [ 72%]
tests/core/workflows/test_validate_workflow.py::TestValidateWorkflowBehavior::test_facade_closed_after_validation PASSED [ 72%]
tests/core/workflows/test_validate_workflow.py::TestValidateConfigDataclass::test_creates_config_with_required_fields PASSED [ 72%]
tests/core/workflows/test_validate_workflow.py::TestValidateConfigDataclass::test_creates_config_with_verbose_flag PASSED [ 72%]
tests/core/workflows/test_validate_workflow.py::TestValidateResultDataclass::test_creates_result_with_all_fields PASSED [ 72%]
tests/core/workflows/test_validate_workflow.py::TestValidateResultDataclass::test_creates_result_with_errors PASSED [ 72%]
tests/core/workflows/test_verify_workflow.py::TestVerifyWorkflowInitialization::test_initialization_with_storage_and_progress PASSED [ 72%]
tests/core/workflows/test_verify_workflow.py::TestVerifyWorkflowInitialization::test_initialization_without_progress PASSED [ 72%]
tests/core/workflows/test_verify_workflow.py::TestVerifyWorkflowIntegrityCheck::test_verify_integrity_success_with_progress PASSED [ 72%]
tests/core/workflows/test_verify_workflow.py::TestVerifyWorkflowIntegrityCheck::test_verify_integrity_failure_with_progress PASSED [ 72%]
tests/core/workflows/test_verify_workflow.py::TestVerifyWorkflowIntegrityCheck::test_verify_integrity_success_without_progress PASSED [ 73%]
tests/core/workflows/test_verify_workflow.py::TestVerifyWorkflowIntegrityCheck::test_verify_integrity_failure_without_progress PASSED [ 73%]
tests/core/workflows/test_verify_workflow.py::TestVerifyWorkflowConsistencyCheck::test_verify_consistency_all_pass_with_progress PASSED [ 73%]
tests/core/workflows/test_verify_workflow.py::TestVerifyWorkflowConsistencyCheck::test_verify_consistency_with_failures_with_progress PASSED [ 73%]
tests/core/workflows/test_verify_workflow.py::TestVerifyWorkflowConsistencyCheck::test_verify_consistency_all_pass_without_progress PASSED [ 73%]
tests/core/workflows/test_verify_workflow.py::TestVerifyWorkflowConsistencyCheck::test_verify_consistency_with_failures_without_progress PASSED [ 73%]
tests/core/workflows/test_verify_workflow.py::TestVerifyWorkflowOffsetsCheck::test_verify_offsets_success_with_progress PASSED [ 73%]
tests/core/workflows/test_verify_workflow.py::TestVerifyWorkflowOffsetsCheck::test_verify_offsets_failure_with_progress PASSED [ 73%]
tests/core/workflows/test_verify_workflow.py::TestVerifyWorkflowOffsetsCheck::test_verify_offsets_success_without_progress PASSED [ 73%]
tests/core/workflows/test_verify_workflow.py::TestVerifyWorkflowOffsetsCheck::test_verify_offsets_failure_without_progress PASSED [ 73%]
tests/core/workflows/test_verify_workflow.py::TestVerifyWorkflowErrorHandling::test_unknown_verify_type_raises_error PASSED [ 73%]
tests/core/workflows/test_verify_workflow.py::TestVerifyWorkflowErrorHandling::test_doctor_cleanup_on_exception PASSED [ 73%]
tests/core/workflows/test_verify_workflow.py::TestVerifyConfig::test_verify_config_defaults PASSED [ 73%]
tests/core/workflows/test_verify_workflow.py::TestVerifyConfig::test_verify_config_with_all_params PASSED [ 73%]
tests/core/workflows/test_verify_workflow.py::TestVerifyResult::test_verify_result_structure PASSED [ 73%]
tests/core/workflows/test_verify_workflow.py::TestVerifyResult::test_verify_result_with_issues PASSED [ 73%]
tests/core/workflows/test_verify_workflow.py::TestVerifyType::test_verify_type_values PASSED [ 73%]
tests/data/test_db_manager.py::TestDBManagerInitialization::test_connect_to_existing_database PASSED [ 73%]
tests/data/test_db_manager.py::TestDBManagerInitialization::test_connect_to_missing_database PASSED [ 73%]
tests/data/test_db_manager.py::TestDBManagerInitialization::test_validate_schema_on_init PASSED [ 73%]
tests/data/test_db_manager.py::TestDBManagerInitialization::test_invalid_database_path PASSED [ 73%]
tests/data/test_db_manager.py::TestDBManagerInitialization::test_context_manager_interface PASSED [ 73%]
tests/data/test_db_manager.py::TestMessageOperations::test_record_archived_message_success PASSED [ 73%]
tests/data/test_db_manager.py::TestMessageOperations::test_record_duplicate_gmail_id_fails PASSED [ 73%]
tests/data/test_db_manager.py::TestMessageOperations::test_record_duplicate_rfc_message_id_fails PASSED [ 73%]
tests/data/test_db_manager.py::TestMessageOperations::test_record_message_creates_archive_run PASSED [ 73%]
tests/data/test_db_manager.py::TestMessageOperations::test_get_message_by_gmail_id_found PASSED [ 74%]
tests/data/test_db_manager.py::TestMessageOperations::test_get_message_by_gmail_id_not_found PASSED [ 74%]
tests/data/test_db_manager.py::TestMessageOperations::test_get_message_location PASSED [ 74%]
tests/data/test_db_manager.py::TestMessageOperations::test_get_all_messages_for_archive PASSED [ 74%]
tests/data/test_db_manager.py::TestDeduplication::test_find_duplicates_none PASSED [ 74%]
tests/data/test_db_manager.py::TestDeduplication::test_find_duplicates_by_rfc_message_id PASSED [ 74%]
tests/data/test_db_manager.py::TestDeduplication::test_remove_duplicate_records PASSED [ 74%]
tests/data/test_db_manager.py::TestDeduplication::test_remove_duplicates_creates_archive_run PASSED [ 74%]
tests/data/test_db_manager.py::TestConsolidation::test_update_archive_location_single PASSED [ 74%]
tests/data/test_db_manager.py::TestConsolidation::test_bulk_update_archive_locations PASSED [ 74%]
tests/data/test_db_manager.py::TestConsolidation::test_bulk_update_creates_archive_run PASSED [ 74%]
tests/data/test_db_manager.py::TestDatabaseIntegrity::test_verify_integrity_clean_database PASSED [ 74%]
tests/data/test_db_manager.py::TestDatabaseIntegrity::test_verify_integrity_invalid_offsets PASSED [ 74%]
tests/data/test_db_manager.py::TestDatabaseIntegrity::test_verify_integrity_duplicate_message_ids PASSED [ 74%]
tests/data/test_db_manager.py::TestDatabaseIntegrity::test_verify_integrity_missing_archive_files PASSED [ 74%]
tests/data/test_db_manager.py::TestDatabaseIntegrity::test_get_messages_with_invalid_offsets PASSED [ 74%]
tests/data/test_db_manager.py::TestTransactions::test_transaction_commit_on_success PASSED [ 74%]
tests/data/test_db_manager.py::TestTransactions::test_transaction_rollback_on_error PASSED [ 74%]
tests/data/test_db_manager.py::TestTransactions::test_explicit_commit PASSED [ 74%]
tests/data/test_db_manager.py::TestTransactions::test_explicit_rollback PASSED [ 74%]
tests/data/test_db_manager.py::TestEdgeCases::test_record_message_with_null_optional_fields PASSED [ 74%]
tests/data/test_db_manager.py::TestEdgeCases::test_bulk_update_empty_list PASSED [ 74%]
tests/data/test_db_manager.py::TestEdgeCases::test_bulk_update_partial_failure PASSED [ 74%]
tests/data/test_db_manager.py::TestEdgeCases::test_find_duplicates_large_dataset PASSED [ 74%]
tests/data/test_db_manager.py::TestEdgeCases::test_unicode_handling PASSED [ 74%]
tests/data/test_db_manager.py::TestEdgeCases::test_very_long_field_values PASSED [ 74%]
tests/data/test_db_manager.py::TestEdgeCases::test_concurrent_access PASSED [ 75%]
tests/data/test_db_manager.py::TestSchemaValidation::test_missing_messages_table PASSED [ 75%]
tests/data/test_db_manager.py::TestSchemaValidation::test_missing_required_columns PASSED [ 75%]
tests/data/test_db_manager.py::TestExceptionHandling::test_init_with_nonexistent_file PASSED [ 75%]
tests/data/test_db_manager.py::TestRepairDatabaseCoverage::test_repair_database_with_no_issues PASSED [ 75%]
tests/data/test_db_manager.py::TestGetMessageLocation::test_get_message_location_not_found PASSED [ 75%]
tests/data/test_db_manager.py::TestUpdateArchiveLocation::test_update_archive_location_not_found PASSED [ 75%]
tests/data/test_db_manager.py::TestRemoveDuplicateRecords::test_remove_duplicates_empty_list PASSED [ 75%]
tests/data/test_db_manager.py::TestTransactionContextManager::test_transaction_exception_handling PASSED [ 75%]
tests/data/test_db_manager.py::TestSessionManagement::test_get_session_returns_session_when_found PASSED [ 75%]
tests/data/test_db_manager.py::TestSessionManagement::test_get_session_returns_none_when_not_found PASSED [ 75%]
tests/data/test_db_manager.py::TestSessionManagement::test_get_session_by_file_returns_in_progress_session PASSED [ 75%]
tests/data/test_db_manager.py::TestSessionManagement::test_get_session_by_file_returns_none_when_no_in_progress PASSED [ 75%]
tests/data/test_db_manager.py::TestSessionManagement::test_get_session_by_file_returns_none_for_different_file PASSED [ 75%]
tests/data/test_db_manager.py::TestSessionManagement::test_get_all_partial_sessions_returns_all_in_progress PASSED [ 75%]
tests/data/test_db_manager.py::TestSessionManagement::test_get_all_partial_sessions_excludes_completed PASSED [ 75%]
tests/data/test_db_manager.py::TestSessionManagement::test_get_all_partial_sessions_returns_empty_when_none PASSED [ 75%]
tests/data/test_db_manager.py::TestSessionManagement::test_get_all_partial_sessions_ordered_by_started_at_desc PASSED [ 75%]
tests/data/test_db_manager.py::TestSessionManagement::test_abort_session_changes_status_to_aborted PASSED [ 75%]
tests/data/test_db_manager.py::TestSessionManagement::test_delete_session_removes_session PASSED [ 75%]
tests/data/test_db_manager.py::TestSessionManagement::test_delete_messages_for_file_removes_all_messages PASSED [ 75%]
tests/data/test_db_manager.py::TestSessionManagement::test_delete_messages_for_file_returns_zero_when_none PASSED [ 75%]
tests/data/test_db_manager.py::TestDBManagerExceptionHandling::test_delete_message_raises_db_manager_error_on_failure PASSED [ 75%]
tests/data/test_db_manager.py::TestDBManagerExceptionHandling::test_remove_duplicate_records_raises_db_manager_error_on_failure PASSED [ 75%]
tests/data/test_db_manager.py::TestDBManagerExceptionHandling::test_update_archive_location_raises_db_manager_error_on_failure PASSED [ 75%]
tests/data/test_db_manager.py::TestDBManagerExceptionHandling::test_bulk_update_archive_locations_raises_db_manager_error_on_failure PASSED [ 75%]
tests/data/test_db_manager.py::TestDBManagerExceptionHandling::test_record_archived_message_wraps_non_integrity_exceptions PASSED [ 75%]
tests/data/test_db_manager.py::TestSearchMessages::test_search_messages_fulltext_search PASSED [ 76%]
tests/data/test_db_manager.py::TestSearchMessages::test_search_messages_from_filter PASSED [ 76%]
tests/data/test_db_manager.py::TestSearchMessages::test_search_messages_to_filter PASSED [ 76%]
tests/data/test_db_manager.py::TestSearchMessages::test_search_messages_subject_filter PASSED [ 76%]
tests/data/test_db_manager.py::TestSearchMessages::test_search_messages_date_range_filter PASSED [ 76%]
tests/data/test_db_manager.py::TestSearchMessages::test_search_messages_combined_filters PASSED [ 76%]
tests/data/test_db_manager.py::TestSearchMessages::test_search_messages_empty_results PASSED [ 76%]
tests/data/test_db_manager.py::TestSearchMessages::test_search_messages_empty_database PASSED [ 76%]
tests/data/test_db_manager.py::TestSearchMessages::test_search_messages_limit_parameter PASSED [ 76%]
tests/data/test_db_manager.py::TestGetGmailIdsForArchive::test_get_gmail_ids_for_archive_single_file PASSED [ 76%]
tests/data/test_db_manager.py::TestGetGmailIdsForArchive::test_get_gmail_ids_for_archive_empty_file PASSED [ 76%]
tests/data/test_db_manager.py::TestGetGmailIdsForArchive::test_get_gmail_ids_for_archive_returns_set PASSED [ 76%]
tests/data/test_db_manager.py::TestGetMessageCount::test_get_message_count_zero PASSED [ 76%]
tests/data/test_db_manager.py::TestGetMessageCount::test_get_message_count_one PASSED [ 76%]
tests/data/test_db_manager.py::TestGetMessageCount::test_get_message_count_multiple PASSED [ 76%]
tests/data/test_db_manager.py::TestGetMessageCount::test_get_message_count_after_deletion PASSED [ 76%]
tests/data/test_db_manager.py::TestGetArchiveRuns::test_get_archive_runs_empty_database PASSED [ 76%]
tests/data/test_db_manager.py::TestGetArchiveRuns::test_get_archive_runs_default_limit PASSED [ 76%]
tests/data/test_db_manager.py::TestGetArchiveRuns::test_get_archive_runs_with_limit PASSED [ 76%]
tests/data/test_db_manager.py::TestGetArchiveRuns::test_get_archive_runs_ordered_by_timestamp_desc PASSED [ 76%]
tests/data/test_db_manager.py::TestGetArchiveRuns::test_get_archive_runs_returns_dict_with_required_fields PASSED [ 76%]
tests/data/test_db_manager.py::TestIsArchived::test_is_archived_true_for_existing_message PASSED [ 76%]
tests/data/test_db_manager.py::TestIsArchived::test_is_archived_false_for_nonexistent_message PASSED [ 76%]
tests/data/test_db_manager.py::TestIsArchived::test_is_archived_false_on_empty_database PASSED [ 76%]
tests/data/test_db_manager.py::TestIsArchived::test_is_archived_multiple_messages PASSED [ 76%]
tests/data/test_db_manager.py::TestScheduleOperations::test_add_schedule_success PASSED [ 76%]
tests/data/test_db_manager.py::TestScheduleOperations::test_add_schedule_with_day_of_week PASSED [ 77%]
tests/data/test_db_manager.py::TestScheduleOperations::test_add_schedule_with_day_of_month PASSED [ 77%]
tests/data/test_db_manager.py::TestScheduleOperations::test_list_schedules_empty PASSED [ 77%]
tests/data/test_db_manager.py::TestScheduleOperations::test_list_schedules_multiple PASSED [ 77%]
tests/data/test_db_manager.py::TestScheduleOperations::test_list_schedules_enabled_only PASSED [ 77%]
tests/data/test_db_manager.py::TestScheduleOperations::test_get_schedule_found PASSED [ 77%]
tests/data/test_db_manager.py::TestScheduleOperations::test_get_schedule_not_found PASSED [ 77%]
tests/data/test_db_manager.py::TestScheduleOperations::test_remove_schedule_success PASSED [ 77%]
tests/data/test_db_manager.py::TestScheduleOperations::test_remove_schedule_not_found PASSED [ 77%]
tests/data/test_db_manager.py::TestScheduleOperations::test_enable_schedule_success PASSED [ 77%]
tests/data/test_db_manager.py::TestScheduleOperations::test_enable_schedule_not_found PASSED [ 77%]
tests/data/test_db_manager.py::TestScheduleOperations::test_disable_schedule_success PASSED [ 77%]
tests/data/test_db_manager.py::TestScheduleOperations::test_disable_schedule_not_found PASSED [ 77%]
tests/data/test_db_manager.py::TestScheduleOperations::test_update_schedule_last_run_success PASSED [ 77%]
tests/data/test_db_manager.py::TestScheduleOperations::test_update_schedule_last_run_updates_timestamp PASSED [ 77%]
tests/data/test_db_manager.py::TestSessionQueryCompression::test_get_session_by_query_with_compression PASSED [ 77%]
tests/data/test_db_manager.py::TestSessionQueryCompression::test_get_session_by_query_with_none_compression PASSED [ 77%]
tests/data/test_db_manager.py::TestSessionQueryCompression::test_get_session_by_query_no_match_on_compression PASSED [ 77%]
tests/data/test_db_manager.py::TestSessionQueryCompression::test_get_session_by_query_returns_most_recent PASSED [ 77%]
tests/data/test_db_manager.py::TestSessionQueryCompression::test_get_session_by_query_ignores_completed_sessions PASSED [ 77%]
tests/data/test_db_manager.py::TestRepairDatabaseExternalContent::test_repair_database_non_dry_run_creates_archive_run PASSED [ 77%]
tests/data/test_db_manager.py::TestRepairDatabaseExternalContent::test_repair_database_exception_handling PASSED [ 77%]
tests/data/test_db_manager.py::TestFTSIntegrityDetailed::test_verify_integrity_fts_checks_execute PASSED [ 77%]
tests/data/test_db_manager.py::TestSchemaVersionDetection::test_validate_schema_version_returns_1_2_when_rfc_is_pk PASSED [ 77%]
tests/data/test_db_manager.py::TestSchemaVersionDetection::test_validate_schema_version_returns_1_1_when_gmail_is_pk PASSED [ 77%]
tests/data/test_db_manager.py::TestSchemaVersionDetection::test_validate_schema_version_fallback_to_1_1 PASSED [ 77%]
tests/data/test_db_manager.py::TestSessionStatusUpdates::test_update_session_progress_increments_count PASSED [ 78%]
tests/data/test_db_manager.py::TestSessionStatusUpdates::test_complete_session_changes_status PASSED [ 78%]
tests/data/test_db_manager.py::TestSessionStatusUpdates::test_complete_session_updates_timestamp PASSED [ 78%]
tests/data/test_db_manager.py::TestDatabaseAutoCreate::test_initialize_creates_new_database_when_auto_create_true PASSED [ 78%]
tests/data/test_hybrid_storage.py::TestHybridStorageInitialization::test_init_with_valid_db_manager PASSED [ 78%]
tests/data/test_hybrid_storage.py::TestHybridStorageInitialization::test_init_creates_staging_area PASSED [ 78%]
tests/data/test_hybrid_storage.py::TestHybridStorageInitialization::test_cleanup_staging_area_on_del PASSED [ 78%]
tests/data/test_hybrid_storage.py::TestHybridStorageInitialization::test_init_without_preload_rfc_ids PASSED [ 78%]
tests/data/test_hybrid_storage.py::TestArchiveMessage::test_archive_message_success PASSED [ 78%]
tests/data/test_hybrid_storage.py::TestArchiveMessage::test_archive_message_calculates_offset_correctly PASSED [ 78%]
tests/data/test_hybrid_storage.py::TestArchiveMessage::test_archive_message_calculates_length_correctly PASSED [ 78%]
tests/data/test_hybrid_storage.py::TestArchiveMessage::test_archive_message_with_gzip_compression PASSED [ 78%]
tests/data/test_hybrid_storage.py::TestArchiveMessage::test_archive_message_with_lzma_compression PASSED [ 78%]
tests/data/test_hybrid_storage.py::TestArchiveMessage::test_archive_message_with_zstd_compression PASSED [ 78%]
tests/data/test_hybrid_storage.py::TestArchiveMessage::test_archive_message_lock_file_management PASSED [ 78%]
tests/data/test_hybrid_storage.py::TestArchiveMessage::test_archive_message_cleans_staging_file PASSED [ 78%]
tests/data/test_hybrid_storage.py::TestArchiveMessage::test_archive_message_database_fails_counts_as_failed PASSED [ 78%]
tests/data/test_hybrid_storage.py::TestArchiveMessage::test_archive_batch_validates_at_end PASSED [ 78%]
tests/data/test_hybrid_storage.py::TestArchiveMessage::test_archive_message_missing_message_id PASSED [ 78%]
tests/data/test_hybrid_storage.py::TestArchiveMessage::test_archive_message_duplicate_rfc_message_id_skipped PASSED [ 78%]
tests/data/test_hybrid_storage.py::TestConsolidateArchives::test_consolidate_without_deduplication PASSED [ 78%]
tests/data/test_hybrid_storage.py::TestConsolidateArchives::test_consolidate_with_deduplication PASSED [ 78%]
tests/data/test_hybrid_storage.py::TestConsolidateArchives::test_consolidate_recalculates_offsets PASSED [ 78%]
tests/data/test_hybrid_storage.py::TestConsolidateArchives::test_consolidate_validates_result PASSED [ 78%]
tests/data/test_hybrid_storage.py::TestConsolidateArchives::test_consolidate_with_compressed_archives PASSED [ 78%]
tests/data/test_hybrid_storage.py::TestConsolidateArchives::test_consolidate_rollback_on_failure PASSED [ 78%]
tests/data/test_hybrid_storage.py::TestValidation::test_validate_message_consistency_valid_message PASSED [ 78%]
tests/data/test_hybrid_storage.py::TestValidation::test_validate_message_consistency_missing_in_database PASSED [ 79%]
tests/data/test_hybrid_storage.py::TestValidation::test_validate_message_consistency_missing_in_mbox PASSED [ 79%]
tests/data/test_hybrid_storage.py::TestValidation::test_validate_message_consistency_corrupt_email_data PASSED [ 79%]
tests/data/test_hybrid_storage.py::TestValidation::test_validate_archive_consistency_all_good PASSED [ 79%]
tests/data/test_hybrid_storage.py::TestValidation::test_validate_archive_consistency_count_mismatch PASSED [ 79%]
tests/data/test_hybrid_storage.py::TestValidation::test_validate_archive_consistency_orphaned_message PASSED [ 79%]
tests/data/test_hybrid_storage.py::TestAtomicity::test_transaction_commits_on_full_success PASSED [ 79%]
tests/data/test_hybrid_storage.py::TestAtomicity::test_batch_error_handling_counts_failures PASSED [ 79%]
tests/data/test_hybrid_storage.py::TestAtomicity::test_successful_archive_cleans_up_staging_files PASSED [ 79%]
tests/data/test_hybrid_storage.py::TestAtomicity::test_partial_write_detection PASSED [ 79%]
tests/data/test_hybrid_storage.py::TestAtomicity::test_concurrent_operations_dont_interfere PASSED [ 79%]
tests/data/test_hybrid_storage.py::TestErrorHandling::test_invalid_mbox_path PASSED [ 79%]
tests/data/test_hybrid_storage.py::TestErrorHandling::test_disk_full_scenario PASSED [ 79%]
tests/data/test_hybrid_storage.py::TestErrorHandling::test_permission_error PASSED [ 79%]
tests/data/test_hybrid_storage.py::TestErrorHandling::test_corrupt_source_archive_in_consolidation PASSED [ 79%]
tests/data/test_hybrid_storage.py::TestEdgeCasesAndCoverage::test_decompress_corrupt_gzip PASSED [ 79%]
tests/data/test_hybrid_storage.py::TestEdgeCasesAndCoverage::test_decompress_corrupt_lzma PASSED [ 79%]
tests/data/test_hybrid_storage.py::TestEdgeCasesAndCoverage::test_decompress_corrupt_zstd PASSED [ 79%]
tests/data/test_hybrid_storage.py::TestEdgeCasesAndCoverage::test_decompress_with_invalid_compression_format PASSED [ 79%]
tests/data/test_hybrid_storage.py::TestEdgeCasesAndCoverage::test_compress_with_invalid_compression_format PASSED [ 79%]
tests/data/test_hybrid_storage.py::TestEdgeCasesAndCoverage::test_validate_archive_consistency_decompression_fails PASSED [ 79%]
tests/data/test_hybrid_storage.py::TestEdgeCasesAndCoverage::test_collect_messages_decompression_fails PASSED [ 79%]
tests/data/test_hybrid_storage.py::TestEdgeCasesAndCoverage::test_consolidate_validation_missing_messages PASSED [ 79%]
tests/data/test_hybrid_storage.py::TestEdgeCasesAndCoverage::test_consolidate_validation_unexpected_messages PASSED [ 79%]
tests/data/test_hybrid_storage.py::TestEdgeCasesAndCoverage::test_context_manager_enter PASSED [ 79%]
tests/data/test_hybrid_storage.py::TestEdgeCasesAndCoverage::test_context_manager_exit_cleanup PASSED [ 79%]
tests/data/test_hybrid_storage.py::TestEdgeCasesAndCoverage::test_cleanup_staging_area_with_permission_error PASSED [ 80%]
tests/data/test_hybrid_storage.py::TestEdgeCasesAndCoverage::test_cleanup_staging_area_with_missing_attribute PASSED [ 80%]
tests/data/test_hybrid_storage.py::TestEdgeCasesAndCoverage::test_extract_body_preview_non_multipart_with_exception PASSED [ 80%]
tests/data/test_hybrid_storage.py::TestEdgeCasesAndCoverage::test_extract_body_preview_multipart_with_exception PASSED [ 80%]
tests/data/test_hybrid_storage.py::TestEdgeCasesAndCoverage::test_extract_body_preview_very_short PASSED [ 80%]
tests/data/test_hybrid_storage.py::TestEdgeCasesAndCoverage::test_archive_message_with_unusual_compressed_extension PASSED [ 80%]
tests/data/test_hybrid_storage.py::TestEdgeCasesAndCoverage::test_archive_message_with_orphaned_lock_file PASSED [ 80%]
tests/data/test_hybrid_storage.py::TestEdgeCasesAndCoverage::test_archive_message_to_new_file_offset_zero PASSED [ 80%]
tests/data/test_hybrid_storage.py::TestEdgeCasesAndCoverage::test_validate_message_missing_archive_file PASSED [ 80%]
tests/data/test_hybrid_storage.py::TestEdgeCasesAndCoverage::test_deduplicate_with_duplicate_rfc_message_ids PASSED [ 80%]
tests/data/test_hybrid_storage.py::TestEdgeCasesAndCoverage::test_validate_consolidation_with_temp_file_cleanup PASSED [ 80%]
tests/data/test_hybrid_storage.py::TestEdgeCasesAndCoverage::test_cleanup_staging_area_iterdir_exception PASSED [ 80%]
tests/data/test_hybrid_storage.py::TestEdgeCasesAndCoverage::test_extract_body_preview_no_text_plain_part PASSED [ 80%]
tests/data/test_hybrid_storage.py::TestEdgeCasesAndCoverage::test_extract_body_preview_payload_not_bytes PASSED [ 80%]
tests/data/test_hybrid_storage.py::TestEdgeCasesAndCoverage::test_batch_archive_handles_record_failures PASSED [ 80%]
tests/data/test_hybrid_storage.py::TestEdgeCasesAndCoverage::test_batch_archive_mbox_error_raises_exception PASSED [ 80%]
tests/data/test_hybrid_storage.py::TestEdgeCasesAndCoverage::test_archive_batch_successful PASSED [ 80%]
tests/data/test_hybrid_storage.py::TestEdgeCasesAndCoverage::test_consolidate_with_compression_output PASSED [ 80%]
tests/data/test_hybrid_storage.py::TestEdgeCasesAndCoverage::test_bulk_write_database_error_rollback PASSED [ 80%]
tests/data/test_hybrid_storage.py::TestEdgeCasesAndCoverage::test_archive_message_with_lock_file_cleanup PASSED [ 80%]
tests/data/test_hybrid_storage.py::TestEdgeCasesAndCoverage::test_archive_message_with_compression_and_various_formats PASSED [ 80%]
tests/data/test_hybrid_storage.py::TestEdgeCasesAndCoverage::test_consolidate_with_archive_file_fallback PASSED [ 80%]
tests/data/test_hybrid_storage.py::TestEdgeCasesAndCoverage::test_archive_message_compression_extension_detection PASSED [ 80%]
tests/data/test_hybrid_storage.py::TestEdgeCasesAndCoverage::test_consolidate_with_lock_file_cleanup PASSED [ 80%]
tests/data/test_hybrid_storage.py::TestEdgeCasesAndCoverage::test_mbox_unlock_failure_during_cleanup PASSED [ 80%]
tests/data/test_hybrid_storage.py::TestEdgeCasesAndCoverage::test_mbox_close_failure_during_cleanup PASSED [ 80%]
tests/data/test_hybrid_storage.py::TestEdgeCasesAndCoverage::test_archive_message_fallback_mbox_path PASSED [ 81%]
tests/data/test_hybrid_storage.py::TestEdgeCasesAndCoverage::test_bulk_update_archive_locations_error PASSED [ 81%]
tests/data/test_hybrid_storage.py::TestEdgeCasesAndCoverage::test_consolidate_rollback_on_db_failure PASSED [ 81%]
tests/data/test_hybrid_storage.py::TestEdgeCasesAndCoverage::test_consolidate_staging_cleanup_failure PASSED [ 81%]
tests/data/test_hybrid_storage.py::test_hybrid_storage_malformed_email_body PASSED [ 81%]
tests/data/test_hybrid_storage.py::test_hybrid_storage_rollback_cleans_staging PASSED [ 81%]
tests/data/test_hybrid_storage.py::test_bulk_write_length_fallback_when_file_not_created PASSED [ 81%]
tests/data/test_hybrid_storage.py::test_consolidate_length_fallback_when_file_not_created PASSED [ 81%]
tests/data/test_hybrid_storage.py::test_bulk_write_staging_offset_zero_on_first_message PASSED [ 81%]
tests/data/test_hybrid_storage.py::test_bulk_write_length_fallback_path_when_file_missing PASSED [ 81%]
tests/data/test_hybrid_storage.py::test_bulk_write_cleanup_on_error_path PASSED [ 81%]
tests/data/test_hybrid_storage.py::test_bulk_write_finally_block_exceptions PASSED [ 81%]
tests/data/test_hybrid_storage.py::test_consolidate_staging_cleanup_on_validation_error PASSED [ 81%]
tests/data/test_hybrid_storage.py::test_consolidate_rollback_on_general_exception PASSED [ 81%]
tests/data/test_hybrid_storage.py::test_consolidate_finally_block_unlock_close PASSED [ 81%]
tests/data/test_hybrid_storage.py::test_consolidate_rollback_failure_logging PASSED [ 81%]
tests/data/test_hybrid_storage.py::test_consolidate_staging_cleanup_exception PASSED [ 81%]
tests/data/test_hybrid_storage.py::TestReadOperations::test_search_messages_fulltext PASSED [ 81%]
tests/data/test_hybrid_storage.py::TestReadOperations::test_search_messages_with_metadata_filters PASSED [ 81%]
tests/data/test_hybrid_storage.py::TestReadOperations::test_search_messages_with_pagination PASSED [ 81%]
tests/data/test_hybrid_storage.py::TestReadOperations::test_search_messages_empty_database PASSED [ 81%]
tests/data/test_hybrid_storage.py::TestReadOperations::test_search_messages_no_matches PASSED [ 81%]
tests/data/test_hybrid_storage.py::TestReadOperations::test_get_message_by_gmail_id_success PASSED [ 81%]
tests/data/test_hybrid_storage.py::TestReadOperations::test_get_message_by_gmail_id_not_found PASSED [ 81%]
tests/data/test_hybrid_storage.py::TestReadOperations::test_get_message_by_rfc_id_success PASSED [ 81%]
tests/data/test_hybrid_storage.py::TestReadOperations::test_get_message_by_rfc_id_not_found PASSED [ 81%]
tests/data/test_hybrid_storage.py::TestReadOperations::test_extract_message_content_from_uncompressed_mbox PASSED [ 81%]
tests/data/test_hybrid_storage.py::TestReadOperations::test_extract_message_content_from_compressed_mbox PASSED [ 82%]
tests/data/test_hybrid_storage.py::TestReadOperations::test_extract_message_content_message_not_found PASSED [ 82%]
tests/data/test_hybrid_storage.py::TestReadOperations::test_extract_message_content_archive_file_missing PASSED [ 82%]
tests/data/test_hybrid_storage.py::TestStatisticsOperations::test_get_archive_stats_empty_database PASSED [ 82%]
tests/data/test_hybrid_storage.py::TestStatisticsOperations::test_get_archive_stats_with_messages PASSED [ 82%]
tests/data/test_hybrid_storage.py::TestStatisticsOperations::test_get_message_ids_for_archive PASSED [ 82%]
tests/data/test_hybrid_storage.py::TestStatisticsOperations::test_get_message_ids_for_archive_nonexistent_file PASSED [ 82%]
tests/data/test_hybrid_storage.py::TestStatisticsOperations::test_get_recent_runs PASSED [ 82%]
tests/data/test_hybrid_storage.py::TestStatisticsOperations::test_get_recent_runs_with_limit PASSED [ 82%]
tests/data/test_hybrid_storage.py::TestStatisticsOperations::test_get_recent_runs_empty_database PASSED [ 82%]
tests/data/test_hybrid_storage.py::TestStatisticsOperations::test_is_message_archived_true PASSED [ 82%]
tests/data/test_hybrid_storage.py::TestStatisticsOperations::test_is_message_archived_false PASSED [ 82%]
tests/data/test_hybrid_storage.py::TestStatisticsOperations::test_get_message_count_zero PASSED [ 82%]
tests/data/test_hybrid_storage.py::TestStatisticsOperations::test_get_message_count_accurate PASSED [ 82%]
tests/data/test_hybrid_storage_batch.py::TestArchiveMessagesBatch::test_archive_messages_batch_exists PASSED [ 82%]
tests/data/test_hybrid_storage_batch.py::TestArchiveMessagesBatch::test_archive_messages_batch_basic_success PASSED [ 82%]
tests/data/test_hybrid_storage_batch.py::TestArchiveMessagesBatch::test_archive_messages_batch_empty_list PASSED [ 82%]
tests/data/test_hybrid_storage_batch.py::TestArchiveMessagesBatch::test_archive_messages_batch_records_correct_offsets PASSED [ 82%]
tests/data/test_hybrid_storage_batch.py::TestArchiveMessagesBatchAtomicity::test_batch_handles_per_message_db_errors PASSED [ 82%]
tests/data/test_hybrid_storage_batch.py::TestArchiveMessagesBatchAtomicity::test_batch_all_or_nothing_semantics PASSED [ 82%]
tests/data/test_hybrid_storage_batch.py::TestArchiveMessagesBatchDuplicates::test_batch_skips_duplicates_by_rfc_message_id PASSED [ 82%]
tests/data/test_hybrid_storage_batch.py::TestArchiveMessagesBatchDuplicates::test_batch_skips_already_archived_messages PASSED [ 82%]
tests/data/test_hybrid_storage_batch.py::TestArchiveMessagesBatchCommitInterval::test_batch_commits_at_interval PASSED [ 82%]
tests/data/test_hybrid_storage_batch.py::TestArchiveMessagesBatchCommitInterval::test_batch_single_commit_for_small_batch PASSED [ 82%]
tests/data/test_hybrid_storage_batch.py::TestArchiveMessagesBatchIOEfficiency::test_batch_single_fsync_at_end PASSED [ 82%]
tests/data/test_hybrid_storage_batch.py::TestArchiveMessagesBatchIOEfficiency::test_batch_single_mbox_open_close_cycle PASSED [ 82%]
tests/data/test_hybrid_storage_batch.py::TestArchiveMessagesBatchIOEfficiency::test_batch_no_per_message_validation PASSED [ 83%]
tests/data/test_hybrid_storage_batch.py::TestArchiveMessagesBatchValidation::test_batch_validates_at_end PASSED [ 83%]
tests/data/test_hybrid_storage_batch.py::TestArchiveMessagesBatchValidation::test_validate_batch_consistency_method_exists PASSED [ 83%]
tests/data/test_hybrid_storage_batch.py::TestArchiveMessagesBatchMetadata::test_batch_records_thread_ids PASSED [ 83%]
tests/data/test_hybrid_storage_batch.py::TestArchiveMessagesBatchMetadata::test_batch_records_labels PASSED [ 83%]
tests/data/test_hybrid_storage_batch.py::TestArchiveMessagesBatchCompression::test_batch_with_gzip_compression PASSED [ 83%]
tests/data/test_hybrid_storage_batch.py::TestArchiveMessagesBatchCompression::test_batch_with_zstd_compression PASSED [ 83%]
tests/data/test_hybrid_storage_batch.py::TestArchiveMessagesBatchReturnValues::test_batch_returns_dict_with_counts PASSED [ 83%]
tests/data/test_hybrid_storage_coverage.py::TestHybridStorageInterruptHandling::test_archive_messages_batch_with_interrupt PASSED [ 83%]
tests/data/test_hybrid_storage_coverage.py::TestHybridStorageInterruptHandling::test_archive_messages_batch_interrupt_mid_batch PASSED [ 83%]
tests/data/test_hybrid_storage_coverage.py::TestHybridStorageProgressCallbacks::test_progress_callback_on_skip PASSED [ 83%]
tests/data/test_hybrid_storage_coverage.py::TestHybridStorageProgressCallbacks::test_progress_callback_on_success PASSED [ 83%]
tests/data/test_hybrid_storage_coverage.py::TestHybridStorageProgressCallbacks::test_progress_callback_on_error PASSED [ 83%]
tests/data/test_hybrid_storage_coverage.py::TestHybridStorageFallbackPaths::test_offset_calculation_without_mbox_file PASSED [ 83%]
tests/data/test_hybrid_storage_coverage.py::TestHybridStorageFallbackPaths::test_length_calculation_fallback PASSED [ 83%]
tests/data/test_hybrid_storage_coverage.py::TestHybridStorageCleanupPaths::test_unlock_exception_handling PASSED [ 83%]
tests/data/test_hybrid_storage_coverage.py::TestHybridStorageCleanupPaths::test_close_exception_handling PASSED [ 83%]
tests/data/test_hybrid_storage_coverage.py::TestHybridStorageCleanupPaths::test_lock_file_cleanup_on_compression PASSED [ 83%]
tests/data/test_migration.py::TestMigrationManagerInit::test_init_with_path_string PASSED [ 83%]
tests/data/test_migration.py::TestMigrationManagerInit::test_init_with_path_object PASSED [ 83%]
tests/data/test_migration.py::TestMigrationManagerInit::test_context_manager PASSED [ 83%]
tests/data/test_migration.py::TestSchemaVersionDetection::test_detect_none_for_nonexistent_db PASSED [ 83%]
tests/data/test_migration.py::TestSchemaVersionDetection::test_detect_v1_0_with_archived_messages_table PASSED [ 83%]
tests/data/test_migration.py::TestSchemaVersionDetection::test_detect_v1_1_with_messages_table PASSED [ 83%]
tests/data/test_migration.py::TestSchemaVersionDetection::test_detect_version_from_schema_version_table PASSED [ 83%]
tests/data/test_migration.py::TestNeedsMigration::test_needs_migration_for_v1_0 PASSED [ 83%]
tests/data/test_migration.py::TestNeedsMigration::test_needs_migration_for_none PASSED [ 84%]
tests/data/test_migration.py::TestNeedsMigration::test_no_migration_needed_for_v1_1 PASSED [ 84%]
tests/data/test_migration.py::TestBackupCreation::test_create_backup_success PASSED [ 84%]
tests/data/test_migration.py::TestBackupCreation::test_create_backup_nonexistent_db_fails PASSED [ 84%]
tests/data/test_migration.py::TestBackupCreation::test_create_backup_fails_with_permission_error PASSED [ 84%]
tests/data/test_migration.py::TestEnhancedSchemaCreation::test_create_enhanced_schema PASSED [ 84%]
tests/data/test_migration.py::TestExtractRfcMessageId::test_extract_existing_message_id PASSED [ 84%]
tests/data/test_migration.py::TestExtractRfcMessageId::test_generate_fallback_message_id PASSED [ 84%]
tests/data/test_migration.py::TestExtractRfcMessageId::test_handles_empty_message_id PASSED [ 84%]
tests/data/test_migration.py::TestExtractBodyPreview::test_extract_from_plain_text PASSED [ 84%]
tests/data/test_migration.py::TestExtractBodyPreview::test_extract_from_multipart PASSED [ 84%]
tests/data/test_migration.py::TestExtractBodyPreview::test_max_chars_limit PASSED [ 84%]
tests/data/test_migration.py::TestExtractBodyPreview::test_handles_binary_payload PASSED [ 84%]
tests/data/test_migration.py::TestMigrationWorkflow::test_migrate_v1_to_v1_1_success PASSED [ 84%]
tests/data/test_migration.py::TestMigrationWorkflow::test_migrate_with_missing_mbox_file PASSED [ 84%]
tests/data/test_migration.py::TestMigrationWorkflow::test_extract_body_preview_multipart_decode_error PASSED [ 84%]
tests/data/test_migration.py::TestMigrationWorkflow::test_extract_body_preview_non_multipart_decode_error PASSED [ 84%]
tests/data/test_migration.py::TestMigrationWorkflow::test_migrate_extracts_full_metadata PASSED [ 84%]
tests/data/test_migration.py::TestValidateMigration::test_validate_migration_success PASSED [ 84%]
tests/data/test_migration.py::TestValidateMigration::test_validate_migration_fails_wrong_version PASSED [ 84%]
tests/data/test_migration.py::TestValidateMigration::test_validate_migration_fails_missing_messages_table PASSED [ 84%]
tests/data/test_migration.py::TestRollbackMigration::test_rollback_success PASSED [ 84%]
tests/data/test_migration.py::TestRollbackMigration::test_rollback_fails_missing_backup PASSED [ 84%]
tests/data/test_migration.py::TestExtractThreadId::test_extract_from_gmail_thrid_header PASSED [ 84%]
tests/data/test_migration.py::TestExtractThreadId::test_extract_from_references_header PASSED [ 84%]
tests/data/test_migration.py::TestExtractThreadId::test_returns_none_without_thread_headers PASSED [ 84%]
tests/data/test_migration.py::TestExtractThreadId::test_handles_empty_references_header PASSED [ 84%]
tests/data/test_migration.py::TestValidationEdgeCases::test_validate_migration_fails_missing_fts_table PASSED [ 85%]
tests/data/test_migration.py::TestSchemaVersionEdgeCases::test_detect_none_for_empty_schema_version_table PASSED [ 85%]
tests/data/test_migration.py::TestSchemaVersionEdgeCases::test_detect_none_for_unrecognized_schema PASSED [ 85%]
tests/data/test_migration.py::TestCloseConnection::test_close_when_connection_exists PASSED [ 85%]
tests/data/test_migration.py::TestCloseConnection::test_close_when_no_connection PASSED [ 85%]
tests/data/test_migration.py::TestBodyPreviewExceptions::test_extract_body_handles_decode_error_multipart PASSED [ 85%]
tests/data/test_migration.py::TestBodyPreviewExceptions::test_extract_body_handles_decode_error_plain PASSED [ 85%]
tests/data/test_migration.py::TestMigrationErrorHandling::test_migrate_handles_corrupt_mbox_file PASSED [ 85%]
tests/data/test_migration.py::TestMigrationErrorHandling::test_migrate_handles_multiple_mbox_files_with_failures PASSED [ 85%]
tests/data/test_migration.py::test_migration_with_corrupted_database PASSED [ 85%]
tests/data/test_migration.py::test_migration_completes_successfully_simple PASSED [ 85%]
tests/data/test_migration.py::test_migration_schema_update_transaction PASSED [ 85%]
tests/data/test_migration.py::test_migration_backfill_with_missing_offsets PASSED [ 85%]
tests/data/test_migration.py::test_migration_fts_index_creation PASSED   [ 85%]
tests/data/test_migration.py::test_migration_handles_duplicate_message_ids PASSED [ 85%]
tests/data/test_migration.py::test_migration_preserves_data_integrity PASSED [ 85%]
tests/data/test_migration.py::test_migration_schema_version_updated PASSED [ 85%]
tests/data/test_migration.py::test_migration_handles_message_processing_error PASSED [ 85%]
tests/data/test_migration.py::test_migration_handles_mbox_scan_failure PASSED [ 85%]
tests/data/test_migration.py::test_backfill_offsets_missing_archive PASSED [ 85%]
tests/data/test_migration.py::test_backfill_offsets_message_processing_error PASSED [ 85%]
tests/data/test_migration.py::test_rollback_migration_missing_backup PASSED [ 85%]
tests/data/test_migration.py::test_migration_multipart_message_handling PASSED [ 85%]
tests/data/test_migration.py::test_migration_non_multipart_message_handling PASSED [ 85%]
tests/data/test_migration.py::test_migration_handles_missing_archive_file PASSED [ 85%]
tests/data/test_migration.py::test_migration_remaining_messages_warning PASSED [ 85%]
tests/data/test_migration.py::test_migration_handles_malformed_messages PASSED [ 86%]
tests/data/test_migration.py::test_migration_last_message_length_calculation PASSED [ 86%]
tests/data/test_migration.py::TestMigrationErrorPaths::test_migrate_message_processing_error PASSED [ 86%]
tests/data/test_migration.py::TestMigrationErrorPaths::test_migrate_mbox_scan_failure PASSED [ 86%]
tests/data/test_migration.py::TestMigrationErrorPaths::test_rollback_migration_error PASSED [ 86%]
tests/data/test_migration.py::TestMigrationErrorPaths::test_backfill_empty_invalid_messages PASSED [ 86%]
tests/data/test_migration.py::TestMigrationErrorPaths::test_backfill_message_processing_error PASSED [ 86%]
tests/data/test_migration.py::TestMigrationErrorPaths::test_backfill_mbox_scan_error PASSED [ 86%]
tests/data/test_migration.py::TestMigrationErrorPaths::test_backfill_rollback_on_error PASSED [ 86%]
tests/data/test_migration.py::TestMigrationErrorPaths::test_backfill_multiple_messages_offset_calculation PASSED [ 86%]
tests/data/test_scheduler.py::TestScheduleValidation::test_invalid_frequency_raises_error PASSED [ 86%]
tests/data/test_scheduler.py::TestScheduleValidation::test_invalid_time_format_raises_error PASSED [ 86%]
tests/data/test_scheduler.py::TestScheduleValidation::test_invalid_time_format_no_colon PASSED [ 86%]
tests/data/test_scheduler.py::TestScheduleValidation::test_invalid_day_of_week_raises_error PASSED [ 86%]
tests/data/test_scheduler.py::TestScheduleValidation::test_invalid_day_of_month_raises_error PASSED [ 86%]
tests/data/test_scheduler.py::TestScheduleValidation::test_weekly_without_day_of_week_raises_error PASSED [ 86%]
tests/data/test_scheduler.py::TestScheduleValidation::test_monthly_without_day_of_month_raises_error PASSED [ 86%]
tests/data/test_scheduler.py::TestScheduleValidation::test_empty_command_raises_error PASSED [ 86%]
tests/data/test_scheduler.py::TestScheduleValidation::test_valid_daily_schedule PASSED [ 86%]
tests/data/test_scheduler.py::TestScheduleValidation::test_valid_weekly_schedule PASSED [ 86%]
tests/data/test_scheduler.py::TestScheduleValidation::test_valid_monthly_schedule PASSED [ 86%]
tests/data/test_scheduler.py::TestAddSchedule::test_add_daily_schedule PASSED [ 86%]
tests/data/test_scheduler.py::TestAddSchedule::test_add_weekly_schedule PASSED [ 86%]
tests/data/test_scheduler.py::TestAddSchedule::test_add_monthly_schedule PASSED [ 86%]
tests/data/test_scheduler.py::TestAddSchedule::test_add_schedule_with_validation_error PASSED [ 86%]
tests/data/test_scheduler.py::TestListSchedules::test_list_empty_schedules PASSED [ 86%]
tests/data/test_scheduler.py::TestListSchedules::test_list_schedules_returns_entries PASSED [ 87%]
tests/data/test_scheduler.py::TestListSchedules::test_list_schedules_enabled_only PASSED [ 87%]
tests/data/test_scheduler.py::TestGetSchedule::test_get_schedule_by_id PASSED [ 87%]
tests/data/test_scheduler.py::TestGetSchedule::test_get_nonexistent_schedule_returns_none PASSED [ 87%]
tests/data/test_scheduler.py::TestRemoveSchedule::test_remove_schedule PASSED [ 87%]
tests/data/test_scheduler.py::TestRemoveSchedule::test_remove_nonexistent_schedule PASSED [ 87%]
tests/data/test_scheduler.py::TestEnableDisableSchedule::test_disable_schedule PASSED [ 87%]
tests/data/test_scheduler.py::TestEnableDisableSchedule::test_enable_schedule PASSED [ 87%]
tests/data/test_scheduler.py::TestEnableDisableSchedule::test_disable_nonexistent_schedule PASSED [ 87%]
tests/data/test_scheduler.py::TestEnableDisableSchedule::test_enable_nonexistent_schedule PASSED [ 87%]
tests/data/test_scheduler.py::TestUpdateLastRun::test_update_last_run PASSED [ 87%]
tests/data/test_scheduler.py::TestScheduleEntry::test_schedule_entry_creation PASSED [ 87%]
tests/data/test_scheduler.py::TestScheduleEntry::test_schedule_entry_to_dict PASSED [ 87%]
tests/data/test_schema_manager.py::TestSchemaVersion::test_version_ordering PASSED [ 87%]
tests/data/test_schema_manager.py::TestSchemaVersion::test_version_comparison_operators PASSED [ 87%]
tests/data/test_schema_manager.py::TestSchemaVersion::test_from_string PASSED [ 87%]
tests/data/test_schema_manager.py::TestSchemaVersion::test_is_valid PASSED [ 87%]
tests/data/test_schema_manager.py::TestSchemaManagerDetection::test_detect_nonexistent_database PASSED [ 87%]
tests/data/test_schema_manager.py::TestSchemaManagerDetection::test_detect_empty_database PASSED [ 87%]
tests/data/test_schema_manager.py::TestSchemaManagerDetection::test_detect_v1_0_database PASSED [ 87%]
tests/data/test_schema_manager.py::TestSchemaManagerDetection::test_detect_v1_1_database PASSED [ 87%]
tests/data/test_schema_manager.py::TestSchemaManagerDetection::test_detect_v1_2_database PASSED [ 87%]
tests/data/test_schema_manager.py::TestSchemaManagerDetection::test_version_caching PASSED [ 87%]
tests/data/test_schema_manager.py::TestSchemaManagerCapabilities::test_v1_0_capabilities PASSED [ 87%]
tests/data/test_schema_manager.py::TestSchemaManagerCapabilities::test_v1_1_capabilities PASSED [ 87%]
tests/data/test_schema_manager.py::TestSchemaManagerCapabilities::test_v1_2_capabilities PASSED [ 87%]
tests/data/test_schema_manager.py::TestSchemaManagerVersionRequirements::test_require_version_success PASSED [ 87%]
tests/data/test_schema_manager.py::TestSchemaManagerVersionRequirements::test_require_version_failure PASSED [ 88%]
tests/data/test_schema_manager.py::TestSchemaManagerVersionRequirements::test_require_capability_success PASSED [ 88%]
tests/data/test_schema_manager.py::TestSchemaManagerVersionRequirements::test_require_capability_failure PASSED [ 88%]
tests/data/test_schema_manager.py::TestSchemaManagerMigration::test_needs_migration_v1_0 PASSED [ 88%]
tests/data/test_schema_manager.py::TestSchemaManagerMigration::test_needs_migration_v1_1 PASSED [ 88%]
tests/data/test_schema_manager.py::TestSchemaManagerMigration::test_no_migration_needed_current PASSED [ 88%]
tests/data/test_schema_manager.py::TestSchemaManagerMigration::test_is_supported PASSED [ 88%]
tests/data/test_schema_manager.py::TestSchemaVersionError::test_error_with_versions PASSED [ 88%]
tests/data/test_schema_manager.py::TestSchemaVersionError::test_error_suggestion_for_none PASSED [ 88%]
tests/data/test_schema_manager.py::TestSchemaManagerClassMethods::test_get_current_version_string PASSED [ 88%]
tests/data/test_schema_manager.py::TestSchemaManagerClassMethods::test_version_from_string PASSED [ 88%]
tests/data/test_schema_manager.py::TestSchemaVersionComparisons::test_lt_with_non_schema_version_returns_not_implemented PASSED [ 88%]
tests/data/test_schema_manager.py::TestSchemaVersionComparisons::test_gt_with_non_schema_version_returns_not_implemented PASSED [ 88%]
tests/data/test_schema_manager.py::TestSchemaVersionComparisons::test_le_with_schema_versions PASSED [ 88%]
tests/data/test_schema_manager.py::TestSchemaVersionComparisons::test_ge_with_schema_versions PASSED [ 88%]
tests/data/test_schema_manager.py::TestSchemaManagerEdgeCases::test_detect_version_sqlite_error_returns_unknown PASSED [ 88%]
tests/data/test_schema_manager.py::TestSchemaManagerEdgeCases::test_has_capability_returns_false_for_invalid_version PASSED [ 88%]
tests/data/test_schema_manager.py::TestSchemaManagerEdgeCases::test_require_version_raises_for_invalid_version PASSED [ 88%]
tests/test_cli_consolidate.py::TestConsolidateCommand::test_consolidate_success PASSED [ 88%]
tests/test_cli_consolidate.py::TestConsolidateCommand::test_consolidate_with_sort PASSED [ 88%]
tests/test_cli_consolidate.py::TestConsolidateCommand::test_consolidate_with_no_sort PASSED [ 88%]
tests/test_cli_consolidate.py::TestConsolidateCommand::test_consolidate_with_dedupe PASSED [ 88%]
tests/test_cli_consolidate.py::TestConsolidateCommand::test_consolidate_with_no_dedupe PASSED [ 88%]
tests/test_cli_consolidate.py::TestConsolidateCommand::test_consolidate_with_gzip_compression PASSED [ 88%]
tests/test_cli_consolidate.py::TestConsolidateCommand::test_consolidate_with_explicit_compression PASSED [ 88%]
tests/test_cli_consolidate.py::TestConsolidateCommand::test_consolidate_no_archives_error PASSED [ 88%]
tests/test_cli_consolidate.py::TestConsolidateCommand::test_consolidate_database_not_found_error PASSED [ 89%]
tests/test_cli_consolidate.py::TestConsolidateCommand::test_consolidate_output_exists_error PASSED [ 89%]
tests/test_cli_consolidate.py::TestConsolidateCommand::test_consolidate_shows_summary PASSED [ 89%]
tests/test_cli_consolidate.py::TestConsolidateCommand::test_consolidate_default_state_db_path PASSED [ 89%]
tests/test_cli_dedupe.py::TestDedupeCommand::test_dedupe_dry_run_default PASSED [ 89%]
tests/test_cli_dedupe.py::TestDedupeCommand::test_dedupe_with_no_dry_run PASSED [ 89%]
tests/test_cli_dedupe.py::TestDedupeCommand::test_dedupe_no_duplicates PASSED [ 89%]
tests/test_cli_dedupe.py::TestDedupeCommand::test_dedupe_v1_0_database_error PASSED [ 89%]
tests/test_cli_import.py::TestImportCommand::test_import_single_file_success PASSED [ 89%]
tests/test_cli_import.py::TestImportCommand::test_import_with_skip_duplicates PASSED [ 89%]
tests/test_cli_import.py::TestImportCommand::test_import_with_no_skip_duplicates PASSED [ 89%]
tests/test_cli_import.py::TestImportCommand::test_import_glob_pattern_multiple_files PASSED [ 89%]
tests/test_cli_import.py::TestImportCommand::test_import_missing_file_error PASSED [ 89%]
tests/test_cli_import.py::TestImportCommand::test_import_database_error_handling PASSED [ 89%]
tests/test_cli_import.py::TestImportCommand::test_import_shows_progress_and_statistics PASSED [ 89%]
tests/test_cli_import.py::TestImportCommand::test_import_default_state_db_path PASSED [ 89%]
tests/test_cli_import.py::TestImportCommand::test_import_shows_summary_table PASSED [ 89%]
tests/test_cli_migration.py::TestMigrateCommand::test_migrate_v1_0_database PASSED [ 89%]
tests/test_cli_migration.py::TestMigrateCommand::test_migrate_already_migrated_database PASSED [ 89%]
tests/test_cli_migration.py::TestMigrateCommand::test_migrate_nonexistent_database PASSED [ 89%]
tests/test_cli_migration.py::TestMigrateCommand::test_migrate_default_database_path PASSED [ 89%]
tests/test_cli_migration.py::TestStatusCommand::test_status_v1_0_database_requires_migration PASSED [ 89%]
tests/test_cli_migration.py::TestStatusCommand::test_status_v1_1_database PASSED [ 89%]
tests/test_cli_migration.py::TestStatusCommand::test_status_nonexistent_database PASSED [ 89%]
tests/test_cli_migration.py::TestStatusCommand::test_status_shows_database_size PASSED [ 89%]
tests/test_cli_migration.py::TestStatusCommand::test_status_verbose_shows_more_detail PASSED [ 89%]
tests/test_cli_repair.py::test_repair_dry_run_default PASSED             [ 90%]
tests/test_cli_repair.py::test_repair_dry_run_explicit PASSED            [ 90%]
tests/test_cli_repair.py::test_repair_actual_requires_confirmation PASSED [ 90%]
tests/test_cli_repair.py::test_repair_actual_with_confirmation PASSED    [ 90%]
tests/test_cli_repair.py::test_repair_fts_only PASSED                    [ 90%]
tests/test_cli_repair.py::test_repair_backfill_dry_run PASSED            [ 90%]
tests/test_cli_repair.py::test_repair_backfill_actual PASSED             [ 90%]
tests/test_cli_repair.py::test_repair_combined_fts_and_backfill PASSED   [ 90%]
tests/test_cli_repair.py::test_repair_output_format PASSED               [ 90%]
tests/test_cli_repair.py::test_repair_nonexistent_db PASSED              [ 90%]
tests/test_cli_repair.py::test_repair_no_issues PASSED                   [ 90%]
tests/test_cli_repair.py::test_repair_backfill_missing_mbox PASSED       [ 90%]
tests/test_cli_search.py::TestSearchCommand::test_search_with_query_string PASSED [ 90%]
tests/test_cli_search.py::TestSearchCommand::test_search_with_from_filter PASSED [ 90%]
tests/test_cli_search.py::TestSearchCommand::test_search_with_subject_filter PASSED [ 90%]
tests/test_cli_search.py::TestSearchCommand::test_search_with_date_range PASSED [ 90%]
tests/test_cli_search.py::TestSearchCommand::test_search_with_multiple_filters PASSED [ 90%]
tests/test_cli_search.py::TestSearchCommand::test_search_with_limit_option PASSED [ 90%]
tests/test_cli_search.py::TestSearchCommand::test_search_with_json_output PASSED [ 90%]
tests/test_cli_search.py::TestSearchCommand::test_search_no_results PASSED [ 90%]
tests/test_cli_search.py::TestSearchCommand::test_search_missing_database PASSED [ 90%]
tests/test_cli_search.py::TestSearchCommand::test_search_v1_0_database_error PASSED [ 90%]
tests/test_cli_search.py::TestSearchCommand::test_search_query_with_from_syntax PASSED [ 90%]
tests/test_cli_search.py::TestSearchCommand::test_search_combined_query_and_filter PASSED [ 90%]
tests/test_cli_search.py::TestSearchCommand::test_search_to_filter PASSED [ 90%]
tests/test_cli_search.py::TestSearchCommand::test_search_shows_execution_time PASSED [ 90%]
tests/test_cli_search.py::TestSearchCommand::test_search_invalid_date_format PASSED [ 90%]
tests/test_consolidate_implementation.py::TestConsolidateCommand::test_consolidate_database_not_found PASSED [ 91%]
tests/test_consolidate_implementation.py::TestConsolidateCommand::test_consolidate_output_file_exists PASSED [ 91%]
tests/test_consolidate_implementation.py::TestConsolidateCommand::test_consolidate_no_archives PASSED [ 91%]
tests/test_consolidate_implementation.py::TestConsolidateCommand::test_consolidate_workflow_execution PASSED [ 91%]
tests/test_consolidate_implementation.py::TestConsolidateCommand::test_consolidate_workflow_exception PASSED [ 91%]
tests/test_consolidate_implementation.py::TestConsolidateCommand::test_consolidate_with_deduplicate PASSED [ 91%]
tests/test_dedupe_implementation.py::TestDedupeCommand::test_dedupe_database_not_found PASSED [ 91%]
tests/test_dedupe_implementation.py::TestDedupeCommand::test_dedupe_no_archives PASSED [ 91%]
tests/test_dedupe_implementation.py::TestDedupeCommand::test_dedupe_no_duplicates_found PASSED [ 91%]
tests/test_dedupe_implementation.py::TestDedupeCommand::test_dedupe_dry_run_with_duplicates PASSED [ 91%]
tests/test_dedupe_implementation.py::TestDedupeCommand::test_dedupe_actual_run_with_duplicates PASSED [ 91%]
tests/test_dedupe_implementation.py::TestDedupeCommand::test_dedupe_workflow_exception PASSED [ 91%]
tests/test_dedupe_implementation.py::TestDedupeCommand::test_dedupe_with_json_output PASSED [ 91%]
tests/test_init.py::test_version_exists PASSED                           [ 91%]
tests/test_no_print_statements.py::TestNoPrintStatements::test_auth_uses_output_manager_not_print PASSED [ 91%]
tests/test_no_print_statements.py::TestNoPrintStatements::test_archiver_uses_output_manager_not_print PASSED [ 91%]
tests/test_no_print_statements.py::TestNoPrintStatements::test_archiver_compression_uses_output_manager PASSED [ 91%]
tests/test_no_print_statements.py::TestNoPrintStatements::test_validator_uses_progress_reporter_not_print PASSED [ 91%]
tests/test_no_print_statements.py::TestBackwardCompatibility::test_archiver_works_without_output_manager PASSED [ 91%]
tests/test_no_print_statements.py::TestBackwardCompatibility::test_validator_silent_without_progress_reporter PASSED [ 91%]
tests/test_session_logger.py::TestSessionLoggerInitialization::test_init_default_path PASSED [ 91%]
tests/test_session_logger.py::TestSessionLoggerInitialization::test_init_custom_path PASSED [ 91%]
tests/test_session_logger.py::TestSessionLoggerInitialization::test_init_creates_nested_directories PASSED [ 91%]
tests/test_session_logger.py::TestSessionLoggerInitialization::test_init_permission_error_handling PASSED [ 91%]
tests/test_session_logger.py::TestSessionLoggerInitialization::test_init_invalid_path PASSED [ 91%]
tests/test_session_logger.py::TestSessionLoggerInitialization::test_timestamped_filename_format PASSED [ 91%]
tests/test_session_logger.py::TestSessionLoggerInitialization::test_file_handle_opened PASSED [ 92%]
tests/test_session_logger.py::TestSessionLoggerWriting::test_write_single_entry PASSED [ 92%]
tests/test_session_logger.py::TestSessionLoggerWriting::test_write_multiple_entries PASSED [ 92%]
tests/test_session_logger.py::TestSessionLoggerWriting::test_write_all_severity_levels PASSED [ 92%]
tests/test_session_logger.py::TestSessionLoggerWriting::test_write_includes_timestamp PASSED [ 92%]
tests/test_session_logger.py::TestSessionLoggerWriting::test_write_format PASSED [ 92%]
tests/test_session_logger.py::TestSessionLoggerWriting::test_write_flushes_immediately PASSED [ 92%]
tests/test_session_logger.py::TestSessionLoggerWriting::test_write_multiline_message PASSED [ 92%]
tests/test_session_logger.py::TestSessionLoggerWriting::test_write_special_characters PASSED [ 92%]
tests/test_session_logger.py::TestSessionLoggerFileManagement::test_close_method PASSED [ 92%]
tests/test_session_logger.py::TestSessionLoggerFileManagement::test_context_manager_basic PASSED [ 92%]
tests/test_session_logger.py::TestSessionLoggerFileManagement::test_context_manager_writes_persist PASSED [ 92%]
tests/test_session_logger.py::TestSessionLoggerFileManagement::test_context_manager_exception_handling PASSED [ 92%]
tests/test_session_logger.py::TestSessionLoggerFileManagement::test_multiple_close_calls_safe PASSED [ 92%]
tests/test_session_logger.py::TestSessionLoggerCleanup::test_cleanup_old_logs_basic PASSED [ 92%]
tests/test_session_logger.py::TestSessionLoggerCleanup::test_cleanup_keeps_most_recent PASSED [ 92%]
tests/test_session_logger.py::TestSessionLoggerCleanup::test_cleanup_disabled_with_zero PASSED [ 92%]
tests/test_session_logger.py::TestSessionLoggerCleanup::test_cleanup_ignores_non_session_files PASSED [ 92%]
tests/test_session_logger.py::TestSessionLoggerCleanup::test_cleanup_handles_unlink_errors_gracefully PASSED [ 92%]
tests/test_session_logger.py::TestSessionLoggerEdgeCases::test_write_after_close_raises_error PASSED [ 92%]
tests/test_session_logger.py::TestSessionLoggerEdgeCases::test_disk_full_simulation PASSED [ 92%]
tests/test_session_logger.py::TestSessionLoggerEdgeCases::test_empty_message PASSED [ 92%]
tests/test_session_logger.py::TestSessionLoggerEdgeCases::test_very_long_message PASSED [ 92%]
tests/test_session_logger.py::TestSessionLoggerEdgeCases::test_concurrent_write_safety PASSED [ 92%]
tests/test_session_logger.py::TestSessionLoggerEdgeCases::test_default_level_is_info PASSED [ 92%]
tests/test_session_logger.py::TestSessionLoggerIntegration::test_integration_with_log_buffer PASSED [ 92%]
tests/test_session_logger.py::TestSessionLoggerIntegration::test_session_logger_gets_debug_logs PASSED [ 93%]
tests/test_session_logger.py::TestSessionLoggerIntegration::test_xdg_config_home_respected PASSED [ 93%]
tests/unit/core/deduplicator/test_dedup_facade.py::TestDeduplicatorFacade::test_find_duplicates PASSED [ 93%]
tests/unit/core/deduplicator/test_dedup_facade.py::TestDeduplicatorFacade::test_generate_report PASSED [ 93%]
tests/unit/core/deduplicator/test_dedup_facade.py::TestDeduplicatorFacade::test_deduplicate_dry_run PASSED [ 93%]
tests/unit/core/deduplicator/test_dedup_facade.py::TestDeduplicatorFacade::test_deduplicate_actual PASSED [ 93%]
tests/unit/core/deduplicator/test_dedup_facade.py::TestDeduplicatorFacade::test_deduplicate_largest_strategy PASSED [ 93%]
tests/unit/core/deduplicator/test_dedup_facade.py::TestDeduplicatorFacade::test_missing_database_raises PASSED [ 93%]
tests/unit/core/deduplicator/test_dedup_facade.py::TestDeduplicatorFacade::test_v10_schema_raises PASSED [ 93%]
tests/unit/core/deduplicator/test_dedup_facade.py::TestDeduplicatorFacade::test_context_manager PASSED [ 93%]
tests/unit/core/deduplicator/test_dedup_facade.py::TestDeduplicatorFacade::test_empty_duplicates_deduplicate PASSED [ 93%]
tests/unit/core/deduplicator/test_dup_remover.py::TestDuplicateRemover::test_remove_messages_dry_run PASSED [ 93%]
tests/unit/core/deduplicator/test_dup_remover.py::TestDuplicateRemover::test_remove_messages_actual PASSED [ 93%]
tests/unit/core/deduplicator/test_dup_remover.py::TestDuplicateRemover::test_remove_empty_list PASSED [ 93%]
tests/unit/core/deduplicator/test_dup_remover.py::TestDuplicateRemover::test_remove_single_message PASSED [ 93%]
tests/unit/core/deduplicator/test_dup_remover.py::TestDuplicateRemover::test_remove_uses_parameterized_query PASSED [ 93%]
tests/unit/core/deduplicator/test_dup_resolver.py::TestDuplicateResolver::test_resolve_newest_strategy PASSED [ 93%]
tests/unit/core/deduplicator/test_dup_resolver.py::TestDuplicateResolver::test_resolve_largest_strategy PASSED [ 93%]
tests/unit/core/deduplicator/test_dup_resolver.py::TestDuplicateResolver::test_resolve_first_strategy PASSED [ 93%]
tests/unit/core/deduplicator/test_dup_resolver.py::TestDuplicateResolver::test_resolve_invalid_strategy_raises PASSED [ 93%]
tests/unit/core/deduplicator/test_dup_resolver.py::TestDuplicateResolver::test_resolve_single_message PASSED [ 93%]
tests/unit/core/deduplicator/test_dup_resolver.py::TestDuplicateResolver::test_resolve_calculates_space_saved PASSED [ 93%]
tests/unit/core/deduplicator/test_dup_resolver.py::TestDuplicateResolver::test_resolve_newest_presorted PASSED [ 93%]
tests/unit/core/deduplicator/test_dup_resolver.py::TestResolution::test_resolution_contains_all_fields PASSED [ 93%]
tests/unit/core/deduplicator/test_dup_scanner.py::TestDuplicateScanner::test_find_duplicates PASSED [ 93%]
tests/unit/core/deduplicator/test_dup_scanner.py::TestDuplicateScanner::test_duplicate_group_sizes PASSED [ 93%]
tests/unit/core/deduplicator/test_dup_scanner.py::TestDuplicateScanner::test_unique_messages_not_included PASSED [ 93%]
tests/unit/core/deduplicator/test_dup_scanner.py::TestDuplicateScanner::test_messages_sorted_by_timestamp PASSED [ 94%]
tests/unit/core/deduplicator/test_dup_scanner.py::TestDuplicateScanner::test_message_info_fields PASSED [ 94%]
tests/unit/core/deduplicator/test_dup_scanner.py::TestDuplicateScanner::test_no_duplicates_returns_empty PASSED [ 94%]
tests/unit/core/deduplicator/test_dup_scanner.py::TestDuplicateScanner::test_null_size_bytes_uses_mbox_length PASSED [ 94%]
tests/unit/core/importer/test_facade.py::TestImporterFacadeInit::test_init_minimal PASSED [ 94%]
tests/unit/core/importer/test_facade.py::TestImporterFacadeInit::test_init_with_gmail_client PASSED [ 94%]
tests/unit/core/importer/test_facade.py::TestImporterFacadeCountMessages::test_count_messages_uncompressed PASSED [ 94%]
tests/unit/core/importer/test_facade.py::TestImporterFacadeCountMessages::test_count_messages_compressed PASSED [ 94%]
tests/unit/core/importer/test_facade.py::TestImporterFacadeCountMessages::test_count_messages_file_not_found PASSED [ 94%]
tests/unit/core/importer/test_facade.py::TestImporterFacadeImportArchive::test_import_archive_basic_flow PASSED [ 94%]
tests/unit/core/importer/test_facade.py::TestImporterFacadeImportArchive::test_import_archive_file_not_found PASSED [ 94%]
tests/unit/core/importer/test_facade.py::TestImporterFacadeImportMultiple::test_import_multiple_success PASSED [ 94%]
tests/unit/core/importer/test_facade.py::TestImporterFacadeImportMultiple::test_import_multiple_no_matches PASSED [ 94%]
tests/unit/core/importer/test_gmail_lookup.py::TestGmailLookupInit::test_init_with_client PASSED [ 94%]
tests/unit/core/importer/test_gmail_lookup.py::TestGmailLookupInit::test_init_without_client PASSED [ 94%]
tests/unit/core/importer/test_gmail_lookup.py::TestGmailLookupLookupGmailId::test_lookup_gmail_id_found PASSED [ 94%]
tests/unit/core/importer/test_gmail_lookup.py::TestGmailLookupLookupGmailId::test_lookup_gmail_id_not_found PASSED [ 94%]
tests/unit/core/importer/test_gmail_lookup.py::TestGmailLookupLookupGmailId::test_lookup_gmail_id_no_client PASSED [ 94%]
tests/unit/core/importer/test_gmail_lookup.py::TestGmailLookupLookupGmailId::test_lookup_gmail_id_api_error PASSED [ 94%]
tests/unit/core/importer/test_gmail_lookup.py::TestGmailLookupIsEnabled::test_is_enabled_with_client PASSED [ 94%]
tests/unit/core/importer/test_gmail_lookup.py::TestGmailLookupIsEnabled::test_is_enabled_without_client PASSED [ 94%]
tests/unit/core/importer/test_gmail_lookup.py::TestLookupResult::test_lookup_result_found PASSED [ 94%]
tests/unit/core/importer/test_gmail_lookup.py::TestLookupResult::test_lookup_result_not_found PASSED [ 94%]
tests/unit/core/importer/test_gmail_lookup.py::TestLookupResult::test_lookup_result_error PASSED [ 94%]
tests/unit/core/importer/test_reader.py::TestMboxReaderInit::test_init PASSED [ 94%]
tests/unit/core/importer/test_reader.py::TestMboxReaderCountMessages::test_count_messages_success PASSED [ 94%]
tests/unit/core/importer/test_reader.py::TestMboxReaderCountMessages::test_count_messages_empty PASSED [ 95%]
tests/unit/core/importer/test_reader.py::TestMboxReaderExtractRfcMessageId::test_extract_rfc_message_id_present PASSED [ 95%]
tests/unit/core/importer/test_reader.py::TestMboxReaderExtractRfcMessageId::test_extract_rfc_message_id_missing_generates_fallback PASSED [ 95%]
tests/unit/core/importer/test_reader.py::TestMboxReaderExtractRfcMessageId::test_extract_rfc_message_id_whitespace_trimmed PASSED [ 95%]
tests/unit/core/importer/test_reader.py::TestMboxReaderExtractThreadId::test_extract_thread_id_gmail_header PASSED [ 95%]
tests/unit/core/importer/test_reader.py::TestMboxReaderExtractThreadId::test_extract_thread_id_references_fallback PASSED [ 95%]
tests/unit/core/importer/test_reader.py::TestMboxReaderExtractThreadId::test_extract_thread_id_missing PASSED [ 95%]
tests/unit/core/importer/test_reader.py::TestMboxReaderExtractBodyPreview::test_extract_body_preview_plain_text PASSED [ 95%]
tests/unit/core/importer/test_reader.py::TestMboxReaderExtractBodyPreview::test_extract_body_preview_truncated PASSED [ 95%]
tests/unit/core/importer/test_reader.py::TestMboxReaderExtractBodyPreview::test_extract_body_preview_multipart PASSED [ 95%]
tests/unit/core/importer/test_reader.py::TestMboxReaderExtractBodyPreview::test_extract_body_preview_empty PASSED [ 95%]
tests/unit/core/importer/test_reader.py::TestMboxReaderExtractMetadata::test_extract_metadata_complete PASSED [ 95%]
tests/unit/core/importer/test_reader.py::TestMboxReaderExtractMetadata::test_extract_metadata_without_gmail_id PASSED [ 95%]
tests/unit/core/importer/test_reader.py::TestMboxReaderExtractMetadata::test_extract_metadata_checksum_consistent PASSED [ 95%]
tests/unit/core/importer/test_reader.py::TestMboxReaderReadMessages::test_read_messages_with_offsets PASSED [ 95%]
tests/unit/core/importer/test_reader.py::TestMboxReaderReadMessages::test_read_messages_empty_mbox PASSED [ 95%]
tests/unit/core/importer/test_scanner.py::TestCompressionFormat::test_from_path_gzip PASSED [ 95%]
tests/unit/core/importer/test_scanner.py::TestCompressionFormat::test_from_path_lzma PASSED [ 95%]
tests/unit/core/importer/test_scanner.py::TestCompressionFormat::test_from_path_lzma_alt PASSED [ 95%]
tests/unit/core/importer/test_scanner.py::TestCompressionFormat::test_from_path_zstd PASSED [ 95%]
tests/unit/core/importer/test_scanner.py::TestCompressionFormat::test_from_path_none PASSED [ 95%]
tests/unit/core/importer/test_scanner.py::TestCompressionFormat::test_from_path_case_insensitive PASSED [ 95%]
tests/unit/core/importer/test_scanner.py::TestCompressionFormat::test_from_path_unknown_extension PASSED [ 95%]
tests/unit/core/importer/test_scanner.py::TestFileScannerInit::test_init_default PASSED [ 95%]
tests/unit/core/importer/test_scanner.py::TestFileScannerScanPattern::test_scan_pattern_single_file PASSED [ 95%]
tests/unit/core/importer/test_scanner.py::TestFileScannerScanPattern::test_scan_pattern_multiple_files PASSED [ 95%]
tests/unit/core/importer/test_scanner.py::TestFileScannerScanPattern::test_scan_pattern_no_matches PASSED [ 96%]
tests/unit/core/importer/test_scanner.py::TestFileScannerDecompress::test_decompress_gzip PASSED [ 96%]
tests/unit/core/importer/test_scanner.py::TestFileScannerDecompress::test_decompress_lzma PASSED [ 96%]
tests/unit/core/importer/test_scanner.py::TestFileScannerDecompress::test_decompress_uncompressed PASSED [ 96%]
tests/unit/core/importer/test_scanner.py::TestFileScannerDecompress::test_decompress_error_cleanup PASSED [ 96%]
tests/unit/core/importer/test_scanner.py::TestFileScannerCleanup::test_cleanup_temp_file PASSED [ 96%]
tests/unit/core/importer/test_scanner.py::TestFileScannerCleanup::test_cleanup_non_temp_file PASSED [ 96%]
tests/unit/core/importer/test_scanner.py::TestFileScannerCleanup::test_cleanup_missing_file PASSED [ 96%]
tests/unit/core/importer/test_writer.py::TestDatabaseWriterInit::test_init PASSED [ 96%]
tests/unit/core/importer/test_writer.py::TestDatabaseWriterLoadExistingIds::test_load_existing_ids_success PASSED [ 96%]
tests/unit/core/importer/test_writer.py::TestDatabaseWriterLoadExistingIds::test_load_existing_ids_empty_table PASSED [ 96%]
tests/unit/core/importer/test_writer.py::TestDatabaseWriterLoadExistingIds::test_load_existing_ids_table_missing PASSED [ 96%]
tests/unit/core/importer/test_writer.py::TestDatabaseWriterIsDuplicate::test_is_duplicate_existing PASSED [ 96%]
tests/unit/core/importer/test_writer.py::TestDatabaseWriterIsDuplicate::test_is_duplicate_in_session PASSED [ 96%]
tests/unit/core/importer/test_writer.py::TestDatabaseWriterIsDuplicate::test_is_duplicate_not_found PASSED [ 96%]
tests/unit/core/importer/test_writer.py::TestDatabaseWriterWriteMessage::test_write_message_success PASSED [ 96%]
tests/unit/core/importer/test_writer.py::TestDatabaseWriterWriteMessage::test_write_message_duplicate_skipped PASSED [ 96%]
tests/unit/core/importer/test_writer.py::TestDatabaseWriterWriteMessage::test_write_message_duplicate_replaced PASSED [ 96%]
tests/unit/core/importer/test_writer.py::TestDatabaseWriterWriteMessage::test_write_message_database_error PASSED [ 96%]
tests/unit/core/importer/test_writer.py::TestDatabaseWriterRecordArchiveRun::test_record_archive_run PASSED [ 96%]
tests/unit/core/importer/test_writer.py::TestWriteResult::test_write_result_values PASSED [ 96%]
tests/unit/core/search/test_query_parser.py::TestQueryParser::test_parse_empty_query PASSED [ 96%]
tests/unit/core/search/test_query_parser.py::TestQueryParser::test_parse_fulltext_only PASSED [ 96%]
tests/unit/core/search/test_query_parser.py::TestQueryParser::test_parse_from_filter PASSED [ 96%]
tests/unit/core/search/test_query_parser.py::TestQueryParser::test_parse_to_filter PASSED [ 96%]
tests/unit/core/search/test_query_parser.py::TestQueryParser::test_parse_subject_filter PASSED [ 96%]
tests/unit/core/search/test_query_parser.py::TestQueryParser::test_parse_date_filters PASSED [ 96%]
tests/unit/core/search/test_query_parser.py::TestQueryParser::test_parse_combined_filters PASSED [ 97%]
tests/unit/core/search/test_query_parser.py::TestQueryParser::test_parse_preserves_original_query PASSED [ 97%]
tests/unit/core/search/test_query_parser.py::TestQueryParser::test_parse_builds_fts_query PASSED [ 97%]
tests/unit/core/search/test_query_parser.py::TestQueryParser::test_parse_builds_fts_query_with_subject PASSED [ 97%]
tests/unit/core/search/test_query_parser.py::TestQueryParams::test_has_fulltext_terms PASSED [ 97%]
tests/unit/core/search/test_query_parser.py::TestQueryParams::test_has_metadata_filters PASSED [ 97%]
tests/unit/core/search/test_search_executor.py::TestSearchExecutor::test_execute_fulltext_search PASSED [ 97%]
tests/unit/core/search/test_search_executor.py::TestSearchExecutor::test_execute_metadata_search PASSED [ 97%]
tests/unit/core/search/test_search_executor.py::TestSearchExecutor::test_execute_hybrid_search PASSED [ 97%]
tests/unit/core/search/test_search_executor.py::TestSearchExecutor::test_execute_with_limit PASSED [ 97%]
tests/unit/core/search/test_search_executor.py::TestSearchExecutor::test_execute_tracks_time PASSED [ 97%]
tests/unit/core/search/test_search_executor.py::TestSearchExecutor::test_execute_invalid_fts_query PASSED [ 97%]
tests/unit/core/search/test_search_facade.py::TestSearchFacade::test_search_gmail_style_query PASSED [ 97%]
tests/unit/core/search/test_search_facade.py::TestSearchFacade::test_search_fulltext_only PASSED [ 97%]
tests/unit/core/search/test_search_facade.py::TestSearchFacade::test_search_metadata_only PASSED [ 97%]
tests/unit/core/search/test_search_facade.py::TestSearchFacade::test_search_with_limit PASSED [ 97%]
tests/unit/core/search/test_search_facade.py::TestSearchFacade::test_search_tracks_execution_time PASSED [ 97%]
tests/unit/core/search/test_search_facade.py::TestSearchFacade::test_context_manager PASSED [ 97%]
tests/unit/core/search/test_search_facade.py::TestSearchFacade::test_missing_database_raises PASSED [ 97%]
tests/unit/core/search/test_search_facade.py::TestSearchFacade::test_search_fulltext_direct PASSED [ 97%]
tests/unit/core/search/test_search_facade.py::TestSearchFacade::test_search_metadata_direct PASSED [ 97%]
tests/unit/core/search/test_search_facade.py::TestSearchFacade::test_search_metadata_date_filters PASSED [ 97%]
tests/unit/core/test_archiver_filter.py::TestMessageFilter::test_filter_with_incremental_false PASSED [ 97%]
tests/unit/core/test_archiver_filter.py::TestMessageFilter::test_filter_with_incremental_true PASSED [ 97%]
tests/unit/core/test_archiver_filter.py::TestMessageFilter::test_filter_with_no_archived_messages PASSED [ 97%]
tests/unit/core/test_archiver_filter.py::TestMessageFilter::test_filter_with_all_archived PASSED [ 97%]
tests/unit/core/test_archiver_filter.py::TestMessageFilter::test_filter_handles_database_error PASSED [ 98%]
tests/unit/core/test_archiver_filter.py::TestMessageFilter::test_filter_with_empty_message_list PASSED [ 98%]
tests/unit/core/test_archiver_filter.py::TestMessageFilter::test_filter_excludes_null_gmail_ids PASSED [ 98%]
tests/unit/core/test_archiver_filter.py::TestMessageFilter::test_filter_with_none_connection PASSED [ 98%]
tests/unit/core/test_archiver_filter.py::TestFilterResult::test_total_skipped_property PASSED [ 98%]
tests/unit/core/test_archiver_filter.py::TestFilterResult::test_total_skipped_with_zeros PASSED [ 98%]
tests/unit/core/test_archiver_writer.py::TestMessageWriter::test_archive_messages_with_valid_message_ids PASSED [ 98%]
tests/unit/core/test_archiver_writer.py::TestMessageWriter::test_archive_messages_creates_session_with_uuid PASSED [ 98%]
tests/unit/core/test_archiver_writer.py::TestMessageWriter::test_archive_messages_with_empty_message_list PASSED [ 98%]
tests/unit/core/test_archiver_writer.py::TestMessageWriter::test_archive_messages_with_gzip_compression PASSED [ 98%]
tests/unit/core/test_archiver_writer.py::TestMessageWriter::test_archive_messages_with_lzma_compression PASSED [ 98%]
tests/unit/core/test_archiver_writer.py::TestMessageWriter::test_archive_messages_with_zstd_compression PASSED [ 98%]
tests/unit/core/test_archiver_writer.py::TestMessageWriter::test_archive_messages_without_compression PASSED [ 98%]
tests/unit/core/test_archiver_writer.py::TestMessageWriter::test_archive_messages_validates_compression_format PASSED [ 98%]
tests/unit/core/test_archiver_writer.py::TestMessageWriter::test_archive_messages_with_invalid_compression_format PASSED [ 98%]
tests/unit/core/test_archiver_writer.py::TestMessageWriter::test_archive_messages_result_dict_structure PASSED [ 98%]
tests/unit/core/test_archiver_writer.py::TestMessageWriter::test_archive_messages_with_task_handle PASSED [ 98%]
tests/unit/core/test_archiver_writer.py::TestMessageWriter::test_archive_messages_with_partial_failure PASSED [ 98%]
tests/unit/core/test_archiver_writer.py::TestMessageWriter::test_archive_messages_handles_interruption PASSED [ 98%]
tests/unit/core/test_archiver_writer.py::TestArchiveMessagesInternal::test_archive_messages_fetch_and_parse_with_labels PASSED [ 98%]
tests/unit/core/test_archiver_writer.py::TestArchiveMessagesInternal::test_archive_messages_fetch_error_handling PASSED [ 98%]
tests/unit/core/test_archiver_writer.py::TestArchiveMessagesInternal::test_archive_messages_interrupt_during_fetch PASSED [ 98%]
tests/unit/core/test_archiver_writer.py::TestArchiveMessagesInternal::test_archive_messages_keyboard_interrupt_during_batch PASSED [ 98%]
tests/unit/core/test_archiver_writer.py::TestArchiveMessagesInternal::test_archive_messages_with_task_progress_tracking PASSED [ 98%]
tests/unit/core/test_archiver_writer.py::TestArchiveMessagesInternal::test_archive_messages_batch_operation_with_interrupted_flag PASSED [ 98%]
tests/unit/core/test_archiver_writer.py::TestArchiveMessagesInternal::test_archive_messages_with_skipped_duplicates PASSED [ 98%]
tests/unit/core/test_archiver_writer.py::TestArchiveMessagesInternal::test_archive_messages_with_compression PASSED [ 99%]
tests/unit/core/test_archiver_writer.py::TestArchiveMessagesInternal::test_archive_messages_without_session_id PASSED [ 99%]
tests/unit/core/test_archiver_writer.py::TestArchiveMessagesInternal::test_archive_messages_logs_summary PASSED [ 99%]
tests/unit/core/test_archiver_writer.py::TestArchiveMessagesInternal::test_sigint_handler_installation PASSED [ 99%]
tests/unit/core/test_archiver_writer.py::TestArchiveMessagesInternal::test_log_method_prints_message PASSED [ 99%]
tests/unit/core/test_archiver_writer.py::TestArchiveMessagesInternal::test_archive_messages_with_failed_messages PASSED [ 99%]
tests/unit/core/test_archiver_writer.py::TestArchiveMessagesInternal::test_archive_messages_fetch_error_with_task_tracking PASSED [ 99%]
tests/unit/core/test_archiver_writer.py::TestArchiveMessagesInternal::test_progress_callback_is_called PASSED [ 99%]
tests/unit/core/test_archiver_writer.py::TestArchiveMessagesInternal::test_sigint_handler_called_and_restored PASSED [ 99%]
tests/unit/core/test_archiver_writer.py::TestArchiveMessagesInternal::test_sigint_handler_sets_interrupted_event PASSED [ 99%]
tests/unit/core/test_archiver_writer.py::TestArchiveMessagesInternal::test_progress_callback_with_task PASSED [ 99%]
tests/unit/core/test_archiver_writer.py::TestArchiveMessagesInternal::test_keyboard_interrupt_during_async_for PASSED [ 99%]
tests/unit/core/validator/test_decompressor.py::TestDecompressor::test_get_uncompressed_mbox_returns_as_is PASSED [ 99%]
tests/unit/core/validator/test_decompressor.py::TestDecompressor::test_get_gzip_compressed_decompresses_to_temp PASSED [ 99%]
tests/unit/core/validator/test_decompressor.py::TestDecompressor::test_get_lzma_compressed_decompresses_to_temp PASSED [ 99%]
tests/unit/core/validator/test_decompressor.py::TestDecompressor::test_get_zstd_compressed_decompresses_to_temp PASSED [ 99%]
tests/unit/core/validator/test_decompressor.py::TestDecompressor::test_get_unknown_extension_returns_as_is PASSED [ 99%]
tests/unit/core/validator/test_decompressor.py::TestDecompressor::test_cleanup_temp_file_removes_file PASSED [ 99%]
tests/unit/core/validator/test_decompressor.py::TestDecompressor::test_cleanup_non_temp_file_does_not_remove PASSED [ 99%]
tests/unit/core/validator/test_decompressor.py::TestDecompressor::test_cleanup_missing_file_does_not_raise PASSED [ 99%]
tests/unit/core/validator/test_validator_facade.py::TestValidatorFacade::test_init PASSED [ 99%]
tests/unit/core/validator/test_validator_facade.py::TestValidatorFacade::test_validate_all_with_valid_archive PASSED [ 99%]
tests/unit/core/validator/test_validator_facade.py::TestValidatorFacade::test_validate_all_with_empty_archive PASSED [ 99%]
tests/unit/core/validator/test_validator_facade.py::TestValidatorFacade::test_validate_count_match PASSED [ 99%]
tests/unit/core/validator/test_validator_facade.py::TestValidatorFacade::test_validate_count_mismatch PASSED [ 99%]
tests/unit/core/validator/test_validator_facade.py::TestValidatorFacade::test_compute_checksum PASSED [ 99%]
tests/unit/core/validator/test_validator_facade.py::TestValidatorFacade::test_validate_comprehensive_basic PASSED [100%]

=================================== FAILURES ===================================
___________________ test_check_temp_directory_not_accessible ___________________

    async def test_check_temp_directory_not_accessible() -> None:
        """Test temp directory check when not accessible."""
        with patch("tempfile.gettempdir", return_value="/nonexistent/tmp"):
            with patch("os.access", return_value=False):
>               doctor = await Doctor.create(":memory:")
                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

tests/core/test_doctor.py:494: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
src/gmailarchiver/core/doctor/facade.py:93: in create
    storage = HybridStorage(db_manager)
              ^^^^^^^^^^^^^^^^^^^^^^^^^
src/gmailarchiver/data/hybrid_storage.py:106: in __init__
    self._staging_area.mkdir(exist_ok=True)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = PosixPath('/nonexistent/tmp/gmailarchiver_staging'), mode = 511
parents = False, exist_ok = True

    def mkdir(self, mode=0o777, parents=False, exist_ok=False):
        """
        Create a new directory at this given path.
        """
        try:
>           os.mkdir(self, mode)
E           FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent/tmp/gmailarchiver_staging'

/opt/homebrew/Cellar/python@3.14/3.14.2/Frameworks/Python.framework/Versions/3.14/lib/python3.14/pathlib/__init__.py:1011: FileNotFoundError
=============================== warnings summary ===============================
tests/cli/test_command_context.py: 24 warnings
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/rich/live.py:256: UserWarning: install "ipywidgets" for Jupyter support
    warnings.warn('install "ipywidgets" for Jupyter support')

tests/cli/test_output.py::TestLiveLayoutContextInitialization::test_init_with_all_components
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/_pytest/python.py:166: ResourceWarning: unclosed file <_io.TextIOWrapper name='/var/folders/12/9c5gy96s0h1ggdksjk1ll3xh0000gn/T/tmppnrgem8r/session_2025-12-20_183504.log' mode='w' encoding='utf-8'>
    result = testfunction(**testargs)
  Enable tracemalloc to get traceback where the object was allocated.
  See https://docs.pytest.org/en/stable/how-to/capture-warnings.html#resource-warnings for more info.

tests/cli/test_output.py::TestLiveLayoutContextInitialization::test_init_with_default_components
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/_pytest/python.py:166: ResourceWarning: unclosed file <_io.TextIOWrapper name='/var/folders/12/9c5gy96s0h1ggdksjk1ll3xh0000gn/T/tmp6vm46f3i/session_2025-12-20_183504.log' mode='w' encoding='utf-8'>
    result = testfunction(**testargs)
  Enable tracemalloc to get traceback where the object was allocated.
  See https://docs.pytest.org/en/stable/how-to/capture-warnings.html#resource-warnings for more info.

tests/cli/test_output.py::TestLiveLayoutContextInitialization::test_init_custom_max_visible
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/_pytest/python.py:166: ResourceWarning: unclosed file <_io.TextIOWrapper name='/var/folders/12/9c5gy96s0h1ggdksjk1ll3xh0000gn/T/tmplrlg3km7/session_2025-12-20_183504.log' mode='w' encoding='utf-8'>
    result = testfunction(**testargs)
  Enable tracemalloc to get traceback where the object was allocated.
  See https://docs.pytest.org/en/stable/how-to/capture-warnings.html#resource-warnings for more info.

tests/core/test_doctor.py::test_check_database_schema_v11
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x10b628650> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/core/test_doctor.py::test_check_database_schema_v10
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x10b62add0> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/core/test_doctor.py::test_check_database_integrity_ok
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x10b62a850> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/core/test_doctor.py::test_check_orphaned_fts_none
tests/core/test_doctor.py::test_check_dependencies_installed
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x10b6298d0> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/core/test_doctor.py::test_check_archive_files_exist
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x108aed3d0> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/core/test_doctor.py::test_check_archive_files_missing
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x108a244d0> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/core/test_doctor.py::test_check_python_version_ok
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x10b629fd0> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/core/test_doctor.py::test_check_python_version_too_old
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x108a275d0> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/core/test_doctor.py::test_check_oauth_token_missing
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x10b640950> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/core/test_doctor.py::test_check_oauth_token_valid
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x10b640cd0> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/core/test_doctor.py::test_check_oauth_token_expired
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x10b6434d0> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/core/test_doctor.py::test_check_oauth_token_expired
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x10ada2650> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/core/test_doctor.py::test_check_credentials_file_exists
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x1089cb650> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/core/test_doctor.py::test_check_disk_space_sufficient
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x10b640dd0> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/core/test_doctor.py::test_check_disk_space_low_warning
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x10b641550> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/core/test_doctor.py::test_check_disk_space_critical_error
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x10b643f50> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/core/test_doctor.py::test_check_write_permissions_ok
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x10b643ad0> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/core/test_doctor.py::test_check_write_permissions_denied
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x10b641a50> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/core/test_doctor.py::test_check_stale_lock_files_none
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x10b641450> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/core/test_doctor.py::test_check_stale_lock_files_found
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x10b6420d0> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/core/test_doctor.py::test_check_temp_directory_accessible
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x10b6421d0> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/core/test_doctor.py::test_run_diagnostics_all_checks_pass
tests/core/test_doctor.py::test_check_python_version_compatibility
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x10b4ab850> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/core/test_doctor.py::test_run_diagnostics_with_warnings
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x10b4aaed0> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/core/test_doctor.py::test_run_diagnostics_with_errors
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x10b4aaa50> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/core/test_doctor.py::test_run_diagnostics_counts_results_correctly
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x10b4aa550> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/core/test_doctor.py::test_auto_fix_orphaned_fts
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x10b4aacd0> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/core/test_doctor.py::test_auto_fix_stale_locks
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x10b4abcd0> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/core/test_doctor.py::test_run_auto_fix_fixes_all_issues
tests/core/test_doctor.py::test_doctor_with_memory_database
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x10b4a9450> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/core/test_doctor.py::test_multiple_diagnostics_runs_independent
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x10a95fcd0> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/core/test_doctor.py::test_doctor_on_windows
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x10b4ab750> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/core/test_doctor.py::test_doctor_on_macos
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x10b5196d0> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/core/test_doctor.py::test_check_database_schema_unknown_version
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x10b51a550> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/core/test_doctor.py::test_check_orphaned_fts_not_found
tests/core/test_doctor.py::test_check_credentials_file_missing
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x10b51b4d0> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/core/test_doctor.py::test_check_archive_files_exist_with_missing_files
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x108b0bdd0> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/core/test_doctor.py::test_check_oauth_token_file_missing
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x10b4ab150> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/core/test_doctor.py::test_check_disk_space_insufficient
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x10b51b6d0> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/core/test_doctor.py::test_check_write_permissions_readonly_file
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x10b5194d0> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/core/test_doctor.py::test_check_stale_locks_found
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x10b51afd0> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/core/test_doctor.py::test_fix_missing_database
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x10b51aed0> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/core/test_doctor.py::test_run_diagnostics_full_report
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x10b5193d0> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/core/test_doctor.py::test_check_stale_locks_exception
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x10b4a8950> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/core/test_doctor.py::test_check_stale_locks_exception
tests/core/test_importer.py::TestImportSingleArchive::test_import_simple_mbox_all_messages
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x10b519ad0> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/core/test_doctor.py::test_check_stale_locks_exception
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x10b5187d0> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/core/test_doctor.py::test_check_stale_locks_exception
tests/core/test_importer.py::TestImportSingleArchive::test_import_simple_mbox_all_messages
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/_pytest/unraisableexception.py:67: PytestUnraisableExceptionWarning: Exception ignored while calling deallocator <function Connection.__del__ at 0x1075e9590>: None
  
  Traceback (most recent call last):
    File "/Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py", line 429, in __del__
      self._stop_running()
      ~~~~~~~~~~~~~~~~~~^^
    File "/Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py", line 101, in _stop_running
      future = asyncio.get_event_loop().create_future()
               ~~~~~~~~~~~~~~~~~~~~~~^^
    File "/opt/homebrew/Cellar/python@3.14/3.14.2/Frameworks/Python.framework/Versions/3.14/lib/python3.14/asyncio/events.py", line 715, in get_event_loop
      raise RuntimeError('There is no current event loop in thread %r.'
                         % threading.current_thread().name)
  RuntimeError: There is no current event loop in thread 'MainThread'.
  
  
    warnings.warn(pytest.PytestUnraisableExceptionWarning(msg))

tests/core/test_doctor.py::test_fix_stale_locks_handles_glob_error
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x10b4f4ed0> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/core/test_importer.py::TestImportSingleArchive::test_import_simple_mbox_all_messages
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x10b4a9dd0> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/core/test_importer.py::TestImportSingleArchive::test_import_simple_mbox_all_messages
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x10b4f48d0> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/core/workflows/test_import_workflow.py::TestImportWorkflowBehavior::test_reports_progress_during_import
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x10b6424d0> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/data/test_hybrid_storage.py::TestEdgeCasesAndCoverage::test_bulk_write_database_error_rollback
  /Users/atomasini/Development/GMailArchiver/tests/data/test_hybrid_storage.py:1944: ResourceWarning: unclosed file <_io.BufferedRandom name='/var/folders/12/9c5gy96s0h1ggdksjk1ll3xh0000gn/T/gmailarchiver_staging/bulk_write_e7a7ffec-fe35-43db-82d6-795bfac570ba.mbox'>
    pass  # Expected to fail
  Enable tracemalloc to get traceback where the object was allocated.
  See https://docs.pytest.org/en/stable/how-to/capture-warnings.html#resource-warnings for more info.

tests/test_cli_repair.py::test_repair_dry_run_default
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x10c504cd0> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/test_cli_repair.py::test_repair_dry_run_explicit
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x10a703050> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/test_cli_repair.py::test_repair_actual_requires_confirmation
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x10a700650> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/test_cli_repair.py::test_repair_actual_with_confirmation
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x10b76ab50> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/test_cli_repair.py::test_repair_fts_only
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x10b7682d0> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/test_cli_repair.py::test_repair_backfill_dry_run
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x10c50e7d0> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/test_cli_repair.py::test_repair_backfill_actual
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x10c45f150> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/test_cli_repair.py::test_repair_combined_fts_and_backfill
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x10c45de50> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/test_cli_repair.py::test_repair_output_format
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x10c4b0dd0> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/test_cli_repair.py::test_repair_no_issues
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x10b108350> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/test_cli_search.py::TestSearchCommand::test_search_shows_execution_time
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/aiosqlite/core.py:417: ResourceWarning: <aiosqlite.core.Connection object at 0x10b10ad50> was deleted before being closed. Please use 'async with' or '.close()' to close the connection properly.
    warn(

tests/test_session_logger.py::TestSessionLoggerInitialization::test_init_default_path
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/_pytest/python.py:166: ResourceWarning: unclosed file <_io.TextIOWrapper name='/var/folders/12/9c5gy96s0h1ggdksjk1ll3xh0000gn/T/tmpqttsgqq9/session_2025-12-20_183519.log' mode='w' encoding='utf-8'>
    result = testfunction(**testargs)
  Enable tracemalloc to get traceback where the object was allocated.
  See https://docs.pytest.org/en/stable/how-to/capture-warnings.html#resource-warnings for more info.

tests/test_session_logger.py::TestSessionLoggerInitialization::test_init_custom_path
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/_pytest/python.py:166: ResourceWarning: unclosed file <_io.TextIOWrapper name='/var/folders/12/9c5gy96s0h1ggdksjk1ll3xh0000gn/T/tmpyjajwkfh/custom_logs/session_2025-12-20_183519.log' mode='w' encoding='utf-8'>
    result = testfunction(**testargs)
  Enable tracemalloc to get traceback where the object was allocated.
  See https://docs.pytest.org/en/stable/how-to/capture-warnings.html#resource-warnings for more info.

tests/test_session_logger.py::TestSessionLoggerInitialization::test_init_creates_nested_directories
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/_pytest/python.py:166: ResourceWarning: unclosed file <_io.TextIOWrapper name='/var/folders/12/9c5gy96s0h1ggdksjk1ll3xh0000gn/T/tmpc4ir2zjt/level1/level2/logs/session_2025-12-20_183519.log' mode='w' encoding='utf-8'>
    result = testfunction(**testargs)
  Enable tracemalloc to get traceback where the object was allocated.
  See https://docs.pytest.org/en/stable/how-to/capture-warnings.html#resource-warnings for more info.

tests/test_session_logger.py::TestSessionLoggerInitialization::test_timestamped_filename_format
  /Users/atomasini/Development/GMailArchiver/.venv/lib/python3.14/site-packages/_pytest/python.py:166: ResourceWarning: unclosed file <_io.TextIOWrapper name='/var/folders/12/9c5gy96s0h1ggdksjk1ll3xh0000gn/T/tmpa41u0abl/session_2025-12-20_183519.log' mode='w' encoding='utf-8'>
    result = testfunction(**testargs)
  Enable tracemalloc to get traceback where the object was allocated.
  See https://docs.pytest.org/en/stable/how-to/capture-warnings.html#resource-warnings for more info.

-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
================================ tests coverage ================================
_______________ coverage: platform darwin, python 3.14.2-final-0 _______________

Name                                                    Stmts   Miss  Cover   Missing
-------------------------------------------------------------------------------------
src/gmailarchiver/__init__.py                               4      2    50%   5-6
src/gmailarchiver/_version.py                              13      0   100%
src/gmailarchiver/cli/__init__.py                           4      0   100%
src/gmailarchiver/cli/_output_search.py                    41      0   100%
src/gmailarchiver/cli/adapters.py                           2      0   100%
src/gmailarchiver/cli/command_context.py                  268      2    99%   770-771
src/gmailarchiver/cli/commands/archive.py                 119      1    99%   72
src/gmailarchiver/cli/commands/consolidate.py               7      0   100%
src/gmailarchiver/cli/commands/dedupe.py                    7      0   100%
src/gmailarchiver/cli/commands/doctor.py                    7      0   100%
src/gmailarchiver/cli/commands/import_.py                  49      6    88%   99, 115-118, 137
src/gmailarchiver/cli/commands/migrate.py                   7      0   100%
src/gmailarchiver/cli/commands/repair.py                    7      0   100%
src/gmailarchiver/cli/commands/schedule.py                 19      5    74%   41, 60, 76, 92, 108
src/gmailarchiver/cli/commands/search.py                  135     13    90%   91, 108-109, 170, 173, 234, 240, 271, 281, 290, 309, 337-338
src/gmailarchiver/cli/commands/status.py                   57      1    98%   88
src/gmailarchiver/cli/commands/validate.py                 58      1    98%   67
src/gmailarchiver/cli/commands/verify.py                   13      3    77%   32, 52, 72
src/gmailarchiver/cli/consolidate.py                       32      0   100%
src/gmailarchiver/cli/dedupe.py                            40      0   100%
src/gmailarchiver/cli/doctor.py                            52      8    85%   71, 90, 109, 141-143, 145-146
src/gmailarchiver/cli/main.py                              46      2    96%   11-12
src/gmailarchiver/cli/migrate.py                           27      1    96%   51
src/gmailarchiver/cli/output.py                           678     45    93%   60, 68, 76, 84, 92, 101, 110, 133, 145, 149, 153, 346, 359, 368-375, 394, 405, 417-420, 462, 531, 702-703, 850, 875-876, 917-920, 1099, 1163, 1231, 1581-1590, 1593, 1610-1611, 1749, 1917
src/gmailarchiver/cli/repair.py                            34      5    85%   21, 39-46
src/gmailarchiver/cli/schedule.py                          81      9    89%   36, 43, 83, 138, 146, 169, 177, 200, 208
src/gmailarchiver/cli/ui/__init__.py                        8      0   100%
src/gmailarchiver/cli/ui/adapters.py                       49      1    98%   167
src/gmailarchiver/cli/ui/builder.py                       132      1    99%   201
src/gmailarchiver/cli/ui/protocols.py                      28     11    61%   27, 37, 52, 61, 69, 78, 87, 98, 121, 146, 159
src/gmailarchiver/cli/ui/widgets/__init__.py               11      0   100%
src/gmailarchiver/cli/ui/widgets/errors.py                 24      3    88%   54-55, 102
src/gmailarchiver/cli/ui/widgets/log_window.py             66      0   100%
src/gmailarchiver/cli/ui/widgets/progress.py               23      1    96%   88
src/gmailarchiver/cli/ui/widgets/progress_bar.py          108      2    98%   175, 209
src/gmailarchiver/cli/ui/widgets/report_card.py            30      3    90%   49-50, 111
src/gmailarchiver/cli/ui/widgets/suggestions.py            26      3    88%   48-49, 102
src/gmailarchiver/cli/ui/widgets/table.py                  72      3    96%   185, 192-193
src/gmailarchiver/cli/ui/widgets/task.py                  114      2    98%   189, 240
src/gmailarchiver/cli/ui/widgets/validation.py             88      8    91%   103-104, 124-125, 169-172, 234
src/gmailarchiver/cli/ui/widgets/workflow_progress.py      50      0   100%
src/gmailarchiver/cli/ui_builder.py                         6      0   100%
src/gmailarchiver/cli/verify.py                            64      3    95%   37, 89, 141
src/gmailarchiver/cli/widgets.py                            2      0   100%
src/gmailarchiver/connectors/__init__.py                    5      0   100%
src/gmailarchiver/connectors/auth.py                      130     18    86%   45, 47, 122, 286, 302-311, 319-327
src/gmailarchiver/connectors/config/__init__.py             0      0   100%
src/gmailarchiver/connectors/gmail_client.py              175      2    99%   407, 439
src/gmailarchiver/connectors/platform_scheduler.py        137      5    96%   112, 138, 245, 365, 428
src/gmailarchiver/connectors/rate_limiter.py               43      0   100%
src/gmailarchiver/core/__init__.py                         10      0   100%
src/gmailarchiver/core/archiver/__init__.py                 2      0   100%
src/gmailarchiver/core/archiver/_filter.py                 24      0   100%
src/gmailarchiver/core/archiver/_writer.py                 98      2    98%   200, 202
src/gmailarchiver/core/archiver/facade.py                  70      4    94%   134-135, 321, 327
src/gmailarchiver/core/compressor/__init__.py               2      0   100%
src/gmailarchiver/core/compressor/_gzip.py                 34      2    94%   37-38
src/gmailarchiver/core/compressor/_lzma.py                 34      0   100%
src/gmailarchiver/core/compressor/_zstd.py                 34      2    94%   37-38
src/gmailarchiver/core/compressor/facade.py               179     12    93%   29, 34, 39, 44, 313, 345, 375, 408-410, 423-424
src/gmailarchiver/core/consolidator/__init__.py             2      0   100%
src/gmailarchiver/core/consolidator/_merger.py             11      0   100%
src/gmailarchiver/core/consolidator/_sorter.py             46      1    98%   98
src/gmailarchiver/core/consolidator/facade.py              40      0   100%
src/gmailarchiver/core/deduplicator/__init__.py             6      0   100%
src/gmailarchiver/core/deduplicator/_remover.py            19      1    95%   52
src/gmailarchiver/core/deduplicator/_resolver.py           22      1    95%   59
src/gmailarchiver/core/deduplicator/_scanner.py            26      1    96%   49
src/gmailarchiver/core/deduplicator/facade.py              67      1    99%   106
src/gmailarchiver/core/doctor/__init__.py                   5      0   100%
src/gmailarchiver/core/doctor/_diagnostics.py             197     11    94%   72, 80, 146, 253, 331, 408-416, 445-446, 579
src/gmailarchiver/core/doctor/_repair.py                   57      0   100%
src/gmailarchiver/core/doctor/facade.py                   139      4    97%   233, 235, 314, 323
src/gmailarchiver/core/extractor/__init__.py                3      0   100%
src/gmailarchiver/core/extractor/_extractor.py             59      2    97%   105-106
src/gmailarchiver/core/extractor/_locator.py               17      0   100%
src/gmailarchiver/core/extractor/facade.py                 43      0   100%
src/gmailarchiver/core/importer/__init__.py                 2      0   100%
src/gmailarchiver/core/importer/_gmail_lookup.py           22      0   100%
src/gmailarchiver/core/importer/_reader.py                 97      5    95%   134, 203-204, 210-211
src/gmailarchiver/core/importer/_scanner.py                51      0   100%
src/gmailarchiver/core/importer/_writer.py                 41      1    98%   92
src/gmailarchiver/core/importer/facade.py                 140      1    99%   277
src/gmailarchiver/core/search/__init__.py                   4      0   100%
src/gmailarchiver/core/search/_executor.py                121      8    93%   52, 58, 111, 182, 243, 276-278, 293
src/gmailarchiver/core/search/_parser.py                   60      0   100%
src/gmailarchiver/core/search/_types.py                     5      0   100%
src/gmailarchiver/core/search/facade.py                    52      1    98%   85
src/gmailarchiver/core/validator/__init__.py                5      0   100%
src/gmailarchiver/core/validator/_checksum.py               4      0   100%
src/gmailarchiver/core/validator/_counter.py               38      2    95%   64-65
src/gmailarchiver/core/validator/_decompressor.py          37      0   100%
src/gmailarchiver/core/validator/facade.py                245     10    96%   98, 326-327, 404-406, 432, 560, 568, 570
src/gmailarchiver/core/workflows/__init__.py               12      0   100%
src/gmailarchiver/core/workflows/archive.py                85      0   100%
src/gmailarchiver/core/workflows/composer.py               54      1    98%   210
src/gmailarchiver/core/workflows/consolidate.py            44      0   100%
src/gmailarchiver/core/workflows/dedupe.py                 44      0   100%
src/gmailarchiver/core/workflows/doctor.py                 39      2    95%   110-111
src/gmailarchiver/core/workflows/import_.py                58      0   100%
src/gmailarchiver/core/workflows/migrate.py                79      1    99%   142
src/gmailarchiver/core/workflows/repair.py                 77      2    97%   108, 131
src/gmailarchiver/core/workflows/search.py                 32      1    97%   91
src/gmailarchiver/core/workflows/status.py                 29      1    97%   86
src/gmailarchiver/core/workflows/step.py                   64      3    95%   116, 121, 139
src/gmailarchiver/core/workflows/steps/__init__.py         10      0   100%
src/gmailarchiver/core/workflows/steps/doctor.py           62      0   100%
src/gmailarchiver/core/workflows/steps/filter.py           59      2    97%   157-158
src/gmailarchiver/core/workflows/steps/gmail.py           131      7    95%   95-97, 329-332
src/gmailarchiver/core/workflows/steps/metadata.py        106      0   100%
src/gmailarchiver/core/workflows/steps/scan.py             43      2    95%   115-116
src/gmailarchiver/core/workflows/steps/search.py           53      3    94%   79, 165-166
src/gmailarchiver/core/workflows/steps/stats.py            36      3    92%   80, 112-113
src/gmailarchiver/core/workflows/steps/validate.py         81      4    95%   133-134, 187-188
src/gmailarchiver/core/workflows/steps/write.py            57      1    98%   118
src/gmailarchiver/core/workflows/validate.py               32      0   100%
src/gmailarchiver/core/workflows/verify.py                 82      0   100%
src/gmailarchiver/data/__init__.py                          6      0   100%
src/gmailarchiver/data/db_manager.py                      392     16    96%   307-309, 603-612, 805, 816, 908-938, 978-979
src/gmailarchiver/data/hybrid_storage.py                  663     64    90%   181, 261, 269-275, 312, 345-346, 427, 439, 462, 471-472, 481-482, 596, 647-651, 667, 691, 727, 748, 779, 815, 845-848, 868, 875, 1019-1020, 1141, 1183-1185, 1215-1222, 1307, 1319, 1331-1338, 1372-1373, 1608-1611
src/gmailarchiver/data/migration.py                       312      7    98%   870-881
src/gmailarchiver/data/scheduler.py                        60      3    95%   182, 188-189
src/gmailarchiver/data/schema_manager.py                  186     10    95%   187-188, 334, 337, 345-347, 389-390, 489
src/gmailarchiver/shared/__init__.py                        5      0   100%
src/gmailarchiver/shared/input_validator.py                61     40    34%   36, 45, 52, 81-118, 171-197
src/gmailarchiver/shared/path_validator.py                 21      6    71%   40, 46, 71, 93-98
src/gmailarchiver/shared/protocols.py                      52      9    83%   168, 172, 176, 180, 208-214
src/gmailarchiver/shared/utils.py                          34      6    82%   57-62, 104
-------------------------------------------------------------------------------------
TOTAL                                                    8529    436    95%
=========================== short test summary info ============================
FAILED tests/core/test_doctor.py::test_check_temp_directory_not_accessible - ...
================= 1 failed, 2631 passed, 97 warnings in 16.34s =================
