I-1: boards() отдаёт type=null, если тип неизвестен у любого проекта доски. M-2: labels_add ensure_fields нормализуется к метке проекта. M-3: light_list вместо list_projects в _assign_boards. M-4/T5.4: пустой project — 422. M-1, M-5, T10.1-T10.7: README, ARCHITECTURE, CLAUDE.md, design.md (49-51), e2e. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
50 lines
3.0 KiB
TypeScript
50 lines
3.0 KiB
TypeScript
import { expect, test } from "@playwright/test";
|
||
import { agentServeRefresh, login } from "./hub.ts";
|
||
|
||
// проект заводится один раз на тестовый хаб: сценарии идут по порядку, файл — последний по алфавиту
|
||
test.describe.serial("проекты", () => {
|
||
test("первый вход: проект AWPCA в адресе, на доске задача проекта", async ({ page }) => {
|
||
await login(page);
|
||
await expect(page).toHaveURL(/\/app\/board\?project=AWPCA$/);
|
||
await expect(page.locator('.board .card[data-key="AURORA-9001"]')).toBeVisible();
|
||
});
|
||
|
||
test("метка занята: окно остаётся открытым, ошибка в alert", async ({ page }) => {
|
||
await login(page);
|
||
await page.getByLabel("Проект", { exact: true }).selectOption({ label: "+ Новый проект…" });
|
||
const d = page.getByRole("dialog", { name: "Новый проект" });
|
||
await d.getByLabel("Метка").fill("awpca");
|
||
await d.getByLabel("Название").fill("x");
|
||
await d.getByRole("button", { name: "Создать" }).click();
|
||
await expect(d.getByRole("alert")).toContainText("уже есть");
|
||
await expect(d).toBeVisible();
|
||
});
|
||
|
||
test("создание проекта из формы: адрес, пакет, разбор пакета агентом", async ({ page }) => {
|
||
await login(page);
|
||
await page.getByLabel("Проект", { exact: true }).selectOption({ label: "+ Новый проект…" });
|
||
const d = page.getByRole("dialog", { name: "Новый проект" });
|
||
await d.getByLabel("Метка").fill("STOCKS_DRRK");
|
||
await d.getByLabel("Название").fill("Запасы ДРРК");
|
||
await d.getByRole("button", { name: "Создать" }).click();
|
||
await expect(page).toHaveURL(/\?project=STOCKS_DRRK/);
|
||
await expect(page.getByRole("status")).toContainText(/пакет #\d+/);
|
||
await expect(page.locator(".board .card[data-key]")).toHaveCount(0);
|
||
await agentServeRefresh(); // иначе пакет держит «Обновить из Jira» в других файлах на общем тестовом хабе
|
||
await expect(page.getByRole("status")).toContainText("выполнен");
|
||
});
|
||
|
||
test("переключение проекта и раздела", async ({ page }) => {
|
||
await login(page, "/app/board?project=STOCKS_DRRK");
|
||
await page.getByLabel("Проект", { exact: true }).selectOption({ label: "AWPCA — АРМ КА" });
|
||
await expect(page.locator('.board .card[data-key="AURORA-9001"]')).toBeVisible();
|
||
await page.getByRole("link", { name: "Задачи", exact: true }).click();
|
||
await expect(page).toHaveURL(/\/app\/issues\?project=AWPCA$/);
|
||
});
|
||
|
||
test("неизвестный проект в адресе", async ({ page }) => {
|
||
await login(page, "/app/issues?project=NOPE");
|
||
await expect(page.getByText("проект NOPE не найден")).toBeVisible();
|
||
});
|
||
});
|