import json from testcontainers.postgres import PostgresContainer from typer.testing import CliRunner from tht.cli import app def test_session_migrate_status_is_pristine_and_idempotent(): with PostgresContainer("postgres:16-alpine") as postgres: database_url = postgres.get_connection_url() runner = CliRunner() before = runner.invoke( app, ["session", "migrate", "--database-url", database_url, "--status", "--json"] ) assert before.exit_code == 0, before.output assert json.loads(before.stdout) == {"applied": [], "drifted": [], "pending": ["001", "002"]} assert before.stderr == "" first = runner.invoke(app, ["session", "migrate", "--database-url", database_url, "--json"]) second = runner.invoke(app, ["session", "migrate", "--database-url", database_url, "--json"]) expected = {"applied": ["001", "002"], "drifted": [], "pending": []} assert first.exit_code == 0, first.output assert second.exit_code == 0, second.output assert json.loads(first.stdout) == expected assert json.loads(second.stdout) == expected def test_session_migrate_status_database_failure_is_pristine_json(): result = CliRunner().invoke( app, [ "session", "migrate", "--database-url", "postgresql+psycopg2://test:test@127.0.0.1:1/test", "--status", "--json", ], ) assert result.exit_code == 1 assert result.stderr == "" assert "Traceback" not in result.stdout assert json.loads(result.stdout)["error"]