3 changed files with 103 additions and 36 deletions
@ -1,55 +1,102 @@ |
|||||
import { render, screen, fireEvent } from "@testing-library/react"; |
import { render, screen, fireEvent } from "@testing-library/react"; |
||||
import { beforeEach, describe, expect, it, Mock, vi } from "vitest"; |
import { beforeEach, describe, expect, it, vi, Mock } from "vitest"; |
||||
import { RefreshKeysDialog } from "./RefreshKeysDialog"; |
import { RefreshKeysDialog } from "./RefreshKeysDialog.tsx"; |
||||
import { useRefreshKeysDialog } from "./useRefreshKeysDialog.ts"; |
import { useRefreshKeysDialog } from "./useRefreshKeysDialog.ts"; |
||||
|
import { useMessageStore } from "@core/stores/messageStore.ts"; // Import for mocking
|
||||
|
import { useDevice } from "@core/stores/deviceStore.ts"; // Import for mocking
|
||||
|
import { Protobuf } from "@meshtastic/core"; |
||||
|
|
||||
|
|
||||
|
vi.mock("@core/stores/messageStore.ts", () => ({ |
||||
|
useMessageStore: vi.fn(), |
||||
|
})); |
||||
|
|
||||
|
const mockNodeWithError: Partial<Protobuf.Mesh.NodeInfo> = { |
||||
|
user: { longName: "Test Node Long", shortName: "TNL", id: 456 }, |
||||
|
}; |
||||
|
const mockNodes = new Map([[456, mockNodeWithError]]); |
||||
|
const mockNodeErrors = new Map([[123, { node: 456 }]]); |
||||
|
|
||||
|
vi.mock("@core/stores/deviceStore.ts", () => ({ |
||||
|
useDevice: vi.fn(), |
||||
|
})); |
||||
|
|
||||
|
const mockHandleCloseDialog = vi.fn(); |
||||
|
const mockHandleNodeRemove = vi.fn(); |
||||
vi.mock("./useRefreshKeysDialog.ts", () => ({ |
vi.mock("./useRefreshKeysDialog.ts", () => ({ |
||||
useRefreshKeysDialog: vi.fn(), |
useRefreshKeysDialog: vi.fn(() => ({ |
||||
|
handleCloseDialog: mockHandleCloseDialog, |
||||
|
handleNodeRemove: mockHandleNodeRemove, |
||||
|
})), |
||||
})); |
})); |
||||
|
|
||||
describe("RefreshKeysDialog Component", () => { |
describe("RefreshKeysDialog Component", () => { |
||||
let handleCloseDialogMock: Mock; |
|
||||
let handleNodeRemoveMock: Mock; |
|
||||
let onOpenChangeMock: Mock; |
let onOpenChangeMock: Mock; |
||||
|
|
||||
beforeEach(() => { |
beforeEach(() => { |
||||
handleCloseDialogMock = vi.fn(); |
vi.clearAllMocks(); |
||||
handleNodeRemoveMock = vi.fn(); |
|
||||
onOpenChangeMock = vi.fn(); |
onOpenChangeMock = vi.fn(); |
||||
|
|
||||
(useRefreshKeysDialog as Mock).mockReturnValue({ |
vi.mocked(useMessageStore).mockReturnValue({ activeChat: 123 }); |
||||
handleCloseDialog: handleCloseDialogMock, |
vi.mocked(useDevice).mockReturnValue({ |
||||
handleNodeRemove: handleNodeRemoveMock, |
nodeErrors: mockNodeErrors, |
||||
|
nodes: mockNodes, |
||||
|
}); |
||||
|
vi.mocked(useRefreshKeysDialog).mockReturnValue({ |
||||
|
handleCloseDialog: mockHandleCloseDialog, |
||||
|
handleNodeRemove: mockHandleNodeRemove, |
||||
}); |
}); |
||||
}); |
}); |
||||
|
|
||||
it("renders the dialog with correct content", () => { |
it("should render the dialog with dynamic content when open and data is available", () => { |
||||
render(<RefreshKeysDialog open={true} onOpenChange={onOpenChangeMock} />); |
render(<RefreshKeysDialog open onOpenChange={onOpenChangeMock} />); |
||||
expect(screen.getByText("Keys Mismatch")).toBeInTheDocument(); |
|
||||
expect(screen.getByText("Request New Keys")).toBeInTheDocument(); |
expect(screen.getByText(`Keys Mismatch - ${mockNodeWithError?.user?.longName}`)).toBeInTheDocument(); |
||||
expect(screen.getByText("Dismiss")).toBeInTheDocument(); |
expect(screen.getByText(new RegExp(`${mockNodeWithError?.user?.longName}.*${mockNodeWithError?.user?.shortName}`))).toBeInTheDocument(); |
||||
|
expect(screen.getByRole('button', { name: /request new keys/i })).toBeInTheDocument(); |
||||
|
expect(screen.getByRole('button', { name: /dismiss/i })).toBeInTheDocument(); |
||||
|
expect(screen.getByRole('button', { name: /Close/i })).toBeInTheDocument(); |
||||
}); |
}); |
||||
|
|
||||
it("calls handleNodeRemove when 'Request New Keys' button is clicked", () => { |
it("should call handleNodeRemove when 'Request New Keys' button is clicked", () => { |
||||
render(<RefreshKeysDialog open={true} onOpenChange={onOpenChangeMock} />); |
render(<RefreshKeysDialog open onOpenChange={onOpenChangeMock} />); |
||||
fireEvent.click(screen.getByText("Request New Keys")); |
fireEvent.click(screen.getByRole('button', { name: /request new keys/i })); |
||||
expect(handleNodeRemoveMock).toHaveBeenCalled(); |
expect(mockHandleNodeRemove).toHaveBeenCalledTimes(1); |
||||
}); |
}); |
||||
|
|
||||
it("calls handleCloseDialog when 'Dismiss' button is clicked", () => { |
it("should call handleCloseDialog when 'Dismiss' button is clicked", () => { |
||||
render(<RefreshKeysDialog open={true} onOpenChange={onOpenChangeMock} />); |
render(<RefreshKeysDialog open onOpenChange={onOpenChangeMock} />); |
||||
fireEvent.click(screen.getByText("Dismiss")); |
fireEvent.click(screen.getByRole('button', { name: /dismiss/i })); |
||||
expect(handleCloseDialogMock).toHaveBeenCalled(); |
expect(mockHandleCloseDialog).toHaveBeenCalledTimes(1); |
||||
}); |
}); |
||||
|
|
||||
it("calls onOpenChange when dialog close button is clicked", () => { |
it("should call handleCloseDialog when the explicit DialogClose button is clicked", () => { |
||||
render(<RefreshKeysDialog open={true} onOpenChange={onOpenChangeMock} />); |
render(<RefreshKeysDialog open onOpenChange={onOpenChangeMock} />); |
||||
fireEvent.click(screen.getByRole("button", { name: /close/i })); |
fireEvent.click(screen.getByRole('button', { name: /close/i })); // Use the aria-label
|
||||
expect(handleCloseDialogMock).toHaveBeenCalled(); |
expect(mockHandleCloseDialog).toHaveBeenCalledTimes(1); |
||||
}); |
}); |
||||
|
|
||||
it("does not render when open is false", () => { |
|
||||
|
it("should not render the dialog when open is false", () => { |
||||
render(<RefreshKeysDialog open={false} onOpenChange={onOpenChangeMock} />); |
render(<RefreshKeysDialog open={false} onOpenChange={onOpenChangeMock} />); |
||||
expect(screen.queryByText("Keys Mismatch")).not.toBeInTheDocument(); |
expect(screen.queryByRole("dialog")).not.toBeInTheDocument(); |
||||
|
}); |
||||
|
|
||||
|
it("should render null if nodeErrorNum is not found for activeChat", () => { |
||||
|
vi.mocked(useDevice).mockReturnValue({ |
||||
|
nodeErrors: new Map(), |
||||
|
nodes: mockNodes, |
||||
|
}); |
||||
|
const { container } = render(<RefreshKeysDialog open onOpenChange={onOpenChangeMock} />); |
||||
|
expect(container.firstChild).toBeNull(); |
||||
|
}); |
||||
|
|
||||
|
it("should render null if nodeWithError is not found for nodeErrorNum.node", () => { |
||||
|
vi.mocked(useDevice).mockReturnValue({ |
||||
|
nodeErrors: mockNodeErrors, |
||||
|
nodes: new Map(), |
||||
|
}); |
||||
|
const { container } = render(<RefreshKeysDialog open onOpenChange={onOpenChangeMock} />); |
||||
|
expect(container.firstChild).toBeNull(); |
||||
}); |
}); |
||||
}); |
}); |
||||
Loading…
Reference in new issue