UNPKG

taiga-mcp-server

Version:

Full-featured MCP server for Taiga project management with advanced sprint and issue tracking. Based on mcpTAIGA by adriapedralbes, enhanced with substantial modifications. Developed collaboratively with Claude Code (AI-assisted development).

134 lines (110 loc) 4.83 kB
#!/usr/bin/env node /** * 向後相容性測試 - 測試處理 filePath 參數的情況 * 模擬使用者之前遇到的錯誤場景 */ import { fileURLToPath } from 'url'; import { dirname, join } from 'path'; import fs from 'fs'; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); async function testBackwardCompatibility() { console.log('🧪 Testing Backward Compatibility for File Upload...\n'); try { // 導入工具 const { uploadAttachmentTool } = await import('../src/tools/attachmentTools.js'); const { z } = await import('zod'); console.log('✅ 工具導入成功'); // 創建測試文件 const testFilePath = join(__dirname, 'test_upload.txt'); const testContent = '這是一個測試文件,用於測試向後相容性。'; fs.writeFileSync(testFilePath, testContent); console.log(`✅ 測試文件創建: ${testFilePath}`); // 測試 schema 驗證 - 舊格式 (filePath) const schema = z.object(uploadAttachmentTool.schema); const legacyParams = { itemType: 'issue', itemId: 829, projectIdentifier: 'ltg', filePath: testFilePath, description: '向後相容性測試文件' }; console.log('🔍 測試 schema 驗證 (舊格式)...'); const validationResult = schema.parse(legacyParams); console.log('✅ Schema 驗證通過'); // 測試工具 handler 邏輯 (不實際調用 API) console.log('🔍 測試 handler 邏輯...'); // 模擬 handler 的參數處理邏輯 const { itemType, itemId, projectIdentifier, fileData, fileName, mimeType, filePath, description } = validationResult; console.log('📋 Handler 接收到的參數:'); console.log(` - itemType: ${itemType}`); console.log(` - itemId: ${itemId}`); console.log(` - projectIdentifier: ${projectIdentifier}`); console.log(` - fileData: ${fileData ? 'provided' : 'undefined'}`); console.log(` - fileName: ${fileName || 'undefined'}`); console.log(` - mimeType: ${mimeType || 'undefined'}`); console.log(` - filePath: ${filePath || 'undefined'}`); console.log(` - description: ${description || 'undefined'}`); // 測試智能檢測邏輯 if (fileData && fileName) { console.log('🆕 檢測到新格式: 使用 Base64 數據'); } else if (filePath) { console.log('🔄 檢測到舊格式: 使用文件路徑 (向後相容模式)'); // 測試 TaigaService 的 uploadAttachmentFromPath 方法 const { TaigaService } = await import('../src/taigaService.js'); const service = new TaigaService(); console.log('🔍 測試 uploadAttachmentFromPath 方法...'); try { await service.uploadAttachmentFromPath(itemType, itemId, filePath, description); console.log('❌ 應該因為認證失敗而拋出錯誤'); } catch (error) { if (error.message.includes('authenticated') || error.message.includes('TAIGA_USERNAME')) { console.log('✅ 方法正常運作 (因認證問題而失敗,符合預期)'); } else { console.log(`✅ 方法檢測到問題: ${error.message}`); } } } else { console.log('❌ 檢測失敗: 需要 fileData+fileName 或 filePath'); } // 測試新格式 console.log('\n🔍 測試新格式 (Base64)...'); const fileBuffer = fs.readFileSync(testFilePath); const base64Data = fileBuffer.toString('base64'); const newParams = { itemType: 'issue', itemId: 829, projectIdentifier: 'ltg', fileData: base64Data, fileName: 'test_upload.txt', mimeType: 'text/plain', description: '新格式測試文件' }; const newValidationResult = schema.parse(newParams); console.log('✅ 新格式 schema 驗證通過'); const { fileData: newFileData, fileName: newFileName } = newValidationResult; if (newFileData && newFileName) { console.log('✅ 新格式檢測正確'); } // 清理 fs.unlinkSync(testFilePath); console.log('✅ 測試文件已清理'); console.log('\n🎉 向後相容性測試全部通過!'); console.log('\n📋 測試結果摘要:'); console.log('✅ 舊格式 (filePath) 支援正常'); console.log('✅ 新格式 (fileData) 支援正常'); console.log('✅ 智能檢測邏輯運作正常'); console.log('✅ 錯誤處理機制正常'); } catch (error) { console.error('❌ 測試失敗:', error.message); console.error(error.stack); process.exit(1); } } // 運行測試 if (import.meta.url === `file://${process.argv[1]}`) { testBackwardCompatibility().catch(error => { console.error('測試執行失敗:', error); process.exit(1); }); }