..................................................................F..... [ 23%]
........................................................................ [ 47%]
........................................................................ [ 71%]
....F..FFFFFFFF.F...........................................F..F........ [ 95%]
...............                                                          [100%]
================================== FAILURES ===================================
__________ TestGetEtlReadonlyConnection.test_uses_etl_config_params ___________
tests\test_database.py:94: in test_uses_etl_config_params
    assert connect_kwargs["dbname"] == "etl_feiqiu"
E   AssertionError: assert 'test_etl_feiqiu' == 'etl_feiqiu'
E     
E     - etl_feiqiu
E     + test_etl_feiqiu
E     ? +++++
__________ TestRunningState.test_is_running_true_when_process_active __________
tests\test_task_executor.py:118: in test_is_running_true_when_process_active
    assert executor.is_running("exec-1") is True
E   AssertionError: assert False is True
E    +  where False = is_running('exec-1')
E    +    where is_running = <app.services.task_executor.TaskExecutor object at 0x000001C9442CBD40>.is_running
____________________ TestReadStream.test_read_stdout_lines ____________________
tests\test_task_executor.py:146: in test_read_stdout_lines
    await executor._read_stream("exec-1", stream, "stdout", collector)
          ^^^^^^^^^^^^^^^^^^^^^
E   AttributeError: 'TaskExecutor' object has no attribute '_read_stream'
____________________ TestReadStream.test_read_stderr_lines ____________________
tests\test_task_executor.py:158: in test_read_stderr_lines
    await executor._read_stream("exec-1", stream, "stderr", collector)
          ^^^^^^^^^^^^^^^^^^^^^
E   AttributeError: 'TaskExecutor' object has no attribute '_read_stream'
________________ TestReadStream.test_read_stream_none_is_safe _________________
tests\test_task_executor.py:166: in test_read_stream_none_is_safe
    await executor._read_stream("exec-1", None, "stdout", collector)
          ^^^^^^^^^^^^^^^^^^^^^
E   AttributeError: 'TaskExecutor' object has no attribute '_read_stream'
__________________ TestReadStream.test_broadcast_during_read __________________
tests\test_task_executor.py:175: in test_broadcast_during_read
    await executor._read_stream("exec-1", stream, "stdout", collector)
          ^^^^^^^^^^^^^^^^^^^^^
E   AttributeError: 'TaskExecutor' object has no attribute '_read_stream'
____________________ TestExecute.test_successful_execution ____________________
tests\test_task_executor.py:218: in test_successful_execution
    assert "processing..." in update_kwargs["output_log"]
E   AssertionError: assert 'processing...' in ''
______________________ TestExecute.test_failed_execution ______________________
tests\test_task_executor.py:245: in test_failed_execution
    assert update_kwargs["status"] == "failed"
E   AssertionError: assert 'success' == 'failed'
E     
E     - failed
E     + success
_________________ TestExecute.test_exception_during_execution _________________
tests\test_task_executor.py:263: in test_exception_during_execution
    assert update_kwargs["status"] == "failed"
E   AssertionError: assert 'success' == 'failed'
E     
E     - failed
E     + success
_____________ TestExecute.test_subscribers_notified_on_completion _____________
tests\test_task_executor.py:290: in test_subscribers_notified_on_completion
    assert "[stdout] line" in messages
E   AssertionError: assert '[stdout] line' in ['[stderr] [2026-02-25 02:42:10] INFO  | etl_billiards | 配置加载完成', '[stderr] [2026-02-25 02:42:10] INFO  | etl_billiard... 02:42:11] INFO  | etl_billiards | 使用回溯时间窗口: 2026-02-24 02:42:11.615145+08:00 ~ 2026-02-25 02:42:11.615145+08:00', ...]
___________________ TestCancel.test_cancel_running_process ____________________
tests\test_task_executor.py:331: in test_cancel_running_process
    assert result is True
E   assert False is True
_____________ TestFlows.test_flows_returns_three_processing_modes _____________
tests\test_tasks_router.py:124: in test_flows_returns_three_processing_modes
    assert len(data["processing_modes"]) == 3
E   AssertionError: assert 4 == 3
E    +  where 4 = len([{'description': '只处理新增和变更的数据', 'id': 'increment_only', 'name': '仅增量处理'}, {'description': '校验现有数据并修复不一致', 'id': 'verif...nt_verify', 'name': '增量 + 校验修复'}, {'description': '用 API 返回数据的实际时间范围处理全部层，无需校验', 'id': 'full_window', 'name': '全窗口处理'}])
_____________________ TestFlows.test_processing_mode_ids ______________________
tests\test_tasks_router.py:143: in test_processing_mode_ids
    assert mode_ids == {"increment_only", "verify_only", "increment_verify"}
E   AssertionError: assert {'full_window...'verify_only'} == {'increment_o...'verify_only'}
E     
E     Extra items in the left set:
E     'full_window'
E     Use -v to get more diff
=========================== short test summary info ===========================
FAILED tests/test_database.py::TestGetEtlReadonlyConnection::test_uses_etl_config_params
FAILED tests/test_task_executor.py::TestRunningState::test_is_running_true_when_process_active
FAILED tests/test_task_executor.py::TestReadStream::test_read_stdout_lines - ...
FAILED tests/test_task_executor.py::TestReadStream::test_read_stderr_lines - ...
FAILED tests/test_task_executor.py::TestReadStream::test_read_stream_none_is_safe
FAILED tests/test_task_executor.py::TestReadStream::test_broadcast_during_read
FAILED tests/test_task_executor.py::TestExecute::test_successful_execution - ...
FAILED tests/test_task_executor.py::TestExecute::test_failed_execution - Asse...
FAILED tests/test_task_executor.py::TestExecute::test_exception_during_execution
FAILED tests/test_task_executor.py::TestExecute::test_subscribers_notified_on_completion
FAILED tests/test_task_executor.py::TestCancel::test_cancel_running_process
FAILED tests/test_tasks_router.py::TestFlows::test_flows_returns_three_processing_modes
FAILED tests/test_tasks_router.py::TestFlows::test_processing_mode_ids - Asse...
13 failed, 290 passed in 146.30s (0:02:26)
