import { describe, it, expect } from 'vitest';
import { createTestHarness } from './utils/testHarness.js';
import { setupMockApi } from './utils/mockApi.js';
/**
* MCPサーバー基本機能の統合テスト
*/
describe('MCPサーバー基本機能', () => {
setupMockApi();
describe('サーバー起動とツール一覧', () => {
it('MCPサーバーが正常に起動し、15個のツールが登録されている', async () => {
const harness = await createTestHarness();
try {
// ツール一覧を取得
const tools = await harness.client.listTools();
// 16個のツールが存在することを確認
expect(tools.tools).toHaveLength(16);
// 各ツール名を確認
const toolNames = tools.tools.map((tool) => tool.name);
// 認証ツール
expect(toolNames).toContain('verge_browser_login');
expect(toolNames).toContain('verge_login');
expect(toolNames).toContain('verge_get_current_user');
expect(toolNames).toContain('verge_update_user');
expect(toolNames).toContain('verge_logout');
// ブログ管理ツール
expect(toolNames).toContain('verge_list_blogs');
expect(toolNames).toContain('verge_get_blog');
expect(toolNames).toContain('verge_create_blog');
expect(toolNames).toContain('verge_update_blog');
expect(toolNames).toContain('verge_delete_blog');
// 記事管理ツール
expect(toolNames).toContain('verge_list_articles');
expect(toolNames).toContain('verge_get_article');
expect(toolNames).toContain('verge_create_article');
expect(toolNames).toContain('verge_update_article');
expect(toolNames).toContain('verge_publish_article');
expect(toolNames).toContain('verge_delete_article');
} finally {
await harness.close();
}
});
it('各ツールに正しいスキーマが定義されている', async () => {
const harness = await createTestHarness();
try {
const tools = await harness.client.listTools();
// verge_loginツールのスキーマを確認
const loginTool = tools.tools.find((t) => t.name === 'verge_login');
expect(loginTool).toBeDefined();
expect(loginTool!.inputSchema).toHaveProperty('required');
expect(loginTool!.inputSchema.required).toEqual(['email', 'password']);
// verge_create_articleツールのスキーマを確認
const createArticleTool = tools.tools.find(
(t) => t.name === 'verge_create_article'
);
expect(createArticleTool).toBeDefined();
expect(createArticleTool!.inputSchema).toHaveProperty('required');
expect(createArticleTool!.inputSchema.required).toContain('blog_id');
expect(createArticleTool!.inputSchema.required).toContain('title');
expect(createArticleTool!.inputSchema.required).toContain('content');
expect(createArticleTool!.inputSchema.required).toContain('slug');
} finally {
await harness.close();
}
});
});
describe('認証フロー', () => {
it('正しい認証情報でログインできる', async () => {
const harness = await createTestHarness();
try {
// ログインツールを実行
const result = await harness.client.callTool({
name: 'verge_login',
arguments: {
email: 'test@example.com',
password: 'password123',
},
});
// レスポンスを確認
expect(result.isError).toBeFalsy();
expect(result.content).toHaveLength(1);
expect(result.content[0].type).toBe('text');
const response = JSON.parse((result.content[0] as any).text);
expect(response.success).toBe(true);
expect(response.token).toBe('mock-jwt-token');
expect(response.user).toHaveProperty('email', 'test@example.com');
} finally {
await harness.close();
}
});
it('誤った認証情報でログインに失敗する', async () => {
const harness = await createTestHarness();
try {
// 誤ったパスワードでログイン
const result = await harness.client.callTool({
name: 'verge_login',
arguments: {
email: 'test@example.com',
password: 'wrong-password',
},
});
// エラーレスポンスを確認
expect(result.isError).toBe(true);
expect(result.content).toHaveLength(1);
const response = JSON.parse((result.content[0] as any).text);
expect(response.success).toBe(false);
expect(response.error).toContain('Invalid credentials');
} finally {
await harness.close();
}
});
it('ログイン後に現在のユーザー情報を取得できる', async () => {
const harness = await createTestHarness();
try {
// ログイン
await harness.client.callTool({
name: 'verge_login',
arguments: {
email: 'test@example.com',
password: 'password123',
},
});
// 現在のユーザー情報を取得
const result = await harness.client.callTool({
name: 'verge_get_current_user',
arguments: {},
});
// レスポンスを確認
expect(result.isError).toBeFalsy();
const response = JSON.parse((result.content[0] as any).text);
expect(response.success).toBe(true);
expect(response.user).toHaveProperty('email', 'test@example.com');
expect(response.user).toHaveProperty('name', 'Test User');
} finally {
await harness.close();
}
});
it('ログインせずにユーザー情報取得を試みるとエラーになる', async () => {
const harness = await createTestHarness();
try {
// ログインせずにユーザー情報を取得
const result = await harness.client.callTool({
name: 'verge_get_current_user',
arguments: {},
});
// エラーレスポンスを確認
expect(result.isError).toBe(true);
const response = JSON.parse((result.content[0] as any).text);
expect(response.success).toBe(false);
expect(response.error).toContain('No authentication token');
} finally {
await harness.close();
}
});
});
});