tv-recommender-mcp-server
Version:
MCP server for TV show recommendations
159 lines (158 loc) • 6.83 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const axios_1 = __importDefault(require("axios"));
const details_1 = require("../../tools/details");
// 模拟 axios
jest.mock('axios');
const mockedAxios = axios_1.default;
describe('getShowDetails Tool', () => {
beforeEach(() => {
jest.clearAllMocks();
});
it('应该正确返回剧集详情', async () => {
// 模拟搜索结果
mockedAxios.get.mockImplementationOnce(() => Promise.resolve({
data: {
results: [
{
id: 123,
name: '西部世界',
first_air_date: '2016-10-02'
}
]
}
}));
// 模拟详情结果
mockedAxios.get.mockImplementationOnce(() => Promise.resolve({
data: {
id: 123,
name: '西部世界',
overview: '这是一部关于机器人的剧集',
first_air_date: '2016-10-02',
genres: [
{ id: 1, name: '科幻' },
{ id: 2, name: '西部' }
],
number_of_seasons: 4,
status: 'Canceled',
vote_average: 8.0,
credits: {
cast: [
{ name: '埃文·蕾切尔·伍德', order: 0 },
{ name: '坦迪·牛顿', order: 1 },
{ name: '杰弗里·怀特', order: 2 },
{ name: '詹姆斯·麦斯登', order: 3 },
{ name: '艾德·哈里斯', order: 4 }
]
}
}
}));
const result = await (0, details_1.getShowDetails)({ show_title: '西部世界' });
expect(result).toEqual({
title: '西部世界',
year: 2016,
rating: 8.0,
genres: ['科幻', '西部'],
overview: '这是一部关于机器人的剧集',
cast: ['埃文·蕾切尔·伍德', '坦迪·牛顿', '杰弗里·怀特', '詹姆斯·麦斯登', '艾德·哈里斯'],
numberOfSeasons: 4,
status: '已取消'
});
// 验证 API 调用
expect(mockedAxios.get).toHaveBeenCalledTimes(2);
expect(mockedAxios.get).toHaveBeenNthCalledWith(1, expect.stringContaining('/search/tv'), expect.anything());
expect(mockedAxios.get).toHaveBeenNthCalledWith(2, expect.stringContaining('/tv/123'), expect.anything());
});
it('应该处理找不到剧集的情况', async () => {
// 模拟空搜索结果
mockedAxios.get.mockImplementationOnce(() => Promise.resolve({
data: {
results: []
}
}));
const result = await (0, details_1.getShowDetails)({ show_title: '一部不存在的剧' });
expect(result).toBe('抱歉,未能找到您提供的剧集"一部不存在的剧"。');
// 验证只调用了搜索 API
expect(mockedAxios.get).toHaveBeenCalledTimes(1);
expect(mockedAxios.get).toHaveBeenCalledWith(expect.stringContaining('/search/tv'), expect.anything());
});
it('应该处理 API 调用失败的情况', async () => {
// 模拟 API 调用失败
mockedAxios.get.mockImplementationOnce(() => Promise.reject(new Error('API Error')));
const result = await (0, details_1.getShowDetails)({ show_title: '西部世界' });
expect(result).toBe('获取剧集信息时发生错误,请稍后再试。');
// 验证 API 调用
expect(mockedAxios.get).toHaveBeenCalledTimes(1);
});
it('应该正确映射剧集状态', async () => {
// 测试不同的状态映射
const statusTestCases = [
{ apiStatus: 'Ended', expectedStatus: '已完结' },
{ apiStatus: 'Returning Series', expectedStatus: '连载中' },
{ apiStatus: 'Canceled', expectedStatus: '已取消' },
{ apiStatus: 'In Production', expectedStatus: '制作中' },
{ apiStatus: 'Unknown Status', expectedStatus: '未知状态' }
];
for (const testCase of statusTestCases) {
jest.clearAllMocks();
// 模拟搜索结果
mockedAxios.get.mockImplementationOnce(() => Promise.resolve({
data: {
results: [{ id: 123, name: '测试剧集' }]
}
}));
// 模拟详情结果
mockedAxios.get.mockImplementationOnce(() => Promise.resolve({
data: {
id: 123,
name: '测试剧集',
overview: '测试简介',
first_air_date: '2020-01-01',
genres: [{ id: 1, name: '测试类型' }],
number_of_seasons: 1,
status: testCase.apiStatus,
vote_average: 8.0,
credits: { cast: [{ name: '测试演员', order: 0 }] }
}
}));
const result = await (0, details_1.getShowDetails)({ show_title: '测试剧集' });
expect(result).toHaveProperty('status', testCase.expectedStatus);
}
});
it('应该处理缺少首播日期的情况', async () => {
// 模拟搜索结果
mockedAxios.get.mockImplementationOnce(() => Promise.resolve({
data: {
results: [
{
id: 456,
name: '未公布日期的剧集'
}
]
}
}));
// 模拟详情结果,但没有first_air_date
mockedAxios.get.mockImplementationOnce(() => Promise.resolve({
data: {
id: 456,
name: '未公布日期的剧集',
overview: '这是一部尚未公布日期的剧集',
first_air_date: null, // 首播日期为空
genres: [{ id: 1, name: '科幻' }],
number_of_seasons: 1,
status: 'In Production',
vote_average: 7.5,
credits: {
cast: [{ name: '测试演员', order: 0 }]
}
}
}));
const result = await (0, details_1.getShowDetails)({ show_title: '未公布日期的剧集' });
// 验证结果,年份应该为null
expect(result).toHaveProperty('year', null);
expect(result).toHaveProperty('title', '未公布日期的剧集');
});
});