sdlc-hub/web/e2e/wiki.spec.ts
Andrey Epifancev 2f73f11170 Веб: окно правки вики с диффом поверх ленты (#140)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 13:15:26 +04:00

64 lines
4.4 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { expect, test } from "@playwright/test";
import { login } from "./hub.ts";
// копия вики проекта AWPCA засеяна scripts/seed-hub.py: корень и две страницы (одна с вложением)
test("вики: дерево, страница, поиск", async ({ page }) => {
await login(page, "/app/wiki?project=AWPCA");
const tree = page.getByRole("tree", { name: "Страницы вики" });
await expect(tree.getByRole("treeitem")).toHaveCount(3);
await tree.getByRole("treeitem", { name: "Регламент согласования" }).click();
await expect(page).toHaveURL(/page=DOC-9003/);
const article = page.getByRole("article");
await expect(article.getByRole("heading", { name: "Регламент согласования" })).toBeVisible();
await expect(article.getByRole("button", { name: /схема\.txt/ })).toBeVisible();
// ссылка на другую страницу вики меняет адрес и выделенный узел
await article.getByRole("link", { name: "К модели" }).click();
await expect(page).toHaveURL(/page=DOC-9002/);
await expect(tree.getByRole("treeitem", { name: "Модель данных" })).toHaveAttribute("aria-selected", "true");
await expect(page.getByRole("article").locator("table")).toBeVisible();
await page.getByRole("searchbox", { name: "Поиск по вики" }).fill("согласов");
await expect(tree).toHaveCount(0);
await expect(page.getByRole("list", { name: "Результаты поиска" }).getByRole("link")).not.toHaveCount(0);
await page.getByRole("list", { name: "Результаты поиска" }).getByRole("link", { name: /Регламент согласования/ }).click();
await expect(page).toHaveURL(/page=DOC-9003/);
});
test("вики: вложение скачивается через запрос к агенту", async ({ page }) => {
await login(page, "/app/wiki?project=AWPCA&page=DOC-9003");
const req = page.waitForRequest((r) => r.method() === "POST" && /\/wiki\/attachments\/\d+\/fetch$/.test(r.url()));
await page.getByRole("article").getByRole("button", { name: /схема\.txt/ }).click();
await req; // агента в тестовом хабе нет: скачивание остаётся «Загружается…», достаточно, что запрос ушёл
await expect(page.getByRole("article").getByText("Загружается…")).toBeVisible();
});
// две правки DOC-9003 засеяны seed-hub.py (сегодня, автор Дмитрий Соснов): новая «+1 / −1», старая «+5 / −0»
test("правка из ленты: окно с диффом, «Предыдущая правка», назад — лента", async ({ page }) => {
await login(page, "/app/feed?project=AWPCA&period=7d&sources=wiki");
const feed = page.getByTestId("page-feed");
await feed.getByRole("link", { name: /\+1 \/ −1/ }).click();
const d = page.getByRole("dialog");
await expect(d.getByRole("heading", { name: "Регламент согласования" })).toBeVisible();
await expect(d.getByText("правка 2 из 2")).toBeVisible();
await expect(d.locator(".wiki-version-line--add").first()).toBeVisible();
await expect(d.locator(".wiki-version-line--del").first()).toBeVisible();
await expect(feed).toBeVisible(); // лента под окном
await d.getByRole("button", { name: "Предыдущая правка" }).click();
await expect(d.getByText("правка 1 из 2")).toBeVisible();
await expect(d.getByRole("button", { name: "Предыдущая правка" })).toBeDisabled();
await page.goBack();
await expect(page.getByRole("dialog")).toHaveCount(0);
await expect(page).toHaveURL(/\/app\/feed\?project=AWPCA&period=7d&sources=wiki/);
});
test("окно правки на 390 px: горизонтальной прокрутки страницы нет", async ({ page }) => {
await page.setViewportSize({ width: 390, height: 800 });
await login(page, "/app/feed?project=AWPCA&period=7d&sources=wiki");
await page.getByTestId("page-feed").getByRole("link", { name: /\+5 \/ −0/ }).click();
await expect(page.getByRole("dialog").locator(".wiki-version-line--add").first()).toBeVisible();
const fits = await page.evaluate(() => document.documentElement.scrollWidth <= document.documentElement.clientWidth);
expect(fits).toBe(true);
});