test: поведенческая проверка partial unique consolidation_lock — первая блокировка фиксируется, снятие проверяется rowcount, имя индекса в ошибке
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
parent
f30494e7cf
commit
218ce88a31
@ -226,16 +226,34 @@ async def _check_active_lock_is_unique(session: AsyncSession) -> None:
|
|||||||
|
|
||||||
first = lock()
|
first = lock()
|
||||||
session.add(first)
|
session.add(first)
|
||||||
await session.flush()
|
await session.commit() # первая активная блокировка зафиксирована: rollback ниже её не заденет
|
||||||
first_id = first.id
|
first_id = first.id
|
||||||
|
|
||||||
session.add(lock())
|
session.add(lock())
|
||||||
with pytest.raises(IntegrityError):
|
with pytest.raises(IntegrityError) as exc_info:
|
||||||
await session.flush() # второй активный lock на ту же версию
|
await session.flush() # второй активный lock на ту же версию
|
||||||
|
assert "uq_consolidation_lock_version_active" in str(exc_info.value)
|
||||||
await session.rollback()
|
await session.rollback()
|
||||||
|
|
||||||
await session.execute(
|
released = await session.execute(
|
||||||
text("UPDATE dkb.consolidation_lock SET released_at = :now WHERE id = :id"), {"now": now, "id": first_id}
|
text("UPDATE dkb.consolidation_lock SET released_at = :now WHERE id = :id"), {"now": now, "id": first_id}
|
||||||
)
|
)
|
||||||
session.add(lock()) # после снятия первой блокировки — можно
|
assert released.rowcount == 1 # type: ignore[attr-defined] # первая блокировка существовала и снята
|
||||||
await session.flush()
|
session.add(lock()) # после снятия первой блокировки слот свободен — именно из-за `WHERE released_at IS NULL`
|
||||||
|
await session.commit()
|
||||||
|
|
||||||
|
# снятая и активная блокировки одной версии сосуществуют; активной по-прежнему ровно одна
|
||||||
|
session.add(lock())
|
||||||
|
with pytest.raises(IntegrityError):
|
||||||
|
await session.flush()
|
||||||
await session.rollback()
|
await session.rollback()
|
||||||
|
counts = (
|
||||||
|
await session.execute(
|
||||||
|
text(
|
||||||
|
"SELECT count(*) FILTER (WHERE released_at IS NULL), count(*) FILTER (WHERE released_at IS NOT NULL) "
|
||||||
|
"FROM dkb.consolidation_lock WHERE consolidation_version_id = :v"
|
||||||
|
),
|
||||||
|
{"v": version_id},
|
||||||
|
)
|
||||||
|
).one()
|
||||||
|
assert tuple(counts) == (1, 1)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user