ai-roles: guard от конкурентного soft-delete в update() не покрыт тестом #88

Closed
opened 2026-06-21 02:33:13 +03:00 by Ghost · 0 comments

Найдено в multi-aspect code review всех изменений с коммита 053a9c0d (ветка develop).

Грань: test-coverage · Severity: warning
Где: apps/server/src/core/ai-chat/roles/ai-agent-roles.service.ts:136-140

Проблема
Сервис делает два findById: предварительную проверку (L102) и повторную выборку после UPDATE (L136); ветка if (!updated) throw BadRequestException (L139) покрывает soft-delete между UPDATE и повторной выборкой. В spec заглушка findById: jest.fn().mockResolvedValue(opts.existing) возвращает одно и то же на каждый вызов, поэтому оба lookup отдают роль и ветка L139 не исполняется. Кросс-воркспейс тест проверяет только первый guard. Дополнительно: успешный возврат toView(updated) (L140) не ассертится — проверяется только patch, переданный в repo.update.

Предлагаемый фикс
Тест: findById возвращает строку на первом вызове и undefined на втором (mockResolvedValueOnce(row).mockResolvedValueOnce(undefined)) → отклонение BadRequestException; плюс happy-path тест, проверяющий форму AgentRoleView при успешном update.

Найдено в multi-aspect code review всех изменений с коммита `053a9c0d` (ветка develop). **Грань:** test-coverage · **Severity:** warning **Где:** `apps/server/src/core/ai-chat/roles/ai-agent-roles.service.ts:136-140` **Проблема** Сервис делает два findById: предварительную проверку (L102) и повторную выборку после UPDATE (L136); ветка `if (!updated) throw BadRequestException` (L139) покрывает soft-delete между UPDATE и повторной выборкой. В spec заглушка `findById: jest.fn().mockResolvedValue(opts.existing)` возвращает одно и то же на каждый вызов, поэтому оба lookup отдают роль и ветка L139 не исполняется. Кросс-воркспейс тест проверяет только первый guard. Дополнительно: успешный возврат `toView(updated)` (L140) не ассертится — проверяется только patch, переданный в repo.update. **Предлагаемый фикс** Тест: findById возвращает строку на первом вызове и undefined на втором (`mockResolvedValueOnce(row).mockResolvedValueOnce(undefined)`) → отклонение BadRequestException; плюс happy-path тест, проверяющий форму AgentRoleView при успешном update.
Ghost closed this issue 2026-06-21 14:10:33 +03:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: vvzvlad/gitmost#88