diff --git a/__tests__/AIClasses/BaseAIFileService.test.ts b/__tests__/AIClasses/BaseAIFileService.test.ts index a78f7ca..7fcdda8 100644 --- a/__tests__/AIClasses/BaseAIFileService.test.ts +++ b/__tests__/AIClasses/BaseAIFileService.test.ts @@ -5,6 +5,7 @@ import { Attachment } from '../../Conversations/Attachment'; import { RegisterSingleton, DeregisterAllServices } from '../../Services/DependencyService'; import { Services } from '../../Services/Services'; import { AbortService } from '../../Services/AbortService'; +import { StringTools } from '../../Helpers/StringTools'; /** * Concrete implementation for testing BaseAIFileService @@ -36,6 +37,9 @@ describe('BaseAIFileService', () => { let abortService: AbortService; beforeEach(() => { + // Mock StringTools.resizeB64Image to avoid browser environment issues in tests + vi.spyOn(StringTools, 'resizeB64Image').mockImplementation(async (base64: string) => base64); + // Mock SettingsService const mockSettingsService = { settings: { diff --git a/__tests__/AIClasses/Claude.test.ts b/__tests__/AIClasses/Claude.test.ts index 987a5c4..692f292 100644 --- a/__tests__/AIClasses/Claude.test.ts +++ b/__tests__/AIClasses/Claude.test.ts @@ -776,6 +776,7 @@ describe('Claude', () => { fileName: 'test-image.png', mimeType: 'image/png', base64: 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==', + getMimeType: vi.fn(() => 'image/png'), getFileID: vi.fn(() => 'file_123'), // Mock file ID setFileID: vi.fn(), deleteFileID: vi.fn() @@ -808,6 +809,7 @@ describe('Claude', () => { fileName: 'document.pdf', mimeType: 'application/pdf', base64: 'JVBERi0xLjQKJeLjz9MK', + getMimeType: vi.fn(() => 'application/pdf'), getFileID: vi.fn(() => 'file_456'), // Mock file ID setFileID: vi.fn(), deleteFileID: vi.fn() @@ -1227,6 +1229,7 @@ describe('Claude', () => { fileName: 'report.pdf', mimeType: 'application/pdf', base64: 'base64encodedcontent', + getMimeType: vi.fn(() => 'application/pdf'), getFileID: vi.fn(() => 'file_pdf_123'), setFileID: vi.fn(), deleteFileID: vi.fn() @@ -1254,6 +1257,7 @@ describe('Claude', () => { fileName: 'photo.jpg', mimeType: 'image/jpeg', base64: 'base64imagedata', + getMimeType: vi.fn(() => 'image/jpeg'), getFileID: vi.fn(() => 'file_img_jpeg'), setFileID: vi.fn(), deleteFileID: vi.fn() @@ -1281,6 +1285,7 @@ describe('Claude', () => { fileName: 'diagram.png', mimeType: 'image/png', base64: 'base64pngdata', + getMimeType: vi.fn(() => 'image/png'), getFileID: vi.fn(() => 'file_img_png'), setFileID: vi.fn(), deleteFileID: vi.fn() @@ -1304,6 +1309,7 @@ describe('Claude', () => { fileName: 'animation.gif', mimeType: 'image/gif', base64: 'base64gifdata', + getMimeType: vi.fn(() => 'image/gif'), getFileID: vi.fn(() => 'file_img_gif'), setFileID: vi.fn(), deleteFileID: vi.fn() @@ -1327,6 +1333,7 @@ describe('Claude', () => { fileName: 'modern.webp', mimeType: 'image/webp', base64: 'base64webpdata', + getMimeType: vi.fn(() => 'image/webp'), getFileID: vi.fn(() => 'file_img_webp'), setFileID: vi.fn(), deleteFileID: vi.fn() @@ -1350,6 +1357,7 @@ describe('Claude', () => { fileName: 'photo.bmp', mimeType: 'image/bmp', base64: 'base64bmpdata', + getMimeType: vi.fn(() => 'image/bmp'), getFileID: vi.fn(() => 'file_img_bmp'), setFileID: vi.fn(), deleteFileID: vi.fn() @@ -1371,6 +1379,7 @@ describe('Claude', () => { fileName: 'doc.pdf', mimeType: 'application/pdf', base64: 'pdfdata', + getMimeType: vi.fn(() => 'application/pdf'), getFileID: vi.fn(() => 'file_1'), setFileID: vi.fn(), deleteFileID: vi.fn() @@ -1379,6 +1388,7 @@ describe('Claude', () => { fileName: 'image.jpg', mimeType: 'image/jpeg', base64: 'jpegdata', + getMimeType: vi.fn(() => 'image/jpeg'), getFileID: vi.fn(() => 'file_2'), setFileID: vi.fn(), deleteFileID: vi.fn() @@ -1387,6 +1397,7 @@ describe('Claude', () => { fileName: 'screenshot.png', mimeType: 'image/png', base64: 'pngdata', + getMimeType: vi.fn(() => 'image/png'), getFileID: vi.fn(() => 'file_3'), setFileID: vi.fn(), deleteFileID: vi.fn() @@ -1435,6 +1446,7 @@ describe('Claude', () => { fileName: 'good.jpg', mimeType: 'image/jpeg', base64: 'jpegdata', + getMimeType: vi.fn(() => 'image/jpeg'), getFileID: vi.fn(() => 'file_good'), setFileID: vi.fn(), deleteFileID: vi.fn() @@ -1443,6 +1455,7 @@ describe('Claude', () => { fileName: 'bad.bmp', mimeType: 'image/bmp', base64: 'bmpdata', + getMimeType: vi.fn(() => 'image/bmp'), getFileID: vi.fn(() => 'file_bad'), setFileID: vi.fn(), deleteFileID: vi.fn() @@ -1451,6 +1464,7 @@ describe('Claude', () => { fileName: 'doc.pdf', mimeType: 'application/pdf', base64: 'pdfdata', + getMimeType: vi.fn(() => 'application/pdf'), getFileID: vi.fn(() => 'file_pdf'), setFileID: vi.fn(), deleteFileID: vi.fn() @@ -1479,6 +1493,7 @@ describe('Claude', () => { fileName: 'image.png', mimeType: 'image/png', base64: 'imagedata', + getMimeType: vi.fn(() => 'image/png'), getFileID: vi.fn(() => undefined), // No file ID setFileID: vi.fn(), deleteFileID: vi.fn() @@ -1497,6 +1512,7 @@ describe('Claude', () => { fileName: 'document.PDF', mimeType: 'application/pdf', base64: 'pdfdata', + getMimeType: vi.fn(() => 'application/pdf'), getFileID: vi.fn(() => 'file_pdf_upper'), setFileID: vi.fn(), deleteFileID: vi.fn() @@ -1505,6 +1521,7 @@ describe('Claude', () => { fileName: 'photo.JPG', mimeType: 'image/jpeg', base64: 'jpegdata', + getMimeType: vi.fn(() => 'image/jpeg'), getFileID: vi.fn(() => 'file_jpg_upper'), setFileID: vi.fn(), deleteFileID: vi.fn() @@ -1535,6 +1552,7 @@ describe('Claude', () => { fileName: 'report (final) v2.pdf', mimeType: 'application/pdf', base64: 'pdfdata', + getMimeType: vi.fn(() => 'application/pdf'), getFileID: vi.fn(() => 'file_special'), setFileID: vi.fn(), deleteFileID: vi.fn() @@ -1551,6 +1569,7 @@ describe('Claude', () => { fileName: 'photo.jpeg', mimeType: 'image/jpeg', base64: 'jpegdata', + getMimeType: vi.fn(() => 'image/jpeg'), getFileID: vi.fn(() => 'file_jpeg_ext'), setFileID: vi.fn(), deleteFileID: vi.fn() diff --git a/__tests__/AIClasses/Gemini.test.ts b/__tests__/AIClasses/Gemini.test.ts index 02d7e1f..3f1cfb9 100644 --- a/__tests__/AIClasses/Gemini.test.ts +++ b/__tests__/AIClasses/Gemini.test.ts @@ -1124,6 +1124,7 @@ describe('Gemini', () => { fileName: 'report.pdf', mimeType: 'application/pdf', base64: 'base64encodedcontent', + getMimeType: () => 'application/pdf', getFileID: () => 'file-123', setFileID: vi.fn(), deleteFileID: vi.fn() @@ -1149,6 +1150,7 @@ describe('Gemini', () => { fileName: 'photo.jpg', mimeType: 'image/jpeg', base64: 'base64imagedata', + getMimeType: () => 'image/jpeg', getFileID: () => 'file-456', setFileID: vi.fn(), deleteFileID: vi.fn() @@ -1174,6 +1176,7 @@ describe('Gemini', () => { fileName: 'diagram.png', mimeType: 'image/png', base64: 'base64pngdata', + getMimeType: () => 'image/png', getFileID: () => 'file-789', setFileID: vi.fn(), deleteFileID: vi.fn() @@ -1196,6 +1199,7 @@ describe('Gemini', () => { fileName: 'animation.gif', mimeType: 'image/gif', base64: 'base64gifdata', + getMimeType: () => 'image/gif', getFileID: () => 'file-gif', setFileID: vi.fn(), deleteFileID: vi.fn() @@ -1215,6 +1219,7 @@ describe('Gemini', () => { fileName: 'photo.bmp', mimeType: 'image/bmp', base64: 'base64bmpdata', + getMimeType: () => 'image/bmp', getFileID: () => 'file-bmp', setFileID: vi.fn(), deleteFileID: vi.fn() @@ -1235,6 +1240,7 @@ describe('Gemini', () => { fileName: 'doc.pdf', mimeType: 'application/pdf', base64: 'pdfdata', + getMimeType: () => 'application/pdf', getFileID: () => 'file-pdf', setFileID: vi.fn(), deleteFileID: vi.fn() @@ -1243,6 +1249,7 @@ describe('Gemini', () => { fileName: 'image.jpg', mimeType: 'image/jpeg', base64: 'jpegdata', + getMimeType: () => 'image/jpeg', getFileID: () => 'file-jpg', setFileID: vi.fn(), deleteFileID: vi.fn() @@ -1251,6 +1258,7 @@ describe('Gemini', () => { fileName: 'screenshot.png', mimeType: 'image/png', base64: 'pngdata', + getMimeType: () => 'image/png', getFileID: () => 'file-png', setFileID: vi.fn(), deleteFileID: vi.fn() @@ -1296,6 +1304,7 @@ describe('Gemini', () => { fileName: 'good.jpg', mimeType: 'image/jpeg', base64: 'jpegdata', + getMimeType: () => 'image/jpeg', getFileID: () => 'file-jpg', setFileID: vi.fn(), deleteFileID: vi.fn() @@ -1304,6 +1313,7 @@ describe('Gemini', () => { fileName: 'bad.bmp', mimeType: 'image/bmp', base64: 'bmpdata', + getMimeType: () => 'image/bmp', getFileID: () => 'file-bmp', setFileID: vi.fn(), deleteFileID: vi.fn() @@ -1312,6 +1322,7 @@ describe('Gemini', () => { fileName: 'doc.pdf', mimeType: 'application/pdf', base64: 'pdfdata', + getMimeType: () => 'application/pdf', getFileID: () => 'file-pdf', setFileID: vi.fn(), deleteFileID: vi.fn() @@ -1338,6 +1349,7 @@ describe('Gemini', () => { fileName: 'success.pdf', mimeType: 'application/pdf', base64: 'pdfdata', + getMimeType: () => 'application/pdf', getFileID: () => 'file-success', setFileID: vi.fn(), deleteFileID: vi.fn() @@ -1346,6 +1358,7 @@ describe('Gemini', () => { fileName: 'failed.jpg', mimeType: 'image/jpeg', base64: 'jpegdata', + getMimeType: () => 'image/jpeg', getFileID: () => undefined, // Upload failed setFileID: vi.fn(), deleteFileID: vi.fn() @@ -1377,6 +1390,7 @@ describe('Gemini', () => { fileName: 'report (final) v2.pdf', mimeType: 'application/pdf', base64: 'pdfdata', + getMimeType: () => 'application/pdf', getFileID: () => 'file-123', setFileID: vi.fn(), deleteFileID: vi.fn() @@ -1393,6 +1407,7 @@ describe('Gemini', () => { fileName: 'photo.jpeg', mimeType: 'image/jpeg', base64: 'jpegdata', + getMimeType: () => 'image/jpeg', getFileID: () => 'file-jpeg', setFileID: vi.fn(), deleteFileID: vi.fn() diff --git a/__tests__/AIClasses/OpenAI.test.ts b/__tests__/AIClasses/OpenAI.test.ts index 2291a5e..4e27c38 100644 --- a/__tests__/AIClasses/OpenAI.test.ts +++ b/__tests__/AIClasses/OpenAI.test.ts @@ -1002,6 +1002,7 @@ describe('OpenAI', () => { fileName: 'report.pdf', mimeType: 'application/pdf', base64: 'base64encodedcontent', + getMimeType: () => 'application/pdf', getFileID: () => 'file-123', setFileID: vi.fn(), deleteFileID: vi.fn() @@ -1028,6 +1029,7 @@ describe('OpenAI', () => { fileName: 'photo.jpg', mimeType: 'image/jpeg', base64: 'base64imagedata', + getMimeType: () => 'image/jpeg', getFileID: () => 'file-456', setFileID: vi.fn(), deleteFileID: vi.fn() @@ -1054,6 +1056,7 @@ describe('OpenAI', () => { fileName: 'diagram.png', mimeType: 'image/png', base64: 'base64pngdata', + getMimeType: () => 'image/png', getFileID: () => 'file-789', setFileID: vi.fn(), deleteFileID: vi.fn() @@ -1079,6 +1082,7 @@ describe('OpenAI', () => { fileName: 'modern.webp', mimeType: 'image/webp', base64: 'base64webpdata', + getMimeType: () => 'image/webp', getFileID: () => 'file-webp', setFileID: vi.fn(), deleteFileID: vi.fn() @@ -1104,6 +1108,7 @@ describe('OpenAI', () => { fileName: 'photo.gif', mimeType: 'image/gif', base64: 'base64gifdata', + getMimeType: () => 'image/gif', getFileID: () => 'file-gif', setFileID: vi.fn(), deleteFileID: vi.fn() @@ -1125,6 +1130,7 @@ describe('OpenAI', () => { fileName: 'failed.pdf', mimeType: 'application/pdf', base64: 'base64data', + getMimeType: () => 'application/pdf', getFileID: () => undefined, // Upload failed setFileID: vi.fn(), deleteFileID: vi.fn() @@ -1144,6 +1150,7 @@ describe('OpenAI', () => { fileName: 'doc.pdf', mimeType: 'application/pdf', base64: 'pdfdata', + getMimeType: () => 'application/pdf', getFileID: () => 'file-pdf', setFileID: vi.fn(), deleteFileID: vi.fn() @@ -1152,6 +1159,7 @@ describe('OpenAI', () => { fileName: 'image.jpg', mimeType: 'image/jpeg', base64: 'jpegdata', + getMimeType: () => 'image/jpeg', getFileID: () => 'file-jpg', setFileID: vi.fn(), deleteFileID: vi.fn() @@ -1160,6 +1168,7 @@ describe('OpenAI', () => { fileName: 'screenshot.png', mimeType: 'image/png', base64: 'pngdata', + getMimeType: () => 'image/png', getFileID: () => 'file-png', setFileID: vi.fn(), deleteFileID: vi.fn() @@ -1207,6 +1216,7 @@ describe('OpenAI', () => { fileName: 'good.jpg', mimeType: 'image/jpeg', base64: 'jpegdata', + getMimeType: () => 'image/jpeg', getFileID: () => 'file-jpg', setFileID: vi.fn(), deleteFileID: vi.fn() @@ -1215,6 +1225,7 @@ describe('OpenAI', () => { fileName: 'bad.bmp', mimeType: 'image/bmp', base64: 'bmpdata', + getMimeType: () => 'image/bmp', getFileID: () => 'file-bmp', setFileID: vi.fn(), deleteFileID: vi.fn() @@ -1223,6 +1234,7 @@ describe('OpenAI', () => { fileName: 'doc.pdf', mimeType: 'application/pdf', base64: 'pdfdata', + getMimeType: () => 'application/pdf', getFileID: () => 'file-pdf', setFileID: vi.fn(), deleteFileID: vi.fn() @@ -1257,6 +1269,7 @@ describe('OpenAI', () => { fileName: 'success.pdf', mimeType: 'application/pdf', base64: 'pdfdata', + getMimeType: () => 'application/pdf', getFileID: () => 'file-success', setFileID: vi.fn(), deleteFileID: vi.fn() @@ -1265,6 +1278,7 @@ describe('OpenAI', () => { fileName: 'failed.jpg', mimeType: 'image/jpeg', base64: 'jpegdata', + getMimeType: () => 'image/jpeg', getFileID: () => undefined, // Upload failed setFileID: vi.fn(), deleteFileID: vi.fn() @@ -1301,6 +1315,7 @@ describe('OpenAI', () => { fileName: 'failed1.pdf', mimeType: 'application/pdf', base64: 'data1', + getMimeType: () => 'application/pdf', getFileID: () => undefined, setFileID: vi.fn(), deleteFileID: vi.fn() @@ -1309,6 +1324,7 @@ describe('OpenAI', () => { fileName: 'failed2.jpg', mimeType: 'image/jpeg', base64: 'data2', + getMimeType: () => 'image/jpeg', getFileID: () => undefined, setFileID: vi.fn(), deleteFileID: vi.fn()