[Test] Флейк portfolio-structure: 401 в beforeEach в полном e2e-прогоне #106

Closed
opened 2026-10-15 22:19:15 +03:00 by codex-bot · 1 comment
Owner

Наблюдение

В первом полном npm run test:e2e suite test/portfolio-structure.e2e-spec.ts упал в beforeEach (PUT /api/v1/tbank-connection с Bearer <token> вернул 401 вместо 200). В повторном полном прогоне и при отдельных запусках (3 раза) прошёл. Деталей 401 в логе нет.

Что известно

  • Токен подписывается при загрузке модуля: new JwtService().sign({ sub, type: 'access' }, { secret: process.env.JWT_SECRET }).
  • setupFiles (test/e2e-env.cjs) задаёт JWT_SECRET до каждого файла, поэтому отсутствие секрета маловероятно.
  • Стратегия требует algorithms: ['HS256'], type: 'access', существующий sub (пользователь создаётся в beforeAll).

Что сделать

  1. Воспроизвести: многократно гнать полный test:e2e и зафиксировать частоту.
  2. Логировать причину 401 (JsonWebTokenError / TokenExpired / пользователь) в падающем прогоне.
  3. Найти источник недетерминизма (порядок suites, общее состояние, время) и устранить.

Критерии готовности

  • Причина установлена и записана.
  • N последовательных полных прогонов без 401 (N указать в закрытии).
## Наблюдение В первом полном `npm run test:e2e` suite `test/portfolio-structure.e2e-spec.ts` упал в `beforeEach` (PUT `/api/v1/tbank-connection` с `Bearer <token>` вернул 401 вместо 200). В повторном полном прогоне и при отдельных запусках (3 раза) прошёл. Деталей 401 в логе нет. ## Что известно - Токен подписывается при загрузке модуля: `new JwtService().sign({ sub, type: 'access' }, { secret: process.env.JWT_SECRET })`. - `setupFiles` (`test/e2e-env.cjs`) задаёт `JWT_SECRET` до каждого файла, поэтому отсутствие секрета маловероятно. - Стратегия требует `algorithms: ['HS256']`, `type: 'access'`, существующий `sub` (пользователь создаётся в `beforeAll`). ## Что сделать 1. Воспроизвести: многократно гнать полный `test:e2e` и зафиксировать частоту. 2. Логировать причину 401 (JsonWebTokenError / TokenExpired / пользователь) в падающем прогоне. 3. Найти источник недетерминизма (порядок suites, общее состояние, время) и устранить. ## Критерии готовности - Причина установлена и записана. - N последовательных полных прогонов без 401 (N указать в закрытии).
Author
Owner

Закрыто как неактуальное: флейк не воспроизведён, причина не установлена.

Проверка на develop (Node 24.21.0):

  • Полные npm run test:e2e прошли 19 раз подряд без падений: 1 базовый, 6 подряд и 12 подряд с временным логированием причины 401 в JwtAuthGuard.handleRequest.
  • В этих логах для portfolio-structure 401 не было ни разу. Были только ожидаемые 401 No auth token из негативных тестов других suites.
  • Дополнительно 24 параллельных запуска portfolio-structure по 8 одновременно, с очищенным кешем ts-jest и при нагрузке на CPU: 0 падений.
  • Кодом отброшены варианты: JWT_SECRET (задаётся в setupFiles), срок жизни токена, общее состояние (у каждого suite своя временная БД).

Диагностический код откатен, изменений в репозитории нет. Критерий «причина установлена» не выполнен, закрываем по решению владельца. Если флейк повторится, нужен лог упавшего прогона с причиной 401, тогда issue можно переоткрыть.

Закрыто как неактуальное: флейк не воспроизведён, причина не установлена. Проверка на `develop` (Node 24.21.0): - Полные `npm run test:e2e` прошли 19 раз подряд без падений: 1 базовый, 6 подряд и 12 подряд с временным логированием причины 401 в `JwtAuthGuard.handleRequest`. - В этих логах для `portfolio-structure` 401 не было ни разу. Были только ожидаемые 401 `No auth token` из негативных тестов других suites. - Дополнительно 24 параллельных запуска `portfolio-structure` по 8 одновременно, с очищенным кешем ts-jest и при нагрузке на CPU: 0 падений. - Кодом отброшены варианты: `JWT_SECRET` (задаётся в `setupFiles`), срок жизни токена, общее состояние (у каждого suite своя временная БД). Диагностический код откатен, изменений в репозитории нет. Критерий «причина установлена» не выполнен, закрываем по решению владельца. Если флейк повторится, нужен лог упавшего прогона с причиной 401, тогда issue можно переоткрыть.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: WealthLedger/backend#106