You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
151 lines
4.0 KiB
151 lines
4.0 KiB
import { afterEach, beforeEach, describe, expect, it, Mock, vi } from "vitest";
|
|
import { renderHook } from "@testing-library/react";
|
|
import {
|
|
UNSAFE_ROLES,
|
|
useUnsafeRolesDialog,
|
|
} from "@components/Dialog/UnsafeRolesDialog/useUnsafeRolesDialog.ts";
|
|
import { eventBus } from "@core/utils/eventBus.ts";
|
|
|
|
vi.mock("@core/utils/eventBus", () => ({
|
|
eventBus: {
|
|
on: vi.fn(),
|
|
off: vi.fn(),
|
|
emit: vi.fn(),
|
|
},
|
|
}));
|
|
|
|
const mockDevice = {
|
|
setDialogOpen: vi.fn(),
|
|
};
|
|
|
|
vi.mock("@core/stores/deviceStore", () => ({
|
|
useDevice: () => ({
|
|
setDialogOpen: mockDevice.setDialogOpen,
|
|
}),
|
|
}));
|
|
|
|
describe("useUnsafeRolesDialog", () => {
|
|
beforeEach(() => {
|
|
vi.resetAllMocks();
|
|
});
|
|
|
|
afterEach(() => {
|
|
vi.clearAllMocks();
|
|
});
|
|
|
|
const renderUnsafeRolesHook = () => {
|
|
return renderHook(() => useUnsafeRolesDialog());
|
|
};
|
|
|
|
describe("handleCloseDialog", () => {
|
|
it("should call setDialogOpen with correct parameters when dialog is closed", () => {
|
|
const { result } = renderUnsafeRolesHook();
|
|
|
|
result.current.handleCloseDialog();
|
|
|
|
expect(mockDevice.setDialogOpen).toHaveBeenCalledWith(
|
|
"unsafeRoles",
|
|
false,
|
|
);
|
|
});
|
|
});
|
|
|
|
describe("validateRoleSelection", () => {
|
|
it("should resolve with true for safe roles without opening dialog", async () => {
|
|
const { result } = renderUnsafeRolesHook();
|
|
const safeRole = "SAFE_ROLE";
|
|
|
|
const validationResult = await result.current.validateRoleSelection(
|
|
safeRole,
|
|
);
|
|
|
|
expect(validationResult).toBe(true);
|
|
expect(mockDevice.setDialogOpen).not.toHaveBeenCalled();
|
|
});
|
|
|
|
it("should open dialog for unsafe roles and resolve with true when confirmed", async () => {
|
|
const { result } = renderUnsafeRolesHook();
|
|
|
|
const validationPromise = result.current.validateRoleSelection(
|
|
UNSAFE_ROLES[0],
|
|
);
|
|
|
|
expect(mockDevice.setDialogOpen).toHaveBeenCalledWith(
|
|
"unsafeRoles",
|
|
true,
|
|
);
|
|
expect(eventBus.on).toHaveBeenCalledWith(
|
|
"dialog:unsafeRoles",
|
|
expect.any(Function),
|
|
);
|
|
|
|
const onHandler = (eventBus.on as Mock).mock.calls[0][1];
|
|
onHandler({ action: "confirm" });
|
|
const validationResult = await validationPromise;
|
|
|
|
expect(validationResult).toBe(true);
|
|
expect(eventBus.off).toHaveBeenCalledWith(
|
|
"dialog:unsafeRoles",
|
|
onHandler,
|
|
);
|
|
});
|
|
|
|
it("should resolve with false when user dismisses the dialog", async () => {
|
|
const { result } = renderUnsafeRolesHook();
|
|
const validationPromise = result.current.validateRoleSelection(
|
|
UNSAFE_ROLES[0],
|
|
);
|
|
const onHandler = (eventBus.on as Mock).mock.calls[0][1];
|
|
onHandler({ action: "dismiss" });
|
|
|
|
const validationResult = await validationPromise;
|
|
expect(validationResult).toBe(false);
|
|
expect(eventBus.off).toHaveBeenCalledWith(
|
|
"dialog:unsafeRoles",
|
|
onHandler,
|
|
);
|
|
});
|
|
|
|
it("should clean up event listener after response", async () => {
|
|
const { result } = renderUnsafeRolesHook();
|
|
|
|
const validationPromise = result.current.validateRoleSelection(
|
|
UNSAFE_ROLES[1],
|
|
);
|
|
const onHandler = (eventBus.on as Mock).mock.calls[0][1];
|
|
|
|
onHandler({ action: "confirm" });
|
|
await validationPromise;
|
|
|
|
expect(eventBus.off).toHaveBeenCalledWith(
|
|
"dialog:unsafeRoles",
|
|
onHandler,
|
|
);
|
|
});
|
|
});
|
|
|
|
it("should work with all unsafe roles", async () => {
|
|
const { result } = renderUnsafeRolesHook();
|
|
|
|
for (const unsafeRole of UNSAFE_ROLES) {
|
|
mockDevice.setDialogOpen.mockClear();
|
|
(eventBus.on as Mock).mockClear();
|
|
|
|
const validationPromise = result.current.validateRoleSelection(
|
|
unsafeRole,
|
|
);
|
|
|
|
expect(mockDevice.setDialogOpen).toHaveBeenCalledWith(
|
|
"unsafeRoles",
|
|
true,
|
|
);
|
|
|
|
const onHandler = (eventBus.on as Mock).mock.calls[0][1];
|
|
onHandler({ action: "confirm" });
|
|
|
|
const validationResult = await validationPromise;
|
|
|
|
expect(validationResult).toBe(true);
|
|
}
|
|
});
|
|
});
|
|
|