Skip to content

fix(tests): deterministyczny wybór w Select2 helperze (klik zamiast Enter)#274

Merged
mpasternak merged 1 commit into
devfrom
fix/select2-helper-exact-match
Jun 1, 2026
Merged

fix(tests): deterministyczny wybór w Select2 helperze (klik zamiast Enter)#274
mpasternak merged 1 commit into
devfrom
fix/select2-helper-exact-match

Conversation

@mpasternak
Copy link
Copy Markdown
Member

Problem

Flake na CI (PR #189, shard 5/8): test_procent_odpowiedzialnosci_baseModel_AutorFormset_dwoch_autorow[chromium-wydawnictwo_zwarte] wywalał się Playwright TimeoutError na wait_for_function. To był jednak tylko wtórny objaw — na serwerze leciał HTTP 500:

psycopg2.errors.UniqueViolation: ... "bpp_wydawnictwo_zwarte_a_rekord_id_autor_id_typ_o_efb01db8_uniq"
DETAIL: Klucz (rekord_id, autor_id, typ_odpowiedzialnosci_id)=(37, 38, 15) już istnieje.

Oba wiersze formsetu autorów wylądowały z tym samym autor_id, choć test wybierał dwóch różnych autorów. Strona nigdy nie pokazała „dodany pomyślnie" → timeout Playwrighta.

Root cause

select_select2_autocomplete (src/django_bpp/playwright_util.py) wciskał Enter, wybierając PIERWSZĄ podświetloną pozycję wyników — bez weryfikacji, że to faktycznie szukany rekord.

Testowi autorzy dzielą prefiks nazwiska: Aut1<suffix> / Aut2<suffix>. Pod obciążeniem CI press_sequentially wpisuje znaki wolniej niż debounce Select2 (~250 ms), więc dla zapytania "Aut2…" w oknie czasowym widoczne bywają jeszcze wyniki dla "Aut…" — zawierające autora pierwszego. Warunek oczekiwania (!isLoading && hasResults) spełniają te nieświeże, szersze wyniki, a Enter wybiera złego autora. Oba wiersze → ten sam autor_idUniqueViolation przy zapisie.

To nie jest regresja PR #189 — jedyna zmiana tego PR-a w admin/core.py to klucz cache w filter_count_view (inna ścieżka niż save_related). Pre-existing timing-flake Select2. Dodatkowo: w pytest.ini jest --only-rerun TimeoutError, ale brak --reruns N → realnie 0 retry, więc jeden błędny strzał wywala cały shard.

Fix

Helper klika teraz konkretną pozycję, której widoczny tekst zawiera pełną szukaną wartość, zamiast wciskać Enter na pierwszej podświetlonej. Tylko gdy takiej pozycji nie ma (pola, gdzie szukany tekst nie jest podłańcuchem etykiety — np. generowane warianty „zapisany jako" typu Kopara1) helper spada do dawnego Enter-na-pierwszej.

Naprawia całą klasę tych flake'ów, nie tylko ten jeden test.

Weryfikacja

Lokalnie, na zbudowanych assetach + testcontainers:

test_..._dwoch_autorow × {wydawnictwo_ciagle, wydawnictwo_zwarte, patent} × 3 powtórki = 9/9 passed

Happy-path bez regresji; ścieżka fallback (Enter dla zapisany_jako) zweryfikowana, bo Kopara1/2 nie są podłańcuchem etykiety. Timing-flake reprodukuje się głównie pod obciążeniem CI — ostateczna walidacja na zielonym CI tego PR-a.

🤖 Generated with Claude Code

…j pozycji zamiast Enter

select_select2_autocomplete wciskał Enter wybierając PIERWSZĄ podświetloną
pozycję wyników. Pod obciążeniem CI press_sequentially wpisuje znaki wolniej
niż debounce Select2, więc dla "Aut2…" w oknie czasowym widoczne bywają jeszcze
wyniki dla "Aut…" — zawierające INNEGO autora o wspólnym prefiksie. Enter
po cichu wybierał złego autora; błąd ujawniał się dopiero przy zapisie jako
UniqueViolation na (rekord_id, autor_id, typ_odpowiedzialnosci_id), bo oba
wiersze formsetu wskazywały na ten sam autor_id.

Helper klika teraz konkretną pozycję, której widoczny tekst zawiera pełną
szukaną wartość; tylko gdy takiej pozycji nie ma (pola, gdzie szukany tekst
nie jest podłańcuchem etykiety, np. generowane warianty "zapisany jako")
spada do dawnego Enter-na-pierwszej.

Weryfikacja lokalna: test_..._dwoch_autorow × 3 parametry × 3 powtórki = 9/9
passed.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@mpasternak mpasternak merged commit 09f996b into dev Jun 1, 2026
9 checks passed
@mpasternak mpasternak deleted the fix/select2-helper-exact-match branch June 1, 2026 11:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant