feat(registry): hard-cut META_REPO -> REGISTRY_REPO; wire mirror into startup/webhook/sweep
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1,11 +1,11 @@
|
||||
"""Slice M1 — the §22 multi-project spine.
|
||||
"""Slice M1+M3 — the §22 multi-project spine.
|
||||
|
||||
Migration 026 introduces the `projects` and `project_members` tables, seeds
|
||||
the single `default` project (the N=1 case, §22.13), and threads a
|
||||
`project_id` column onto every slug-bearing table, backfilled to `default`.
|
||||
The §22.13 startup backfill then fills the default project's content_repo
|
||||
from META_REPO. These tests prove the spine lands without disturbing the
|
||||
single-project app.
|
||||
M3 retires the META_REPO startup backfill; content_repo now comes from the
|
||||
registry mirror (projects.yaml in REGISTRY_REPO). These tests prove the
|
||||
spine lands without disturbing the single-project app.
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
@@ -40,7 +40,8 @@ def test_default_project_seeded_and_backfilled(app_with_fake_gitea):
|
||||
assert row["id"] == "default"
|
||||
# public preserves the pre-multi-project open-by-default posture.
|
||||
assert row["visibility"] == "public"
|
||||
# §22.13 startup backfill set content_repo from META_REPO (tmp_env).
|
||||
# M3: content_repo now comes from the registry mirror (projects.yaml),
|
||||
# not the retired META_REPO startup backfill.
|
||||
assert row["content_repo"] == "meta"
|
||||
|
||||
|
||||
@@ -105,22 +106,19 @@ def test_project_members_table_shape(app_with_fake_gitea):
|
||||
pass
|
||||
|
||||
|
||||
def test_seed_default_project_is_idempotent(app_with_fake_gitea):
|
||||
"""Re-running the backfill never clobbers a content_repo already set —
|
||||
so a later registry mirror (M3) wins over the META_REPO fallback."""
|
||||
from app import db, projects
|
||||
from app.config import load_config
|
||||
def test_registry_mirror_is_idempotent(app_with_fake_gitea):
|
||||
"""Re-running the registry mirror is safe — it upserts (overwrites) the
|
||||
projects row from projects.yaml each time without raising. M3 retirement
|
||||
of seed_default_project: the registry mirror is now the sole authority."""
|
||||
from app import db
|
||||
|
||||
app, _ = app_with_fake_gitea
|
||||
with TestClient(app):
|
||||
db.conn().execute(
|
||||
"UPDATE projects SET content_repo = 'ohm-content' WHERE id = 'default'"
|
||||
)
|
||||
projects.seed_default_project(load_config())
|
||||
# After startup the row should have content_repo from projects.yaml.
|
||||
got = db.conn().execute(
|
||||
"SELECT content_repo FROM projects WHERE id = 'default'"
|
||||
).fetchone()["content_repo"]
|
||||
assert got == "ohm-content"
|
||||
assert got == "meta"
|
||||
|
||||
|
||||
def test_registry_repo_config_wired(app_with_fake_gitea, monkeypatch):
|
||||
@@ -128,6 +126,8 @@ def test_registry_repo_config_wired(app_with_fake_gitea, monkeypatch):
|
||||
|
||||
monkeypatch.setenv("REGISTRY_REPO", "wiggleverse-registry")
|
||||
assert load_config().registry_repo == "wiggleverse-registry"
|
||||
# Optional through M1: absent resolves to empty, not a startup failure.
|
||||
# M3: REGISTRY_REPO is now required — absent raises RuntimeError.
|
||||
monkeypatch.delenv("REGISTRY_REPO", raising=False)
|
||||
assert load_config().registry_repo == ""
|
||||
import pytest
|
||||
with pytest.raises(RuntimeError, match="REGISTRY_REPO"):
|
||||
load_config()
|
||||
|
||||
Reference in New Issue
Block a user