diff --git a/tests/test_services_notes_sweep.py b/tests/test_services_notes_sweep.py index 64ee239..a611b78 100644 --- a/tests/test_services_notes_sweep.py +++ b/tests/test_services_notes_sweep.py @@ -44,6 +44,22 @@ async def _sweep_sql(**kwargs): return captured["sql"] +def _where(sql: str) -> str: + """Just the WHERE clause. `select(Note)` names every column, so searching + the whole statement for a column name always finds the SELECT list — which + is how one of these tests first failed for the wrong reason. + + Matched by regex rather than split on a literal, because the exact + whitespace SQLAlchemy emits around WHERE is not something a test should + depend on. + """ + import re + + m = re.search(r"\bWHERE\b(.*?)(?:\bORDER BY\b|$)", sql, re.S) + assert m, "no WHERE clause — the sweep must never select the whole table" + return m.group(1) + + # ── the ordering, which is the whole signal ────────────────────────────────── @pytest.mark.asyncio @@ -62,9 +78,13 @@ async def test_never_checked_sorts_first_not_last(): @pytest.mark.asyncio async def test_the_order_is_total(): """A tiebreak, so two notes verified in the same transaction do not swap - places between calls and make a page boundary lie.""" - sql = await _sweep_sql() - assert sql.index("NULLS FIRST") < sql.index("notes.id") + places between calls and make a page boundary lie. + + Asserted on the END of the statement, not by searching it: `select(Note)` + names every column, so the first `notes.id` in the text is the SELECT + list, not the ORDER BY.""" + sql = (await _sweep_sql()).rstrip() + assert sql.endswith("ORDER BY notes.verified_at ASC NULLS FIRST, notes.id") # ── which rows are eligible ────────────────────────────────────────────────── @@ -98,9 +118,9 @@ async def test_a_task_carrying_a_check_is_NOT_filtered_out(): so such a row would be in an ILLEGAL state — and this is the one surface that could tell somebody. Hiding it to match the invariant would make the sweep agree with a database it had stopped describing.""" - sql = await _sweep_sql() - assert "notes.status IS NULL" not in sql - assert "notes.note_type" not in sql + where = _where(await _sweep_sql()) + assert "notes.status" not in where + assert "notes.note_type" not in where # ── the filters ──────────────────────────────────────────────────────────────