from __future__ import annotations
import importlib.util
from pathlib import Path

LAUNCHER = Path(__file__).with_name("launch_v2.py")
spec = importlib.util.spec_from_file_location("launch_v2", LAUNCHER)
assert spec is not None and spec.loader is not None
launch = importlib.util.module_from_spec(spec)
spec.loader.exec_module(launch)


def test_provider_finishes_before_customer_and_gateway_and_snapshot_closes_first() -> None:
    events: list[str] = []
    snapshots: list[tuple[str, ...]] = []

    def snapshot() -> dict[str, object]:
        snapshots.append(tuple(events))
        return {"digest": "clean", "files": []}

    setattr(launch, "protected_snapshot", snapshot)

    def provider() -> dict[str, object]:
        events.append("provider_probe")
        return {"result": "ready"}

    def provider_done(_result: dict[str, object]) -> None:
        events.append("provider_complete")

    def prepare() -> dict[str, object]:
        events.append("customer_prepare")
        return {"customer": "fresh"}

    def runtime() -> dict[str, object]:
        events.append("gateway_runtime_files_created")
        return {"gateway": "running"}

    launch.ordered_pre_runtime(provider, provider_done, prepare, runtime)

    assert events == [
        "provider_probe",
        "provider_complete",
        "customer_prepare",
        "gateway_runtime_files_created",
    ]
    assert snapshots == [(), ("provider_probe",)]
