/** * @file Tests for CloneSourcesForm: every URL in the box is cloned in turn as * an extra folder, a host that wants a login opens the login row, and Retry * re-runs only the failed URLs with that login. * @author Nguyễn Ngọc Trí Vĩ */ import { describe, it, expect, vi, beforeEach } from "vitest"; import { render, screen, waitFor } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import "../../../i18n"; vi.mock("../../../lib/api", () => ({ api: { lanes: { cloneFolder: vi.fn() } }, })); import { api, type LaneSourcesView } from "../../../lib/api"; import { CloneSourcesForm } from "../CloneSourcesForm"; const view = { sources: [] } as unknown as LaneSourcesView & { path: string }; describe("CloneSourcesForm", () => { beforeEach(() => vi.mocked(api.lanes.cloneFolder).mockReset()); it("clones each URL, asks for a login where needed, and retries only that one", async () => { const user = userEvent.setup(); const onAdded = vi.fn(); vi.mocked(api.lanes.cloneFolder).mockImplementation(async (_id, body) => { if (body?.url.includes("private") && !body.credentials) throw Object.assign(new Error("login"), { code: "ECREDENTIALS", auth: { protocol: "https", host: "private.test" }, }); return view; }); render(); await user.type( screen.getByTestId("workspace-clone-input"), "https://h/a.git\nhttps://private.test/b.git\nhttps://h/a.git" ); await user.click(screen.getByTestId("workspace-clone-run")); await waitFor(() => expect(api.lanes.cloneFolder).toHaveBeenCalledTimes(2)); expect(onAdded).toHaveBeenCalledTimes(1); expect(await screen.findByText(/private\.test needs a login/)).toBeInTheDocument(); // Only what is left stays in the box. expect(screen.getByTestId("workspace-clone-input")).toHaveValue("https://private.test/b.git"); await user.type(screen.getByLabelText("Username"), "dev"); await user.type(screen.getByLabelText("Password or access token"), "tok"); await user.click(screen.getByRole("button", { name: "Retry the failed ones" })); await waitFor(() => expect(onAdded).toHaveBeenCalledTimes(2)); expect(api.lanes.cloneFolder).toHaveBeenLastCalledWith(3, { url: "https://private.test/b.git", credentials: { username: "dev", password: "tok", remember: true }, }); expect(screen.getByTestId("workspace-clone-input")).toHaveValue(""); }); });