"""§22.9/§22.5 — GET /api/deployment + GET /api/projects/:id with visibility.""" from __future__ import annotations from fastapi.testclient import TestClient from test_propose_vertical import ( # noqa: F401 app_with_fake_gitea, tmp_env, provision_user_row, sign_in_as, ) def _add_project(pid, name, vis, typ="document"): from app import db db.conn().execute( "INSERT OR REPLACE INTO projects (id, name, type, content_repo, visibility, initial_state) " "VALUES (?, ?, ?, ?, ?, 'super-draft')", (pid, name, typ, pid, vis), ) def test_deployment_lists_public_omits_gated_and_unlisted_for_anon(app_with_fake_gitea): app, _ = app_with_fake_gitea with TestClient(app) as client: _add_project("pub", "Public", "public") _add_project("gat", "Gated", "gated") _add_project("unl", "Unlisted", "unlisted") r = client.get("/api/deployment") assert r.status_code == 200 body = r.json() assert body["name"] == "Test Deployment" ids = {p["id"] for p in body["projects"]} assert "pub" in ids and "default" in ids # both public assert "gat" not in ids # gated, anon not a member assert "unl" not in ids # unlisted never enumerated def test_projects_id_404_for_gated_non_member(app_with_fake_gitea): app, _ = app_with_fake_gitea with TestClient(app) as client: _add_project("gat", "Gated", "gated") assert client.get("/api/projects/gat").status_code == 404 def test_projects_id_returns_config_for_public(app_with_fake_gitea): app, _ = app_with_fake_gitea with TestClient(app) as client: from app import db db.conn().execute( "UPDATE projects SET config_json = ? WHERE id = 'default'", ('{"theme": {"accent": "#5b5bd6"}}',), ) r = client.get("/api/projects/default") assert r.status_code == 200 body = r.json() assert body["id"] == "default" assert body["type"] == "document" assert body["visibility"] == "public" assert body["theme"] == {"accent": "#5b5bd6"} def test_projects_id_unlisted_readable_by_direct_id(app_with_fake_gitea): app, _ = app_with_fake_gitea with TestClient(app) as client: _add_project("unl", "Unlisted", "unlisted") assert client.get("/api/projects/unl").status_code == 200