Files
rfc-app/backend/tests/test_api_deployment.py
T
2026-06-03 23:44:51 -07:00

98 lines
3.8 KiB
Python

"""§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
def test_projects_id_unknown_returns_404_even_for_superuser(app_with_fake_gitea):
app, _ = app_with_fake_gitea
with TestClient(app) as client:
provision_user_row(user_id=1, login="ben", role="owner")
sign_in_as(client, user_id=1, gitea_login="ben", display_name="Ben", role="owner")
assert client.get("/api/projects/does-not-exist").status_code == 404
def test_projects_id_unknown_returns_404_for_anon(app_with_fake_gitea):
app, _ = app_with_fake_gitea
with TestClient(app) as client:
assert client.get("/api/projects/nope").status_code == 404
def test_gated_project_visible_and_readable_to_member(app_with_fake_gitea):
from app import db
app, _ = app_with_fake_gitea
with TestClient(app) as client:
_add_project("teamx", "Team X", "gated")
provision_user_row(user_id=5, login="mia", role="contributor")
db.conn().execute(
"INSERT INTO project_members (project_id, user_id, role) VALUES ('teamx', 5, 'project_viewer')"
)
sign_in_as(client, user_id=5, gitea_login="mia", display_name="Mia", role="contributor")
# member sees the gated project in the deployment directory
ids = {p["id"] for p in client.get("/api/deployment").json()["projects"]}
assert "teamx" in ids
# member can read it directly
r = client.get("/api/projects/teamx")
assert r.status_code == 200
assert r.json()["id"] == "teamx"