import { describe, it, expect, beforeEach, vi } from 'vitest';
import { VergeApiClient } from '../../src/client/api';
import { handleLogin, handleGetCurrentUser, handleUpdateUser } from '../../src/tools/auth';
describe('認証ツール', () => {
let apiClient: VergeApiClient;
beforeEach(() => {
apiClient = new VergeApiClient('https://api.example.com');
});
// ============================================================
// handleLogin
// ============================================================
describe('handleLogin', () => {
it('正常系: ログインに成功してトークンとユーザー情報を返す', async () => {
const mockResponse = {
token: 'mock-jwt-token',
user: {
id: 1,
email: 'test@example.com',
name: 'Test User',
role: 'admin' as const,
password_change_required: false,
created_at: '2024-01-01T00:00:00.000Z',
},
};
// APIクライアントのloginメソッドをモック
vi.spyOn(apiClient, 'login').mockResolvedValueOnce(mockResponse);
const input = {
email: 'test@example.com',
password: 'password123',
};
const result = await handleLogin(input, apiClient);
expect(apiClient.login).toHaveBeenCalledWith('test@example.com', 'password123');
expect(result.content).toHaveLength(1);
expect(result.content[0].type).toBe('text');
const parsedContent = JSON.parse(result.content[0].text);
expect(parsedContent.success).toBe(true);
expect(parsedContent.message).toBe('ログインに成功しました');
expect(parsedContent.token).toBe('mock-jwt-token');
expect(parsedContent.user).toEqual({
id: 1,
email: 'test@example.com',
name: 'Test User',
role: 'admin',
});
});
it('異常系: ログインに失敗した場合はエラーを返す', async () => {
vi.spyOn(apiClient, 'login').mockRejectedValueOnce(new Error('Invalid credentials'));
const input = {
email: 'test@example.com',
password: 'wrong-password',
};
const result = await handleLogin(input, apiClient);
expect(result.isError).toBe(true);
expect(result.content).toHaveLength(1);
expect(result.content[0].type).toBe('text');
const parsedContent = JSON.parse(result.content[0].text);
expect(parsedContent.success).toBe(false);
expect(parsedContent.error).toContain('Invalid credentials');
});
});
// ============================================================
// handleGetCurrentUser
// ============================================================
describe('handleGetCurrentUser', () => {
it('正常系: 現在のユーザー情報を返す', async () => {
const mockUser = {
id: 1,
email: 'test@example.com',
name: 'Test User',
role: 'admin' as const,
password_change_required: false,
created_at: '2024-01-01T00:00:00.000Z',
};
vi.spyOn(apiClient, 'getCurrentUser').mockResolvedValueOnce(mockUser);
const result = await handleGetCurrentUser(apiClient);
expect(apiClient.getCurrentUser).toHaveBeenCalled();
expect(result.content).toHaveLength(1);
expect(result.content[0].type).toBe('text');
const parsedContent = JSON.parse(result.content[0].text);
expect(parsedContent.success).toBe(true);
expect(parsedContent.user).toEqual(mockUser);
});
it('異常系: 認証エラーの場合はエラーを返す', async () => {
vi.spyOn(apiClient, 'getCurrentUser').mockRejectedValueOnce(new Error('Unauthorized'));
const result = await handleGetCurrentUser(apiClient);
expect(result.isError).toBe(true);
expect(result.content).toHaveLength(1);
expect(result.content[0].type).toBe('text');
const parsedContent = JSON.parse(result.content[0].text);
expect(parsedContent.success).toBe(false);
expect(parsedContent.error).toContain('Unauthorized');
});
});
// ============================================================
// handleUpdateUser
// ============================================================
describe('handleUpdateUser', () => {
it('正常系: ユーザー情報を更新', async () => {
const mockUser = {
id: 1,
email: 'updated@example.com',
name: 'Updated User',
role: 'admin' as const,
password_change_required: false,
created_at: '2024-01-01T00:00:00.000Z',
};
vi.spyOn(apiClient, 'updateUser').mockResolvedValueOnce(mockUser);
const input = {
user_id: 1,
name: 'Updated User',
email: 'updated@example.com',
};
const result = await handleUpdateUser(input, apiClient);
expect(apiClient.updateUser).toHaveBeenCalledWith(1, {
name: 'Updated User',
email: 'updated@example.com',
});
const parsedContent = JSON.parse(result.content[0].text);
expect(parsedContent.success).toBe(true);
expect(parsedContent.message).toBe('ユーザー情報を更新しました');
expect(parsedContent.user).toEqual(mockUser);
});
it('異常系: エラーハンドリング', async () => {
vi.spyOn(apiClient, 'updateUser').mockRejectedValueOnce(new Error('Update failed'));
const input = {
user_id: 1,
name: 'Updated User',
};
const result = await handleUpdateUser(input, apiClient);
expect(result.isError).toBe(true);
const parsedContent = JSON.parse(result.content[0].text);
expect(parsedContent.success).toBe(false);
expect(parsedContent.error).toBe('Update failed');
});
});
});