From 25514d93770d47ab0d9709114798b01ae42a3c3b Mon Sep 17 00:00:00 2001 From: IK Date: Sun, 20 Sep 2026 19:18:51 +0700 Subject: [PATCH] test: cover waterbody error states --- apps/web/tests/spots.spec.ts | 10 ++++++++++ apps/web/tests/waterbodies.spec.ts | 8 ++++++++ docs/ROADMAP.md | 4 ++-- 3 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 apps/web/tests/spots.spec.ts diff --git a/apps/web/tests/spots.spec.ts b/apps/web/tests/spots.spec.ts new file mode 100644 index 0000000..37ce887 --- /dev/null +++ b/apps/web/tests/spots.spec.ts @@ -0,0 +1,10 @@ +import { expect, test } from "@playwright/test"; + +test("unknown spot exposes an unavailable state without a misleading coordinate", async ({ page }) => { + await page.goto("/spots/not-a-real-spot"); + + await expect(page.getByRole("heading", { name: "Точка недоступна" })).toBeVisible(); + await expect(page.getByText("API не ответил или такой точки нет.")).toBeVisible(); + await expect(page.getByRole("navigation", { name: "Навигационная цепочка" })).toContainText("Точка недоступна"); + await expect(page.getByText(/Точность координат:/)).toHaveCount(0); +}); diff --git a/apps/web/tests/waterbodies.spec.ts b/apps/web/tests/waterbodies.spec.ts index d5368f2..c47a90c 100644 --- a/apps/web/tests/waterbodies.spec.ts +++ b/apps/web/tests/waterbodies.spec.ts @@ -17,3 +17,11 @@ test("unknown waterbody slug has a navigable not-found state", async ({ page }) await expect(page.getByRole("alert")).toContainText("Такого водоёма нет в справочнике"); await expect(page.getByRole("link", { name: "Открыть каталог" })).toHaveAttribute("href", "/waterbodies"); }); + +test("unknown waterbody/fish pair keeps a clear not-found state", async ({ page }) => { + await page.goto("/waterbodies/р-вьюнок/not-a-real-fish"); + + await expect(page.getByRole("heading", { name: "Данные не найдены" })).toBeVisible(); + await expect(page.getByRole("alert")).toContainText("Такого сочетания нет в справочнике"); + await expect(page.getByRole("link", { name: "Вернуться на главную" })).toHaveAttribute("href", "/"); +}); diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index ed3dbfd..30f1c23 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -54,9 +54,9 @@ - [ ] **W03 · Модель и provenance.** В модель `Waterbody`, API-каталог и миграции `0017`/`0019`/`0020` добавлены nullable-поля provenance, счётчик видов и detail-факты; идемпотентный upsert применён к canonical snapshot: `19/19`, без missing/duplicate/provenance issues. Осталось применить подтверждённые detail snapshots и отдельно разделить игровые и редакционные тексты при подключении detail-данных. - [ ] **W04 · Классификация изображений.** Добавлены допустимые роли `waterbody_cover`, `waterbody_map`, `waterbody_depth_map`, `waterbody_screenshot` и проверка их назначения только через review для canonical waterbody. Кандидаты по-прежнему не получают роль автоматически. Осталось наполнить очередь detail-изображениями и провести contact-sheet review с проверкой dimensions, MIME, SHA-256, соответствия названию и источника. - [ ] **W05 · Crosswalk источников.** Добавлен offline-конструктор консервативных предложений: нормализуются только точные имена/алиасы, неоднозначные и unmatched строки не получают canonical key; отсутствие ID выдаётся лишь диагностикой и не считается удалением. RF4MAP/RF4-STAT directory parsers теперь преобразуются в crosswalk identities без переноса метрик или автоматической привязки. Осталось подать полный набор реальных RF4DB/RF4MAP/RF4 Posts identities и вручную подтвердить результаты, включая три ранее отмеченных отсутствующих RF4MAP объекта. -- [ ] **W06 · Координаты и точность.** В `ExternalObservation`, staging, provenance опубликованного улова и публичных activity/spot-ответах добавлены `coordinate_raw`, `coordinate_precision = exact | approximate | area | missing` и список источников; RF4DB/RF4-STAT/RF4MAP/RF4 Posts parsers теперь протягивают исходную строку, включая строки без доступных числовых координат. Исправлена spot detail: точность (`точные`/`приблизительные`/`район`/`не указаны`) теперь видна рядом с координатами и покрыта smoke regression. In-app Chromium и focused smoke подтвердили `/spots/vyunok-321x654` на desktop/mobile без overflow. Осталась полная browser QA матрица для всех precision/error-состояний. +- [ ] **W06 · Координаты и точность.** В `ExternalObservation`, staging, provenance опубликованного улова и публичных activity/spot-ответах добавлены `coordinate_raw`, `coordinate_precision = exact | approximate | area | missing` и список источников; RF4DB/RF4-STAT/RF4MAP/RF4 Posts parsers теперь протягивают исходную строку, включая строки без доступных числовых координат. Исправлена spot detail: точность (`точные`/`приблизительные`/`район`/`не указаны`) теперь видна рядом с координатами и покрыта smoke regression. In-app Chromium и focused smoke подтвердили `/spots/vyunok-321x654` на desktop/mobile без overflow; добавлен browser regression для отсутствующей точки без ложных координат. Осталась полная browser QA матрица для всех precision/error-состояний. - [ ] **W07 · Публичный API и страницы.** API и detail-страница теперь выводят подтверждённые detail-факты водоёма: описание, уровень, количество видов, алиасы, число ссылок на точки и отдельный счётчик изображений-кандидатов; источники и непроверенные media не смешиваются. Осталось подключить только проверенные waterbody media roles и завершить browser QA, включая различение карты, заставки и абстрактного отпечатка. -- [ ] **W08 · Приёмка и эксплуатация.** Fixture-based parser tests, offline catalog/media audit и повторный idempotent import подтверждены: `created=0 updated=19`, в PostgreSQL ровно `19` RF4DB waterbodies плюс `2` legacy-записи, media audit сообщает `issues=[]` и `orphaned_files=[]`. In-app Chromium и focused smoke покрывают desktop/mobile основные страницы; 20.09 targeted waterbody E2E подтвердил detail с пустой активностью и отдельный not-found state, полный web E2E прошёл `27 passed, 1 skipped`, visual-matrix также прошёл. Остаются полная browser QA error/empty matrix и закрытие внешних detail-данных. Сетевые тесты не выполнять; регулярный импорт оставить opt-in и под общим cooldown/backoff. +- [ ] **W08 · Приёмка и эксплуатация.** Fixture-based parser tests, offline catalog/media audit и повторный idempotent import подтверждены: `created=0 updated=19`, в PostgreSQL ровно `19` RF4DB waterbodies плюс `2` legacy-записи, media audit сообщает `issues=[]` и `orphaned_files=[]`. In-app Chromium и focused smoke покрывают desktop/mobile основные страницы; 20.09 targeted waterbody E2E подтвердил detail с пустой активностью, not-found waterbody и not-found waterbody/fish pair, а spot regression — unavailable state без ложной координаты; полный web E2E прошёл `27 passed, 1 skipped`, visual-matrix также прошёл. Остаются полная browser QA error/empty matrix и закрытие внешних detail-данных. Сетевые тесты не выполнять; регулярный импорт оставить opt-in и под общим cooldown/backoff. ### Каталог снастей, наживок и прочей оснастки