gendesign/backend/tests/services/test_2464_kn_lock_key.py
bot-backend a899cb9b1f
All checks were successful
Deploy / changes (push) Successful in 7s
Deploy / build-frontend (push) Has been skipped
Deploy / deploy-caddy (push) Has been skipped
Deploy / build-backend (push) Successful in 2m17s
Deploy / build-worker (push) Successful in 3m52s
Deploy / deploy (push) Successful in 1m25s
Deploy / deploy-status (push) Successful in 1s
Deploy / perimeter-smoke (push) Successful in 8s
fix(ptica): ключ синглтон-лока kn-свипа зависит от множества, а не от порядка (#2464) (#2970)
2026-08-20 10:34:30 +00:00

59 lines
2.9 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""Ключ синглтон-лока kn-свипа зависит от множества, а не от порядка (#2464).
`developers` приходит прямо из тела запроса (`admin_scrape`), порядок произвольный.
Раньше список джойнился как пришёл: один и тот же набор в другом порядке давал ДРУГОЙ
ключ — синглтон молча переставал быть синглтоном, два свипа шли параллельно по одним и
тем же разработчикам.
Второе следствие того же корня: `force_release_lock` строит ключ этой же функцией.
Оператор, снимающий залипший лок и перечисливший разработчиков в ином порядке, молча не
снимал ничего.
Тесты сравнивают ЗНАЧЕНИЯ ключей — на origin/main они не совпадают, то есть красное
означает «ключи разошлись», а не «функции нет».
"""
from __future__ import annotations
import os
os.environ.setdefault("DATABASE_URL", "postgresql+psycopg://test:test@localhost:5432/test")
def _key(region: int, devs: list[str] | None) -> str:
from app.workers.tasks.scrape_kn import _lock_key
return _lock_key(region, devs)
def test_same_set_different_order_gives_same_key() -> None:
"""Порядок не должен создавать второй лок для того же набора."""
a = _key(66, ["6208_0", "1234_5", "9999_1"])
b = _key(66, ["9999_1", "6208_0", "1234_5"])
assert a == b, f"один набор дал два ключа:\n {a}\n {b}"
def test_duplicates_do_not_change_the_key() -> None:
"""Повтор в списке — тот же набор, тот же лок."""
assert _key(66, ["6208_0", "6208_0"]) == _key(66, ["6208_0"])
def test_different_sets_stay_separate() -> None:
"""Контроль: разные наборы обязаны остаться разными локами.
Ловит «починку» через огрубление ключа (напр. отбросить developers вовсе) —
тогда свипы по разным разработчикам блокировали бы друг друга.
"""
assert _key(66, ["A"]) != _key(66, ["B"])
assert _key(66, ["A"]) != _key(66, ["A", "B"])
def test_region_still_separates_locks() -> None:
"""Контроль: регион остаётся частью ключа."""
assert _key(66, ["A"]) != _key(74, ["A"])
def test_empty_and_none_mean_all_developers() -> None:
"""Контроль: прежняя семантика '*' для пустого/None сохранена."""
assert _key(66, None).endswith(":*")
assert _key(66, []).endswith(":*")