diff --git a/.gitignore b/.gitignore index 7f60f8e..b56602c 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,4 @@ src/jira_hub/web/app/ web/test-results/ web/playwright-report/ web/.e2e-hub/ +*.tsbuildinfo diff --git a/web/src/issues/IssueCard.test.tsx b/web/src/issues/IssueCard.test.tsx index 6d3c4f8..070cff8 100644 --- a/web/src/issues/IssueCard.test.tsx +++ b/web/src/issues/IssueCard.test.tsx @@ -2,7 +2,7 @@ import { act, cleanup, render, screen, waitFor, within } from "@testing-library/ import userEvent from "@testing-library/user-event"; import { QueryClientProvider } from "@tanstack/react-query"; import { createMemoryRouter, RouterProvider, useNavigate, useParams } from "react-router"; -import { beforeEach, describe, expect, it } from "vitest"; +import { beforeEach, describe, expect, it, vi } from "vitest"; import { qk } from "../api/queries.ts"; import { makeQueryClient } from "../api/queryClient.ts"; import { setToken } from "../auth/token.ts"; @@ -254,6 +254,7 @@ describe("карточка задачи", () => { slowPut.resolve(json(200, note({ owner_note: "раз", updated_by: "web" }))); await screen.findByRole("button", { name: "Править" }); // режим чтения (findByText("раз") ловил бы ещё живой textarea) expect(screen.getByText("раз")).toBeInTheDocument(); // с сохранённым значением + expect(screen.queryByLabelText("Заметка владельца")).toBeNull(); // форма закрыта }); it("M-2: ошибка повторной загрузки при уже имеющихся данных — данные остаются, строка с «Повторить»", async () => { @@ -327,4 +328,14 @@ describe("карточка задачи", () => { expect(within(view).getAllByText("—")).toHaveLength(5); expect(within(view).getByRole("button", { name: "Править" })).toBeInTheDocument(); }); + + it("T5.3: одинаковые связи не дают предупреждения о повторяющихся key", async () => { + const err = vi.spyOn(console, "error").mockImplementation(() => {}); + const dup = { target_key: "AURORA-9002", link_type: "ASUPR_Блокер_Начала", summary: "API", status: "Новая" }; + mockFetch((_m, url) => url.pathname === "/settings" ? json(200, settings) : json(200, issue("AURORA-9001", { links_out: [dup, dup] }))); + open("/issues/AURORA-9001"); + await screen.findAllByRole("link", { name: "AURORA-9002" }); + expect(err.mock.calls.flat().join(" ")).not.toContain("same key"); + err.mockRestore(); + }); }); diff --git a/web/src/issues/IssueCard.tsx b/web/src/issues/IssueCard.tsx index f25bca2..6d99946 100644 --- a/web/src/issues/IssueCard.tsx +++ b/web/src/issues/IssueCard.tsx @@ -85,8 +85,8 @@ function Links({ issue, linkTypes }: { issue: IssueDetail; linkTypes: Record