homeio
PublicForked from doctor-io/homeio
useTrashActions.test.tsx
/* @vitest-environment jsdom */
import { act, renderHook } from "@testing-library/react";
import { describe, expect, it, vi } from "vitest";
import {
useDeleteFromTrash,
useMoveToTrash,
useRestoreFromTrash,
} from "@/modules/files/hooks/useTrashActions";
import { createTestQueryClient, createWrapper } from "@/test/query-client-wrapper";
describe("useTrashActions", () => {
it("moves files to trash and invalidates files + trash queries", async () => {
const fetchMock = vi.fn().mockResolvedValueOnce({
ok: true,
json: async () => ({
data: {
trashPath: "Trash/notes.txt",
originalPath: "Documents/notes.txt",
},
}),
});
vi.stubGlobal("fetch", fetchMock);
const client = createTestQueryClient();
const invalidateSpy = vi.spyOn(client, "invalidateQueries");
const { result } = renderHook(() => useMoveToTrash(), {
wrapper: createWrapper(client),
});
await act(async () => {
await result.current.mutateAsync({
path: "Documents/notes.txt",
});
});
expect(invalidateSpy).toHaveBeenCalledWith({
queryKey: ["files", "list", "Documents"],
});
expect(invalidateSpy).toHaveBeenCalledWith({
queryKey: ["files", "list", "Trash"],
});
expect(invalidateSpy).toHaveBeenCalledWith({
queryKey: ["files", "trash", "entries", "Trash"],
});
});
it("restores from trash and invalidates destination listing", async () => {
const fetchMock = vi.fn().mockResolvedValueOnce({
ok: true,
json: async () => ({
data: {
restoredPath: "Documents/notes.txt",
sourceTrashPath: "Trash/notes.txt",
},
}),
});
vi.stubGlobal("fetch", fetchMock);
const client = createTestQueryClient();
const invalidateSpy = vi.spyOn(client, "invalidateQueries");
const { result } = renderHook(() => useRestoreFromTrash(), {
wrapper: createWrapper(client),
});
await act(async () => {
await result.current.mutateAsync({
path: "Trash/notes.txt",
collision: "keep-both",
});
});
expect(invalidateSpy).toHaveBeenCalledWith({
queryKey: ["files", "list", "Documents"],
});
});
it("deletes permanently and invalidates trash listing", async () => {
const fetchMock = vi.fn().mockResolvedValueOnce({
ok: true,
json: async () => ({
data: {
deleted: true,
path: "Trash/notes.txt",
},
}),
});
vi.stubGlobal("fetch", fetchMock);
const client = createTestQueryClient();
const invalidateSpy = vi.spyOn(client, "invalidateQueries");
const { result } = renderHook(() => useDeleteFromTrash(), {
wrapper: createWrapper(client),
});
await act(async () => {
await result.current.mutateAsync({
path: "Trash/notes.txt",
});
});
expect(invalidateSpy).toHaveBeenCalledWith({
queryKey: ["files", "list", "Trash"],
});
});
});