from fastapi import FastAPI import app as app_module def test_app_py_exports_unified_fastapi_app() -> None: assert isinstance(app_module.app, FastAPI) def test_app_py_exports_gradio_demo_for_space_sdk() -> None: assert type(app_module.demo).__name__ == "Blocks" def test_app_py_serves_api_and_gradio_from_one_asgi_app() -> None: route_paths = {getattr(route, "path", "") for route in app_module.app.routes} assert "/health" in route_paths assert "/runs" in route_paths assert "" in route_paths def test_app_py_defaults_to_spaces_friendly_bind(monkeypatch) -> None: monkeypatch.delenv("GRADIO_SERVER_NAME", raising=False) monkeypatch.delenv("GRADIO_SERVER_PORT", raising=False) monkeypatch.delenv("HOST", raising=False) monkeypatch.delenv("PORT", raising=False) assert app_module.server_config() == {"host": "0.0.0.0", "port": 7860} assert app_module.gradio_launch_config() == {"server_name": "0.0.0.0", "server_port": 7860} def test_app_py_does_not_self_bind_under_gradio_space(monkeypatch) -> None: monkeypatch.setenv("SPACE_ID", "build-small-hackathon/agent-swarm-workbench") monkeypatch.setenv("SPACE_SDK", "gradio") assert app_module.should_self_launch() is False assert app_module.should_launch_gradio_space() is True def test_app_py_does_not_self_bind_under_space_without_sdk_env(monkeypatch) -> None: monkeypatch.setenv("SPACE_ID", "build-small-hackathon/agent-swarm-workbench") monkeypatch.delenv("SPACE_SDK", raising=False) monkeypatch.delenv("HF_SPACE_SDK", raising=False) assert app_module.should_self_launch() is False def test_app_py_can_force_self_launch(monkeypatch) -> None: monkeypatch.setenv("SPACE_ID", "build-small-hackathon/agent-swarm-workbench") monkeypatch.setenv("FORCE_SELF_LAUNCH", "1") assert app_module.should_self_launch() is True assert app_module.should_launch_gradio_space() is False def test_app_py_self_binds_outside_gradio_space(monkeypatch) -> None: monkeypatch.delenv("SPACE_ID", raising=False) monkeypatch.delenv("SPACE_SDK", raising=False) monkeypatch.delenv("FORCE_SELF_LAUNCH", raising=False) assert app_module.should_self_launch() is True assert app_module.should_launch_gradio_space() is False def test_space_metadata_uses_gradio_sdk_app_py() -> None: readme = open("README.md", encoding="utf-8").read() assert "sdk: gradio" in readme assert "app_file: app.py" in readme assert "sdk: docker" not in readme.split("---", 2)[1]