Skip to main content
Glama

Scrapbox Cosense MCP Server

by worldnine
get-page.test.ts5.86 kB
import { handleGetPage } from '@/routes/handlers/get-page.js'; import * as cosense from '@/cosense.js'; // モックの設定 jest.mock('@/cosense.js'); const mockedCosense = cosense as jest.Mocked<typeof cosense>; describe('handleGetPage', () => { const mockProjectName = 'test-project'; const mockCosenseSid = 'test-sid'; const mockPageResponse = { id: 'page1', title: 'Test Page', lines: [ { id: 'line1', text: 'Line 1', userId: 'user1', created: 1700000000, updated: 1700000000 }, { id: 'line2', text: 'Line 2', userId: 'user2', created: 1700000000, updated: 1700000000 }, ], created: 1700000000, updated: 1700001000, links: ['Related Page'], relatedPages: { links1hop: [] }, user: { id: 'user1', name: 'testuser', displayName: 'Test User', photo: 'photo.jpg', }, lastUpdateUser: { id: 'user2', name: 'updateuser', displayName: 'Update User', photo: 'photo2.jpg', }, collaborators: [ { id: 'user3', name: 'collabuser', displayName: 'Collab User', photo: 'photo3.jpg', }, ], }; const mockReadablePageResponse = { title: 'Test Page', lines: mockPageResponse.lines, created: mockPageResponse.created, updated: mockPageResponse.updated, user: mockPageResponse.lastUpdateUser, // lastUpdateUserがcreated userとして扱われる lastUpdateUser: mockPageResponse.user, // userがlast editorとして扱われる collaborators: mockPageResponse.collaborators, links: mockPageResponse.links, }; beforeEach(() => { jest.clearAllMocks(); }); describe('正常ケース', () => { test('ページ情報が正常に取得されること', async () => { mockedCosense.getPage.mockResolvedValue(mockPageResponse); mockedCosense.toReadablePage.mockReturnValue(mockReadablePageResponse); const params = { pageTitle: 'Test Page' }; const result = await handleGetPage(mockProjectName, mockCosenseSid, params); expect(result.content).toHaveLength(1); expect(result.content[0]?.type).toBe('text'); expect(result.content[0]?.text).toContain('Title: Test Page'); expect(result.content[0]?.text).toContain('Line 1'); expect(result.content[0]?.text).toContain('Line 2'); expect(mockedCosense.getPage).toHaveBeenCalledWith( mockProjectName, 'Test Page', mockCosenseSid ); expect(mockedCosense.toReadablePage).toHaveBeenCalledWith(mockPageResponse); }); test('基本的な動作確認', async () => { mockedCosense.getPage.mockResolvedValue(mockPageResponse); mockedCosense.toReadablePage.mockReturnValue(mockReadablePageResponse); const params = { pageTitle: 'Simple Test' }; const result = await handleGetPage(mockProjectName, mockCosenseSid, params); expect(result.content[0]?.text).toContain('Title: Test Page'); }); test('オプショナルprojectNameパラメータが使用されること', async () => { mockedCosense.getPage.mockResolvedValue(mockPageResponse); mockedCosense.toReadablePage.mockReturnValue(mockReadablePageResponse); const params = { pageTitle: 'Test Page', projectName: 'custom-project' }; const result = await handleGetPage(mockProjectName, mockCosenseSid, params); // getPageが指定されたprojectNameで呼び出されることを確認 expect(mockedCosense.getPage).toHaveBeenCalledWith('custom-project', 'Test Page', mockCosenseSid); expect(result.content[0]?.text).toContain('Title: Test Page'); }); test('projectNameが未指定の場合はデフォルトプロジェクト名が使用されること', async () => { mockedCosense.getPage.mockResolvedValue(mockPageResponse); mockedCosense.toReadablePage.mockReturnValue(mockReadablePageResponse); const params = { pageTitle: 'Test Page' }; const result = await handleGetPage(mockProjectName, mockCosenseSid, params); // getPageがデフォルトprojectNameで呼び出されることを確認 expect(mockedCosense.getPage).toHaveBeenCalledWith(mockProjectName, 'Test Page', mockCosenseSid); expect(result.content[0]?.text).toContain('Title: Test Page'); }); }); describe('エラーケース', () => { test('ページが見つからない場合にエラーレスポンスを返すこと', async () => { mockedCosense.getPage.mockResolvedValue(null); const params = { pageTitle: 'Nonexistent Page' }; const result = await handleGetPage(mockProjectName, mockCosenseSid, params); expect(result.isError).toBe(true); expect(result.content[0]?.text).toContain('Page \"Nonexistent Page\" not found'); expect(result.content[0]?.text).toContain('Operation: get_page'); expect(result.content[0]?.text).toContain(`Project: ${mockProjectName}`); }); test('空のページタイトルが正しく処理されること', async () => { mockedCosense.getPage.mockResolvedValue(null); const params = { pageTitle: '' }; const result = await handleGetPage(mockProjectName, mockCosenseSid, params); expect(result.isError).toBe(true); expect(result.content[0]?.text).toContain('Page \"\" not found'); }); test('APIエラーが発生した場合にエラーレスポンスを返すこと', async () => { const errorMessage = 'API Error'; mockedCosense.getPage.mockRejectedValue(new Error(errorMessage)); const params = { pageTitle: 'Test Page' }; const result = await handleGetPage(mockProjectName, mockCosenseSid, params); expect(result.isError).toBe(true); expect(result.content[0]?.text).toContain('Error details:'); expect(result.content[0]?.text).toContain(errorMessage); }); }); });

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/worldnine/scrapbox-cosense-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server