/** * @description Tests for DocusignEnvelopeRequestHandler * @author Paul Huliganga * @date 2026-02-25 */ @isTest public class DocusignEnvelopeRequestHandlerTest { @isTest static void testValidateRequest_Success() { // Setup DocusignCompositeEnvelopeBuilder.Request req = new DocusignCompositeEnvelopeBuilder.Request(); req.templateIds = new List{ 'template1', 'template2' }; req.recordId = '001xx000003DHf'; req.language = 'en'; req.emailSubject = 'Test Subject'; // Test Test.startTest(); DocusignEnvelopeRequestHandler.validateRequest(req); Test.stopTest(); // Verify - no exception thrown Assert.isTrue(true, 'Validation should pass'); } @isTest static void testValidateRequest_NoTemplateIds() { // Setup DocusignCompositeEnvelopeBuilder.Request req = new DocusignCompositeEnvelopeBuilder.Request(); req.templateIds = new List(); req.recordId = '001xx000003DHf'; // Test & Verify Test.startTest(); try { DocusignEnvelopeRequestHandler.validateRequest(req); Assert.fail('Should throw IllegalArgumentException'); } catch (IllegalArgumentException e) { Assert.isTrue(e.getMessage().contains('At least one template ID'), 'Correct error message'); } Test.stopTest(); } @isTest static void testValidateRequest_TooManyTemplates() { // Setup DocusignCompositeEnvelopeBuilder.Request req = new DocusignCompositeEnvelopeBuilder.Request(); req.templateIds = new List(); for (Integer i = 0; i < 15; i++) { req.templateIds.add('template' + i); } req.recordId = '001xx000003DHf'; // Test & Verify Test.startTest(); try { DocusignEnvelopeRequestHandler.validateRequest(req); Assert.fail('Should throw IllegalArgumentException'); } catch (IllegalArgumentException e) { Assert.isTrue(e.getMessage().contains('Maximum 14 templates'), 'Correct error message'); } Test.stopTest(); } @isTest static void testValidateRequest_NoRecordId() { // Setup DocusignCompositeEnvelopeBuilder.Request req = new DocusignCompositeEnvelopeBuilder.Request(); req.templateIds = new List{ 'template1' }; req.recordId = ''; // Test & Verify Test.startTest(); try { DocusignEnvelopeRequestHandler.validateRequest(req); Assert.fail('Should throw IllegalArgumentException'); } catch (IllegalArgumentException e) { Assert.isTrue(e.getMessage().contains('Salesforce record ID'), 'Correct error message'); } Test.stopTest(); } @isTest static void testValidateRequest_BlankTemplateId() { // Setup DocusignCompositeEnvelopeBuilder.Request req = new DocusignCompositeEnvelopeBuilder.Request(); req.templateIds = new List{ 'template1', '', 'template3' }; req.recordId = '001xx000003DHf'; // Test & Verify Test.startTest(); try { DocusignEnvelopeRequestHandler.validateRequest(req); Assert.fail('Should throw IllegalArgumentException'); } catch (IllegalArgumentException e) { Assert.isTrue(e.getMessage().contains('Template ID cannot be blank'), 'Correct error message'); } Test.stopTest(); } @isTest static void testBuildEnvelopeJSON_Success() { // Setup DocusignCompositeEnvelopeBuilder.Request req = new DocusignCompositeEnvelopeBuilder.Request(); req.templateIds = new List{ 'template2', 'template1', 'template2' }; // duplicates and unsorted req.recordId = '001xx000003DHf'; req.language = 'es'; req.emailSubject = 'Custom Subject'; // Test Test.startTest(); String json = DocusignEnvelopeRequestHandler.buildEnvelopeJSON(req); Test.stopTest(); // Verify Assert.isNotNull(json, 'JSON should be generated'); Assert.isTrue(json.contains('sent'), 'Should contain sent status'); Assert.isTrue(json.contains('Custom Subject'), 'Should contain custom subject'); Assert.isTrue(json.contains('compositeTemplates'), 'Should contain compositeTemplates'); } @isTest static void testBuildEnvelopeJSON_DefaultSubject() { // Setup DocusignCompositeEnvelopeBuilder.Request req = new DocusignCompositeEnvelopeBuilder.Request(); req.templateIds = new List{ 'template1' }; req.recordId = '001xx000003DHf'; req.emailSubject = null; // Test Test.startTest(); String json = DocusignEnvelopeRequestHandler.buildEnvelopeJSON(req); Test.stopTest(); // Verify Assert.isTrue(json.contains('Please review and sign these forms'), 'Should use default subject'); } @isTest static void testBuildEnvelopeJSON_TemplatesAreSorted() { // Setup DocusignCompositeEnvelopeBuilder.Request req = new DocusignCompositeEnvelopeBuilder.Request(); req.templateIds = new List{ 'template3', 'template1', 'template2' }; req.recordId = '001xx000003DHf'; // Test Test.startTest(); String json = DocusignEnvelopeRequestHandler.buildEnvelopeJSON(req); Test.stopTest(); // Verify - templates should be in sorted order (template1, template2, template3) Integer idx1 = json.indexOf('template1'); Integer idx2 = json.indexOf('template2'); Integer idx3 = json.indexOf('template3'); Assert.isTrue(idx1 < idx2 && idx2 < idx3, 'Templates should be sorted alphabetically'); } @isTest static void testBuildEnvelopeJSON_DuplicatesRemoved() { // Setup DocusignCompositeEnvelopeBuilder.Request req = new DocusignCompositeEnvelopeBuilder.Request(); req.templateIds = new List{ 'template1', 'template1', 'template2' }; req.recordId = '001xx000003DHf'; // Test Test.startTest(); String json = DocusignEnvelopeRequestHandler.buildEnvelopeJSON(req); Test.stopTest(); // Verify - should only have 2 compositeTemplate entries Integer count = 0; Integer pos = 0; while ((pos = json.indexOf('compositeTemplateId', pos)) != -1) { count++; pos++; } Assert.areEqual(2, count, 'Should have 2 unique templates after deduplication'); } }