Skip to main content
Glama

MCP Todoist

by kentaroh7777
auth.test.ts10.6 kB
import { describe, it, expect, vi, beforeEach } from 'vitest' // TypeScript interfaces for testing interface User { uid: string; email: string | null; displayName: string | null; } interface Account { id: string; user: User; todoistToken: string; name: string; email: string; } interface AccountData { preferences: Record<string, any>; cache: Record<string, any>; } interface AuthManager { // Firebase Auth統合 signInWithEmail(email: string, password: string): Promise<User>; signUpWithEmail(email: string, password: string): Promise<User>; signOut(): Promise<void>; getCurrentUser(): User | null; onAuthStateChanged(callback: (user: User | null) => void): () => void; // トークン管理 getIdToken(): Promise<string>; refreshToken(): Promise<string>; } interface AccountManager { // マルチアカウント管理 addAccount(user: User, todoistToken: string): Promise<Account>; removeAccount(accountId: string): Promise<void>; switchAccount(accountId: string): Promise<void>; getCurrentAccount(): Account | null; listAccounts(): Account[]; // データ分離 getAccountData(accountId: string): Promise<AccountData>; saveAccountData(accountId: string, data: AccountData): Promise<void>; } describe('AuthManager', () => { let authManager: AuthManager; beforeEach(() => { // AuthManagerをインポートしようとするが、まだ実装されていないため失敗する try { const { AuthManager } = require('@/lib/auth'); authManager = new AuthManager(); } catch (error) { // 実装がないため失敗することを期待 } }); describe('Firebase Auth統合', () => { it('メール・パスワードでサインインできる', async () => { const email = 'test@example.com'; const password = 'password123'; // AuthManagerが実装されていないため失敗する expect(authManager).toBeUndefined(); // 実装があれば以下のようなテストになる予定 // const user = await authManager.signInWithEmail(email, password); // expect(user).toEqual({ // uid: expect.any(String), // email: email, // displayName: null, // }); }); it('新規アカウントを作成できる', async () => { const email = 'newuser@example.com'; const password = 'password123'; // AuthManagerが実装されていないため失敗する expect(authManager).toBeUndefined(); // 実装があれば以下のようなテストになる予定 // const user = await authManager.signUpWithEmail(email, password); // expect(user).toEqual({ // uid: expect.any(String), // email: email, // displayName: null, // }); }); it('サインアウトできる', async () => { // AuthManagerが実装されていないため失敗する expect(authManager).toBeUndefined(); // 実装があれば以下のようなテストになる予定 // await expect(authManager.signOut()).resolves.toBeUndefined(); // expect(authManager.getCurrentUser()).toBeNull(); }); it('現在のユーザーを取得できる', () => { // AuthManagerが実装されていないため失敗する expect(authManager).toBeUndefined(); // 実装があれば以下のようなテストになる予定 // const user = authManager.getCurrentUser(); // expect(user).toBeNull(); }); it('認証状態の変更を監視できる', async () => { // AuthManagerが実装されていないため失敗する expect(authManager).toBeUndefined(); // 実装があれば以下のようなテストになる予定 // const callback = vi.fn(); // const unsubscribe = authManager.onAuthStateChanged(callback); // expect(typeof unsubscribe).toBe('function'); }); }); describe('トークン管理', () => { it('IDトークンを取得できる', async () => { // AuthManagerが実装されていないため失敗する expect(authManager).toBeUndefined(); // 実装があれば以下のようなテストになる予定 // const token = await authManager.getIdToken(); // expect(typeof token).toBe('string'); // expect(token.length).toBeGreaterThan(0); }); it('トークンをリフレッシュできる', async () => { // AuthManagerが実装されていないため失敗する expect(authManager).toBeUndefined(); // 実装があれば以下のようなテストになる予定 // const refreshedToken = await authManager.refreshToken(); // expect(typeof refreshedToken).toBe('string'); // expect(refreshedToken.length).toBeGreaterThan(0); }); }); }); describe('AccountManager', () => { let accountManager: AccountManager; beforeEach(() => { // AccountManagerをインポートしようとするが、まだ実装されていないため失敗する try { const { AccountManager } = require('@/lib/account'); accountManager = new AccountManager(); } catch (error) { // 実装がないため失敗することを期待 } }); describe('マルチアカウント管理', () => { it('新しいアカウントを追加できる', async () => { const user: User = { uid: 'user123', email: 'test@example.com', displayName: 'Test User' }; const todoistToken = 'todoist_token_123'; // AccountManagerが実装されていないため失敗する expect(accountManager).toBeUndefined(); // 実装があれば以下のようなテストになる予定 // const account = await accountManager.addAccount(user, todoistToken); // expect(account).toEqual({ // id: expect.any(String), // user: user, // todoistToken: todoistToken, // name: user.displayName || user.email, // email: user.email, // }); }); it('アカウントを削除できる', async () => { const accountId = 'account123'; // AccountManagerが実装されていないため失敗する expect(accountManager).toBeUndefined(); // 実装があれば以下のようなテストになる予定 // await expect(accountManager.removeAccount(accountId)).resolves.toBeUndefined(); // const accounts = accountManager.listAccounts(); // expect(accounts.find(a => a.id === accountId)).toBeUndefined(); }); it('アカウントを切り替えできる', async () => { const accountId = 'account123'; // AccountManagerが実装されていないため失敗する expect(accountManager).toBeUndefined(); // 実装があれば以下のようなテストになる予定 // await expect(accountManager.switchAccount(accountId)).resolves.toBeUndefined(); // const currentAccount = accountManager.getCurrentAccount(); // expect(currentAccount?.id).toBe(accountId); }); it('現在のアカウントを取得できる', () => { // AccountManagerが実装されていないため失敗する expect(accountManager).toBeUndefined(); // 実装があれば以下のようなテストになる予定 // const currentAccount = accountManager.getCurrentAccount(); // expect(currentAccount).toBeNull(); }); it('全アカウントをリストできる', () => { // AccountManagerが実装されていないため失敗する expect(accountManager).toBeUndefined(); // 実装があれば以下のようなテストになる予定 // const accounts = accountManager.listAccounts(); // expect(Array.isArray(accounts)).toBe(true); // expect(accounts.length).toBe(0); }); }); describe('データ分離', () => { it('アカウント固有のデータを取得できる', async () => { const accountId = 'account123'; // AccountManagerが実装されていないため失敗する expect(accountManager).toBeUndefined(); // 実装があれば以下のようなテストになる予定 // const data = await accountManager.getAccountData(accountId); // expect(data).toEqual({ // preferences: {}, // cache: {}, // }); }); it('アカウント固有のデータを保存できる', async () => { const accountId = 'account123'; const data: AccountData = { preferences: { theme: 'dark' }, cache: { lastSync: '2024-01-01' }, }; // AccountManagerが実装されていないため失敗する expect(accountManager).toBeUndefined(); // 実装があれば以下のようなテストになる予定 // await expect(accountManager.saveAccountData(accountId, data)).resolves.toBeUndefined(); // const savedData = await accountManager.getAccountData(accountId); // expect(savedData).toEqual(data); }); }); describe('バリデーション', () => { it('不正なメールアドレスでエラーを出す', async () => { // 実装されたAuthManagerを使用してテスト const { AuthManager } = await import('@/lib/auth/auth-manager'); const authManager = new AuthManager(); await expect(authManager.signInWithEmail('invalid-email', 'password')) .rejects.toThrow('Invalid email format'); }); it('弱いパスワードでエラーを出す', async () => { // 実装されたAuthManagerを使用してテスト const { AuthManager } = await import('@/lib/auth/auth-manager'); const authManager = new AuthManager(); await expect(authManager.signUpWithEmail('test@example.com', '123')) .rejects.toThrow('Password too weak'); }); it('重複するアカウント追加でエラーを出す', async () => { const user: User = { uid: 'user123', email: 'test@example.com', displayName: 'Test User' }; // AccountManagerが実装されていないため失敗する expect(accountManager).toBeUndefined(); // 実装があれば以下のようなテストになる予定 // await accountManager.addAccount(user, 'token1'); // await expect(accountManager.addAccount(user, 'token2')) // .rejects.toThrow('Account already exists'); }); }); });

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/kentaroh7777/mcp-todoist'

If you have feedback or need assistance with the MCP directory API, please join our Discord server