test(pipeline-status): regression guard for duplicate Closes mentions #92

Merged
slaid098 merged 1 commit from test/pipeline-status/duplicate-closes-guard into main 2026-08-16 20:59:29 +03:00
Owner

Что сделано

Добавлен тест test_check_issue_duplicate_same_number_not_ambiguous в tests/test_pipeline_status.py: check_issue на body, где один и тот же номер issue упомянут дважды (одинаковым ключевым словом и разными ключевыми словами) → фаза ISSUE DONE, не AMBIGUOUS.

Почему

Урок PR#55: дубликат Closes #N в body ронял pipeline-status в AMBIGUOUS. Сейчас защита живёт только в структуре кода (set() в check_issue) — регрессионного теста не было, и рефакторинг мог её случайно потерять.

Watch out

Рядом с тестом добавлен комментарий-ссылка на существующий контрастный тест test_check_issue_ambiguous_multiple (разные номера issues → AMBIGUOUS); дубликат не добавлялся.

Pending

—

Closes #86

## Что сделано Добавлен тест `test_check_issue_duplicate_same_number_not_ambiguous` в `tests/test_pipeline_status.py`: `check_issue` на body, где один и тот же номер issue упомянут дважды (одинаковым ключевым словом и разными ключевыми словами) → фаза ISSUE DONE, не AMBIGUOUS. ## Почему Урок PR#55: дубликат `Closes #N` в body ронял `pipeline-status` в AMBIGUOUS. Сейчас защита живёт только в структуре кода (`set()` в `check_issue`) — регрессионного теста не было, и рефакторинг мог её случайно потерять. ## Watch out Рядом с тестом добавлен комментарий-ссылка на существующий контрастный тест `test_check_issue_ambiguous_multiple` (разные номера issues → AMBIGUOUS); дубликат не добавлялся. ## Pending — Closes #86
test(pipeline-status): duplicate same issue number not ambiguous
All checks were successful
CI (always) / bootstrap (pull_request) Successful in 5s
CI / bootstrap (pull_request) Successful in 8s
CI / complexity (pull_request) Successful in 31s
CI / lint (pull_request) Successful in 32s
CI / typecheck (pull_request) Successful in 31s
CI / test (3.13) (pull_request) Successful in 1m42s
a73bfc37b1
Author
Owner

Code Review Summary

Регрессионный тест для защиты из PR#55: дубликат Closes #N в body (тем же ключевым словом или Closes+Fixes) → ISSUE DONE, не AMBIGUOUS. Логика проверена: CLOSURE_RE.findall даёт ["45", "45"] для обоих кейсов, set() дедуплицирует → len(issue_numbers) == 1 → DONE; gh issue view замокан. Тест не зависит от порядка, имеет asserts, CI green. Writer change нет (только тестовый файл) — cross-file impact отсутствует.

Positives

  • Тест реально воспроизводит баг из PR#55 (дубликат номера → AMBIGUOUS) и защищает set()-дедупликацию в check_issue от рефакторинга
  • Оба варианта дубликата покрыты: одинаковое ключевое слово и Closes+Fixes
  • Комментарий-ссылка на контрастный тест test_check_issue_ambiguous_multiple помогает читателю понять границу DONE/AMBIGUOUS
  • PR body полный (4 heading'а), title и branch в conventional формате

Suggestions (info, not blocking)

  • tests/test_pipeline_status.py:222 [style] Два кейса в цикле for — можно было бы @pytest.mark.parametrize для изоляции кейсов в отчёте pytest (при падении будет видно, какой именно body упал). Не блокирует.
  • tests/test_pipeline_status.py:222 [style] По code-standards regression-тесты ссылаются на issue/PR в имени (например _regression_#55). Имя описательное, PR body ссылается на PR#55 — достаточно, но суффикс усилил бы связь.

Verdict: APPROVE

## Code Review Summary Регрессионный тест для защиты из PR#55: дубликат `Closes #N` в body (тем же ключевым словом или Closes+Fixes) → ISSUE DONE, не AMBIGUOUS. Логика проверена: `CLOSURE_RE.findall` даёт `["45", "45"]` для обоих кейсов, `set()` дедуплицирует → `len(issue_numbers) == 1` → DONE; `gh issue view` замокан. Тест не зависит от порядка, имеет asserts, CI green. Writer change нет (только тестовый файл) — cross-file impact отсутствует. ### Positives - Тест реально воспроизводит баг из PR#55 (дубликат номера → AMBIGUOUS) и защищает `set()`-дедупликацию в `check_issue` от рефакторинга - Оба варианта дубликата покрыты: одинаковое ключевое слово и Closes+Fixes - Комментарий-ссылка на контрастный тест `test_check_issue_ambiguous_multiple` помогает читателю понять границу DONE/AMBIGUOUS - PR body полный (4 heading'а), title и branch в conventional формате ### Suggestions (info, not blocking) - **tests/test_pipeline_status.py:222** [style] Два кейса в цикле `for` — можно было бы `@pytest.mark.parametrize` для изоляции кейсов в отчёте pytest (при падении будет видно, какой именно body упал). Не блокирует. - **tests/test_pipeline_status.py:222** [style] По code-standards regression-тесты ссылаются на issue/PR в имени (например `_regression_#55`). Имя описательное, PR body ссылается на PR#55 — достаточно, но суффикс усилил бы связь. ### Verdict: APPROVE
slaid098 deleted branch test/pipeline-status/duplicate-closes-guard 2026-08-16 20:59:29 +03:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
slaid098/opencode-config!92
No description provided.