"""迁移 636 —— 一个页面上不存在的旋钮等于没有。 `assistant.room_escalate_after_reminders` 在 635 落地时只以代码里的默认值存在, 而平台设置页列的是 `platform_settings` 里**实际有的行** —— 于是这个键在页面上 根本不出现。同一批设置里另外五个都是种进去的,唯独这一个漏了。 盯两件事:**种进去了**,以及**不覆盖管理员改过的值**(一次发布把管理员的决定改 回默认值,是这类种子最典型也最难发现的伤害)。 """ from __future__ import annotations import importlib.util import json import pathlib import pytest import sqlalchemy as sa from alembic.migration import MigrationContext from alembic.operations import Operations from ..conftest import _TEST_SYNC_URL _MIGRATION = ( pathlib.Path(__file__).resolve().parents[2] / "alembic" / "versions" / "636_assistant_escalation_setting.py" ) KEY = "assistant.room_escalate_after_reminders" def _load(): spec = importlib.util.spec_from_file_location("m636", _MIGRATION) assert spec and spec.loader module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) return module def _run(conn, direction: str = "upgrade") -> None: ctx = MigrationContext.configure(conn) with Operations.context(ctx): getattr(_load(), direction)() @pytest.fixture def conn(): engine = sa.create_engine(_TEST_SYNC_URL) with engine.begin() as c: c.execute(sa.text("DELETE FROM platform_settings WHERE `key` = :k"), {"k": KEY}) yield c c.execute(sa.text("DELETE FROM platform_settings WHERE `key` = :k"), {"k": KEY}) engine.dispose() def _row(conn): return conn.execute( sa.text("SELECT `value`, `description` FROM platform_settings " "WHERE `key` = :k"), {"k": KEY}, ).mappings().first() def test_the_knob_shows_up_with_an_explanation(conn): _run(conn) row = _row(conn) assert row is not None, "这一行不存在 = 设置页上没有这个旋钮" raw = row["value"] assert json.loads(raw) if isinstance(raw, str) else raw == 3 # 描述不是装饰:页面上只有键名的一行布尔/数字,管理员无从判断该改成几。 assert row["description"] and len(row["description"]) > 20 def test_it_never_overwrites_what_an_admin_chose(conn): conn.execute( sa.text("INSERT INTO platform_settings (`key`, `value`, `description`) " "VALUES (:k, :v, :d)"), {"k": KEY, "v": json.dumps(5), "d": "管理员自己写的"}, ) _run(conn) row = _row(conn) assert row is not None raw = row["value"] value = json.loads(raw) if isinstance(raw, str) else raw assert value == 5, "一次发布把管理员的决定改回默认值,是这类种子最难发现的伤害" assert row["description"] == "管理员自己写的" def test_running_it_twice_is_a_no_op(conn): _run(conn) _run(conn) assert _row(conn) is not None