"""Tests for org / project rename — event-sourced renames. Renames must go through events (`ProjectUpdated.name` / `OrgUpdated.name`) so a `replay()` reconstructs the new name; a direct projection UPDATE would be lost. These tests assert the projection changed AND an event was logged. """ from __future__ import annotations import sqlite3 import pytest from claire.hlc import HLCGenerator from claire.web import service def _event_count(conn: sqlite3.Connection) -> int: return conn.execute("SELECT COUNT(*) FROM events").fetchone()[0] def test_rename_project_by_name(conn: sqlite3.Connection, gen: HLCGenerator) -> None: service.create_project(conn, gen, name="alpha") before = _event_count(conn) renamed = service.rename_project(conn, gen, name_or_id="alpha", new_name="beta") assert renamed.name == "beta" assert _event_count(conn) == before + 1 row = conn.execute( "SELECT name FROM projects WHERE id = ?", (str(renamed.id),) ).fetchone() assert row["name"] == "beta" def test_rename_project_by_id(conn: sqlite3.Connection, gen: HLCGenerator) -> None: proj = service.create_project(conn, gen, name="alpha") renamed = service.rename_project( conn, gen, name_or_id=str(proj.id), new_name="gamma" ) assert renamed.id == proj.id assert renamed.name == "gamma" def test_rename_project_rejects_empty(conn: sqlite3.Connection, gen: HLCGenerator) -> None: service.create_project(conn, gen, name="alpha") with pytest.raises(service.InvalidInput): service.rename_project(conn, gen, name_or_id="alpha", new_name=" ") def test_rename_project_unknown(conn: sqlite3.Connection, gen: HLCGenerator) -> None: with pytest.raises(service.NotFound): service.rename_project(conn, gen, name_or_id="nope", new_name="beta") def test_rename_project_conflict(conn: sqlite3.Connection, gen: HLCGenerator) -> None: service.create_project(conn, gen, name="alpha") service.create_project(conn, gen, name="beta") with pytest.raises(service.Conflict): service.rename_project(conn, gen, name_or_id="alpha", new_name="beta") def test_rename_org_by_name(conn: sqlite3.Connection, gen: HLCGenerator) -> None: service.create_org(conn, gen, name="acme") before = _event_count(conn) renamed = service.rename_org(conn, gen, name_or_id="acme", new_name="globex") assert renamed.name == "globex" assert _event_count(conn) == before + 1 row = conn.execute( "SELECT name FROM orgs WHERE id = ?", (str(renamed.id),) ).fetchone() assert row["name"] == "globex" def test_rename_org_by_id(conn: sqlite3.Connection, gen: HLCGenerator) -> None: org = service.create_org(conn, gen, name="acme") renamed = service.rename_org(conn, gen, name_or_id=str(org.id), new_name="initech") assert renamed.id == org.id assert renamed.name == "initech" def test_rename_org_rejects_empty(conn: sqlite3.Connection, gen: HLCGenerator) -> None: service.create_org(conn, gen, name="acme") with pytest.raises(service.InvalidInput): service.rename_org(conn, gen, name_or_id="acme", new_name="")