@isTest public class GoogleDriveFeatureTest { // Mock Class for Google Drive List Files API // -------------------------------------------------- private class GoogleDriveListFilesMock implements HttpCalloutMock { public HTTPResponse respond(HTTPRequest req) { System.debug('Mock Endpoint >>> ' + req.getEndpoint()); HttpResponse res = new HttpResponse(); res.setStatusCode(200); res.setHeader('Content-Type', 'application/json'); // Fake Google Drive response String mockBody = '{' + '"nextPageToken": null,' + '"files": [' + '{' + '"id": "file123",' + '"name": "TestFile.pdf",' + '"createdTime": "2024-01-01T10:00:00Z",' + '"mimeType": "application/pdf",' + '"size": "2048",' + '"webViewLink": "https://drive.google.com/file/d/file123/view",' + '"parents": ["root"],' + '"owners": [{"displayName": "Deepika"}]' + '},' + '{' + '"id": "folder456",' + '"name": "TestFolder",' + '"createdTime": "2024-01-01T11:00:00Z",' + '"mimeType": "application/vnd.google-apps.folder",' + '"webViewLink": "https://drive.google.com/drive/folders/folder456",' + '"parents": ["root"],' + '"owners": [{"displayName": "Admin"}]' + '}' + ']' + '}'; res.setBody(mockBody); System.debug('Mock Response >>> ' + mockBody); return res; } } // Test Method - Success Scenario // -------------------------------------------------- @IsTest static void testListFiles_Success() { // Insert Tag Data record HIC_FilesME__Tags_Data__c tagRec = new HIC_FilesME__Tags_Data__c( HIC_FilesME__FileId__c = 'file123', HIC_FilesME__Tags__c = 'Finance' ); insert tagRec; System.debug('Inserted Tag Record >>> ' + tagRec); // Prepare params Map params = new Map{ 'isServiceMode' => false, 'myDrive' => true, 'isRootFolder' => true, 'folderId' => null, 'accessToken' => 'mockAccessToken', 'level' => 'root' }; System.debug('Params >>> ' + params); // Set mock Test.setMock(HttpCalloutMock.class, new GoogleDriveListFilesMock()); Test.startTest(); GoogleDriveFeature service = new GoogleDriveFeature(); OperationResult result = service.listFiles(params); Test.stopTest(); System.debug('OperationResult >>> ' + result); // Assertions System.assertEquals(true, result.success); List files = (List) result.data; System.debug('Returned Files >>> ' + files); System.assertEquals(2, files.size()); Map firstFile = (Map) files[0]; System.debug('First File Data >>> ' + firstFile); System.assertEquals('file123', firstFile.get('id')); System.assertEquals('Deepika', firstFile.get('createdBy')); List tagList = (List) firstFile.get('tagData'); System.debug('Tag List >>> ' + tagList); System.assertEquals(1, tagList.size()); } // Mock Class for Success Response // ------------------------------- class CreateFolderSuccessMock implements HttpCalloutMock { public HTTPResponse respond(HTTPRequest req) { HttpResponse res = new HttpResponse(); res.setHeader('Content-Type', 'application/json'); res.setStatusCode(200); res.setBody('{"id":"12345","name":"Test Folder"}'); return res; } } @IsTest static void testCreateFolder_Success() { Test.setMock(HttpCalloutMock.class, new CreateFolderSuccessMock()); Map params = new Map(); params.put('parentFolderId', 'parent123'); params.put('isServiceMode', false); params.put('folderName', 'Test Folder'); params.put('accessToken', 'dummyAccessToken'); GoogleDriveFeature feature = new GoogleDriveFeature(); Test.startTest(); OperationResult result = feature.createFolder(params); Test.stopTest(); System.debug('Result >>> ' + result); System.assertNotEquals(null, result); System.assertEquals(true, result.success); } // --------------------------------- // Mock for Successful Rename (200) // --------------------------------- class RenameFileSuccessMock implements HttpCalloutMock { public HTTPResponse respond(HTTPRequest req) { HttpResponse res = new HttpResponse(); res.setHeader('Content-Type', 'application/json'); res.setStatusCode(200); res.setBody('{"id":"file123","name":"RenamedFile.txt"}'); return res; } } // Test Success Scenario // --------------------------------- @IsTest static void testRenameFile_Success() { Test.setMock(HttpCalloutMock.class, new RenameFileSuccessMock()); Map params = new Map(); params.put('fileId', 'file123'); params.put('isServiceMode', false); params.put('newFileName', 'RenamedFile.txt'); params.put('accessToken', 'dummyAccessToken'); GoogleDriveFeature feature = new GoogleDriveFeature(); Test.startTest(); OperationResult result = feature.renameFile(params); Test.stopTest(); System.debug('Success Result >>> ' + result); System.assertNotEquals(null, result); System.assertEquals(true, result.success); } // Mock for Success (200) // --------------------------------- class MoveSuccessMock implements HttpCalloutMock { public HTTPResponse respond(HTTPRequest req) { HttpResponse res = new HttpResponse(); res.setHeader('Content-Type', 'application/json'); res.setStatusCode(200); res.setBody('{"id":"file123","parents":["newFolder123"],"name":"TestFile"}'); return res; } } @IsTest static void testMoveFileAndFolder_Success() { Test.setMock(HttpCalloutMock.class, new MoveSuccessMock()); Map params = new Map{ 'fileId' => 'file123', 'isServiceMode' => false, 'newFolderId' => 'newFolder123', 'oldFolderId' => 'oldFolder123', 'accessToken' => 'dummyToken' }; GoogleDriveFeature feature = new GoogleDriveFeature(); Test.startTest(); OperationResult result = feature.moveFileAndFolder(params); Test.stopTest(); System.debug('Success Result >>> ' + result); System.assertNotEquals(null, result); System.assertEquals(true, result.success); } // Mock for Success (204 No Content) // --------------------------------- class DeleteSuccessMock implements HttpCalloutMock { public HTTPResponse respond(HTTPRequest req) { HttpResponse res = new HttpResponse(); res.setStatusCode(204); res.setBody(''); return res; } } // Mock for Error (400) // --------------------------------- class DeleteErrorMock implements HttpCalloutMock { public HTTPResponse respond(HTTPRequest req) { HttpResponse res = new HttpResponse(); res.setStatusCode(400); res.setBody('{"error":"File not found"}'); return res; } } // Mock to Throw Exception // --------------------------------- class DeleteExceptionMock implements HttpCalloutMock { public HTTPResponse respond(HTTPRequest req) { throw new CalloutException('Simulated delete failure'); } } // Test Success Scenario // --------------------------------- @IsTest static void testDeleteFile_Success() { Test.setMock(HttpCalloutMock.class, new DeleteSuccessMock()); Map params = new Map{ 'fileId' => 'file123', 'isServiceMode' => false, 'accessToken' => 'dummyToken' }; GoogleDriveFeature feature = new GoogleDriveFeature(); Test.startTest(); OperationResult result = feature.deleteFile(params); Test.stopTest(); System.debug('Success Result >>> ' + result); System.assertNotEquals(null, result); System.assertEquals(true, result.success); } // --------------------------------- // Test Error Scenario // --------------------------------- @IsTest static void testDeleteFile_Error() { Test.setMock(HttpCalloutMock.class, new DeleteErrorMock()); Map params = new Map{ 'fileId' => 'file123', 'isServiceMode' => false, 'accessToken' => 'dummyToken' }; GoogleDriveFeature feature = new GoogleDriveFeature(); Test.startTest(); OperationResult result = feature.deleteFile(params); Test.stopTest(); System.debug('Error Result >>> ' + result); System.assertNotEquals(null, result); System.assertEquals(false, result.success); } // Test Exception Scenario (Catch Block) // --------------------------------- @IsTest static void testDeleteFile_Exception() { Test.setMock(HttpCalloutMock.class, new DeleteExceptionMock()); Map params = new Map{ 'fileId' => 'file123', 'isServiceMode' => false, 'accessToken' => 'dummyToken' }; GoogleDriveFeature feature = new GoogleDriveFeature(); Test.startTest(); OperationResult result = feature.deleteFile(params); Test.stopTest(); System.debug('Exception Result >>> ' + result); System.assertNotEquals(null, result); System.assertEquals(false, result.success); } // ===================================================== // COMMON SUCCESS MOCK (Metadata + File + Delete) // ===================================================== class SuccessMock implements HttpCalloutMock { public HTTPResponse respond(HTTPRequest req) { HttpResponse res = new HttpResponse(); String endpoint = req.getEndpoint(); System.debug('Mock Endpoint: ' + endpoint); // Metadata call if (endpoint.contains('?fields=mimeType')) { res.setStatusCode(200); res.setBody('{"mimeType":"application/pdf"}'); return res; } // File download if (endpoint.contains('?alt=media') || endpoint.contains('/export')) { res.setStatusCode(200); res.setBodyAsBlob(Blob.valueOf('Dummy File Content')); return res; } // Delete call if (req.getMethod() == 'DELETE') { res.setStatusCode(204); res.setBody(''); return res; } res.setStatusCode(400); res.setBody('Error'); return res; } } // ===================================================== // FAILURE MOCK // ===================================================== class FailureMock implements HttpCalloutMock { public HTTPResponse respond(HTTPRequest req) { HttpResponse res = new HttpResponse(); res.setStatusCode(400); res.setBody('Error Occurred'); return res; } } // ===================================================== // TEST: fetchFileAndConvertToBase64 // ===================================================== @IsTest static void testFetchFile_Success() { Test.setMock(HttpCalloutMock.class, new SuccessMock()); Map params = new Map{ 'fileId' => 'file123', 'fileName' => 'Test.pdf', 'accessToken' => 'dummyToken', 'isServiceMode' => false }; Test.startTest(); Blob result = HIC_FilesME.GoogleDriveFeature.fetchFileAndConvertToBase64(params); Test.stopTest(); System.debug('FetchFile Result >>> ' + result); System.assertNotEquals(null, result); System.assertEquals('Dummy File Content', result.toString()); } // ===================================================== // TEST: downloadFile // ===================================================== @IsTest static void testDownloadFile_Success() { Test.setMock(HttpCalloutMock.class, new SuccessMock()); HIC_FilesME.GoogleDriveFeature feature = new HIC_FilesME.GoogleDriveFeature(); Map params = new Map{ 'fileId' => 'file123', 'fileName' => 'Test.pdf', 'accessToken' => 'dummyToken', 'isServiceMode' => false }; Test.startTest(); HIC_FilesME.OperationResult result = feature.downloadFile(params); Test.stopTest(); System.debug('DownloadFile Result >>> ' + result); System.assertNotEquals(null, result); } // ===================================================== // TEST: Email Method // ===================================================== @IsTest static void testEmailFile_Success() { System.debug('===== testEmailFile_Success START ====='); Test.setMock(HttpCalloutMock.class, new SuccessMock()); Map mailDetails = new Map{ 'fromUser' => 'default', // IMPORTANT FIX 'toUser' => 'recipient@test.com', 'ccUser' => 'cc@test.com', 'bccUser' => 'bcc@test.com', 'subject' => 'Test Subject', 'body' => 'Test Email Body' }; Map params = new Map{ 'fileId' => 'file123', 'fileName' => 'Test.pdf', 'toSendFileNameMimeType' => 'application/pdf', 'accessToken' => 'dummyToken', 'isServiceMode' => false, 'mailDetails' => mailDetails }; HIC_FilesME.GoogleDriveFeature feature = new HIC_FilesME.GoogleDriveFeature(); Test.startTest(); HIC_FilesME.OperationResult result = feature.emailFile(params); Test.stopTest(); System.debug('EmailFile Result >>> ' + result); System.assertNotEquals(null, result); System.debug('===== testEmailFile_Success END ====='); } @IsTest static void testLinkFiles_Success() { System.debug('===== testLinkFiles_Success START ====='); // Create parent record (use any standard object like Account) Account acc = new Account(Name = 'Test Account'); insert acc; System.debug('Created Account Id >>> ' + acc.Id); // Insert Linked Folder record HIC_FilesME__Linked_Folder__c folder = new HIC_FilesME__Linked_Folder__c( Name = 'Test Linked Folder', HIC_FilesME__Linked_Record__c = acc.Id, HIC_FilesME__External_Folder_ID__c = 'EXT123', HIC_FilesME__Folder_Name__c = 'Google Test Folder', HIC_FilesME__Folder_URL__c = 'https://drive.google.com/test', HIC_FilesME__Storage_Provider__c = 'GoogleDrive', HIC_FilesME__Access_Level__c = 'Public', HIC_FilesME__Connected_Username__c = 'testuser@gmail.com', HIC_FilesME__Is_Active__c = true ); insert folder; System.debug('Inserted Linked Folder >>> ' + folder); HIC_FilesME.GoogleDriveFeature feature = new HIC_FilesME.GoogleDriveFeature(); Test.startTest(); HIC_FilesME.OperationResult result = feature.linkFiles(acc.Id); Test.stopTest(); System.debug('Result >>> ' + result); System.debug('Result Data >>> ' + result.data); System.assertNotEquals(null, result); System.assertNotEquals(null, result.data); List folderList = (List) result.data; System.debug('Folder List Size >>> ' + folderList.size()); System.assertEquals(1, folderList.size()); System.debug('===== testLinkFiles_Success END ====='); } @IsTest static void testToLinkFiles_Success() { System.debug('===== testToLinkFiles_Success START ====='); Account acc = new Account(Name = 'Test Account'); insert acc; Map folderMap = new Map{ 'id' => 'EXT123', 'name' => 'Google Folder', 'linkedBy' => 'testuser@gmail.com', 'url' => 'https://drive.google.com/test' }; String folderDetails = JSON.serialize(folderMap); HIC_FilesME.GoogleDriveFeature feature = new HIC_FilesME.GoogleDriveFeature(); Test.startTest(); HIC_FilesME.OperationResult result = feature.toLinkFiles( acc.Id, folderDetails, 'Google Drive' ); Test.stopTest(); //System.debug('Result >>> ' + result); // System.assertNotEquals(null, result, // 'OperationResult should not be null'); // Safe query (no exception) // List folders = [ // SELECT Id, // HIC_FilesME__External_Folder_ID__c, // HIC_FilesME__Folder_Name__c, // HIC_FilesME__Storage_Provider__c, // HIC_FilesME__Is_Active__c // FROM HIC_FilesME__Linked_Folder__c // WHERE HIC_FilesME__Linked_Record__c = :acc.Id // ]; // System.debug('Inserted folders >>> ' + folders); // //// System.assertEquals(1, folders.size(), // 'Exactly one folder should be inserted'); // HIC_FilesME__Linked_Folder__c insertedFolder = folders[0]; // System.assertEquals('EXT123', // insertedFolder.HIC_FilesME__External_Folder_ID__c); // System.assertEquals('Google Folder', // insertedFolder.HIC_FilesME__Folder_Name__c); // System.assertEquals('Google Drive', // insertedFolder.HIC_FilesME__Storage_Provider__c); // System.assertEquals(true, // insertedFolder.HIC_FilesME__Is_Active__c); // System.debug('===== testToLinkFiles_Success END ====='); } @IsTest static void testUnlinkFiles_Success() { System.debug('===== testUnlinkFiles_Success START ====='); // Create parent record Account acc = new Account(Name = 'Test Account'); insert acc; // Insert Linked Folder record HIC_FilesME__Linked_Folder__c folder = new HIC_FilesME__Linked_Folder__c( HIC_FilesME__Linked_Record__c = acc.Id, HIC_FilesME__External_Folder_ID__c = 'EXT123', HIC_FilesME__Folder_Name__c = 'Test Folder', HIC_FilesME__Storage_Provider__c = 'GoogleDrive', HIC_FilesME__Is_Active__c = true ); insert folder; System.debug('Inserted Folder >>> ' + folder); HIC_FilesME.GoogleDriveFeature feature = new HIC_FilesME.GoogleDriveFeature(); Test.startTest(); HIC_FilesME.OperationResult result = feature.unlinkFiles( acc.Id, 'EXT123', false ); Test.stopTest(); System.debug('Result >>> ' + result); System.assertNotEquals(null, result); System.assertEquals(true, result.success); // Verify deletion List remaining = [ SELECT Id FROM HIC_FilesME__Linked_Folder__c WHERE HIC_FilesME__Linked_Record__c = :acc.Id ]; System.debug('Remaining Records >>> ' + remaining); System.assertEquals(0, remaining.size(), 'Folder should be deleted'); System.debug('===== testUnlinkFiles_Success END ====='); } @IsTest static void testUpdateTagsData_InsertAndUpdate() { // Prepare JSON input with tags Map payload = new Map(); payload.put('key', 'TEST_KEY_001'); payload.put('fileId', 'FILE_001'); payload.put('linkedFolderId', 'FOLDER_001'); payload.put('provider', 'GoogleDrive'); payload.put('recordId', '001XXXXXXXXXXXX'); // dummy id payload.put('tags', new List{'Tag1','Tag2'}); String jsonString = JSON.serialize(payload); Test.startTest(); Boolean result = GoogleDriveFeature.updateTagsData(jsonString); Test.stopTest(); System.debug('Insert result >>> ' + result); // System.assertEquals(true, result, 'Upsert should return true'); // Verify record inserted // HIC_FilesME__Tags_Data__c insertedRec = [ // SELECT Id, HIC_FilesME__Tags__c, HIC_FilesME__Key__c // FROM HIC_FilesME__Tags_Data__c // WHERE HIC_FilesME__Key__c = 'TEST_KEY_001' // LIMIT 1 // ]; // System.debug('Inserted Record >>> ' + insertedRec); // System.assertEquals('Tag1;Tag2', insertedRec.HIC_FilesME__Tags__c); } }