homeio
PublikFork dari doctor-io/homeio
useStoreCatalog.test.tsx
/* @vitest-environment jsdom */
import { renderHook, waitFor } from "@testing-library/react";
import { describe, expect, it, vi } from "vitest";
import { useStoreCatalog } from "@/modules/apps/hooks/useStoreCatalog";
import { createTestQueryClient, createWrapper } from "@/test/query-client-wrapper";
describe("useStoreCatalog", () => {
it("loads the store catalog with query params", async () => {
const fetchMock = vi.fn().mockResolvedValue({
ok: true,
json: async () => ({
data: [
{
id: "plex",
name: "Plex",
description: "Media server",
platform: "Docker",
categories: ["Media"],
logoUrl: "https://cdn.example.com/plex.png",
repositoryUrl: "https://github.com/plex",
stackFile: "Apps/Plex/docker-compose.yml",
status: "not_installed",
webUiPort: null,
updateAvailable: false,
},
],
meta: {
count: 1,
categories: [
{
id: "media",
name: "Media",
description: "Media apps",
appCount: 1,
},
],
featuredAppIds: ["plex"],
recommendedAppIds: ["plex"],
sourcePath: "/DATA/AppStore/CasaOS-AppStore",
},
}),
});
vi.stubGlobal("fetch", fetchMock);
const client = createTestQueryClient();
const { result } = renderHook(
() =>
useStoreCatalog({
category: "Media",
search: "plex",
installedOnly: true,
updatesOnly: true,
}),
{
wrapper: createWrapper(client),
},
);
await waitFor(() => {
expect(result.current.isSuccess).toBe(true);
});
expect(result.current.data?.apps).toHaveLength(1);
expect(result.current.data?.categories[0]?.name).toBe("Media");
expect(fetchMock).toHaveBeenCalledWith(
"/api/v1/store/apps?category=Media&search=plex&installedOnly=true&updatesOnly=true",
{ cache: "no-store" },
);
});
it("returns error state when request fails", async () => {
vi.stubGlobal(
"fetch",
vi.fn().mockResolvedValue({
ok: false,
status: 500,
}),
);
const client = createTestQueryClient();
const { result } = renderHook(() => useStoreCatalog(), {
wrapper: createWrapper(client),
});
await waitFor(() => {
expect(result.current.isError).toBe(true);
});
expect((result.current.error as Error).message).toContain("Failed to fetch store catalog");
});
});