test_app_module_bootstrap.py 2.96 KB
from __future__ import annotations

from types import SimpleNamespace

from apps.web_api.bootstrap import app_module


def test_bootstrap_app_module_assembles_runtime_and_registers_routes(monkeypatch):
    fake_app = object()
    fake_socketio = object()
    previous_cleanup_handler = lambda: None
    runtime_cleanup_handler = lambda: None
    registered_cleanup_handler = lambda: None
    route_search_submitter = object()
    route_dependencies = object()
    socket_event_dependencies = object()
    runtime_services = SimpleNamespace(
        cleanup_handler=runtime_cleanup_handler,
        process_registry=object(),
        process_manager=SimpleNamespace(check_app_status=lambda: None),
        log_dir="runtime-logs",
        analysis_service=SimpleNamespace(
            resolve_search_query=lambda **_: ("task-1", "museum"),
            dispatch_search_request=lambda **_: {"success": True},
        ),
        search_dispatch_runtime=SimpleNamespace(
            resolve_search_query=lambda **_: ("task-1", "museum"),
            dispatch_search_request=lambda **_: {"success": True},
        ),
    )

    route_registration_calls: list[tuple[object, object]] = []
    socket_registration_calls: list[tuple[object, object]] = []

    monkeypatch.setattr(app_module, "create_app", lambda: (fake_app, fake_socketio))
    monkeypatch.setattr(app_module.runtime_bootstrap, "build_runtime_services", lambda socketio: runtime_services)
    monkeypatch.setattr(
        app_module,
        "register_reload_safe_cleanup_handler",
        lambda current_handler, previous_handler: (
            registered_cleanup_handler
            if current_handler is runtime_cleanup_handler and previous_handler is previous_cleanup_handler
            else None
        ),
    )
    monkeypatch.setattr(
        app_module.runtime_bootstrap,
        "build_http_route_search_request_submitter",
        lambda **_: route_search_submitter,
    )
    monkeypatch.setattr(app_module.runtime_bootstrap, "build_http_route_dependencies", lambda **_: route_dependencies)
    monkeypatch.setattr(
        app_module.runtime_bootstrap,
        "build_socket_event_dependencies",
        lambda **_: socket_event_dependencies,
    )
    monkeypatch.setattr(
        app_module,
        "register_http_routes",
        lambda app, deps: route_registration_calls.append((app, deps)),
    )
    monkeypatch.setattr(
        app_module,
        "register_socketio_handlers",
        lambda socketio, deps: socket_registration_calls.append((socketio, deps)),
    )

    result = app_module.bootstrap_app_module(
        previous_cleanup_handler=previous_cleanup_handler,
    )

    assert result.app is fake_app
    assert result.socketio is fake_socketio
    assert result.cleanup_handler is registered_cleanup_handler
    assert result.search_hooks is runtime_services.search_dispatch_runtime
    assert route_registration_calls == [(fake_app, route_dependencies)]
    assert socket_registration_calls == [(fake_socketio, socket_event_dependencies)]