import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
import { InMemoryTransport } from '@modelcontextprotocol/sdk/inMemory.js';
import { createPlumeServer } from '../../src/server.js';
import { VergeApiClient } from '../../src/client/api.js';
import { AuthManager } from '../../src/auth/index.js';
describe('verge_logout ツール', () => {
let client: Client;
let server: ReturnType<typeof createPlumeServer>;
let mockApiClient: Partial<VergeApiClient>;
let mockAuthManager: Partial<AuthManager>;
beforeEach(async () => {
// モックAPIクライアント
mockApiClient = {
login: vi.fn(),
getCurrentUser: vi.fn(),
setToken: vi.fn(),
};
// モックAuthManager
mockAuthManager = {
logout: vi.fn().mockResolvedValue(undefined),
};
// サーバーを作成(AuthManagerを渡す)
server = createPlumeServer(
mockApiClient as VergeApiClient,
mockAuthManager as AuthManager
);
// InMemoryTransportでクライアント/サーバーを接続
const [clientTransport, serverTransport] =
InMemoryTransport.createLinkedPair();
await server.connect(serverTransport);
client = new Client(
{
name: 'test-client',
version: '1.0.0',
},
{
capabilities: {},
}
);
await client.connect(clientTransport);
});
afterEach(async () => {
await client.close();
await server.close();
});
it('ログアウトが成功する', async () => {
const result = await client.callTool({
name: 'verge_logout',
arguments: {},
});
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.message).toBe('ログアウトしました。保存されたトークンを削除しました。');
expect(mockAuthManager.logout).toHaveBeenCalledTimes(1);
});
it('ログアウト時にエラーが発生した場合、適切なエラーを返す', async () => {
// AuthManager.logoutがエラーをスローするようにモック
(mockAuthManager.logout as ReturnType<typeof vi.fn>).mockRejectedValueOnce(
new Error('Failed to delete token')
);
const result = await client.callTool({
name: 'verge_logout',
arguments: {},
});
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).toBe('Failed to delete token');
});
});
describe('verge_logout ツール - AuthManager未設定時', () => {
let client: Client;
let server: ReturnType<typeof createPlumeServer>;
let mockApiClient: Partial<VergeApiClient>;
beforeEach(async () => {
// モックAPIクライアント
mockApiClient = {
login: vi.fn(),
getCurrentUser: vi.fn(),
setToken: vi.fn(),
};
// サーバーを作成(AuthManagerを渡さない)
server = createPlumeServer(mockApiClient as VergeApiClient);
// InMemoryTransportでクライアント/サーバーを接続
const [clientTransport, serverTransport] =
InMemoryTransport.createLinkedPair();
await server.connect(serverTransport);
client = new Client(
{
name: 'test-client',
version: '1.0.0',
},
{
capabilities: {},
}
);
await client.connect(clientTransport);
});
afterEach(async () => {
await client.close();
await server.close();
});
it('AuthManagerが設定されていない場合はエラーを返す', async () => {
const result = await client.callTool({
name: 'verge_logout',
arguments: {},
});
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).toBe('AuthManager is not configured');
});
});