tts-mcp
Version:
OpenAI Text to Speech APIを活用したコマンドラインツールとMCPサーバー
115 lines (114 loc) • 4.77 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const sinon_1 = __importDefault(require("sinon"));
const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
const fs_1 = require("fs");
const openai_1 = require("openai");
const mcp_server_1 = require("../src/mcp-server");
// モック設定
jest.mock('@modelcontextprotocol/sdk/server/mcp.js');
jest.mock('@modelcontextprotocol/sdk/server/stdio.js');
jest.mock('openai');
jest.mock('play-sound', () => {
return () => ({
play: jest.fn((file, cb) => cb(null))
});
});
// fsのモック
jest.mock('fs', () => {
const originalFs = jest.requireActual('fs');
return {
...originalFs,
promises: {
...originalFs.promises,
appendFile: jest.fn().mockResolvedValue(undefined),
writeFile: jest.fn().mockResolvedValue(undefined),
unlink: jest.fn().mockResolvedValue(undefined)
}
};
});
describe('mcp-server', () => {
let mockServerInstance;
let mockTransportInstance;
let consoleErrorSpy;
let stderrWriteSpy;
beforeEach(() => {
// コンソール出力とstderrをモック化
consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation();
stderrWriteSpy = jest.spyOn(process.stderr, 'write').mockImplementation();
// McpServerのモックインスタンス
mockServerInstance = {
tool: jest.fn().mockReturnThis(),
connect: jest.fn().mockResolvedValue(undefined)
};
mcp_js_1.McpServer.mockImplementation(() => mockServerInstance);
// StdioServerTransportのモックインスタンス
mockTransportInstance = {};
stdio_js_1.StdioServerTransport.mockImplementation(() => mockTransportInstance);
// OpenAIのモック
const mockArrayBuffer = new Uint8Array([1, 2, 3, 4]).buffer;
const mockSpeechResponse = {
arrayBuffer: jest.fn().mockResolvedValue(mockArrayBuffer)
};
const mockOpenAIInstance = {
audio: {
speech: {
create: jest.fn().mockResolvedValue(mockSpeechResponse)
}
}
};
openai_1.OpenAI.mockImplementation(() => mockOpenAIInstance);
// モックをリセット
jest.clearAllMocks();
});
afterEach(() => {
// モックをリストア
consoleErrorSpy.mockRestore();
stderrWriteSpy.mockRestore();
jest.restoreAllMocks();
sinon_1.default.restore();
});
describe('startMcpServer', () => {
it('有効な設定でMCPサーバーを開始する', async () => {
// テスト設定
const config = {
model: 'tts-1',
voice: 'alloy',
format: 'mp3',
apiKey: 'test_api_key'
};
// サーバー起動
await (0, mcp_server_1.startMcpServer)(config);
// stderrに設定情報が出力されたか検証
expect(stderrWriteSpy).toHaveBeenCalledWith(expect.stringContaining('モデル=tts-1'));
// McpServerが正しく初期化されたか検証
expect(mcp_js_1.McpServer).toHaveBeenCalledWith({
name: "tts-mcp",
version: "1.1.0",
capabilities: { tools: {} }
});
// toolメソッドが呼ばれたか検証
expect(mockServerInstance.tool).toHaveBeenCalledWith("text-to-speech", expect.any(String), // Description string now included
expect.any(Object), expect.any(Function));
// connectメソッドが呼ばれたか検証
expect(mockServerInstance.connect).toHaveBeenCalledWith(mockTransportInstance);
// ログが記録されたか検証
expect(fs_1.promises.appendFile).toHaveBeenCalled();
});
it('APIキーがない場合エラーをスロー', () => {
// エラー処理の検証
const mockLog = jest.spyOn(process.stderr, 'write');
mockLog.mockImplementation(() => true);
expect(() => {
(0, mcp_server_1.initializeClient)('');
}).toThrow();
mockLog.mockRestore();
});
});
// text-to-speech機能のテストは複雑なため、ここではMcpServerのtoolメソッドが
// 正しく呼ばれることだけを検証します。実際の機能テストは別途行う必要があります。
});