0
votes

I've succeeded to successfully construct a REST API using APEX language defined with an annotation: @RestResource.

I also wrote a matching Unit test procedure with @isTest annotation. The execution of the REST API triggered by a HTTP GET with two input parameters works well, while the Unit Test execution, returns a "null" value list resulting from the SOQL query shown below:

String mycase = inputs_case_number; // for ex. '00001026'   
sObject[] sl2 = [SELECT Id, CaseNumber FROM Case WHERE CaseNumber = :mycase LIMIT 1];

The query returns:

VARIABLE_ASSIGNMENT [22]|sl2|[]|0x1ffefea6

I've also tried to execute it with a RunAs() method (see code below), using a dynamically created Salesforce test user, not anonymous, connected to a more powerful profile, but still receiving a "null" answer at the SOQL query. The new profile defines "View All" permission for Cases. Other SOQL queries to objects like: "User" and "UserRecordAccess" with very similar construction are working fine, both for REST APEX and Test APEX.

Is there a way to configure an access permission for Unit test (@isTest) to read the Case object and a few fields like: Id and CaseNumber. Is this error related to the "Tooling API" function and how can we fix this issue in the test procedure?

Code attachment: Unit Test Code

@isTest
private class MyRestResource1Test {
     static testMethod void MyRestRequest() { 
     // generate temporary test user object and assign to running process
     String uniqueUserName = 'standarduser' + DateTime.now().getTime() + '@testorg.com';
     Profile p = [SELECT Id FROM Profile WHERE Name='StandardTestUser'];
     User pu = new User(Alias='standt',Email='[email protected]',LastName='testing',EmailEncodingKey='UTF-8',LanguageLocaleKey='en_US',LocaleSidKey='en_US',ProfileId=p.Id,TimeZoneSidKey='America/New_York',UserName=uniqueUserName);
     System.RunAs(pu) {
          RestRequest req = new RestRequest();
          RestResponse res = new RestResponse(); 
          req.requestURI = '/services/apexrest/sfcheckap/';
          req.addParameter('useremail','[email protected]');
          req.addParameter('casenumber','00001026'); 
          req.httpMethod = 'GET';
          RestContext.request = req;
          RestContext.response = res;
          System.debug('Current User assigned is: ' + UserInfo.getUserName());
          System.debug('Current Profile assigned is: ' + UserInfo.getProfileId()); 
          Test.startTest(); 
          Map<String, Boolean> resultMap = MyRestResource1.doGet(); 
          Test.stopTest();
          Boolean debugflag = resultMap.get('accessPermission');
          String debugflagstr = String.valueOf(debugflag);
          System.assert(debugflagstr.contains('true'));
        }   
    }  
}
1

1 Answers

0
votes

Found a solution path by using: @isTest(SeeAllData=true)

See article: "Using the isTest(SeeAllData=true) Annotation"

https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_testing_seealldata_using.htm