@IsTest public with sharing class AWSS3FeatureTest { private class ListFilesMock implements HttpCalloutMock { public HTTPResponse respond(HTTPRequest req) { HttpResponse res = new HttpResponse(); res.setHeader('Content-Type', 'application/json'); res.setStatusCode(200); // Sample JSON response (List of files) String mockBody = '[{"name":"file1.txt","size":"1024"},' + '{"name":"file2.pdf","size":"2048"}]'; res.setBody(mockBody); return res; } } @IsTest static void testListFiles_Success() { // Set Mock Test.setMock(HttpCalloutMock.class, new ListFilesMock()); // Prepare params Map params = new Map(); params.put('isServiceMode', true); Map payload = new Map{ 'accessKey' => 'dummyAccess', 'secretKey' => 'dummySecret' }; params.put('payload', payload); params.put('key', 'test-folder'); Test.startTest(); OperationResult result = new AWSS3Feature().listFiles(params); Test.stopTest(); System.assertNotEquals(null, result); } @IsTest static void testStoreAwsS3Credentials() { // Prepare payload Map payload = new Map{ 'accessKey' => 'testAccessKey', 'secretAccessKey' => 'testSecretKey', 'region' => 'ap-south-1', 'bucketName' => 'test-bucket' }; Test.startTest(); AWSS3Feature.storeAwsS3Credentials(true, payload); Test.stopTest(); } /* * Mock - 200 Success */ private class DeleteFile200Mock implements HttpCalloutMock { public HTTPResponse respond(HTTPRequest req) { HttpResponse res = new HttpResponse(); res.setStatusCode(200); res.setBody('File Deleted Successfully'); return res; } } /* * Mock - 204 Success */ private class DeleteFile204Mock implements HttpCalloutMock { public HTTPResponse respond(HTTPRequest req) { HttpResponse res = new HttpResponse(); res.setStatusCode(204); res.setBody(''); return res; } } // Test for 200 @IsTest static void testDeleteFile200() { Test.setMock(HttpCalloutMock.class, new DeleteFile200Mock()); Map params = new Map{ 'fileId' => 'sample.txt', 'isServiceMode' => true, 'payload' => new Map{ 'accessKey' => 'AK', 'secretAccessKey' => 'SK' } }; AWSS3Feature service = new AWSS3Feature(); Test.startTest(); OperationResult result = service.deleteFile(params); Test.stopTest(); } // Test for 204 @IsTest static void testDeleteFile204() { Test.setMock(HttpCalloutMock.class, new DeleteFile204Mock()); Map params = new Map{ 'fileId' => 'sample.txt', 'isServiceMode' => true, 'payload' => new Map() }; AWSS3Feature service = new AWSS3Feature(); Test.startTest(); OperationResult result = service.deleteFile(params); Test.stopTest(); } /* * Mock - 200 Success */ private class CreateFolder200Mock implements HttpCalloutMock { public HTTPResponse respond(HTTPRequest req) { HttpResponse res = new HttpResponse(); res.setStatusCode(200); res.setBody('Folder Created'); return res; } } /* * Mock - 201 Success */ private class CreateFolder201Mock implements HttpCalloutMock { public HTTPResponse respond(HTTPRequest req) { HttpResponse res = new HttpResponse(); res.setStatusCode(201); res.setBody('Folder Created'); return res; } } // Test for 200 Status Code @IsTest static void testCreateFolder200() { Test.setMock(HttpCalloutMock.class, new CreateFolder200Mock()); Map params = new Map{ 'parentFolderId' => 'root', 'isServiceMode' => true, 'folderName' => 'TestFolder', 'key' => 'TestFolder', 'payload' => new Map{ 'accessKey' => 'AK', 'secretAccessKey' => 'SK', 'region' => 'ap-south-1' } }; AWSS3Feature service = new AWSS3Feature(); Test.startTest(); OperationResult result = service.createFolder(params); Test.stopTest(); } // Test for 201 Status Code @IsTest static void testCreateFolder201() { Test.setMock(HttpCalloutMock.class, new CreateFolder201Mock()); Map params = new Map{ 'parentFolderId' => 'root', 'isServiceMode' => true, 'folderName' => 'TestFolder201', 'key' => 'TestFolder201', 'payload' => new Map() }; AWSS3Feature service = new AWSS3Feature(); Test.startTest(); OperationResult result = service.createFolder(params); Test.stopTest(); } /* * Mock - 200 Success */ private class RenameFileSuccessMock implements HttpCalloutMock { public HTTPResponse respond(HTTPRequest req) { HttpResponse res = new HttpResponse(); res.setStatusCode(200); // Must return JSON because method deserializes response res.setBody('{"message":"Rename Successful"}'); return res; } } // Test Method @IsTest static void testRenameFileSuccess() { Test.setMock(HttpCalloutMock.class, new RenameFileSuccessMock()); Map params = new Map{ 'fileId' => 'oldFolder/', // includes trailing slash 'isServiceMode' => true, 'newFileName' => 'newFolder/', 'payload' => new Map{ 'accessKey' => 'AK', 'secretAccessKey' => 'SK', 'region' => 'ap-south-1' } }; AWSS3Feature service = new AWSS3Feature(); Test.startTest(); OperationResult result = service.renameFile(params); Test.stopTest(); } /* * Mock - 200 Success */ private class MoveFileSuccessMock implements HttpCalloutMock { public HTTPResponse respond(HTTPRequest req) { HttpResponse res = new HttpResponse(); res.setStatusCode(200); // Must return valid JSON because method deserializes it res.setBody('{"message":"Move Successful"}'); return res; } } // Test Method @IsTest static void testMoveFileAndFolderSuccess() { Test.setMock(HttpCalloutMock.class, new MoveFileSuccessMock()); Map params = new Map{ 'isServiceMode' => true, 'sourceKey' => 'oldFolder/file.txt', 'destinationKey' => 'newFolder/file.txt', 'payload' => new Map{ 'accessKey' => 'AK', 'secretAccessKey' => 'SK', 'region' => 'ap-south-1' } }; AWSS3Feature service = new AWSS3Feature(); Test.startTest(); OperationResult result = service.moveFileAndFolder(params); Test.stopTest(); } /* * Mock - File Download Success */ private class DownloadFileSuccessMock implements HttpCalloutMock { public HTTPResponse respond(HTTPRequest req) { HttpResponse res = new HttpResponse(); res.setStatusCode(200); // Simulate file content Blob fileBlob = Blob.valueOf('Sample File Content'); res.setBodyAsBlob(fileBlob); return res; } } // Success Test @IsTest static void testDownloadFileSuccess() { Test.setMock(HttpCalloutMock.class, new DownloadFileSuccessMock()); Map params = new Map{ 'fileId' => 'sample.txt', 'isServiceMode' => true, 'payload' => new Map{ 'accessKey' => 'AK', 'secretAccessKey' => 'SK' } }; AWSS3Feature service = new AWSS3Feature(); Test.startTest(); OperationResult result = service.downloadFile(params); Test.stopTest(); } @IsTest static void testLinkFilesSuccess() { // Create a test record to link folder with Account acc = new Account(Name = 'Test Account'); insert acc; // Insert Linked Folder test record HIC_FilesME__Linked_Folder__c folder = new HIC_FilesME__Linked_Folder__c( Name = 'Test Folder', HIC_FilesME__Linked_Record__c = acc.Id, HIC_FilesME__External_Folder_ID__c = 'EXT123', HIC_FilesME__Folder_Name__c = 'Demo Folder', HIC_FilesME__Folder_URL__c = 'https://aws.amazon.com/demo', HIC_FilesME__Storage_Provider__c = 'AwsS3', HIC_FilesME__Access_Level__c = 'Public', HIC_FilesME__Connected_Username__c = 'testuser', HIC_FilesME__Is_Active__c = true ); insert folder; AWSS3Feature service = new AWSS3Feature(); Test.startTest(); OperationResult result = service.linkFiles(acc.Id); Test.stopTest(); } @IsTest static void testToLinkFilesSuccess() { Account acc = new Account(Name = 'Test Account'); insert acc; Map folderMap = new Map{ 'id' => 'EXT123', 'name' => 'Demo Folder', 'url' => 'https://aws.amazon.com/demo', 'linkedBy' => 'testuser' }; String folderDetails = JSON.serialize(folderMap); AWSS3Feature service = new AWSS3Feature(); Test.startTest(); OperationResult result = service.toLinkFiles(acc.Id, folderDetails, 'awss3'); Test.stopTest(); System.assert(result != null); System.assertEquals(true, result.success); HIC_FilesME__Linked_Folder__c rec = [ SELECT HIC_FilesME__External_Folder_ID__c, HIC_FilesME__Folder_Name__c, HIC_FilesME__Storage_Provider__c, HIC_FilesME__Connected_Username__c, HIC_FilesME__Is_Active__c FROM HIC_FilesME__Linked_Folder__c WHERE HIC_FilesME__Linked_Record__c = :acc.Id LIMIT 1 ]; System.assertEquals('EXT123', rec.HIC_FilesME__External_Folder_ID__c); System.assertEquals('Demo Folder', rec.HIC_FilesME__Folder_Name__c); System.assertEquals('AwsS3', rec.HIC_FilesME__Storage_Provider__c); System.assertEquals('testuser', rec.HIC_FilesME__Connected_Username__c); System.assertEquals(true, rec.HIC_FilesME__Is_Active__c); } @IsTest static void testUnlinkFiles() { // 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( Name = 'Test Folder', HIC_FilesME__Linked_Record__c = acc.Id, HIC_FilesME__External_Folder_ID__c = 'EXT123', HIC_FilesME__Folder_Name__c = 'Demo Folder', HIC_FilesME__Storage_Provider__c = 'awss3', HIC_FilesME__Is_Active__c = true ); insert folder; AWSS3Feature service = new AWSS3Feature(); Test.startTest(); OperationResult result = service.unlinkFiles(acc.Id, 'EXT123', false); Test.stopTest(); // Verify record deleted List remaining = [ SELECT Id FROM HIC_FilesME__Linked_Folder__c WHERE HIC_FilesME__Linked_Record__c = :acc.Id ]; System.assertEquals(0, remaining.size()); } }