UNPKG

tv-recommender-mcp-server

Version:

MCP server for TV show recommendations

409 lines (408 loc) 19 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const tmdbClient_1 = require("../../services/tmdbClient"); // 模拟 axios 和 配置 jest.mock('axios'); jest.mock('../../utils/config', () => ({ tmdbApiKey: 'mock-api-key' })); // 直接模拟 tmdbClient 的方法 jest.spyOn(tmdbClient_1.tmdbClient, 'testConnection'); jest.spyOn(tmdbClient_1.tmdbClient, 'getConfiguration'); jest.spyOn(tmdbClient_1.tmdbClient, 'searchTvShow'); jest.spyOn(tmdbClient_1.tmdbClient, 'getTvGenres'); jest.spyOn(tmdbClient_1.tmdbClient, 'getRecommendationsByGenre'); jest.spyOn(tmdbClient_1.tmdbClient, 'searchTvShowByTitle'); jest.spyOn(tmdbClient_1.tmdbClient, 'getSimilarTvShows'); jest.spyOn(tmdbClient_1.tmdbClient, 'getTvShowWatchProviders'); jest.spyOn(tmdbClient_1.tmdbClient, 'discoverTvShows'); jest.spyOn(tmdbClient_1.tmdbClient, 'searchPerson'); jest.spyOn(tmdbClient_1.tmdbClient, 'searchKeyword'); jest.spyOn(tmdbClient_1.tmdbClient, 'getPersonDetails'); jest.spyOn(tmdbClient_1.tmdbClient, 'getNetworks'); jest.spyOn(tmdbClient_1.tmdbClient, 'getPersonTvCredits'); jest.spyOn(tmdbClient_1.tmdbClient, 'getTvShowReviews'); jest.spyOn(tmdbClient_1.tmdbClient, 'getPopularTvShows'); jest.spyOn(tmdbClient_1.tmdbClient, 'getTrendingTvShows'); jest.spyOn(tmdbClient_1.tmdbClient, 'getTvShowVideos'); describe('TMDbClient', () => { beforeEach(() => { jest.clearAllMocks(); }); describe('testConnection', () => { it('当API调用成功时应该返回true', async () => { // 模拟方法返回成功结果 tmdbClient_1.tmdbClient.testConnection.mockResolvedValueOnce(true); const result = await tmdbClient_1.tmdbClient.testConnection(); expect(result).toBe(true); expect(tmdbClient_1.tmdbClient.testConnection).toHaveBeenCalled(); }); it('当API调用失败时应该返回false', async () => { // 模拟方法返回失败结果 tmdbClient_1.tmdbClient.testConnection.mockResolvedValueOnce(false); const result = await tmdbClient_1.tmdbClient.testConnection(); expect(result).toBe(false); expect(tmdbClient_1.tmdbClient.testConnection).toHaveBeenCalled(); }); }); describe('getConfiguration', () => { it('应该返回配置数据', async () => { const mockData = { images: { base_url: 'http://example.com' } }; // 模拟方法返回配置数据 tmdbClient_1.tmdbClient.getConfiguration.mockResolvedValueOnce(mockData); const result = await tmdbClient_1.tmdbClient.getConfiguration(); expect(result).toEqual(mockData); expect(tmdbClient_1.tmdbClient.getConfiguration).toHaveBeenCalled(); }); it('当API调用失败时应该抛出错误', async () => { // 模拟方法抛出错误 tmdbClient_1.tmdbClient.getConfiguration.mockRejectedValueOnce(new Error('API Error')); await expect(tmdbClient_1.tmdbClient.getConfiguration()).rejects.toThrow('API Error'); }); }); describe('searchTvShow', () => { it('应该返回搜索结果', async () => { const mockData = { results: [{ id: 1, name: '测试剧集' }] }; // 模拟方法返回搜索结果 tmdbClient_1.tmdbClient.searchTvShow.mockResolvedValueOnce(mockData); const result = await tmdbClient_1.tmdbClient.searchTvShow('测试查询'); expect(result).toEqual(mockData); expect(tmdbClient_1.tmdbClient.searchTvShow).toHaveBeenCalledWith('测试查询'); }); it('当API调用失败时应该抛出错误', async () => { // 模拟方法抛出错误 tmdbClient_1.tmdbClient.searchTvShow.mockRejectedValueOnce(new Error('API Error')); await expect(tmdbClient_1.tmdbClient.searchTvShow('测试查询')).rejects.toThrow('API Error'); }); }); describe('getTvGenres', () => { it('应该返回电视剧类型列表', async () => { const mockData = { genres: [{ id: 1, name: '测试类型' }] }; // 模拟方法返回类型列表 tmdbClient_1.tmdbClient.getTvGenres.mockResolvedValueOnce(mockData); const result = await tmdbClient_1.tmdbClient.getTvGenres(); expect(result).toEqual(mockData); expect(tmdbClient_1.tmdbClient.getTvGenres).toHaveBeenCalled(); }); it('当API调用失败时应该抛出错误', async () => { // 模拟方法抛出错误 tmdbClient_1.tmdbClient.getTvGenres.mockRejectedValueOnce(new Error('API Error')); await expect(tmdbClient_1.tmdbClient.getTvGenres()).rejects.toThrow('API Error'); }); }); describe('searchTvShowByTitle', () => { it('应该返回搜索结果', async () => { const mockData = { results: [{ id: 66732, name: '测试剧集' }] }; // 模拟方法返回搜索结果 tmdbClient_1.tmdbClient.searchTvShowByTitle.mockResolvedValueOnce(mockData); const result = await tmdbClient_1.tmdbClient.searchTvShowByTitle('测试剧集'); expect(result).toEqual(mockData); expect(tmdbClient_1.tmdbClient.searchTvShowByTitle).toHaveBeenCalledWith('测试剧集'); }); }); describe('getSimilarTvShows', () => { it('应该返回相似剧集列表', async () => { const mockData = { results: [{ id: 1, name: '相似剧集' }] }; // 模拟方法返回相似剧集 tmdbClient_1.tmdbClient.getSimilarTvShows.mockResolvedValueOnce(mockData); const result = await tmdbClient_1.tmdbClient.getSimilarTvShows(66732); expect(result).toEqual(mockData); expect(tmdbClient_1.tmdbClient.getSimilarTvShows).toHaveBeenCalledWith(66732); }); }); describe('getRecommendationsByGenre', () => { it('应该返回按类型推荐的剧集列表', async () => { const mockData = { results: [{ id: 1, name: '推荐剧集' }] }; // 模拟方法返回推荐剧集 tmdbClient_1.tmdbClient.getRecommendationsByGenre.mockResolvedValueOnce(mockData); const result = await tmdbClient_1.tmdbClient.getRecommendationsByGenre(35); expect(result).toEqual(mockData); expect(tmdbClient_1.tmdbClient.getRecommendationsByGenre).toHaveBeenCalledWith(35); }); }); describe('getTvShowWatchProviders', () => { it('应该返回观看渠道信息', async () => { const mockData = { id: 123, results: { US: { link: 'https://example.com', flatrate: [{ provider_id: 8, provider_name: 'Netflix' }] } } }; // 模拟方法返回结果 tmdbClient_1.tmdbClient.getTvShowWatchProviders.mockResolvedValueOnce({ id: 123, results: { link: 'https://example.com', flatrate: [{ provider_id: 8, provider_name: 'Netflix' }] } }); const result = await tmdbClient_1.tmdbClient.getTvShowWatchProviders(123); expect(result).toHaveProperty('id', 123); expect(result).toHaveProperty('results'); expect(tmdbClient_1.tmdbClient.getTvShowWatchProviders).toHaveBeenCalledWith(123); }); it('应该支持自定义国家/地区代码', async () => { // 模拟方法返回结果 tmdbClient_1.tmdbClient.getTvShowWatchProviders.mockResolvedValueOnce({ id: 123, results: { link: 'https://example.cn', flatrate: [{ provider_id: 10, provider_name: 'iQiyi' }] } }); const result = await tmdbClient_1.tmdbClient.getTvShowWatchProviders(123, 'CN'); expect(tmdbClient_1.tmdbClient.getTvShowWatchProviders).toHaveBeenCalledWith(123, 'CN'); }); }); describe('discoverTvShows', () => { it('应该返回高级发现结果', async () => { const mockData = { page: 1, results: [{ id: 1, name: '发现剧集' }], total_pages: 10, total_results: 100 }; // 模拟方法返回结果 tmdbClient_1.tmdbClient.discoverTvShows.mockResolvedValueOnce(mockData); const result = await tmdbClient_1.tmdbClient.discoverTvShows({ with_genres: 28, sort_by: 'popularity.desc' }); expect(result).toEqual(mockData); expect(tmdbClient_1.tmdbClient.discoverTvShows).toHaveBeenCalledWith({ with_genres: 28, sort_by: 'popularity.desc' }); }); it('应该处理空参数调用', async () => { const mockData = { page: 1, results: [{ id: 2, name: '默认发现剧集' }] }; // 模拟方法返回结果 tmdbClient_1.tmdbClient.discoverTvShows.mockResolvedValueOnce(mockData); const result = await tmdbClient_1.tmdbClient.discoverTvShows(); expect(result).toEqual(mockData); expect(tmdbClient_1.tmdbClient.discoverTvShows).toHaveBeenCalledWith(); }); }); describe('searchPerson', () => { it('应该返回人物搜索结果', async () => { const mockData = { results: [{ id: 123, name: '汤姆·汉克斯' }] }; // 模拟方法返回结果 tmdbClient_1.tmdbClient.searchPerson.mockResolvedValueOnce(mockData); const result = await tmdbClient_1.tmdbClient.searchPerson('汤姆'); expect(result).toEqual(mockData); expect(tmdbClient_1.tmdbClient.searchPerson).toHaveBeenCalledWith('汤姆'); }); }); describe('searchKeyword', () => { it('应该返回关键词搜索结果', async () => { const mockData = { results: [{ id: 123, name: '超级英雄' }] }; // 模拟方法返回结果 tmdbClient_1.tmdbClient.searchKeyword.mockResolvedValueOnce(mockData); const result = await tmdbClient_1.tmdbClient.searchKeyword('英雄'); expect(result).toEqual(mockData); expect(tmdbClient_1.tmdbClient.searchKeyword).toHaveBeenCalledWith('英雄'); }); }); describe('getPersonDetails', () => { it('应该返回人物详细信息', async () => { const mockData = { id: 123, name: '汤姆·汉克斯', biography: '著名演员...', birthday: '1956-07-09' }; // 模拟方法返回结果 tmdbClient_1.tmdbClient.getPersonDetails.mockResolvedValueOnce(mockData); const result = await tmdbClient_1.tmdbClient.getPersonDetails(123); expect(result).toEqual(mockData); expect(tmdbClient_1.tmdbClient.getPersonDetails).toHaveBeenCalledWith(123); }); }); describe('getNetworks', () => { it('应该返回电视网络列表', async () => { const mockData = { results: [ { provider_id: 8, provider_name: 'Netflix' }, { provider_id: 9, provider_name: 'HBO' } ] }; // 模拟方法返回结果 tmdbClient_1.tmdbClient.getNetworks.mockResolvedValueOnce(mockData); const result = await tmdbClient_1.tmdbClient.getNetworks(); expect(result).toEqual(mockData); expect(tmdbClient_1.tmdbClient.getNetworks).toHaveBeenCalled(); }); }); describe('getPersonTvCredits', () => { it('应该返回人物的电视剧作品', async () => { const mockData = { id: 123, cast: [ { id: 1, name: '剧集1', character: '角色1' }, { id: 2, name: '剧集2', character: '角色2' } ], crew: [ { id: 3, name: '剧集3', job: '导演' } ] }; // 模拟方法返回结果 tmdbClient_1.tmdbClient.getPersonTvCredits.mockResolvedValueOnce(mockData); const result = await tmdbClient_1.tmdbClient.getPersonTvCredits(123); expect(result).toEqual(mockData); expect(tmdbClient_1.tmdbClient.getPersonTvCredits).toHaveBeenCalledWith(123); }); }); describe('getTvShowReviews', () => { it('应该返回剧集评论', async () => { const mockData = { id: 123, page: 1, results: [ { id: 'abc123', author: '用户1', content: '很棒的剧集!' }, { id: 'def456', author: '用户2', content: '值得推荐.' } ], total_pages: 1, total_results: 2 }; // 模拟方法返回结果 tmdbClient_1.tmdbClient.getTvShowReviews.mockResolvedValueOnce(mockData); const result = await tmdbClient_1.tmdbClient.getTvShowReviews(123); expect(result).toEqual(mockData); expect(tmdbClient_1.tmdbClient.getTvShowReviews).toHaveBeenCalledWith(123); }); it('应该支持分页', async () => { const mockData = { id: 123, page: 2, results: [ { id: 'ghi789', author: '用户3', content: '很精彩!' } ], total_pages: 2, total_results: 3 }; // 模拟方法返回结果 tmdbClient_1.tmdbClient.getTvShowReviews.mockResolvedValueOnce(mockData); const result = await tmdbClient_1.tmdbClient.getTvShowReviews(123, 2); expect(result).toEqual(mockData); expect(tmdbClient_1.tmdbClient.getTvShowReviews).toHaveBeenCalledWith(123, 2); }); }); describe('getPopularTvShows', () => { it('应该返回热门剧集', async () => { const mockData = { page: 1, results: [ { id: 1, name: '热门剧集1' }, { id: 2, name: '热门剧集2' } ], total_pages: 10, total_results: 200 }; // 模拟方法返回结果 tmdbClient_1.tmdbClient.getPopularTvShows.mockResolvedValueOnce(mockData); const result = await tmdbClient_1.tmdbClient.getPopularTvShows(); expect(result).toEqual(mockData); expect(tmdbClient_1.tmdbClient.getPopularTvShows).toHaveBeenCalled(); }); it('应该支持分页', async () => { const mockData = { page: 2, results: [ { id: 3, name: '热门剧集3' }, { id: 4, name: '热门剧集4' } ], total_pages: 10, total_results: 200 }; // 模拟方法返回结果 tmdbClient_1.tmdbClient.getPopularTvShows.mockResolvedValueOnce(mockData); const result = await tmdbClient_1.tmdbClient.getPopularTvShows(2); expect(result).toEqual(mockData); expect(tmdbClient_1.tmdbClient.getPopularTvShows).toHaveBeenCalledWith(2); }); }); describe('getTrendingTvShows', () => { it('应该返回周趋势剧集(默认)', async () => { const mockData = { page: 1, results: [ { id: 1, name: '周趋势剧集1' }, { id: 2, name: '周趋势剧集2' } ], total_pages: 5, total_results: 100 }; // 模拟方法返回结果 tmdbClient_1.tmdbClient.getTrendingTvShows.mockResolvedValueOnce(mockData); const result = await tmdbClient_1.tmdbClient.getTrendingTvShows(); expect(result).toEqual(mockData); expect(tmdbClient_1.tmdbClient.getTrendingTvShows).toHaveBeenCalled(); }); it('应该返回日趋势剧集', async () => { const mockData = { page: 1, results: [ { id: 3, name: '日趋势剧集1' }, { id: 4, name: '日趋势剧集2' } ], total_pages: 3, total_results: 50 }; // 模拟方法返回结果 tmdbClient_1.tmdbClient.getTrendingTvShows.mockResolvedValueOnce(mockData); const result = await tmdbClient_1.tmdbClient.getTrendingTvShows('day'); expect(result).toEqual(mockData); expect(tmdbClient_1.tmdbClient.getTrendingTvShows).toHaveBeenCalledWith('day'); }); it('应该支持分页', async () => { const mockData = { page: 2, results: [ { id: 5, name: '周趋势剧集3' }, { id: 6, name: '周趋势剧集4' } ], total_pages: 5, total_results: 100 }; // 模拟方法返回结果 tmdbClient_1.tmdbClient.getTrendingTvShows.mockResolvedValueOnce(mockData); const result = await tmdbClient_1.tmdbClient.getTrendingTvShows('week', 2); expect(result).toEqual(mockData); expect(tmdbClient_1.tmdbClient.getTrendingTvShows).toHaveBeenCalledWith('week', 2); }); }); describe('getTvShowVideos', () => { it('应该返回剧集视频列表', async () => { const mockData = { id: 123, results: [ { id: 'v1', key: 'abc123', name: '预告片', site: 'YouTube', type: 'Trailer', official: true }, { id: 'v2', key: 'def456', name: '花絮', site: 'Vimeo', type: 'Featurette', official: false } ] }; // 模拟方法返回结果 tmdbClient_1.tmdbClient.getTvShowVideos.mockResolvedValueOnce(mockData); const result = await tmdbClient_1.tmdbClient.getTvShowVideos(123); expect(result).toEqual(mockData); expect(tmdbClient_1.tmdbClient.getTvShowVideos).toHaveBeenCalledWith(123); }); }); });