tts-mcp
Version:
OpenAI Text to Speech APIを活用したコマンドラインツールとMCPサーバー
139 lines (138 loc) • 6.22 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const path_1 = __importDefault(require("path"));
const mock_fs_1 = __importDefault(require("mock-fs"));
const utils = __importStar(require("../src/utils"));
describe('utils', () => {
// テスト終了後に必ずmockFsをリストアする
afterEach(() => {
mock_fs_1.default.restore();
jest.restoreAllMocks();
});
describe('readTextFile', () => {
it('ファイルが存在する場合、内容を読み込む', async () => {
// ファイルシステムをモック化
(0, mock_fs_1.default)({
'test-file.txt': 'テストファイルの内容'
});
const content = await utils.readTextFile('test-file.txt');
expect(content).toBe('テストファイルの内容');
});
it('ファイルが存在しない場合、エラーをスロー', async () => {
(0, mock_fs_1.default)({}); // 空のファイルシステム
await expect(utils.readTextFile('non-existent.txt'))
.rejects
.toThrow('ファイルの読み込みに失敗しました');
});
});
describe('ensureOutputDirectory', () => {
it('ディレクトリが存在する場合、何もしない', async () => {
(0, mock_fs_1.default)({
'/existing/directory': {}
});
const consoleSpy = jest.spyOn(console, 'log');
await utils.ensureOutputDirectory('/existing/directory/file.txt');
expect(consoleSpy).not.toHaveBeenCalled();
});
it('ディレクトリが存在しない場合、作成する', async () => {
(0, mock_fs_1.default)({
'/existing': {}
});
const consoleSpy = jest.spyOn(console, 'log');
await utils.ensureOutputDirectory('/existing/new/directory/file.txt');
expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('ディレクトリを作成しました'));
});
});
describe('validateOptions', () => {
it('テキストとファイルの両方が欠けている場合、エラーをスロー', () => {
const options = {
output: 'output.mp3'
};
expect(() => utils.validateOptions(options))
.toThrow('テキスト(-t, --text)かファイル(-f, --file)のいずれかを指定してください');
});
it('速度が範囲外の場合、エラーをスロー', () => {
const optionsTooSlow = {
text: 'テスト',
speed: 0.1
};
const optionsTooFast = {
text: 'テスト',
speed: 5.0
};
expect(() => utils.validateOptions(optionsTooSlow))
.toThrow('速度(-s, --speed)は0.25〜4.0の範囲で指定してください');
expect(() => utils.validateOptions(optionsTooFast))
.toThrow('速度(-s, --speed)は0.25〜4.0の範囲で指定してください');
});
it('有効なオプションの場合、エラーをスローしない', () => {
const options = {
text: 'テスト',
speed: 1.5
};
expect(() => utils.validateOptions(options)).not.toThrow();
});
});
describe('getOutputPath', () => {
it('絶対パスで出力を指定した場合、そのパスを使用', () => {
const absolutePath = path_1.default.resolve('/absolute/path/output.mp3');
const options = {
output: absolutePath
};
expect(utils.getOutputPath(options)).toBe(absolutePath);
});
it('相対パスで出力を指定した場合、カレントディレクトリからの相対パスを使用', () => {
const options = {
output: 'relative/path/output.mp3'
};
const expected = path_1.default.join(process.cwd(), 'relative/path/output.mp3');
expect(utils.getOutputPath(options)).toBe(expected);
});
it('出力パスを指定しない場合、デフォルトのパスを生成', () => {
const originalDateNow = Date.now;
Date.now = jest.fn(() => 1234567890);
const options = {
format: 'mp3'
};
const expected = path_1.default.join(process.cwd(), 'output', 'speech_1234567890.mp3');
expect(utils.getOutputPath(options)).toBe(expected);
Date.now = originalDateNow;
});
});
});