48 lines
1.6 KiB
Python
48 lines
1.6 KiB
Python
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"]
|