// @vitest-environment jsdom import React from "react"; import { act } from "react"; import { createRoot } from "react-dom/client"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; const cleanupCallbacks: Array<() => void> = []; function makeContainer(): HTMLElement { const container = document.createElement("div"); document.body.appendChild(container); cleanupCallbacks.push(() => { container.remove(); }); return container; } function setInputValue(input: HTMLInputElement, value: string): void { const setter = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, "value")?.set; setter?.call(input, value); input.dispatchEvent(new Event("input", { bubbles: true })); } describe("KiroAuthModal", () => { beforeEach(() => { ( globalThis as typeof globalThis & { IS_REACT_ACT_ENVIRONMENT?: boolean } ).IS_REACT_ACT_ENVIRONMENT = true; }); afterEach(() => { while (cleanupCallbacks.length > 0) { cleanupCallbacks.pop()?.(); } document.body.innerHTML = ""; vi.restoreAllMocks(); }); it("shows Google Account and starts Google social login when clicked", async () => { const { default: KiroAuthModal } = await import("@/shared/components/KiroAuthModal"); const container = makeContainer(); const root = createRoot(container); const onMethodSelect = vi.fn(); await act(async () => { root.render(); }); const googleButton = Array.from(container.querySelectorAll("button")).find((button) => button.textContent?.includes("Google Account") ); expect(googleButton).toBeTruthy(); expect(googleButton?.className).not.toContain("hidden"); await act(async () => { googleButton?.click(); }); expect(onMethodSelect).toHaveBeenCalledWith("social", { provider: "google" }); }); it("notifies API key import success before closing the modal", async () => { const { default: KiroAuthModal } = await import("@/shared/components/KiroAuthModal"); const container = makeContainer(); const root = createRoot(container); const calls: string[] = []; const onMethodSelect = vi.fn(() => calls.push("select")); const onClose = vi.fn(() => calls.push("close")); const originalFetch = globalThis.fetch; globalThis.fetch = vi.fn(async () => { return new Response(JSON.stringify({ success: true, connection: { id: "conn-1" } }), { status: 200, headers: { "Content-Type": "application/json" }, }); }) as typeof fetch; try { await act(async () => { root.render(); }); const apiKeyButton = Array.from(container.querySelectorAll("button")).find( (button) => button.querySelector("h3")?.textContent === "API Key" ); await act(async () => { apiKeyButton?.click(); }); const apiKeyInput = container.querySelector("input") as HTMLInputElement; const saveButton = Array.from(container.querySelectorAll("button")).find((button) => button.textContent?.includes("Validate and Save API Key") ); await act(async () => { setInputValue(apiKeyInput, "ksk_test_key"); }); await act(async () => { saveButton?.click(); }); expect(onMethodSelect).toHaveBeenCalledWith("api-key"); expect(onClose).toHaveBeenCalled(); expect(calls).toEqual(["select", "close"]); } finally { globalThis.fetch = originalFetch; } }); });