@IsTest private class QueueMetadataActionsTest { @TestSetup static void setupQueue() { insert new Group( Name = 'Support Queue', DeveloperName = 'Support_Queue', Type = 'Queue', Email = 'support@example.com' ); } @IsTest static void createsOriginWhenMissing() { MetadataMock mock = new MetadataMock('origin'); Test.setMock(HttpCalloutMock.class, mock); CreateOriginPicklistItem.Request request = new CreateOriginPicklistItem.Request(); request.picklistItemName = 'Phone Support'; Test.startTest(); CreateOriginPicklistItem.Result result = CreateOriginPicklistItem.createOrigin( new List{ request } )[0]; Test.stopTest(); Assert.areEqual('Phone_Support', result.caseOrigin); Assert.isTrue(result.created); Assert.areEqual(2, mock.requests.size()); Assert.isTrue( mock.requests[1].contains('Phone_Support') ); Assert.isTrue(mock.requests[1].contains('')); } @IsTest static void createsEmailToCaseRoute() { Group queue = [ SELECT Id FROM Group WHERE DeveloperName = 'Support_Queue' LIMIT 1 ]; MetadataMock mock = new MetadataMock('emailToCase'); Test.setMock(HttpCalloutMock.class, mock); CreateEmailToCase.Request request = new CreateEmailToCase.Request(); request.routingName = 'Support Route'; request.emailAddress = 'support@example.com'; request.caseOwnerId = queue.Id; request.caseOrigin = 'Phone_Support'; Test.startTest(); CreateEmailToCase.Result result = CreateEmailToCase.createRoutingAddress( new List{ request } )[0]; Test.stopTest(); Assert.isTrue(result.created); Assert.areEqual('Case', result.metadataFullName); Assert.areEqual(2, mock.requests.size()); Assert.isTrue( mock.requests[1].contains('Support_Queue') ); Assert.isTrue( mock.requests[1].contains('Medium') ); Assert.isTrue( mock.requests[1].contains('EmailToCase') ); Assert.isTrue( mock.requests[1] .contains('support@example.com') ); Assert.isTrue( mock.requests[1].contains('Phone_Support') ); } @IsTest static void createsQueueListView() { Group queue = [ SELECT Id FROM Group WHERE DeveloperName = 'Support_Queue' LIMIT 1 ]; MetadataMock mock = new MetadataMock('listView'); Test.setMock(HttpCalloutMock.class, mock); CreateListView.Request request = new CreateListView.Request(); request.listViewLabel = 'Support Open Cases'; request.objectApiName = 'Case'; request.groupId = queue.Id; request.displayColumns = 'CASE.CASE_NUMBER, CASE.SUBJECT, CASE.STATUS'; Test.startTest(); CreateListView.Result result = CreateListView.createView( new List{ request } )[0]; Test.stopTest(); Assert.areEqual('Support_Open_Cases', result.listViewApiName); Assert.areEqual('Case.Support_Open_Cases', result.metadataFullName); Assert.isTrue(result.created); Assert.isTrue( mock.requests[1].contains('Queue') ); Assert.isTrue(mock.requests[1].contains('Support_Queue')); Assert.isTrue( mock.requests[1].contains('Resolved,Cancelled,Closed') ); } @IsTest static void appendsAutoResponseEntryAtEnd() { String sourceXml = '' + '' + 'Case Auto-Responsetrue' + 'old@example.com' + '' + ''; CreateCaseAutoResponseRule.Configuration configuration = new CreateCaseAutoResponseRule.Configuration(); configuration.autoResponseRuleName = 'Case Auto-Response'; configuration.caseOrigin = 'Phone_Support'; configuration.templateFullName = 'unfiled$public/Support_Template'; String result = CreateCaseAutoResponseRule.appendRuleEntry( sourceXml, configuration ); Assert.areNotEqual( result.indexOf(''), result.lastIndexOf('') ); Assert.isFalse(result.contains('')); Assert.isTrue(result.contains('Case.Origin')); Assert.isTrue(result.contains('Phone_Support')); Assert.isTrue(result.contains('Case.ContactEmail')); Assert.isTrue(result.contains('Case.Status')); Assert.isTrue(result.contains('Active')); Assert.isTrue(result.contains('Case.RecordTypeId')); Assert.isTrue(result.contains('Customer Service')); Assert.isTrue( result.contains('') ); } @IsTest static void rejectsMultipleInvocableRequests() { CreateOriginPicklistItem.Request first = new CreateOriginPicklistItem.Request(); first.picklistItemName = 'One'; CreateOriginPicklistItem.Request second = new CreateOriginPicklistItem.Request(); second.picklistItemName = 'Two'; try { CreateOriginPicklistItem.createOrigin( new List{ first, second } ); Assert.fail('Expected a validation exception.'); } catch (IllegalArgumentException expected) { Assert.isTrue(expected.getMessage().contains('exactly one request')); } } @IsTest static void insertsAutoResponseEntryAtRequestedPosition() { String sourceXml = '' + 'Case Auto-Responsetrue' + '' + ''; CreateCaseAutoResponseRule.Configuration configuration = new CreateCaseAutoResponseRule.Configuration(); configuration.autoResponseRuleName = 'Case Auto-Response'; configuration.caseOrigin = 'Phone_Support'; configuration.templateFullName = 'unfiled$public/Inserted'; configuration.sortOrder = 1; String result = CreateCaseAutoResponseRule.appendRuleEntry( sourceXml, configuration ); Assert.isTrue( result.indexOf('unfiled$public/Inserted') < result.indexOf('unfiled$public/First') ); } private class MetadataMock implements HttpCalloutMock { private String scenario; public List requests = new List(); private MetadataMock(String scenario) { this.scenario = scenario; } public HttpResponse respond(HttpRequest request) { requests.add(request.getBody()); HttpResponse response = new HttpResponse(); response.setStatusCode(200); response.setHeader('Content-Type', 'text/xml'); if (request.getBody().contains('')) { response.setBody(readResponse()); } else { response.setBody(saveResponse()); } return response; } private String readResponse() { String recordXml; if (scenario == 'origin') { recordXml = 'CaseOrigin' + 'Emailfalse' + ''; } else if (scenario == 'emailToCase') { recordXml = 'Case' + 'true' + 'Discard' + ''; } else { recordXml = ''; } return envelope( '' + recordXml + '' ); } private String saveResponse() { Boolean created = scenario == 'listView'; return envelope( '' + String.valueOf(created).toLowerCase() + 'Testtrue' + '' ); } private String envelope(String body) { return '' + '' + '' + body + ''; } } }