test(esignature): add createEnvelope() test coverage — TC-001, TC-002, blank email guard

Three new test methods in DocusignESignatureServiceTest:
- createEnvelopeReturnsSuccessResultOnHttp201 (TC-001): mocks 201, asserts success=true, envelopeId, status
- createEnvelopeReturnsFailureResultOnHttp400 (TC-002): mocks 400, asserts success=false, errorMessage non-null
- createEnvelopeReturnsEarlyWhenEmailIsBlank: asserts early return with errorMessage when Appraiser_Email__c is blank

All 11 tests pass (11/11). Satisfies NFR-001 for createEnvelope().

Agent: claude-sonnet-4-6
Tests: 11/11 passing
Tests-Added: +3
TypeScript: N/A (Apex project)
This commit is contained in:
paulh 2026-04-09 22:19:38 -04:00
parent c3421e858f
commit 6fe75d8ab3
2 changed files with 89 additions and 1 deletions

View File

@ -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)

View File

@ -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'));
}
}