fix(gateway): app survives runtime init failure; dedupe NATS-down notifications; fix stale slot_lookup note
This commit is contained in:
@@ -346,3 +346,34 @@ async def test_main_prepare_ingestor_failure(mock_app_env, capsys):
|
||||
mock_ingestor_instance.logger.error.assert_called_once_with(
|
||||
'Failed to prepare ingestor: Preparation failed'
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_main_gateway_runtime_init_failure_keeps_read_path_alive(mock_app_env):
|
||||
"""GatewayRuntime construction hitting the network (MinIO/Postgres) and failing
|
||||
must not kill the app: the main loop (read path) still runs and shuts down cleanly."""
|
||||
mock_ingestor_instance = mock_app_env['Ingestor'].return_value
|
||||
mock_exit_signal = mock_app_env['mock_exit_signal']
|
||||
|
||||
mock_app_env['GatewayRuntime'].side_effect = Exception('MinIO unreachable')
|
||||
mock_exit_signal.is_set.side_effect = [False, True]
|
||||
mock_app_env['time_time'].side_effect = [10.0, 11.0]
|
||||
|
||||
with pytest.raises(OsExitCalledError) as excinfo:
|
||||
await app.main()
|
||||
assert excinfo.value.code == 0
|
||||
|
||||
# Loop still ran and shutdown was clean, without any runtime calls
|
||||
mock_ingestor_instance.loop.assert_called_once()
|
||||
mock_ingestor_instance.shutdown.assert_called_once()
|
||||
mock_runtime_instance = mock_app_env['GatewayRuntime'].return_value
|
||||
mock_runtime_instance.idle_sweep.assert_not_called()
|
||||
mock_runtime_instance.stop.assert_not_called()
|
||||
|
||||
# Failure was logged and counted, but did not set exit_signal
|
||||
assert any(
|
||||
'GatewayRuntime failed to initialize' in str(c)
|
||||
for c in mock_ingestor_instance.logger.error.call_args_list
|
||||
)
|
||||
mock_app_env['metrics_APP_ERRORS_TOTAL_labels_inc'].assert_called_once()
|
||||
mock_exit_signal.set.assert_not_called()
|
||||
|
||||
Reference in New Issue
Block a user