import { describe, it, expect, vi, beforeEach } from "vitest"; import { createRequest, parseJsonResponse } from "@/__tests__/helpers/api-test-utils"; import { ApiError } from "@/lib/api"; vi.mock("@/lib/ai", () => ({ suggestAlternativeItems: vi.fn(), })); vi.mock("@/lib/amap", () => ({ searchPois: vi.fn(), })); vi.mock("@/lib/auth", () => ({ getAuthUserId: vi.fn(), })); import { POST } from "./route"; import { suggestAlternativeItems } from "@/lib/ai"; import { searchPois } from "@/lib/amap"; import { getAuthUserId } from "@/lib/auth"; const mockSuggestAlternativeItems = vi.mocked(suggestAlternativeItems); const mockSearchPois = vi.mocked(searchPois); const mockGetAuthUserId = vi.mocked(getAuthUserId); const mockCtx = { params: Promise.resolve({}) }; beforeEach(() => { vi.clearAllMocks(); }); describe("POST /api/blindbox/plan/suggest-item", () => { it("returns 401 when not authenticated", async () => { mockGetAuthUserId.mockRejectedValue(new ApiError("请先登录", 401)); const req = createRequest("/api/blindbox/plan/suggest-item", { method: "POST", body: { activity: "看展" }, }); const res = await POST(req, mockCtx); expect(res.status).toBe(401); }); it("returns mapped suggestions for authenticated user", async () => { mockGetAuthUserId.mockResolvedValue("user-1"); mockSuggestAlternativeItems.mockResolvedValue([ { activity: "看展", searchQuery: "上海博物馆", reason: "交通方便", }, ]); mockSearchPois.mockResolvedValue([ { name: "上海博物馆", address: "黄浦区人民大道201号", lat: 31.2301, lng: 121.4737, }, ]); const req = createRequest("/api/blindbox/plan/suggest-item", { method: "POST", body: { activity: "文艺活动", time: "14:00", location: "121.47,31.23", }, }); const res = await POST(req, mockCtx); const { status, data } = await parseJsonResponse(res); expect(status).toBe(200); expect(data.suggestions).toHaveLength(1); expect(data.suggestions[0]).toMatchObject({ activity: "看展", poi: "上海博物馆", address: "黄浦区人民大道201号", lat: 31.2301, lng: 121.4737, reason: "交通方便", }); }); });