|
|
|
@ -1,18 +1,14 @@ |
|
|
|
import { beforeEach, describe, expect, it, vi } from "vitest"; |
|
|
|
import { render, screen } from "@testing-library/react"; |
|
|
|
import { NodeDetailsDialog } from "@components/Dialog/NodeDetailsDialog/NodeDetailsDialog.tsx"; |
|
|
|
import { useDevice } from "@core/stores/deviceStore.ts"; |
|
|
|
import { useAppStore } from "@core/stores/appStore.ts"; |
|
|
|
import { Protobuf } from "@meshtastic/core"; |
|
|
|
|
|
|
|
vi.mock("@core/stores/deviceStore", () => { |
|
|
|
return { |
|
|
|
useDevice: () => ({ |
|
|
|
setDialogOpen: vi.fn(), |
|
|
|
}), |
|
|
|
}; |
|
|
|
}); |
|
|
|
vi.mock("@core/stores/deviceStore"); |
|
|
|
vi.mock("@core/stores/appStore"); |
|
|
|
|
|
|
|
const mockUseDevice = vi.mocked(useDevice); |
|
|
|
const mockUseAppStore = vi.mocked(useAppStore); |
|
|
|
|
|
|
|
describe("NodeDetailsDialog", () => { |
|
|
|
@ -42,13 +38,22 @@ describe("NodeDetailsDialog", () => { |
|
|
|
beforeEach(() => { |
|
|
|
vi.resetAllMocks(); |
|
|
|
|
|
|
|
mockUseDevice.mockReturnValue({ |
|
|
|
getNode: (nodeNum: number) => { |
|
|
|
if (nodeNum === 1234) { |
|
|
|
return mockNode; |
|
|
|
} |
|
|
|
return undefined; |
|
|
|
}, |
|
|
|
}); |
|
|
|
|
|
|
|
mockUseAppStore.mockReturnValue({ |
|
|
|
nodeNumDetails: 1234, |
|
|
|
}); |
|
|
|
}); |
|
|
|
|
|
|
|
it("renders node details correctly", () => { |
|
|
|
render(<NodeDetailsDialog open node={mockNode} onOpenChange={() => {}} />); |
|
|
|
render(<NodeDetailsDialog open onOpenChange={() => {}} />); |
|
|
|
|
|
|
|
expect(screen.getByText(/Node Details for Test Node \(TN\)/i)) |
|
|
|
.toBeInTheDocument(); |
|
|
|
@ -78,10 +83,26 @@ describe("NodeDetailsDialog", () => { |
|
|
|
}); |
|
|
|
|
|
|
|
it("renders null if node is undefined", () => { |
|
|
|
const mockNode = undefined; |
|
|
|
const requestedNodeNum = 5678; |
|
|
|
|
|
|
|
mockUseAppStore.mockReturnValue({ |
|
|
|
nodeNumDetails: requestedNodeNum, |
|
|
|
}); |
|
|
|
|
|
|
|
mockUseDevice.mockReturnValue({ |
|
|
|
getNode: (nodeNum: number) => { |
|
|
|
if (nodeNum === requestedNodeNum) { |
|
|
|
return undefined; |
|
|
|
} |
|
|
|
if (nodeNum === 1234) { |
|
|
|
return mockNode; |
|
|
|
} |
|
|
|
return undefined; |
|
|
|
}, |
|
|
|
}); |
|
|
|
|
|
|
|
const { container } = render( |
|
|
|
<NodeDetailsDialog open node={mockNode} onOpenChange={() => {}} />, |
|
|
|
<NodeDetailsDialog open onOpenChange={() => {}} />, |
|
|
|
); |
|
|
|
|
|
|
|
expect(container.firstChild).toBeNull(); |
|
|
|
@ -90,14 +111,10 @@ describe("NodeDetailsDialog", () => { |
|
|
|
|
|
|
|
it("renders correctly when position is missing", () => { |
|
|
|
const nodeWithoutPosition = { ...mockNode, position: undefined }; |
|
|
|
mockUseDevice.mockReturnValue({ getNode: () => nodeWithoutPosition }); |
|
|
|
mockUseAppStore.mockReturnValue({ nodeNumDetails: 1234 }); |
|
|
|
|
|
|
|
render( |
|
|
|
<NodeDetailsDialog |
|
|
|
open |
|
|
|
node={nodeWithoutPosition} |
|
|
|
onOpenChange={() => {}} |
|
|
|
/>, |
|
|
|
); |
|
|
|
render(<NodeDetailsDialog open onOpenChange={() => {}} />); |
|
|
|
|
|
|
|
expect(screen.queryByText(/Coordinates:/i)).not.toBeInTheDocument(); |
|
|
|
expect(screen.queryByText(/Altitude:/i)).not.toBeInTheDocument(); |
|
|
|
@ -106,14 +123,10 @@ describe("NodeDetailsDialog", () => { |
|
|
|
|
|
|
|
it("renders correctly when deviceMetrics are missing", () => { |
|
|
|
const nodeWithoutMetrics = { ...mockNode, deviceMetrics: undefined }; |
|
|
|
mockUseDevice.mockReturnValue({ getNode: () => nodeWithoutMetrics }); |
|
|
|
mockUseAppStore.mockReturnValue({ nodeNumDetails: 1234 }); |
|
|
|
|
|
|
|
render( |
|
|
|
<NodeDetailsDialog |
|
|
|
open |
|
|
|
node={nodeWithoutMetrics} |
|
|
|
onOpenChange={() => {}} |
|
|
|
/>, |
|
|
|
); |
|
|
|
render(<NodeDetailsDialog open onOpenChange={() => {}} />); |
|
|
|
|
|
|
|
expect(screen.queryByText(/Device Metrics:/i)).not.toBeInTheDocument(); |
|
|
|
expect(screen.queryByText(/Air TX utilization:/i)).not.toBeInTheDocument(); |
|
|
|
@ -122,10 +135,10 @@ describe("NodeDetailsDialog", () => { |
|
|
|
|
|
|
|
it("renders 'Never' for lastHeard when timestamp is 0", () => { |
|
|
|
const nodeNeverHeard = { ...mockNode, lastHeard: 0 }; |
|
|
|
mockUseDevice.mockReturnValue({ getNode: () => nodeNeverHeard }); |
|
|
|
mockUseAppStore.mockReturnValue({ nodeNumDetails: 1234 }); |
|
|
|
|
|
|
|
render( |
|
|
|
<NodeDetailsDialog open node={nodeNeverHeard} onOpenChange={() => {}} />, |
|
|
|
); |
|
|
|
render(<NodeDetailsDialog open onOpenChange={() => {}} />); |
|
|
|
|
|
|
|
expect(screen.getByText(/Last Heard: Never/i)).toBeInTheDocument(); |
|
|
|
}); |
|
|
|
|