Files
ai-safety-platform/tests/test_migrations.py
T
baozaotumao2025 14722be770 first commit
2026-07-18 21:00:26 +08:00

90 lines
4.0 KiB
Python

from alembic import command
from alembic.config import Config
from sqlalchemy import create_engine, inspect, text
from app.core.config import get_settings
def test_upgrade_from_0005_preserves_duplicate_model_profiles(monkeypatch, tmp_path):
database = tmp_path / "existing.db"
monkeypatch.setenv("DATABASE_URL", f"sqlite:///{database}")
get_settings.cache_clear()
config = Config("alembic.ini")
try:
command.upgrade(config, "0005")
engine = create_engine(f"sqlite:///{database}")
with engine.begin() as connection:
for profile_id in (1, 2):
connection.execute(
text(
"INSERT INTO model_profiles "
"(id, profile_type, model_name, endpoint, capabilities_json, created_at) "
"VALUES (:id, 'target', 'old-model', 'http://old/chat', '{}', CURRENT_TIMESTAMP)"
),
{"id": profile_id},
)
command.upgrade(config, "head")
with engine.connect() as connection:
assert connection.scalar(text("SELECT count(*) FROM model_profiles")) == 2
assert "provider_configs" in inspect(connection).get_table_names()
assert "refresh_tokens" in inspect(connection).get_table_names()
assert connection.scalar(text("SELECT version_num FROM alembic_version")) == "0010"
finally:
get_settings.cache_clear()
def test_0009_separates_historical_result_status_and_adds_unique_key(monkeypatch, tmp_path):
database = tmp_path / "existing-results.db"
monkeypatch.setenv("DATABASE_URL", f"sqlite:///{database}")
get_settings.cache_clear()
config = Config("alembic.ini")
try:
command.upgrade(config, "0008")
engine = create_engine(f"sqlite:///{database}")
with engine.begin() as connection:
connection.execute(
text(
"INSERT INTO test_runs "
"(id, run_type, status, profile, selected_count, completed_count, failed_count, "
"summary_json, created_at, updated_at, idempotency_key, request_fingerprint) "
"VALUES (7, 'safety_test', 'completed_with_errors', 'all', 2, 1, 1, '{}', "
"CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, NULL, '')"
)
)
connection.execute(
text(
"INSERT INTO test_results "
"(run_id, execution_id, case_kind, interaction_mode, status, model_response, "
"judge_result_json, error_message, audit_context_json, created_at) VALUES "
"(7, 'pass-case', 'risk', 'single_turn', 'pass', '', '{}', '', '{}', CURRENT_TIMESTAMP), "
"(7, 'error-case', 'risk', 'tool', 'error', '', '{}', 'boom', '{}', CURRENT_TIMESTAMP)"
)
)
command.upgrade(config, "head")
with engine.connect() as connection:
columns = {column["name"] for column in inspect(connection).get_columns("test_results")}
rows = connection.execute(
text(
"SELECT execution_id, execution_status, verdict "
"FROM test_results ORDER BY execution_id"
)
).all()
unique = inspect(connection).get_unique_constraints("test_results")
run_columns = {
column["name"] for column in inspect(connection).get_columns("test_runs")
}
error_count = connection.scalar(text("SELECT error_count FROM test_runs WHERE id = 7"))
assert "status" not in columns
assert {"execution_status", "verdict"} <= columns
assert rows == [("error-case", "error", None), ("pass-case", "completed", "pass")]
assert any(item["column_names"] == ["run_id", "execution_id"] for item in unique)
assert "failed_count" not in run_columns
assert "capabilities_json" in run_columns
assert error_count == 1
finally:
get_settings.cache_clear()