90 lines
4.0 KiB
Python
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()
|