0

I have 2 RestResource classes:

@RestResource(urlMapping='/Catcher/*') global Without Sharing class vecCatcher { @HttpGet global static void httpGet() { ... } } 

and

@RestResource(urlMapping='/MemberCallTwilio/*') global without sharing class MemberCallTwilio { @HttpGet global static void httpGet() { ... } } 

I'm writing the unit test for the second one, in which I set the requestURI to '/MemberCallTwilio/p2p'. When I run the test, it calls the Catcher class instead. I've even got a debug statement in Catcher that shows the requestURI is 'MemberCallTwilio/p2p'.

When we test this real world, the incoming rest call accesses the correct class, it's just the unit test that results in a call to the wrong class. Catcher runs, system debugs all the parameters correctly, then does nothing because the statusCallbackEvent has no actions in this class.

Here's the full test, along with the method that generates the HTTP request:

 @isTest public static void test_EnglishCallsSpanish(){ List<Contact> members = [ SELECT Id, FCM_Token__c, FirstName, LastName FROM Contact WHERE FirstName = 'MemberApp' ORDER BY LastName LIMIT 3]; Contact caller = members[2]; //English, has fcmToken Contact recipient = members[1]; //Spanish, has fcmToken RestRequest req = generateCallRequest(caller.id, recipient.id); RestContext.request = req; RestResponse res = new RestResponse(); RestContext.response = res; //set mock for pushNotification callout Test.setMock(HttpCalloutMock.class, new HttpMockGenerator()); test.startTest(); vecCatcher.httpGet(); test.stopTest(); System.assertEquals(200, res.statusCode); //more asserts to come } private static RestRequest generateCallRequest(String callerId, String recipientId){ RestRequest req = new RestRequest(); req.addHeader('Content-Type', 'application/json'); req.requestURI = '/MemberCallTwilio/p2p'; req.httpMethod = 'GET'; req.addParameter('RoomStatus', 'in-progress'); req.addParameter('RoomType', 'peer-to-peer'); req.addParameter('recipientAccessToken', 'eyJhbGciOiJIUzI1Ni'); req.addParameter('RoomSid', 'RM712345'); req.addParameter('RoomName', '003jsotNO8'); req.addParameter('SequenceNumber', '0'); req.addParameter('recipientId', recipientId); req.addParameter('callerId', callerId); req.addParameter('StatusCallbackEvent', 'room-created'); req.addParameter('Timestamp', '2021-12-13T16:08:05.694Z'); req.addParameter('AccountSid', 'AC...2345'); System.debug('🔸 requestURI: ' + req.requestURI); return req; } 
1
  • BTW, I know I don't need test mock for testing an incoming REST call, but the MemberCallTwilio class results in an outbound call that does need the mock. Commented Dec 15, 2021 at 18:32

1 Answer 1

2

Your Catcher endpoint is receiving the request because in your test you have veeCatcher.httpGet();

Change that to MemberCallTwilio.httpGet(), and you'll execute the code you're intending to execute.

2
  • DUH! Copy/paste error. Thanks for fresh eyes! Commented Dec 15, 2021 at 18:38
  • @PatMcClellan__c it's always the small things, isn't it? Commented Dec 15, 2021 at 18:39

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.