2 changed files with 191 additions and 0 deletions
@ -0,0 +1,94 @@ |
|||||
|
import { act, renderHook } from "@testing-library/react"; |
||||
|
import { beforeEach, describe, expect, it, vi } from "vitest"; |
||||
|
import { useFavoriteNode } from "./useFavoriteNode.ts"; |
||||
|
import { Protobuf } from "@meshtastic/core"; |
||||
|
|
||||
|
const mockNode = { |
||||
|
num: 1234, |
||||
|
user: { |
||||
|
longName: "Test Node", |
||||
|
}, |
||||
|
isFavorite: true, |
||||
|
} as unknown | Protobuf.Mesh.NodeInfo; |
||||
|
|
||||
|
const mockUpdateFavorite = vi.fn(); |
||||
|
const mockGetNode = vi.fn(() => mockNode); |
||||
|
const mockToast = vi.fn(); |
||||
|
|
||||
|
vi.mock("@core/stores/deviceStore.ts", () => ({ |
||||
|
useDevice: () => ({ |
||||
|
updateFavorite: mockUpdateFavorite, |
||||
|
getNode: mockGetNode, |
||||
|
}), |
||||
|
})); |
||||
|
|
||||
|
vi.mock("@core/hooks/useToast.ts", () => ({ |
||||
|
useToast: () => ({ |
||||
|
toast: mockToast, |
||||
|
}), |
||||
|
})); |
||||
|
|
||||
|
describe("useFavoriteNode hook", () => { |
||||
|
beforeEach(() => { |
||||
|
vi.clearAllMocks(); |
||||
|
}); |
||||
|
|
||||
|
it("calls updateFavorite and shows correct toast", () => { |
||||
|
const { result } = renderHook(() => useFavoriteNode()); |
||||
|
|
||||
|
act(() => { |
||||
|
result.current.updateFavorite({ nodeNum: 1234, isFavorite: true }); |
||||
|
}); |
||||
|
|
||||
|
expect(mockUpdateFavorite).toHaveBeenCalledWith(1234, true); |
||||
|
expect(mockGetNode).toHaveBeenCalledWith(1234); |
||||
|
expect(mockToast).toHaveBeenCalledWith({ |
||||
|
title: "Added Test Node to favorites", |
||||
|
}); |
||||
|
}); |
||||
|
|
||||
|
it("handles removal case", () => { |
||||
|
const { result } = renderHook(() => useFavoriteNode()); |
||||
|
|
||||
|
act(() => { |
||||
|
result.current.updateFavorite({ nodeNum: 1234, isFavorite: false }); |
||||
|
}); |
||||
|
|
||||
|
expect(mockUpdateFavorite).toHaveBeenCalledWith(1234, false); |
||||
|
expect(mockGetNode).toHaveBeenCalledWith(1234); |
||||
|
expect(mockToast).toHaveBeenCalledWith({ |
||||
|
title: "Removed Test Node from favorites", |
||||
|
}); |
||||
|
}); |
||||
|
|
||||
|
it("falls back to 'node' if longName is missing", () => { |
||||
|
mockGetNode.mockReturnValueOnce({ |
||||
|
num: 5678, |
||||
|
user: {}, |
||||
|
}); // no longName
|
||||
|
|
||||
|
const { result } = renderHook(() => useFavoriteNode()); |
||||
|
|
||||
|
act(() => { |
||||
|
result.current.updateFavorite({ nodeNum: 5678, isFavorite: true }); |
||||
|
}); |
||||
|
|
||||
|
expect(mockToast).toHaveBeenCalledWith({ |
||||
|
title: "Added node to favorites", |
||||
|
}); |
||||
|
}); |
||||
|
|
||||
|
it("falls back to 'node' if getNode returns undefined", () => { |
||||
|
mockGetNode.mockReturnValueOnce(undefined); |
||||
|
|
||||
|
const { result } = renderHook(() => useFavoriteNode()); |
||||
|
|
||||
|
act(() => { |
||||
|
result.current.updateFavorite({ nodeNum: 9999, isFavorite: false }); |
||||
|
}); |
||||
|
|
||||
|
expect(mockToast).toHaveBeenCalledWith({ |
||||
|
title: "Removed node from favorites", |
||||
|
}); |
||||
|
}); |
||||
|
}); |
||||
@ -0,0 +1,97 @@ |
|||||
|
import { act, renderHook } from "@testing-library/react"; |
||||
|
import { beforeEach, describe, expect, it, vi } from "vitest"; |
||||
|
import { useIgnoreNode } from "./useIgnoreNode.ts"; |
||||
|
import { Protobuf } from "@meshtastic/core"; |
||||
|
|
||||
|
const mockNode = { |
||||
|
num: 1234, |
||||
|
user: { |
||||
|
longName: "Test Node", |
||||
|
}, |
||||
|
isIgnored: true, |
||||
|
} as unknown | Protobuf.Mesh.NodeInfo; |
||||
|
|
||||
|
const mockUpdateIgnore = vi.fn(); |
||||
|
const mockGetNode = vi.fn(() => mockNode); |
||||
|
const mockToast = vi.fn(); |
||||
|
|
||||
|
vi.mock("@core/stores/deviceStore.ts", () => ({ |
||||
|
useDevice: () => ({ |
||||
|
updateIgnored: mockUpdateIgnore, |
||||
|
getNode: mockGetNode, |
||||
|
}), |
||||
|
})); |
||||
|
|
||||
|
vi.mock("@core/hooks/useToast.ts", () => ({ |
||||
|
useToast: () => ({ |
||||
|
toast: mockToast, |
||||
|
}), |
||||
|
})); |
||||
|
|
||||
|
describe("useIgnoreNode hook", () => { |
||||
|
beforeEach(() => { |
||||
|
vi.clearAllMocks(); |
||||
|
}); |
||||
|
|
||||
|
it("calls updateIgnored and shows correct toast", () => { |
||||
|
const { result } = renderHook(() => useIgnoreNode()); |
||||
|
|
||||
|
act(() => { |
||||
|
result.current.updateIgnored({ nodeNum: 1234, isIgnored: true }); |
||||
|
}); |
||||
|
|
||||
|
expect(mockUpdateIgnore).toHaveBeenCalledWith(1234, true); |
||||
|
expect(mockGetNode).toHaveBeenCalledWith(1234); |
||||
|
expect(mockToast).toHaveBeenCalledWith({ |
||||
|
title: "Added Test Node to ignore list", |
||||
|
}); |
||||
|
}); |
||||
|
|
||||
|
it("handles removal case", () => { |
||||
|
const { result } = renderHook(() => useIgnoreNode()); |
||||
|
|
||||
|
act(() => { |
||||
|
result.current.updateIgnored({ |
||||
|
nodeNum: 1234, |
||||
|
isIgnored: false, |
||||
|
}); |
||||
|
}); |
||||
|
|
||||
|
expect(mockUpdateIgnore).toHaveBeenCalledWith(1234, false); |
||||
|
expect(mockGetNode).toHaveBeenCalledWith(1234); |
||||
|
expect(mockToast).toHaveBeenCalledWith({ |
||||
|
title: "Removed Test Node from ignore list", |
||||
|
}); |
||||
|
}); |
||||
|
|
||||
|
it("falls back to 'node' if longName is missing", () => { |
||||
|
mockGetNode.mockReturnValueOnce({ |
||||
|
num: 5678, |
||||
|
user: {}, |
||||
|
}); // no longName
|
||||
|
|
||||
|
const { result } = renderHook(() => useIgnoreNode()); |
||||
|
|
||||
|
act(() => { |
||||
|
result.current.updateIgnored({ nodeNum: 5678, isIgnored: true }); |
||||
|
}); |
||||
|
|
||||
|
expect(mockToast).toHaveBeenCalledWith({ |
||||
|
title: "Added node to ignore list", |
||||
|
}); |
||||
|
}); |
||||
|
|
||||
|
it("falls back to 'node' if getNode returns undefined", () => { |
||||
|
mockGetNode.mockReturnValueOnce(undefined); |
||||
|
|
||||
|
const { result } = renderHook(() => useIgnoreNode()); |
||||
|
|
||||
|
act(() => { |
||||
|
result.current.updateIgnored({ nodeNum: 9999, isIgnored: false }); |
||||
|
}); |
||||
|
|
||||
|
expect(mockToast).toHaveBeenCalledWith({ |
||||
|
title: "Removed node from ignore list", |
||||
|
}); |
||||
|
}); |
||||
|
}); |
||||
Loading…
Reference in new issue