feat(projects): automate project infrastructure provisioning
Generic Container CI/CD / test-build-publish (push) Successful in 1m13s
Server CI/CD v2 / build-test-publish-and-deploy (push) Successful in 1m13s

This commit is contained in:
2026-09-11 10:57:51 +08:00
parent 10a7a66a41
commit 90b02057bc
38 changed files with 2345 additions and 189 deletions
+22 -13
View File
@@ -7,6 +7,7 @@ from app.infra.db.project_routing import (
get_active_project_routing,
get_project_database_name,
get_project_pgconn_string,
get_schema_template_database_name,
get_project_template_database_name,
get_project_timescale_pgconn_string,
)
@@ -37,12 +38,12 @@ def test_project_database_uses_exact_routing_dsn_for_project_code() -> None:
)
def test_business_template_keeps_server_and_timescale_ignores_legacy_db_name(
def test_business_template_follows_physical_project_and_timescale_uses_routing(
monkeypatch,
) -> None:
monkeypatch.setattr(
"app.infra.db.project_routing.settings.WNDB_TEMPLATE_DB_NAME",
"tjwater_v2_template",
"app.infra.db.project_routing.settings.WNDB_SCHEMA_TEMPLATE_DB_NAME",
"tjwater_v2_schema_template",
)
with activate_project_routing(_routing()):
template_name = get_project_template_database_name("project_a")
@@ -54,7 +55,7 @@ def test_business_template_keeps_server_and_timescale_ignores_legacy_db_name(
assert business == {
"user": "biz_user",
"password": "biz_password",
"dbname": "tjwater_v2_template",
"dbname": "biz_database_template",
"host": "biz.example",
"port": "5432",
"sslmode": "require",
@@ -71,24 +72,32 @@ def test_business_template_keeps_server_and_timescale_ignores_legacy_db_name(
def test_project_code_resolves_to_physical_business_database(monkeypatch) -> None:
monkeypatch.setattr(
"app.infra.db.project_routing.settings.WNDB_TEMPLATE_DB_NAME",
"tjwater_v2_template",
"app.infra.db.project_routing.settings.WNDB_SCHEMA_TEMPLATE_DB_NAME",
"tjwater_v2_schema_template",
)
with activate_project_routing(_routing()):
assert get_project_database_name("project_a") == "biz_database"
assert get_project_database_name("temporary_run") == "temporary_run"
assert get_project_template_database_name("project_a") == "tjwater_v2_template"
assert (
get_project_template_database_name("project_a")
== "biz_database_template"
)
def test_template_falls_back_to_config_outside_project_routing(monkeypatch) -> None:
def test_project_template_uses_database_name_outside_project_routing() -> None:
assert (
get_project_template_database_name("physical_project")
== "physical_project_template"
)
def test_schema_template_comes_from_config(monkeypatch) -> None:
monkeypatch.setattr(
"app.infra.db.project_routing.settings.WNDB_TEMPLATE_DB_NAME",
"tjwater_v2_template",
"app.infra.db.project_routing.settings.WNDB_SCHEMA_TEMPLATE_DB_NAME",
"tjwater_v2_schema_template",
)
assert get_project_template_database_name("ignored-project-code") == (
"tjwater_v2_template"
)
assert get_schema_template_database_name() == "tjwater_v2_schema_template"
def test_project_routing_is_nested_and_request_local() -> None: