test(tradein/frontend): первые проверки поведения — пустое поле, погашенное число, отказ 429 #2769

Merged
bot-backend merged 1 commit from test/2766-frontend-first-tests into main 2026-08-07 07:55:38 +00:00
Collaborator

Что

У tradein-фронта не бежало ни одной проверки поведения — только типы и статический анализ. Три компонента, ломавшиеся за последние сутки, получают по проверке; шаг npm test подключён в ci-tradein.yml (job frontend-checks, после type-check).

Инфраструктура (vitest + jsdom + testing-library) скопирована у соседнего frontend/, где сьют живёт давно — не изобретена заново.

Три проверки

  1. SaleShareList — колонка «Дом» при пустой серии (series_name пуст у всех 9 457 домов, #2700). Текст ячейки сверяется ЦЕЛИКОМ (toBe), потому что «нарисовали пусто» от «нарисовали дыру» отличает ровно хвостовой разделитель ·, а toContain его не заметит.
  2. StreetDealsCard + mapHistory — погашенное гейтом (#2666/#2672, PR #2706) число медианного торга показано ОБЪЯСНЕНИЕМ, а не пустотой и не нулём. Мест показа два (карточка / и HUD /v2), гейт один — проверяются оба.
  3. LoginPage — 429 (#2712/#2717) даёт своё сообщение. Подменяется fetch, а не loginErrorMessage: работает настоящая apiFetch и настоящий HTTPError, то есть проверяется путь от кода ответа до текста на экране. Рядом 401 и 500 — без них «429 показывает текст» прошло бы и на ветке, отвечающей одинаково на всё.

Каждая проверка проверена на слом

мутация продуктового кода результат
снят .filter(Boolean) в BuildingRow 4 красных ('1979 · Панель · 9 эт. · ' to be '1979 · Панель · 9 эт.')
удалён блок median_discount_explanation + его половина note 2 красных
удалена ветка error.status === 429 1 красный

Все мутации откачены, сьют зелёный: 13 passed, 0 skipped, 0 failed.

Test plan

  • npm test — 13/13 зелёных, пропусков нет
  • npm run type-check — чисто
  • npm run lint — новых замечаний нет
  • npm run build — собирается (тест-файлы не становятся роутами)
  • npm run check:mera-public-isolation — OK
  • job frontend-checks показывает шаг «Run tests (vitest)» в логе прогона

Refs #2766

## Что У tradein-фронта не бежало ни одной проверки поведения — только типы и статический анализ. Три компонента, ломавшиеся за последние сутки, получают по проверке; шаг `npm test` подключён в `ci-tradein.yml` (job `frontend-checks`, после type-check). Инфраструктура (vitest + jsdom + testing-library) **скопирована у соседнего `frontend/`**, где сьют живёт давно — не изобретена заново. ## Три проверки 1. **`SaleShareList`** — колонка «Дом» при пустой серии (`series_name` пуст у всех 9 457 домов, #2700). Текст ячейки сверяется ЦЕЛИКОМ (`toBe`), потому что «нарисовали пусто» от «нарисовали дыру» отличает ровно хвостовой разделитель ` · `, а `toContain` его не заметит. 2. **`StreetDealsCard` + `mapHistory`** — погашенное гейтом (#2666/#2672, PR #2706) число медианного торга показано ОБЪЯСНЕНИЕМ, а не пустотой и не нулём. Мест показа два (карточка `/` и HUD `/v2`), гейт один — проверяются оба. 3. **`LoginPage`** — 429 (#2712/#2717) даёт своё сообщение. Подменяется `fetch`, а не `loginErrorMessage`: работает настоящая `apiFetch` и настоящий `HTTPError`, то есть проверяется путь от кода ответа до текста на экране. Рядом 401 и 500 — без них «429 показывает текст» прошло бы и на ветке, отвечающей одинаково на всё. ## Каждая проверка проверена на слом | мутация продуктового кода | результат | |---|---| | снят `.filter(Boolean)` в `BuildingRow` | 4 красных (`'1979 · Панель · 9 эт. · ' to be '1979 · Панель · 9 эт.'`) | | удалён блок `median_discount_explanation` + его половина `note` | 2 красных | | удалена ветка `error.status === 429` | 1 красный | Все мутации откачены, сьют зелёный: **13 passed, 0 skipped, 0 failed**. ## Test plan - [x] `npm test` — 13/13 зелёных, пропусков нет - [x] `npm run type-check` — чисто - [x] `npm run lint` — новых замечаний нет - [x] `npm run build` — собирается (тест-файлы не становятся роутами) - [x] `npm run check:mera-public-isolation` — OK - [ ] job `frontend-checks` показывает шаг «Run tests (vitest)» в логе прогона Refs #2766
bot-backend added 1 commit 2026-08-07 07:46:15 +00:00
test(tradein/frontend): первые проверки поведения — пустое поле, погашенное число, отказ 429
All checks were successful
CI / changes (pull_request) Successful in 8s
CI Trade-In / changes (pull_request) Successful in 9s
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Successful in 45s
CI Trade-In / frontend-checks (pull_request) Successful in 1m22s
CI Trade-In / backend-tests (pull_request) Successful in 3m54s
fcd6bf5cbd
У tradein-фронта не бежало ни одной проверки поведения: лэйн гейтил типы и
статический анализ, а оба молчат про то, что видит пользователь. Три компонента,
ломавшиеся за последние сутки, получают по проверке.

- SaleShareList: колонка «Дом» при пустой серии (#2700 — пусто у всех 9457 домов)
  сверяется ЦЕЛИКОМ, потому что от «нарисовали дыру» отличает ровно хвостовой
  разделитель, а подстрочное совпадение его не видит.
- StreetDealsCard + mapHistory: погашенный гейтом медианный торг (#2666/#2672)
  показан объяснением, а не пустотой и не нулём. Мест показа два (карточка `/`
  и HUD `/v2`), гейт один — проверяются оба.
- LoginPage: 429 (#2712/#2717) даёт своё сообщение. Подменяется fetch, а не
  loginErrorMessage — работает настоящая apiFetch и настоящий HTTPError, то есть
  проверяется путь от кода ответа до текста на экране. Рядом 401 и 500: без них
  «429 показывает текст» прошло бы и на ветке, отвечающей одинаково на всё.

Каждая проверка проверена на слом: снят .filter(Boolean) → 4 красных; убран
блок median_discount_explanation и его половина note → 2 красных; удалена ветка
429 → 1 красный. Инфраструктура (vitest + jsdom + testing-library) скопирована
у frontend/, не изобретена. Шаг подключён в ci-tradein.yml после type-check.

Refs #2766
bot-backend merged commit a034d7a1c1 into main 2026-08-07 07:55:38 +00:00
bot-backend deleted branch test/2766-frontend-first-tests 2026-08-07 07:55:38 +00: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: lekss361/gendesign#2769
No description provided.