Add domain method to map the record Id to a grand-grand-...-parent record Id

This commit is contained in:
WimVelzeboer
2022-05-25 12:22:48 +01:00
parent e1117f1991
commit 0b4d878382
6 changed files with 238 additions and 1 deletions
@@ -120,6 +120,51 @@ private class fflib_SObjects2Test
// todo - add assertions
}
@IsTest
static void itShouldReturnTheRelatedParentDomainId()
{
// GIVEN a case related to contact related to Account ,
// a case record related to contact but not to Account,
// and a case record related to nothing.
// All encapsulated in domains.
Id caseIdA = fflib_IDGenerator.generate(Schema.Case.SObjectType);
Id caseIdB = fflib_IDGenerator.generate(Schema.Case.SObjectType);
Id caseIdC = fflib_IDGenerator.generate(Schema.Case.SObjectType);
Id contactIdA = fflib_IDGenerator.generate(Schema.Contact.SObjectType);
Id contactIdB = fflib_IDGenerator.generate(Schema.Contact.SObjectType);
Id accountId = fflib_IDGenerator.generate(Schema.Account.SObjectType);
Account accountRecord = new Account(Id = accountId);
Contact contactRecordA = new Contact(Id = contactIdA, AccountId = accountId);
Contact contactRecordB = new Contact(Id = contactIdB);
Case caseRecordA = new Case(Id = caseIdA, ContactId = contactIdA);
Case caseRecordB = new Case(Id = caseIdB, ContactId = contactIdB);
Case caseRecordC = new Case(Id = caseIdC);
DomainAccounts accountDomain = new DomainAccounts(new List<Account> {accountRecord});
DomainContacts contactDomain = new DomainContacts(new List<Contact> {contactRecordA, contactRecordB});
DomainCases caseDomain = new DomainCases(new List<Case> {caseRecordA, caseRecordB, caseRecordC});
// WHEN we request the relation between Case and Account
System.Test.startTest();
Map<Id, Id> result = caseDomain.getGrandParentIdById(
new List<fflib_SObjects2>
{
contactDomain,
accountDomain
}
);
System.Test.stopTest();
// THEN it should return the AccountId By CaseId
System.assertEquals(3, result.size(), 'Expected one related account to the case');
System.assert(result.containsKey(caseIdA));
System.assert(result.containsKey(caseIdB));
System.assert(result.containsKey(caseIdC));
System.assertEquals(accountId, result.get(caseIdA), 'Account Id should be related to the Case Id A');
System.assertEquals(null, result.get(caseIdB), 'Case Id B should have no related Account Id');
System.assertEquals(null, result.get(caseIdC), 'Case Id B should have no related Account Id');
}
@IsTest
static void itShouldReturnStringById()
{
@@ -614,4 +659,36 @@ private class fflib_SObjects2Test
clearField(Schema.Account.ShippingCountry);
}
}
private class DomainContacts extends fflib_SObjects2
{
public DomainContacts(List<SObject> records)
{
super(records, Schema.Contact.SObjectType);
}
protected override Map<SObjectType, Schema.SObjectField> getRelatedFieldByDomainType()
{
return new Map<SObjectType, Schema.SObjectField>
{
Schema.Account.SObjectType => Contact.AccountId
};
}
}
private class DomainCases extends fflib_SObjects2
{
public DomainCases(List<SObject> records)
{
super(records, Schema.Case.SObjectType);
}
protected override Map<SObjectType, Schema.SObjectField> getRelatedFieldByDomainType()
{
return new Map<SObjectType, Schema.SObjectField>
{
Schema.Contact.SObjectType => Case.ContactId
};
}
}
}
@@ -238,6 +238,34 @@ private class fflib_ArrayUtilsTest
System.assertEquals(8, result, 'Did not return the last value in the list of objects');
}
@IsTest
static void itShouldReplaceValueInTheMap()
{
Id accountIdA = fflib_IDGenerator.generate(Schema.Account.SObjectType);
Id accountIdB = fflib_IDGenerator.generate(Schema.Account.SObjectType);
Id accountIdC = fflib_IDGenerator.generate(Schema.Account.SObjectType);
Id contactIdA = fflib_IDGenerator.generate(Schema.Contact.SObjectType);
Id contactIdB = fflib_IDGenerator.generate(Schema.Contact.SObjectType);
Map<Id, Id> source = new Map<Id, Id>
{
accountIdA => contactIdA,
accountIdB => contactIdB,
accountIdC => fflib_IDGenerator.generate(Schema.Contact.SObjectType)
};
Map<Id, Id> replacement = new Map<Id, Id>
{
contactIdA => accountIdB,
contactIdB => accountIdA
};
Map<Id, Id> result = fflib_ArrayUtils.replaceValue(source, replacement);
System.assertEquals(3, result.size());
System.assertEquals(accountIdB, result.get(accountIdA));
System.assertEquals(accountIdA, result.get(accountIdB));
System.assertEquals(null, result.get(accountIdC));
}
@IsTest
static void itShouldReturnAllValuesForTheGivenIds()
{