"""Suggestion (legacy) tests — CUST-WP-0061-T06, 2026-07-21. The suggestions table/router is retired to read-only legacy: a fresh `intake` work-record entity replaces it (canon/standards/ work-record-types_v0.1.md), not a rename. The 10 records still open at retirement were migrated to file-backed intake records (see the-custodian/intake-legacy-suggestions-migration.md) and declined here. These tests verify the retirement itself: every mutation endpoint 410s; GET/list still works for the historical record. Since creation is retired, historical rows are seeded directly via the ORM/DB session (bypassing the retired POST) rather than through the API. """ from __future__ import annotations import uuid import pytest from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker from tests.test_capability_requests import _create_domain async def _seed_suggestion(test_engine, *, domain_slug: str, **overrides) -> str: """Insert a Suggestion row directly, bypassing the retired POST endpoint — this is now the only way historical rows get created.""" from api.models.domain import Domain from api.models.suggestion import Suggestion from sqlalchemy import select factory = async_sessionmaker(test_engine, class_=AsyncSession, expire_on_commit=False) async with factory() as session: domain_id = ( await session.execute(select(Domain.id).where(Domain.slug == domain_slug)) ).scalar_one() suggestion = Suggestion( domain_id=domain_id, title=overrides.get("title", "Legacy suggestion"), description=overrides.get("description"), origin=overrides.get("origin"), origin_ref=overrides.get("origin_ref"), base_value=overrides.get("base_value", 3.0), job_size=overrides.get("job_size", 3.0), ) session.add(suggestion) await session.commit() await session.refresh(suggestion) return str(suggestion.id) @pytest.mark.asyncio class TestSuggestionsRetired: async def test_create_returns_410(self, client): await _create_domain(client, "custodian", "Custodian") r = await client.post("/suggestions/", json={ "domain": "custodian", "title": "New suggestion attempt", }) assert r.status_code == 410 assert "intake" in r.json()["detail"].lower() async def test_vet_returns_410(self, client, test_engine): await _create_domain(client, "custodian", "Custodian") sid = await _seed_suggestion(test_engine, domain_slug="custodian") r = await client.post(f"/suggestions/{sid}/vet", json={"note": "x"}) assert r.status_code == 410 async def test_decline_returns_410(self, client, test_engine): await _create_domain(client, "custodian", "Custodian") sid = await _seed_suggestion(test_engine, domain_slug="custodian") r = await client.post(f"/suggestions/{sid}/decline", json={"note": "x"}) assert r.status_code == 410 async def test_promote_returns_410(self, client, test_engine): await _create_domain(client, "custodian", "Custodian") sid = await _seed_suggestion(test_engine, domain_slug="custodian") r = await client.post(f"/suggestions/{sid}/promote", json={}) assert r.status_code == 410 async def test_bump_relevance_returns_410(self, client, test_engine): await _create_domain(client, "custodian", "Custodian") sid = await _seed_suggestion(test_engine, domain_slug="custodian") r = await client.post(f"/suggestions/{sid}/bump-relevance", json={}) assert r.status_code == 410 async def test_reads_are_retired_too(self, client, test_engine): """Slice E1 (STATE-WP-0079-T05, 2026-08-20): reads were kept live only to keep the historical backlog reachable. That history is archived at the-custodian/docs/archived-suggestion-backlog.md, so the read surface is retired as well.""" await _create_domain(client, "custodian", "Custodian") sid = await _seed_suggestion( test_engine, domain_slug="custodian", title="Historical gated-need signal", origin="WARDEN-WP-0012", origin_ref="example", ) for path in (f"/suggestions/{sid}", "/suggestions/", f"/suggestions/{sid}/notes"): r = await client.get(path) assert r.status_code == 410, path async def test_unknown_id_also_410s(self, client): """The whole prefix is retired, so there is nothing left to 404 on.""" r = await client.get(f"/suggestions/{uuid.uuid4()}") assert r.status_code == 410 async def test_retirement_detail_points_at_intake_and_archive(self, client): r = await client.get("/suggestions/") detail = r.json()["detail"] assert "POST /intakes/" in detail assert "archived-suggestion-backlog.md" in detail