Files
MajoorWaldi-ComfyUI-Majoor-…/tests/database/test_schema_heal.py
T

87 lines
2.7 KiB
Python

import pytest
import sqlite3
@pytest.mark.asyncio
async def test_schema_self_heals_missing_columns(tmp_path):
from backend.adapters.db.sqlite import Sqlite
from backend.adapters.db.schema import CURRENT_SCHEMA_VERSION, migrate_schema
db_path = tmp_path / "partial_schema.db"
# Create an "old/partial" schema that reports as up-to-date but is missing columns.
conn = sqlite3.connect(str(db_path))
try:
conn.execute(
"CREATE TABLE metadata (key TEXT PRIMARY KEY, value TEXT NOT NULL)"
)
conn.execute(
"INSERT OR REPLACE INTO metadata (key, value) VALUES ('schema_version', ?)",
(str(CURRENT_SCHEMA_VERSION),),
)
conn.execute(
"""
CREATE TABLE assets (
id INTEGER PRIMARY KEY AUTOINCREMENT,
filename TEXT NOT NULL,
filepath TEXT NOT NULL UNIQUE,
kind TEXT NOT NULL,
ext TEXT NOT NULL,
size INTEGER NOT NULL,
mtime INTEGER NOT NULL
)
"""
)
conn.execute(
"""
CREATE TABLE asset_metadata (
asset_id INTEGER PRIMARY KEY,
rating INTEGER DEFAULT 0
)
"""
)
conn.commit()
finally:
conn.close()
db = Sqlite(str(db_path))
try:
result = await migrate_schema(db)
assert result.ok, result.error
assets_cols = await db.aquery("PRAGMA table_info('assets')")
assert assets_cols.ok, assets_cols.error
assets_col_names = {row["name"] for row in (assets_cols.data or [])}
for name in ["source", "root_id", "subfolder", "width", "height", "duration", "indexed_at"]:
assert name in assets_col_names
meta_cols = await db.aquery("PRAGMA table_info('asset_metadata')")
assert meta_cols.ok, meta_cols.error
meta_col_names = {row["name"] for row in (meta_cols.data or [])}
for name in [
"tags",
"tags_text",
"workflow_hash",
"has_workflow",
"has_generation_data",
"metadata_quality",
"metadata_raw",
]:
assert name in meta_col_names
# Ensure common queries won't crash with "no such column".
assert (await db.aquery("SELECT source, root_id FROM assets LIMIT 0")).ok
assert (await db.aquery(
"""
SELECT tags, metadata_raw, has_workflow, has_generation_data, metadata_quality
FROM asset_metadata
LIMIT 0
"""
)).ok
finally:
try:
await db.aclose()
except Exception:
pass