Improve performance of Dynamic Application Factories

Also added a method overload to provide a Package Name.
Useful for DX based second generation packages. Now each package can have their own bindings.
This commit is contained in:
wim
2023-09-01 15:39:25 +01:00
parent b658e6226b
commit a0fc1bd10d
22 changed files with 416 additions and 139 deletions
@@ -31,15 +31,24 @@
@IsTest(IsParallel=true)
public class fflib_DynamicDomainFactoryTest
{
private static final SObjectType ACCOUNT_OBJECT_TYPE = Schema.Account.SObjectType;
private static final String PACKAGE_FORCE_APP = 'force-app';
private static final String PACKAGE_OTHER_APP = 'other-app';
private static final fflib_IAppBindingResolver bindingResolver =
new fflib_AppBindingResolver();
private static final fflib_DynamicDomainFactory Domain =
new fflib_DynamicDomainFactory(
bindingResolver,
fflib_DynamicSelectorFactoryTest.Selector);
private static final SObjectType ACCOUNT_OBJECT_TYPE = Schema.Account.SObjectType;
fflib_DynamicSelectorFactoryTest.Selector,
PACKAGE_FORCE_APP);
private static final fflib_DynamicDomainFactory OtherDomain =
new fflib_DynamicDomainFactory(
bindingResolver,
fflib_DynamicSelectorFactoryTest.Selector,
PACKAGE_OTHER_APP);
@IsTest
static void itShouldReturnDomain()
@@ -107,6 +116,19 @@ public class fflib_DynamicDomainFactoryTest
System.Assert.isTrue(instanceB.getRecords().isEmpty());
}
@IsTest
static void itShouldReturnTheRightDomainForThePackage()
{
fflib_AppBindingsSelector.SELECTOR_IMPL_TYPE = AppBindingsSelectorMock.class;
final List<Account> records = generateAccountRecords();
System.Test.startTest();
fflib_IDomain otherDomain = OtherDomain.newInstance(records);
System.Test.stopTest();
System.Assert.isTrue(otherDomain instanceof fflib_SObjects2, 'Incorrect returned instance');
}
private static List<Account> generateAccountRecords()
{
@@ -128,18 +150,46 @@ public class fflib_DynamicDomainFactoryTest
}
}
public class OtherDomainConstructor implements fflib_IDomainConstructor
{
public fflib_IDomain construct(List<Object> objects)
{
return new fflib_SObjects2((List<SObject>) objects);
}
}
private class AppBindingsSelectorMock extends fflib_AppBindingsSelector
{
public override List<fflib_AppBinding__mdt> selectAll()
{
fflib_ApplicationPackage__mdt forceApp =
new fflib_ApplicationPackage__mdt(
Id = fflib_IDGenerator.generate(fflib_ApplicationPackage__mdt.SObjectType),
DeveloperName = PACKAGE_FORCE_APP);
fflib_ApplicationPackage__mdt otherApp =
new fflib_ApplicationPackage__mdt(
Id = fflib_IDGenerator.generate(fflib_ApplicationPackage__mdt.SObjectType),
DeveloperName = PACKAGE_OTHER_APP);
return new List<fflib_AppBinding__mdt>
{
new fflib_AppBinding__mdt(
ApplicationPackage__c = forceApp.Id,
ApplicationPackage__r = forceApp,
Type__c = 'Domain',
BindingObject__c = '',
BindingObjectAlternate__c = ACCOUNT_OBJECT_TYPE.getDescribe().getName(),
ImplementationType__c = MyDomainConstructor.class.getName(),
SharingMode__c = 'None'
),
new fflib_AppBinding__mdt(
ApplicationPackage__c = otherApp.Id,
ApplicationPackage__r = otherApp,
Type__c = 'Domain',
BindingObject__c = '',
BindingObjectAlternate__c = ACCOUNT_OBJECT_TYPE.getDescribe().getName(),
ImplementationType__c = OtherDomainConstructor.class.getName(),
SharingMode__c = 'None'
)
};
}
@@ -153,7 +153,6 @@ private class fflib_SObjects2Test
}
);
System.Test.stopTest();
System.debug('result: ' + JSON.serializePretty(result));
// THEN it should return the AccountId By CaseId
System.Assert.areEqual(1, result.size(), 'Expected one account');
@@ -194,7 +193,6 @@ private class fflib_SObjects2Test
}
);
System.Test.stopTest();
System.debug('result: ' + JSON.serializePretty(result));
// THEN it should return the AccountId By CaseId
System.Assert.areEqual(1, result.size(), 'Expected one account');
@@ -91,7 +91,6 @@ private class fflib_LogEventAppenderTest
fflib_LogEventAppender eventAppender = new fflib_LogEventAppender();
fflib_LogLevelFilter__c orgSettings = fflib_LogLevelFilter__c.getOrgDefaults();
System.debug(orgSettings);
orgSettings.LogLevel__c = 'INFO';
insert orgSettings;
@@ -96,7 +96,6 @@ private class fflib_LoggerTest
// THEN - It should be appended to the logAppender
final List<String> result = APPENDER_MOCK
.getAppendedMessages(System.LoggingLevel.DEBUG);
System.debug(result);
System.Assert.areEqual(1, result.size(), 'Expected only one error');
System.Assert.isTrue(result.get(0).startsWith(ERROR_MESSAGE_FORMATTED_WITH_EXCEPTION), 'Incorrect returned error message');
}