Правки minor-находок ревью Task 6 (T6.1-T6.4)

- T6.1: e2e «описание свёрнуто» проверяет scrollHeight > clientHeight и рост высоты pre после «развернуть»
- T6.2: e2e заметки из окна сверяет scrollY после закрытия окна с исходным
- T6.3: тест переименован, добавлен маркер на DOM-узле карточки (узел не пересоздан)
- T6.4: исправлен разорванный абзац в ARCHITECTURE.md

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Andrey Epifancev 2026-10-15 13:29:57 +04:00
parent 62f6d8a11f
commit 9655ca4847
3 changed files with 9 additions and 3 deletions

View File

@ -22,8 +22,7 @@
| `cli` | `init`, `serve`, `import`, `mcp`, `tokens`, `agent publish` | `api`, `mcp_server`, `importer`, `release`, `settings`, `db`, `paths` |
`web/` — веб-приложение хаба (React + TypeScript + Vite): вход по клиентскому токену, страницы «Доска» (`/app/board`)
и «Задачи»
(`/app/issues`); карточка `/app/issues/{key}` — окно поверх страницы, с которой её открыли: `shell/Layout.tsx` рисует
и «Задачи» (`/app/issues`); карточка `/app/issues/{key}` — окно поверх страницы, с которой её открыли: `shell/Layout.tsx` рисует
страницу по адресу из `location.state.background` (`useRoutes` с явным адресом) и `issues/IssueModal.tsx` поверх неё. Собирается `make web` в `src/jira_hub/web/app/`; `api` отдаёт сборку
без токена (`/app/assets/*` — файлы, прочие `/app…` — `index.html`, 503 без сборки), `/` и `/links` перенаправляет на
`/app/board`. Данные — только через HTTP API с клиентским токеном; `mirror.board` отдаёт зеркало без преобразований,

View File

@ -89,10 +89,12 @@ test("M-3: прокрутка и данные доски после окна к
await expect.poll(() => page.evaluate(() => window.scrollY)).toBeGreaterThan(y - 2);
});
test("заметка из окна уходит в хаб и доска под ним не пересоздаётся", async ({ page }) => {
test("заметка из окна уходит в хаб, карточка на доске остаётся на месте, прокрутка сохраняется", async ({ page }) => {
// доска показывает вид работы по меткам Jira (fromHub), заметка work_kind в карточку доски не попадает: проверяем снимок /board
await page.locator('.board .card[data-key="AURORA-9002"]').evaluate((e) => { (e as HTMLElement).dataset.marker = "keep"; });
await page.locator('.board .card[data-key="AURORA-9002"] a.open-card').click();
const d = page.getByRole("dialog");
const y = await page.evaluate(() => window.scrollY);
await d.getByRole("button", { name: "Править" }).click();
await d.getByLabel("Вид работы").selectOption("тестирование");
const snap = page.waitForResponse((r) => new URL(r.url()).pathname === "/board" && r.request().method() === "GET");
@ -103,4 +105,6 @@ test("заметка из окна уходит в хаб и доска под
await page.keyboard.press("Escape");
await expect(page.getByTestId("page-board")).toBeAttached();
await expect(page.locator('.board .card[data-key="AURORA-9002"]')).toBeVisible();
await expect(page.locator('.board .card[data-key="AURORA-9002"]')).toHaveAttribute("data-marker", "keep"); // узел не пересоздан
expect(await page.evaluate(() => window.scrollY)).toBe(y);
});

View File

@ -76,8 +76,11 @@ test("карточка: описание свёрнуто, комментари
await expect(d.getByTestId("comments").getByRole("listitem").first()).toContainText("[мост] служебный комментарий");
await expect(d.getByRole("button", { name: "развернуть" })).toBeVisible();
await expect(d.locator("pre.description")).toHaveClass(/clamped/); // свёрнуто построчным обрезанием (текст в DOM остаётся)
const hClamped = (await d.locator("pre.description").boundingBox())!.height;
expect(await d.locator("pre.description").evaluate((e) => e.scrollHeight > e.clientHeight)).toBe(true);
await d.getByRole("button", { name: "развернуть" }).click();
await expect(d.locator("pre.description")).not.toHaveClass(/clamped/);
expect((await d.locator("pre.description").boundingBox())!.height).toBeGreaterThan(hClamped);
await expect(d.getByText("Конец описания.")).toBeVisible();
await expect(d.getByRole("cell", { name: "ensure_fields" })).toBeHidden();
await d.getByText("Команды моста (2)").click();