I have a controller for a VF Page in a SF Community that returns data from the logged-in user's related Contact record. These user accounts are generated by starting with a contact, then creating a Customer Community Login user account to give them access to the community, so all User accounts that will be viewing this page will have an associated Contact record.
I'm running into trouble testing it because when I run the tests I'm logged in as my own user account in the Sandbox console, and I don't see a way to attach a Contact record to an existing User account. So when the test hits this line
this.userContact = [SELECT Id, Name, AccountId from Contact WHERE Id = :user.ContactId];
then this.userContact
is always null and it can't complete the rest of the test.
How can I fix this? Either by associating a Contact record with my existing SF admin user account in the Sandbox, or if that's not possible, is there a better way to write either the controller or the test to work around this?
When I first wrote the test my VF page was set up differently, so I was just inserting dummy data in the test (contacts, users, etc) and then passing the id of the dummy user to the VF page as a parameter. But now that the controller is using :UserInfo.getUserId()
to get the id of the logged in user (which is the only way I've been able to get this to work on the front end), I can't figure out how to update my test to match.
Controller:
public with sharing class UserStewardListController {
private final User user;
private final Contact userContact;
public final Account userAccount;
private final CVRSOS__Local__c sublocal;
private final Id sublocalId;
public UserStewardListController(ApexPages.StandardController stdController) {
System.debug(LoggingLevel.INFO, '>>> UserStewardListController');
this.user = [SELECT Id, ContactId FROM User WHERE Id = :UserInfo.getUserId()];
System.debug(LoggingLevel.INFO, '>>> USER' + user);
this.userContact = [SELECT Id, Name, AccountId from Contact WHERE Id = :user.ContactId];
System.debug(LoggingLevel.INFO, '>>> USER CONTACT' + userContact);
this.userAccount = [SELECT Id, Name, Sublocal__c, Organizer_Name__c, Organizer_Email__c, Organizer_Cell_Phone__c from Account WHERE Id = :userContact.AccountId];
System.debug(LoggingLevel.INFO, '>>> USER ACCOUNT' + userAccount);
this.sublocal = [SELECT Id from CVRSOS__Local__c where Id = :userAccount.Sublocal__c];
this.sublocalId = sublocal.Id;
System.debug(LoggingLevel.INFO, '>>> SUBLOCAL' + sublocal);
System.debug(LoggingLevel.INFO, '>>> SUBLOCALID' + sublocalId);
}
public List<CVRSOS__LocalSteward__c> getStewards() {
System.debug(LoggingLevel.INFO, '>>> getStewards');
CVRSOS__LocalSteward__c[] stewardList = [
SELECT Id,
CVRSOS__StewardName__c,
Steward_Mobile_Phone__c,
Steward_Preferred_Email__c,
Steward_Worksite_Employer__c,
Steward_Worksite__c,
CVRSOS__ContactId__r.Title
FROM CVRSOS__LocalSteward__c
WHERE ( CVRSOS__LocalId__c = :this.sublocalId)
];
if(stewardList.size() > 0) {
System.debug(LoggingLevel.INFO, '>>> stewardList' + stewardList);
return stewardList;
} else {
System.debug(LoggingLevel.INFO, '>>> stewardList.size === 0');
return null;
}
}
public Account getUserAccount() {
return userAccount;
}
}
Test:
@isTest
private class UserStewardListControllerTest {
static testMethod void testMethod1(){
//Insert Sublocal Record
CVRSOS__Local__c s = new CVRSOS__Local__c(Division__c='Care Providers');
list<CVRSOS__Local__c> sublocalList = new list<CVRSOS__Local__c>();
System.debug(LoggingLevel.INFO, '>>> sublocalList' + sublocalList);
sublocalList.add(s);
insert sublocalList;
// Save sublocalId for creating Account
Id sublocalId = sublocalList[0].Id;
//Insert Account and Contacts
Account a = new Account(Name = 'Test Account');
Insert a;
Contact c1 = New Contact(AccountId = a.Id, FirstName='FirstName1', LastName='LastName1', CVRSOS__Local__c = sublocalId);
Contact c2 = New Contact(AccountId = a.Id, FirstName='FirstName2', LastName='LastName2', CVRSOS__Local__c = sublocalId);
Contact c3 = New Contact(AccountId = a.Id, FirstName='UserFirst', LastName='UserLast', CVRSOS__Local__c = sublocalId);
Insert c1;
Insert c2;
Insert c3;
//Insert User
User u = New User(Contact=c3, ContactId=c3.Id);
//Insert Stewards
CVRSOS__LocalSteward__c st1 = new CVRSOS__LocalSteward__c( CVRSOS__ContactId__c = c1.Id, CVRSOS__LocalId__c = sublocalId);
CVRSOS__LocalSteward__c st2 = new CVRSOS__LocalSteward__c( CVRSOS__ContactId__c = c2.Id, CVRSOS__LocalId__c = sublocalId);
list<CVRSOS__LocalSteward__c> stewardList = new list<CVRSOS__LocalSteward__c>();
stewardList.add(st1);
stewardList.add(st2);
System.debug(LoggingLevel.INFO, '>>> stewardList' + stewardList);
insert stewardList;
Test.StartTest();
PageReference pageRef = Page.UserContactSublocalStewardList;
pageRef.getParameters().put('id', String.valueOf(u.Id));
Test.setCurrentPage(pageRef);
ApexPages.StandardController sc = new ApexPages.StandardController(u);
UserStewardListController ext = new UserStewardListController(sc);
//Test that Stewards are Inserted
list<CVRSOS__LocalSteward__c> obj1 = ext.getStewards();
// system.assertequals(obj1.size(),2);
//Delete Records
delete sublocalList;
delete stewardList;
delete a;
delete c1;
delete c2;
delete c3;
//Test that Stewards are Deleted
list<CVRSOS__LocalSteward__c> obj2 = ext.getStewards();
system.assertEquals(obj2.size(),0);
Test.StopTest();
}
}