Files
wehub-resource-sync b3a7f98e5a
CI / E2E Cloudflare (4/8) (push) Failing after 0s
CI / E2E Cloudflare (8/8) (push) Failing after 1s
CI / Lint (push) Failing after 1s
Auto Extract / Extract (push) Failing after 4s
CI / Version Check (push) Failing after 9s
CI / Integration Tests (push) Failing after 1s
CI / E2E tests (1/8) (push) Failing after 1s
CI / E2E tests (2/8) (push) Failing after 2s
CI / E2E tests (3/8) (push) Failing after 2s
CI / Browser Tests (push) Failing after 1s
CI / E2E tests (5/8) (push) Failing after 1s
CI / E2E Cloudflare (2/8) (push) Failing after 2s
CI / Typecheck (push) Failing after 1s
CI / Changeset Validation (push) Failing after 2s
CI / E2E Cloudflare (5/8) (push) Failing after 1s
CI / E2E Cloudflare (6/8) (push) Failing after 1s
CI / E2E Cloudflare (7/8) (push) Failing after 1s
CodeQL / Analyze (javascript-typescript) (push) Failing after 1s
Format / Format (push) Failing after 0s
CodeQL / Analyze (actions) (push) Failing after 4s
CI / E2E tests (4/8) (push) Failing after 1s
CI / E2E tests (6/8) (push) Failing after 1s
CI / E2E tests (7/8) (push) Failing after 2s
CI / E2E tests (8/8) (push) Failing after 1s
CI / E2E Cloudflare (1/8) (push) Failing after 1s
CI / E2E Cloudflare (3/8) (push) Failing after 2s
Preview Releases / Publish Preview (push) Failing after 0s
zizmor / Run zizmor (push) Failing after 1s
Release / Release (push) Failing after 2s
CI / Smoke Tests (push) Failing after 5m36s
CI / Tests (push) Failing after 6m36s
Release / Sync Templates (push) Has been skipped
CI / E2E Tests (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:23:53 +08:00

72 lines
2.1 KiB
TypeScript

import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
import { apiFetch, fetchManifest } from "../../src/lib/api/client";
describe("apiFetch", () => {
let fetchSpy: ReturnType<typeof vi.fn>;
const originalFetch = globalThis.fetch;
beforeEach(() => {
fetchSpy = vi.fn().mockResolvedValue(new Response(JSON.stringify({}), { status: 200 }));
globalThis.fetch = fetchSpy;
});
afterEach(() => {
globalThis.fetch = originalFetch;
});
it("adds X-EmDash-Request header", async () => {
await apiFetch("/test");
expect(fetchSpy).toHaveBeenCalledOnce();
const [, init] = fetchSpy.mock.calls[0]!;
const headers = new Headers(init.headers);
expect(headers.get("X-EmDash-Request")).toBe("1");
});
it("preserves existing headers", async () => {
await apiFetch("/test", { headers: { "Content-Type": "application/json" } });
const [, init] = fetchSpy.mock.calls[0]!;
const headers = new Headers(init.headers);
expect(headers.get("Content-Type")).toBe("application/json");
expect(headers.get("X-EmDash-Request")).toBe("1");
});
it("passes through other init options", async () => {
await apiFetch("/test", { method: "POST", body: "data" });
const [, init] = fetchSpy.mock.calls[0]!;
expect(init.method).toBe("POST");
expect(init.body).toBe("data");
});
});
describe("fetchManifest", () => {
const originalFetch = globalThis.fetch;
afterEach(() => {
globalThis.fetch = originalFetch;
});
it("returns parsed manifest on success", async () => {
const manifest = {
version: "1.0",
collections: {},
plugins: {},
authMode: "passkey",
hash: "abc",
};
globalThis.fetch = vi
.fn()
.mockResolvedValue(new Response(JSON.stringify({ data: manifest }), { status: 200 }));
const result = await fetchManifest();
expect(result.version).toBe("1.0");
expect(result.authMode).toBe("passkey");
});
it("throws on non-ok response", async () => {
globalThis.fetch = vi
.fn()
.mockResolvedValue(new Response("", { status: 500, statusText: "Internal Server Error" }));
await expect(fetchManifest()).rejects.toThrow("Failed to fetch manifest");
});
});