diff --git a/IMPLEMENTATION_PLAN.md b/IMPLEMENTATION_PLAN.md index 9d027bc..8f72fb6 100644 --- a/IMPLEMENTATION_PLAN.md +++ b/IMPLEMENTATION_PLAN.md @@ -12,7 +12,7 @@ - [x] **Task 2 — EnvelopeCreateResult class + createEnvelope() method:** Add `EnvelopeCreateResult` inner class and `createEnvelope(Id caseId, String accountCode, String templateId)` to `DocusignESignatureService`. (FR-002) -- [ ] **Task 3 — Tests for createEnvelope():** Add test coverage in `DocusignESignatureServiceTest` — success path (mock 201), failure path (mock 400), blank email guard. (NFR-001, TC-001, TC-002) +- [x] **Task 3 — Tests for createEnvelope():** Add test coverage in `DocusignESignatureServiceTest` — success path (mock 201), failure path (mock 400), blank email guard. (NFR-001, TC-001, TC-002) - [ ] **Task 4 — persistEnvelopeResult() + CaseContext extension:** Add `persistEnvelopeResult()` to `CLMAdminService`. Extend `CaseContext` inner class and `getCaseContext()` SOQL to include the 5 eSignature fields. (FR-003, FR-004) diff --git a/force-app/main/default/classes/DocusignESignatureServiceTest.cls b/force-app/main/default/classes/DocusignESignatureServiceTest.cls index 3fcd8e0..39cb611 100644 --- a/force-app/main/default/classes/DocusignESignatureServiceTest.cls +++ b/force-app/main/default/classes/DocusignESignatureServiceTest.cls @@ -147,4 +147,92 @@ private class DocusignESignatureServiceTest { DocusignESignatureService.buildEndpoint('/v2.1/accounts', 'Esignature_Demo_NamedCreds') ); } + + private class CreateEnvelopeSuccessMock implements HttpCalloutMock { + public HttpResponse respond(HttpRequest req) { + HttpResponse res = new HttpResponse(); + res.setHeader('Content-Type', 'application/json'); + res.setStatusCode(201); + res.setBody('{"envelopeId":"abc-123","status":"sent","uri":"/v2.1/accounts/12345678/envelopes/abc-123"}'); + return res; + } + } + + private class CreateEnvelopeFailureMock implements HttpCalloutMock { + public HttpResponse respond(HttpRequest req) { + HttpResponse res = new HttpResponse(); + res.setHeader('Content-Type', 'application/json'); + res.setStatusCode(400); + res.setBody('{"errorCode":"TEMPLATE_NOT_IN_ACCOUNT","message":"The template specified is not in the account."}'); + return res; + } + } + + @IsTest + static void createEnvelopeReturnsSuccessResultOnHttp201() { + Appraiser_Case__c appraiserCase = new Appraiser_Case__c( + Appraiser_Field_Review_Date__c = Date.today(), + Appraiser_Email__c = 'appraiser@example.com', + Appraiser_Name__c = 'Jamie Carter' + ); + insert appraiserCase; + + Test.setMock(HttpCalloutMock.class, new CreateEnvelopeSuccessMock()); + + Test.startTest(); + DocusignESignatureService.EnvelopeCreateResult result = DocusignESignatureService.createEnvelope( + appraiserCase.Id, + 'DTC_CLM_Demo', + 'tmpl-001' + ); + Test.stopTest(); + + System.assertEquals(true, result.success); + System.assertEquals('abc-123', result.envelopeId); + System.assertEquals('sent', result.status); + } + + @IsTest + static void createEnvelopeReturnsFailureResultOnHttp400() { + Appraiser_Case__c appraiserCase = new Appraiser_Case__c( + Appraiser_Field_Review_Date__c = Date.today(), + Appraiser_Email__c = 'appraiser@example.com', + Appraiser_Name__c = 'Jamie Carter' + ); + insert appraiserCase; + + Test.setMock(HttpCalloutMock.class, new CreateEnvelopeFailureMock()); + + Test.startTest(); + DocusignESignatureService.EnvelopeCreateResult result = DocusignESignatureService.createEnvelope( + appraiserCase.Id, + 'DTC_CLM_Demo', + 'tmpl-bad' + ); + Test.stopTest(); + + System.assertEquals(false, result.success); + System.assertNotEquals(null, result.errorMessage); + System.assert(result.errorMessage.contains('400')); + } + + @IsTest + static void createEnvelopeReturnsEarlyWhenEmailIsBlank() { + Appraiser_Case__c appraiserCase = new Appraiser_Case__c( + Appraiser_Field_Review_Date__c = Date.today() + ); + insert appraiserCase; + + Test.startTest(); + DocusignESignatureService.EnvelopeCreateResult result = DocusignESignatureService.createEnvelope( + appraiserCase.Id, + 'DTC_CLM_Demo', + 'tmpl-001' + ); + Test.stopTest(); + + System.assertEquals(false, result.success); + System.assertNotEquals(null, result.errorMessage); + System.assert(result.errorMessage.toLowerCase().contains('email')); + } }