84 lines
2.3 KiB
TypeScript
84 lines
2.3 KiB
TypeScript
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: "交通方便",
|
|
});
|
|
});
|
|
});
|