import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; const { fetchMock, getAuthHeadersMock, handleApiErrorMock, handleApiResponseMock, } = vi.hoisted(() => ({ fetchMock: vi.fn(), getAuthHeadersMock: vi.fn(), handleApiErrorMock: vi.fn(), handleApiResponseMock: vi.fn(), })); vi.mock("next/cache", () => ({ revalidatePath: vi.fn(), })); vi.mock("next/navigation", () => ({ redirect: vi.fn(), })); vi.mock("@/lib", () => ({ apiBaseUrl: "https://api.example.com/api/v1", getAuthHeaders: getAuthHeadersMock, })); vi.mock("@/lib/server-actions-helper", () => ({ handleApiError: handleApiErrorMock, handleApiResponse: handleApiResponseMock, })); import { addRole, updateRole } from "./roles"; const lastRequestBody = () => { const call = fetchMock.mock.calls.at(-1); if (!call) throw new Error("fetch was not called"); const [, init] = call; return JSON.parse(String((init as RequestInit).body)); }; const makeRoleFormData = () => { const formData = new FormData(); formData.set("name", "Alert manager"); formData.set("manage_users", "false"); formData.set("manage_account", "false"); formData.set("manage_billing", "false"); formData.set("manage_providers", "false"); formData.set("manage_integrations", "false"); formData.set("manage_scans", "false"); formData.set("manage_alerts", "true"); formData.set("manage_lighthouse_ai_configuration", "true"); formData.set("unlimited_visibility", "false"); return formData; }; describe("role actions", () => { beforeEach(() => { vi.clearAllMocks(); vi.stubGlobal("fetch", fetchMock); getAuthHeadersMock.mockResolvedValue({ Authorization: "Bearer token" }); handleApiResponseMock.mockResolvedValue({ data: { id: "role-1" } }); handleApiErrorMock.mockReturnValue({ error: "Unexpected error" }); fetchMock.mockResolvedValue( new Response(JSON.stringify({ data: { id: "role-1" } }), { status: 200, headers: { "Content-Type": "application/json" }, }), ); }); afterEach(() => { vi.unstubAllEnvs(); }); it("includes manage_alerts when creating a role in Prowler Cloud", async () => { // Given vi.stubEnv("UI_CLOUD_ENABLED", "true"); // When await addRole(makeRoleFormData()); // Then expect(lastRequestBody().data.attributes.manage_alerts).toBe(true); }); it("omits manage_alerts when creating a role outside Prowler Cloud", async () => { // Given vi.stubEnv("UI_CLOUD_ENABLED", "false"); // When await addRole(makeRoleFormData()); // Then expect(lastRequestBody().data.attributes).not.toHaveProperty( "manage_alerts", ); }); it("includes manage_alerts when updating a role in Prowler Cloud", async () => { // Given vi.stubEnv("UI_CLOUD_ENABLED", "true"); // When await updateRole(makeRoleFormData(), "role-1"); // Then expect(lastRequestBody().data.attributes.manage_alerts).toBe(true); }); it("includes manage_lighthouse_ai_configuration when creating a role in Prowler Cloud", async () => { // Given vi.stubEnv("UI_CLOUD_ENABLED", "true"); // When await addRole(makeRoleFormData()); // Then expect( lastRequestBody().data.attributes.manage_lighthouse_ai_configuration, ).toBe(true); }); it("omits manage_lighthouse_ai_configuration when creating a role outside Prowler Cloud", async () => { // Given vi.stubEnv("UI_CLOUD_ENABLED", "false"); // When await addRole(makeRoleFormData()); // Then expect(lastRequestBody().data.attributes).not.toHaveProperty( "manage_lighthouse_ai_configuration", ); }); it("includes manage_lighthouse_ai_configuration when updating a role in Prowler Cloud", async () => { // Given vi.stubEnv("UI_CLOUD_ENABLED", "true"); // When await updateRole(makeRoleFormData(), "role-1"); // Then expect( lastRequestBody().data.attributes.manage_lighthouse_ai_configuration, ).toBe(true); }); it("omits manage_lighthouse_ai_configuration when updating a role outside Prowler Cloud", async () => { // Given vi.stubEnv("UI_CLOUD_ENABLED", "false"); // When await updateRole(makeRoleFormData(), "role-1"); // Then expect(lastRequestBody().data.attributes).not.toHaveProperty( "manage_lighthouse_ai_configuration", ); }); });