"""§22 S2 — collection read helpers: list_collections / get_collection / subfolder_of.""" from __future__ import annotations import json import tempfile from pathlib import Path from app import collections as collections_mod, db from app.config import Config def _db() -> Config: cfg = Config( gitea_url="x", gitea_bot_user="x", gitea_bot_token="x", gitea_org="x", registry_repo="registry", oauth_client_id="x", oauth_client_secret="x", app_url="x", secret_key="x", database_path=Path(tempfile.mkdtemp(prefix="colhelp-")) / "t.db", owner_gitea_login="x", webhook_secret="x", ) db.run_migrations(cfg) if db._CONN is not None: db._CONN.close() db._CONN = None db.init(cfg) return cfg def _seed(project_id="ohm"): db.conn().execute( "INSERT OR REPLACE INTO projects (id, name, content_repo, visibility, updated_at) " "VALUES (?, 'Ohm', 'ohm-rfc', 'public', datetime('now'))", (project_id,)) for cid, sub, vis, name in [ ("default", "", "public", "Model"), ("features", "features", "public", "Features"), ("secret", "secret", "unlisted", "Secret"), ]: db.conn().execute( "INSERT OR REPLACE INTO collections (id, project_id, type, subfolder, initial_state, " "visibility, name, created_at, updated_at) VALUES (?,?, 'document', ?, " "'super-draft', ?, ?, datetime('now'), datetime('now'))", (cid, project_id, sub, vis, name)) def test_list_collections_excludes_unlisted(): _db() _seed() ids = [c["id"] for c in collections_mod.list_collections("ohm", include_unlisted=False)] assert ids == ["default", "features"] # default first, then by name; 'secret' omitted def test_list_collections_include_unlisted(): _db() _seed() ids = {c["id"] for c in collections_mod.list_collections("ohm", include_unlisted=True)} assert ids == {"default", "features", "secret"} def test_get_collection_and_subfolder(): _db() _seed() assert collections_mod.get_collection("features")["name"] == "Features" assert collections_mod.subfolder_of("features") == "features" assert collections_mod.subfolder_of("default") == "" assert collections_mod.get_collection("nope") is None # ---- §22.4a SLICE-2: field schema served on the collection ---- def test_get_collection_fields_none_when_unset(): # INV-5: a collection with no `fields:` exposes fields=None (the default # `document` collection sees zero change). _db() _seed() assert collections_mod.get_collection("features")["fields"] is None def test_get_collection_exposes_field_schema(): _db() _seed() schema = {"priority": {"type": "enum", "values": ["P0", "P1"]}} db.conn().execute( "UPDATE collections SET config_json = ? WHERE id = 'features'", (json.dumps({"fields": schema}),)) assert collections_mod.get_collection("features")["fields"] == schema