From 218ce88a3176cbccaf42f82dd1f4c76ef097f381 Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Sat, 3 Oct 2026 19:40:11 +0400 Subject: [PATCH] =?UTF-8?q?test:=20=D0=BF=D0=BE=D0=B2=D0=B5=D0=B4=D0=B5?= =?UTF-8?q?=D0=BD=D1=87=D0=B5=D1=81=D0=BA=D0=B0=D1=8F=20=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D0=B5=D1=80=D0=BA=D0=B0=20partial=20unique=20consolidati?= =?UTF-8?q?on=5Flock=20=E2=80=94=20=D0=BF=D0=B5=D1=80=D0=B2=D0=B0=D1=8F=20?= =?UTF-8?q?=D0=B1=D0=BB=D0=BE=D0=BA=D0=B8=D1=80=D0=BE=D0=B2=D0=BA=D0=B0=20?= =?UTF-8?q?=D1=84=D0=B8=D0=BA=D1=81=D0=B8=D1=80=D1=83=D0=B5=D1=82=D1=81?= =?UTF-8?q?=D1=8F,=20=D1=81=D0=BD=D1=8F=D1=82=D0=B8=D0=B5=20=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B5=D1=80=D1=8F=D0=B5=D1=82=D1=81=D1=8F=20rowcou?= =?UTF-8?q?nt,=20=D0=B8=D0=BC=D1=8F=20=D0=B8=D0=BD=D0=B4=D0=B5=D0=BA=D1=81?= =?UTF-8?q?=D0=B0=20=D0=B2=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5.1 --- api/tests/test_models_part_07_09.py | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/api/tests/test_models_part_07_09.py b/api/tests/test_models_part_07_09.py index 97cccaa..c5b7b83 100644 --- a/api/tests/test_models_part_07_09.py +++ b/api/tests/test_models_part_07_09.py @@ -226,16 +226,34 @@ async def _check_active_lock_is_unique(session: AsyncSession) -> None: first = lock() session.add(first) - await session.flush() + await session.commit() # первая активная блокировка зафиксирована: rollback ниже её не заденет first_id = first.id + session.add(lock()) - with pytest.raises(IntegrityError): + with pytest.raises(IntegrityError) as exc_info: await session.flush() # второй активный lock на ту же версию + assert "uq_consolidation_lock_version_active" in str(exc_info.value) 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} ) - session.add(lock()) # после снятия первой блокировки — можно - await session.flush() + assert released.rowcount == 1 # type: ignore[attr-defined] # первая блокировка существовала и снята + session.add(lock()) # после снятия первой блокировки слот свободен — именно из-за `WHERE released_at IS NULL` + await session.commit() + + # снятая и активная блокировки одной версии сосуществуют; активной по-прежнему ровно одна + session.add(lock()) + with pytest.raises(IntegrityError): + await session.flush() 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)