import { expect, test } from "@playwright/test"; import { login } from "./hub.ts"; // экраны доски: «Бэклог», «Спринт», «Kanban» (spec web-app «Спринты и бэклог»); данные — сид тестового хаба (R-27) const side = (page: import("@playwright/test").Page) => page.getByRole("complementary", { name: "Панель приложения" }); test("«Бэклог» AWPCA: секции, «Прошлые спринты (1)», щелчок открывает карточку", async ({ page }) => { await login(page, "/app/jira/backlog?project=AWPCA"); await expect(page.getByRole("heading", { name: "AWPCA_Спринт 2" })).toBeVisible(); await expect(page.getByRole("heading", { name: "AWPCA_Спринт 3" })).toBeVisible(); await expect(page.getByRole("heading", { name: "Бэклог", exact: true, level: 2 })).toBeVisible(); const past = page.getByText("Прошлые спринты (1)"); await expect(past).toBeVisible(); await past.click(); await page.getByText("AWPCA_Спринт 1").first().click(); const row = page.locator(".agile-row").filter({ hasText: "AURORA-9001" }).last(); await expect(row).toBeVisible(); await row.click(); await expect(page).toHaveURL(/\/app\/jira\/issues\/AURORA-9001/); await expect(page.getByRole("dialog")).toBeVisible(); await page.keyboard.press("Escape"); await expect(page).toHaveURL(/\/app\/jira\/backlog/); await expect(page.getByRole("dialog")).toHaveCount(0); }); test("«Спринт» AWPCA: колонки доски, «осталось 7 дн.», карточка окном", async ({ page }) => { await login(page, "/app/jira/sprint?project=AWPCA"); await expect(page.getByRole("heading", { name: "AWPCA_Спринт 2" })).toBeVisible(); await expect(page.getByText(/осталось \d+ дн\./)).toBeVisible(); for (const name of ["К выполнению", "В работе", "Готово"]) { await expect(page.locator(".agile-col__name", { hasText: name })).toBeVisible(); } await page.locator(".agile-card").filter({ hasText: "AURORA-9001" }).click(); await expect(page).toHaveURL(/\/app\/jira\/issues\/AURORA-9001/); await expect(page.getByRole("dialog")).toBeVisible(); await page.keyboard.press("Escape"); await expect(page).toHaveURL(/\/app\/jira\/sprint/); }); test("«Kanban»: «Бэклог (1)», колонки «В работе» и «Готово», подпись «за 14 дней»", async ({ page }) => { await login(page, "/app/jira/kanban?project=KANBAN_E2E"); await expect(page.getByText("Бэклог (1)")).toBeVisible(); await expect(page.locator(".agile-col__name", { hasText: "В работе" })).toBeVisible(); await expect(page.locator(".agile-col__name", { hasText: "Готово" })).toBeVisible(); await expect(page.locator(".agile-col__name", { hasText: "Бэклог" })).toHaveCount(0); await expect(page.getByText("за 14 дней")).toBeVisible(); await expect(page.locator(".agile-card").filter({ hasText: "AURORA-9102" })).toBeVisible(); await expect(page.locator(".agile-card").filter({ hasText: "AURORA-9103" })).toBeVisible(); }); test("без scrum-доски: /app/jira/backlog?project=KANBAN_E2E — «У проекта нет scrum-доски», ссылка «Связи»", async ({ page }) => { await login(page, "/app/jira/backlog?project=KANBAN_E2E"); await expect(page.getByText("У проекта нет scrum-доски")).toBeVisible(); await page.getByRole("link", { name: "Связи", exact: true }).last().click(); await expect(page).toHaveURL(/\/app\/jira\/links\?project=KANBAN_E2E/); }); test("меню по проекту: у AWPCA «Бэклог» и «Спринт», у KANBAN_E2E — «Kanban»", async ({ page }) => { await login(page, "/app/jira/links?project=AWPCA"); await expect(side(page).getByRole("link", { name: "Бэклог" })).toBeVisible(); await expect(side(page).getByRole("link", { name: "Спринт" })).toBeVisible(); await expect(side(page).getByRole("link", { name: "Kanban" })).toHaveCount(0); await page.goto("/app/jira/links?project=KANBAN_E2E"); await expect(side(page).getByRole("link", { name: "Kanban" })).toBeVisible(); await expect(side(page).getByRole("link", { name: "Бэклог" })).toHaveCount(0); await expect(side(page).getByRole("link", { name: "Спринт" })).toHaveCount(0); }); test("900 px: колонки «Спринта» прокручиваются внутри доски, страница без горизонтальной прокрутки", async ({ page }) => { await page.setViewportSize({ width: 900, height: 900 }); await login(page, "/app/jira/sprint?project=AWPCA"); await expect(page.locator(".agile-col").first()).toBeVisible(); const m = await page.evaluate(() => { const d = document.documentElement, c = document.querySelector(".agile-columns")!; return { doc: [d.scrollWidth, d.clientWidth], cols: [c.scrollWidth, c.clientWidth], gutter: c.getBoundingClientRect().left - document.querySelector(".agile")!.getBoundingClientRect().left }; }); expect(m.gutter, "колонки не получают второй отступ внутри страницы (T10.1)").toBe(0); expect(m.doc[0]).toBeLessThanOrEqual(m.doc[1]); expect(m.cols[0]).toBeGreaterThan(m.cols[1]); });