I have a simple helper method in my Apex Code that loads an external ID from a field on the related Case.Contact. I have problems to write a proper unit test that covers the last three lines, including the if(…)
and the return
. I have seen this general answer, unfortunately it does not help me.
This is the method
@TestVisible
private static String getCoursePortalId(String recId) {
if(String.isBlank(recId))
return null;
//Decimal coursePortalIdDecimal = [SELECT Contact.Course_Portal_ID__c FROM Case WHERE Id = :recId].Contact.Course_Portal_ID__c;
Case caseObj = [SELECT Contact.Course_Portal_ID__c FROM Case WHERE Id = :recId];
if(caseObj == null || caseObj.Contact == null || caseObj.Contact.Course_Portal_ID__c == null)
return null;
return caseObj.Contact.Course_Portal_ID__c.toPlainString(); //Decimal to String
}
And this is the corresponding test attempt:
public static testMethod void testGetCoursePortalId() {
// Create case with all required fields
Account accountObj = new Account(
Name = 'JohnDoeAccount'
);
insert accountObj;
Contact contactObj = new Contact(
FirstName = 'John',
LastName = 'Doe',
Course_Portal_ID__c = 1,
AccountId = accountObj.Id
);
insert contactObj;
Case caseObj = new Case(
ContactId = contactObj.Id,
AccountId = accountObj.Id,
Status = 'Working',
Origin = 'Phone');
insert caseObj;
caseObj = [SELECT id, Contact.Course_Portal_ID__c FROM Case WHERE id = :caseObj.id];
System.debug('Course_Portal_ID__c: ' + caseObj.Contact.Course_Portal_ID__c);
System.assertEquals(1, caseObj.Contact.Course_Portal_ID__c);
System.assertEquals('1', caseObj.Contact.Course_Portal_ID__c.toPlainString());
delete caseObj;
delete contactObj;
delete accountObj;
// Create case with all required fields
Account accountObj2 = new Account(
Name = 'JohnDoeAccount'
);
insert accountObj2;
Contact contactObj2 = new Contact(
FirstName = 'John',
LastName = 'Doe',
Course_Portal_ID__c = null,
AccountId = accountObj2.Id
);
insert contactObj2;
Case caseObj2 = new Case(
ContactId = contactObj2.Id,
AccountId = accountObj2.Id,
Status = 'Working',
Origin = 'Phone');
insert caseObj2;
caseObj2 = [SELECT id, Contact.Course_Portal_ID__c FROM Case WHERE id = :caseObj2.id];
System.debug('Course_Portal_ID__c2: ' + caseObj2.Contact.Course_Portal_ID__c);
System.assertEquals(null, caseObj2.Contact.Course_Portal_ID__c);
delete caseObj2;
delete contactObj2;
delete accountObj2;
Test.startTest();
String moodleIdNull = MoodleApiLoaderController.getCoursePortalId(null); //also test ''
String moodleIdExists = MoodleApiLoaderController.getCoursePortalId('1001i000005Qd6dAAC'); //SOQL does not work in tests like normal...?
String moodleIdMissing = MoodleApiLoaderController.getCoursePortalId('1001F00000T2sjSQAR'); //SOQL does not work in tests like normal...?
Test.stopTest();
System.assertEquals(null, moodleIdNull);
System.assertEquals('4776', moodleIdExists); //JZ ID:23391
System.assertEquals(null, moodleIdMissing); //JZ ID:
}
The dummy data does not help (removing it changes nothing but I kept it to show what I've tried.).
How can I test lines like that?