From 533fc3073f24c3a6dc8c280c99ff4e1cf0c27a7d Mon Sep 17 00:00:00 2001 From: Fringg Date: Tue, 11 Aug 2026 13:44:00 +0300 Subject: [PATCH] =?UTF-8?q?test(support):=20=D0=B7=D0=B0=D0=BA=D1=80=D0=B5?= =?UTF-8?q?=D0=BF=D0=B8=D1=82=D1=8C=20=D0=BF=D1=80=D0=B8=D0=B2=D1=8F=D0=B7?= =?UTF-8?q?=D0=BA=D1=83=20onError=20=D0=BA=20=D0=BC=D1=83=D1=82=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D1=8F=D0=BC=20=D1=82=D0=B8=D0=BA=D0=B5=D1=82=D0=BE?= =?UTF-8?q?=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Дополнение к PR #548 при мерже. Код менять не пришлось — добавлены три теста. Решение «это 409» автор вынес в утилиту и покрыл хорошо, а вот сама привязка onError к мутациям осталась непокрытой — при том, что её отсутствие и есть исходный баг: форма молчала, человек жал «Отправить» повторно. Проверил мутациями: снятие onError у createMutation, снятие onError у replyMutation и удаление обновления списка тикетов в ветке 409 набор не роняли. Окружения для рендера компонентов в репозитории нет (vitest настроен на node, без jsdom), поэтому закрепил структурно, по исходнику — приём тот же, что уже используется в бот-репозитории. Крудовато, но ловит ровно ту регрессию, ради которой PR и написан. Остальное проверено, правок не потребовалось. Несущее допущение верно: 409 в app/cabinet/routes/tickets.py встречается ровно один раз и именно про открытый тикет, так что матч по статусу вместо текста detail — правильный выбор (текст приходит только по-английски, а кабинет и бот версионируются раздельно). Переименование rateLimitError → formError сквозное, хвостов не осталось; формы create и reply взаимоисключающие, состояние сбрасывается на всех переходах. Ключи support.errors.* есть во всех четырёх локалях. Шесть предупреждений biome в Support.tsx — предсуществующие, столько же на чистом dev. --- src/utils/ticketErrors.test.ts | 35 ++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/utils/ticketErrors.test.ts b/src/utils/ticketErrors.test.ts index 67dbb11..1cd389f 100644 --- a/src/utils/ticketErrors.test.ts +++ b/src/utils/ticketErrors.test.ts @@ -1,3 +1,4 @@ +import { readFileSync } from 'node:fs'; import { AxiosError, AxiosHeaders } from 'axios'; import { describe, expect, it } from 'vitest'; import { isOpenTicketConflict } from './ticketErrors'; @@ -48,3 +49,37 @@ describe('isOpenTicketConflict', () => { expect(isOpenTicketConflict(null)).toBe(false); }); }); + +describe('обработчики ошибок на форме поддержки', () => { + // Решение «это 409» вынесено в утилиту и покрыто выше, а вот сама привязка + // onError к мутациям — нет: в репозитории нет окружения для рендера + // компонентов (vitest настроен на node, без jsdom). Поэтому закрепляем + // структурно: пропажа onError — это ровно тот баг, который PR и чинит + // (форма молчала, человек жал «Отправить» повторно). + const source = readFileSync(new URL('../pages/Support.tsx', import.meta.url), 'utf8'); + + it('createMutation обрабатывает отказ бэка', () => { + const block = source.slice( + source.indexOf('const createMutation'), + source.indexOf('const replyMutation'), + ); + expect(block).toContain('onError'); + expect(block).toContain('isOpenTicketConflict'); + }); + + it('replyMutation обрабатывает отказ бэка', () => { + const block = source.slice( + source.indexOf('const replyMutation'), + source.indexOf('const getStatusBadge'), + ); + expect(block).toContain('onError'); + }); + + it('409 подтягивает список тикетов — открытый мог появиться в другой сессии', () => { + const block = source.slice( + source.indexOf('isOpenTicketConflict(error)'), + source.indexOf('const replyMutation'), + ); + expect(block).toContain('invalidateQueries'); + }); +});