============================= test session starts ============================= platform win32 -- Python 3.13.11, pytest-9.0.2, pluggy-1.6.0 -- c:\Development\VS Code Projects\webdrop_bridge\.venv\Scripts\python.exe cachedir: .pytest_cache PySide6 6.10.1 -- Qt runtime 6.10.1 -- Qt compiled 6.10.1 rootdir: C:\Development\VS Code Projects\webdrop_bridge configfile: pytest.ini (WARNING: ignoring pytest config in pyproject.toml!) plugins: asyncio-1.3.0, cov-7.0.0, qt-4.5.0 asyncio: mode=Mode.STRICT, debug=False, asyncio_default_fixture_loop_scope=None, asyncio_default_test_loop_scope=function collecting ... collected 206 items tests/integration/test_update_flow.py::TestUpdateFlowIntegration::test_full_update_check_flow PASSED [ 0%] tests/integration/test_update_flow.py::TestUpdateFlowIntegration::test_update_check_with_cache PASSED [ 0%] tests/integration/test_update_flow.py::TestUpdateFlowIntegration::test_update_check_no_newer_version PASSED [ 1%] tests/integration/test_update_flow.py::TestUpdateFlowIntegration::test_update_check_network_error PASSED [ 1%] tests/integration/test_update_flow.py::TestUpdateFlowIntegration::test_version_parsing_in_api_response PASSED [ 2%] tests/integration/test_update_flow.py::TestUpdateFlowIntegration::test_asset_parsing_in_release PASSED [ 2%] tests/integration/test_update_flow.py::TestUpdateFlowIntegration::test_changelog_preserved PASSED [ 3%] tests/unit/test_config.py::TestConfigFromEnv::test_from_env_with_all_values PASSED [ 3%] tests/unit/test_config.py::TestConfigFromEnv::test_from_env_with_defaults PASSED [ 4%] tests/unit/test_config.py::TestConfigFromEnv::test_from_env_invalid_log_level PASSED [ 4%] tests/unit/test_config.py::TestConfigFromEnv::test_from_env_invalid_window_dimension PASSED [ 5%] tests/unit/test_config.py::TestConfigFromEnv::test_from_env_invalid_root_path PASSED [ 5%] tests/unit/test_config.py::TestConfigFromEnv::test_from_env_empty_webapp_url PASSED [ 6%] tests/unit/test_config.py::TestConfigValidation::test_root_path_resolution PASSED [ 6%] tests/unit/test_config.py::TestConfigValidation::test_multiple_root_paths PASSED [ 7%] tests/unit/test_config.py::TestConfigValidation::test_allowed_urls_empty PASSED [ 7%] tests/unit/test_config.py::TestConfigValidation::test_allowed_urls_single PASSED [ 8%] tests/unit/test_config.py::TestConfigValidation::test_allowed_urls_multiple PASSED [ 8%] tests/unit/test_config.py::TestConfigValidation::test_allowed_urls_with_whitespace PASSED [ 9%] tests/unit/test_config_manager.py::TestConfigValidator::test_validate_valid_config PASSED [ 9%] tests/unit/test_config_manager.py::TestConfigValidator::test_validate_missing_required_field PASSED [ 10%] tests/unit/test_config_manager.py::TestConfigValidator::test_validate_invalid_type PASSED [ 10%] tests/unit/test_config_manager.py::TestConfigValidator::test_validate_invalid_log_level PASSED [ 11%] tests/unit/test_config_manager.py::TestConfigValidator::test_validate_invalid_version_format PASSED [ 11%] tests/unit/test_config_manager.py::TestConfigValidator::test_validate_out_of_range_value PASSED [ 12%] tests/unit/test_config_manager.py::TestConfigValidator::test_validate_or_raise_valid PASSED [ 12%] tests/unit/test_config_manager.py::TestConfigValidator::test_validate_or_raise_invalid PASSED [ 13%] tests/unit/test_config_manager.py::TestConfigProfile::test_save_profile PASSED [ 13%] tests/unit/test_config_manager.py::TestConfigProfile::test_load_profile PASSED [ 14%] tests/unit/test_config_manager.py::TestConfigProfile::test_load_nonexistent_profile PASSED [ 14%] tests/unit/test_config_manager.py::TestConfigProfile::test_list_profiles PASSED [ 15%] tests/unit/test_config_manager.py::TestConfigProfile::test_delete_profile PASSED [ 15%] tests/unit/test_config_manager.py::TestConfigProfile::test_delete_nonexistent_profile PASSED [ 16%] tests/unit/test_config_manager.py::TestConfigProfile::test_invalid_profile_name PASSED [ 16%] tests/unit/test_config_manager.py::TestConfigExporter::test_export_to_json PASSED [ 16%] tests/unit/test_config_manager.py::TestConfigExporter::test_import_from_json PASSED [ 17%] tests/unit/test_config_manager.py::TestConfigExporter::test_import_nonexistent_file PASSED [ 17%] tests/unit/test_config_manager.py::TestConfigExporter::test_import_invalid_json PASSED [ 18%] tests/unit/test_config_manager.py::TestConfigExporter::test_import_invalid_config PASSED [ 18%] tests/unit/test_drag_interceptor.py::TestDragInterceptorInitialization::test_drag_interceptor_creation PASSED [ 19%] tests/unit/test_drag_interceptor.py::TestDragInterceptorInitialization::test_drag_interceptor_has_signals PASSED [ 19%] tests/unit/test_drag_interceptor.py::TestDragInterceptorInitialization::test_set_validator PASSED [ 20%] tests/unit/test_drag_interceptor.py::TestDragInterceptorValidation::test_initiate_drag_no_files PASSED [ 20%] tests/unit/test_drag_interceptor.py::TestDragInterceptorValidation::test_initiate_drag_no_validator PASSED [ 21%] tests/unit/test_drag_interceptor.py::TestDragInterceptorValidation::test_initiate_drag_single_valid_file PASSED [ 21%] tests/unit/test_drag_interceptor.py::TestDragInterceptorValidation::test_initiate_drag_invalid_path PASSED [ 22%] tests/unit/test_drag_interceptor.py::TestDragInterceptorValidation::test_initiate_drag_nonexistent_file PASSED [ 22%] tests/unit/test_drag_interceptor.py::TestDragInterceptorMultipleFiles::test_initiate_drag_multiple_files PASSED [ 23%] tests/unit/test_drag_interceptor.py::TestDragInterceptorMultipleFiles::test_initiate_drag_mixed_valid_invalid PASSED [ 23%] tests/unit/test_drag_interceptor.py::TestDragInterceptorMimeData::test_mime_data_creation PASSED [ 24%] tests/unit/test_drag_interceptor.py::TestDragInterceptorSignals::test_drag_started_signal_emitted PASSED [ 24%] tests/unit/test_drag_interceptor.py::TestDragInterceptorSignals::test_drag_failed_signal_on_no_files PASSED [ 25%] tests/unit/test_drag_interceptor.py::TestDragInterceptorSignals::test_drag_failed_signal_on_validation_error PASSED [ 25%] tests/unit/test_drag_interceptor.py::TestDragInterceptorDragExecution::test_drag_cancelled_returns_false PASSED [ 26%] tests/unit/test_drag_interceptor.py::TestDragInterceptorDragExecution::test_pixmap_created_from_widget PASSED [ 26%] tests/unit/test_drag_interceptor.py::TestDragInterceptorIntegration::test_drag_with_nested_file PASSED [ 27%] tests/unit/test_drag_interceptor.py::TestDragInterceptorIntegration::test_drag_with_relative_path PASSED [ 27%] tests/unit/test_logging.py::TestSetupLogging::test_setup_logging_console_only PASSED [ 28%] tests/unit/test_logging.py::TestSetupLogging::test_setup_logging_with_file PASSED [ 28%] tests/unit/test_logging.py::TestSetupLogging::test_setup_logging_invalid_level PASSED [ 29%] tests/unit/test_logging.py::TestSetupLogging::test_setup_logging_invalid_file_path PASSED [ 29%] tests/unit/test_logging.py::TestSetupLogging::test_setup_logging_custom_format PASSED [ 30%] tests/unit/test_logging.py::TestSetupLogging::test_setup_logging_creates_parent_dirs PASSED [ 30%] tests/unit/test_logging.py::TestSetupLogging::test_setup_logging_removes_duplicates PASSED [ 31%] tests/unit/test_logging.py::TestGetLogger::test_get_logger PASSED [ 31%] tests/unit/test_logging.py::TestGetLogger::test_get_logger_default_name PASSED [ 32%] tests/unit/test_logging.py::TestLogRotation::test_rotating_file_handler_configured PASSED [ 32%] tests/unit/test_logging.py::TestJSONFormatter::test_json_formatter_creates_valid_json PASSED [ 33%] tests/unit/test_logging.py::TestJSONFormatter::test_json_formatter_includes_timestamp PASSED [ 33%] tests/unit/test_logging.py::TestJSONFormatter::test_json_formatter_with_exception PASSED [ 33%] tests/unit/test_logging.py::TestJSONFormatter::test_setup_logging_with_json_format PASSED [ 34%] tests/unit/test_logging.py::TestLogArchival::test_setup_logging_with_log_file_created PASSED [ 34%] tests/unit/test_logging.py::TestLogArchival::test_archive_old_logs_with_nonexistent_directory PASSED [ 35%] tests/unit/test_logging.py::TestPerformanceTracker::test_performance_tracker_context_manager PASSED [ 35%] tests/unit/test_logging.py::TestPerformanceTracker::test_performance_tracker_logs_timing PASSED [ 36%] tests/unit/test_logging.py::TestPerformanceTracker::test_performance_tracker_logs_errors PASSED [ 36%] tests/unit/test_logging.py::TestPerformanceTracker::test_performance_tracker_get_elapsed_before_exit PASSED [ 37%] tests/unit/test_main_window.py::TestMainWindowInitialization::test_main_window_creation PASSED [ 37%] tests/unit/test_main_window.py::TestMainWindowInitialization::test_main_window_title PASSED [ 38%] tests/unit/test_main_window.py::TestMainWindowInitialization::test_main_window_geometry PASSED [ 38%] tests/unit/test_main_window.py::TestMainWindowInitialization::test_main_window_has_web_view PASSED [ 39%] tests/unit/test_main_window.py::TestMainWindowInitialization::test_main_window_has_drag_interceptor PASSED [ 39%] tests/unit/test_main_window.py::TestMainWindowNavigation::test_navigation_toolbar_created PASSED [ 40%] tests/unit/test_main_window.py::TestMainWindowNavigation::test_navigation_toolbar_not_movable PASSED [ 40%] tests/unit/test_main_window.py::TestMainWindowNavigation::test_navigate_home PASSED [ 41%] tests/unit/test_main_window.py::TestMainWindowNavigation::test_navigate_home_with_http_url PASSED [ 41%] tests/unit/test_main_window.py::TestMainWindowNavigation::test_navigate_home_with_file_url PASSED [ 42%] tests/unit/test_main_window.py::TestMainWindowWebAppLoading::test_load_local_webapp_file PASSED [ 42%] tests/unit/test_main_window.py::TestMainWindowWebAppLoading::test_load_remote_webapp_url PASSED [ 43%] tests/unit/test_main_window.py::TestMainWindowWebAppLoading::test_load_nonexistent_file_shows_welcome_page PASSED [ 43%] tests/unit/test_main_window.py::TestMainWindowDragIntegration::test_drag_interceptor_validator_set PASSED [ 44%] tests/unit/test_main_window.py::TestMainWindowDragIntegration::test_drag_interceptor_signals_connected PASSED [ 44%] tests/unit/test_main_window.py::TestMainWindowDragIntegration::test_initiate_drag_delegates_to_interceptor PASSED [ 45%] tests/unit/test_main_window.py::TestMainWindowDragIntegration::test_on_drag_started_called PASSED [ 45%] tests/unit/test_main_window.py::TestMainWindowDragIntegration::test_on_drag_failed_called PASSED [ 46%] tests/unit/test_main_window.py::TestMainWindowURLWhitelist::test_restricted_web_view_receives_allowed_urls PASSED [ 46%] tests/unit/test_main_window.py::TestMainWindowURLWhitelist::test_empty_allowed_urls_list PASSED [ 47%] tests/unit/test_main_window.py::TestMainWindowSignals::test_drag_started_signal_connection PASSED [ 47%] tests/unit/test_main_window.py::TestMainWindowSignals::test_drag_failed_signal_connection PASSED [ 48%] tests/unit/test_main_window.py::TestMainWindowMenuBar::test_menu_bar_created PASSED [ 48%] tests/unit/test_main_window.py::TestMainWindowMenuBar::test_window_has_check_for_updates_signal PASSED [ 49%] tests/unit/test_main_window.py::TestMainWindowMenuBar::test_on_check_for_updates_method_exists PASSED [ 49%] tests/unit/test_main_window.py::TestMainWindowMenuBar::test_show_about_dialog_method_exists PASSED [ 50%] tests/unit/test_main_window.py::TestMainWindowStatusBar::test_status_bar_created PASSED [ 50%] tests/unit/test_main_window.py::TestMainWindowStatusBar::test_update_status_label_created PASSED [ 50%] tests/unit/test_main_window.py::TestMainWindowStatusBar::test_set_update_status_text_only PASSED [ 51%] tests/unit/test_main_window.py::TestMainWindowStatusBar::test_set_update_status_with_emoji PASSED [ 51%] tests/unit/test_main_window.py::TestMainWindowStatusBar::test_set_update_status_checking PASSED [ 52%] tests/unit/test_main_window.py::TestMainWindowStatusBar::test_set_update_status_available PASSED [ 52%] tests/unit/test_main_window.py::TestMainWindowStatusBar::test_set_update_status_downloading PASSED [ 53%] tests/unit/test_main_window.py::TestMainWindowStatusBar::test_set_update_status_error PASSED [ 53%] tests/unit/test_main_window.py::TestMainWindowStylesheet::test_stylesheet_loading_gracefully_handles_missing_file PASSED [ 54%] tests/unit/test_main_window.py::TestMainWindowStylesheet::test_stylesheet_loading_with_nonexistent_file PASSED [ 54%] tests/unit/test_main_window.py::TestMainWindowCloseEvent::test_close_event_accepted PASSED [ 55%] tests/unit/test_main_window.py::TestMainWindowIntegration::test_full_initialization_flow PASSED [ 55%] tests/unit/test_main_window.py::TestMainWindowIntegration::test_window_with_multiple_allowed_roots PASSED [ 56%] tests/unit/test_main_window.py::TestMainWindowIntegration::test_window_with_url_whitelist PASSED [ 56%] tests/unit/test_project_structure.py::test_project_structure PASSED [ 57%] tests/unit/test_project_structure.py::test_essential_files PASSED [ 57%] tests/unit/test_project_structure.py::test_python_package_structure PASSED [ 58%] tests/unit/test_restricted_web_view.py::TestRestrictedWebEngineView::test_no_restrictions_empty_list PASSED [ 58%] tests/unit/test_restricted_web_view.py::TestRestrictedWebEngineView::test_no_restrictions_none PASSED [ 59%] tests/unit/test_restricted_web_view.py::TestRestrictedWebEngineView::test_exact_domain_match PASSED [ 59%] tests/unit/test_restricted_web_view.py::TestRestrictedWebEngineView::test_exact_domain_mismatch PASSED [ 60%] tests/unit/test_restricted_web_view.py::TestRestrictedWebEngineView::test_wildcard_pattern_match PASSED [ 60%] tests/unit/test_restricted_web_view.py::TestRestrictedWebEngineView::test_wildcard_pattern_mismatch PASSED [ 61%] tests/unit/test_restricted_web_view.py::TestRestrictedWebEngineView::test_localhost_allowed PASSED [ 61%] tests/unit/test_restricted_web_view.py::TestRestrictedWebEngineView::test_file_url_always_allowed PASSED [ 62%] tests/unit/test_restricted_web_view.py::TestRestrictedWebEngineView::test_multiple_allowed_urls PASSED [ 62%] tests/unit/test_restricted_web_view.py::TestRestrictedWebEngineView::test_rejected_url_opens_system_browser PASSED [ 63%] tests/unit/test_restricted_web_view.py::TestURLAllowedLogic::test_is_url_allowed_empty_list PASSED [ 63%] tests/unit/test_restricted_web_view.py::TestURLAllowedLogic::test_is_url_allowed_file_scheme PASSED [ 64%] tests/unit/test_restricted_web_view.py::TestURLAllowedLogic::test_is_url_allowed_exact_match PASSED [ 64%] tests/unit/test_restricted_web_view.py::TestURLAllowedLogic::test_is_url_allowed_with_port PASSED [ 65%] tests/unit/test_restricted_web_view.py::TestURLAllowedLogic::test_is_url_allowed_wildcard PASSED [ 65%] tests/unit/test_startup_check.py::TestUpdateCheckWorker::test_worker_initialization PASSED [ 66%] tests/unit/test_startup_check.py::TestUpdateCheckWorker::test_worker_has_signals PASSED [ 66%] tests/unit/test_startup_check.py::TestUpdateCheckWorker::test_worker_run_method_exists PASSED [ 66%] tests/unit/test_startup_check.py::TestMainWindowStartupCheck::test_window_has_startup_check_method PASSED [ 67%] tests/unit/test_startup_check.py::TestMainWindowStartupCheck::test_window_has_update_available_signal PASSED [ 67%] tests/unit/test_startup_check.py::TestMainWindowStartupCheck::test_startup_check_initializes_without_error