import { describe, expect, it } from "vitest"; import { ApiProtocolError, ApiRequestError, parseApiResponse } from "@/lib/api"; describe("unified API response parser", () => { it("returns data from a valid success envelope", () => { expect( parseApiResponse<{ items: string[] }>( { code: 200, msg: "success", data: { items: ["one"] } }, 200, ), ).toEqual({ items: ["one"] }); }); it("exposes structured fields from an API error envelope", () => { try { parseApiResponse( { code: 404, msg: "详情不存在", data: null, errorCode: "DETAIL_NOT_FOUND", details: { key: "missing" }, }, 404, ); throw new Error("expected API error"); } catch (error) { expect(error).toBeInstanceOf(ApiRequestError); expect((error as ApiRequestError).message).toBe("详情不存在"); expect((error as ApiRequestError).errorCode).toBe("DETAIL_NOT_FOUND"); expect((error as ApiRequestError).details).toEqual({ key: "missing" }); } }); it("rejects a malformed or mismatched envelope", () => { expect(() => parseApiResponse({ code: 200, msg: "success" }, 200)).toThrow(ApiProtocolError); expect(() => parseApiResponse({ code: 201, msg: "success", data: {} }, 200)).toThrow(ApiProtocolError); expect(() => parseApiResponse({ code: 200, msg: "ok", data: {} }, 200)).toThrow(ApiProtocolError); }); });