From 964a2ed032a26eeef01b6a83bb83039ea6f7bfac Mon Sep 17 00:00:00 2001 From: WimVelzeboer Date: Thu, 13 Jan 2022 11:47:54 +0000 Subject: [PATCH] Improved method for setting read-only field values When mocking records, read-only field values can only be set with this method. It is now also compatible with Date field types Signed-off-by: WimVelzeboer --- .../classes/utils/fflib_MockSObjectUtil.cls | 46 ++++++++++++++++--- 1 file changed, 39 insertions(+), 7 deletions(-) diff --git a/sfdx-source/apex-extensions/main/default/classes/utils/fflib_MockSObjectUtil.cls b/sfdx-source/apex-extensions/main/default/classes/utils/fflib_MockSObjectUtil.cls index de6af26..6aad88d 100644 --- a/sfdx-source/apex-extensions/main/default/classes/utils/fflib_MockSObjectUtil.cls +++ b/sfdx-source/apex-extensions/main/default/classes/utils/fflib_MockSObjectUtil.cls @@ -16,14 +16,46 @@ public with sharing class fflib_MockSObjectUtil SObject.class); } - public static SObject addFieldValue( + // Keeping this method for backwards compatibility + @TestVisible + private static SObject addFieldValue(SObject record, Schema.SObjectField sObjectField, Object value) + { + System.debug(LoggingLevel.WARN, 'addFieldValue is deprecated and will be removed at some point, please use setFieldValue instead'); + return setFieldValue(record, sObjectField, value); + } + + @TestVisible + private static SObject setFieldValue( SObject record, SObjectField sObjectField, Object value) { - String original = JSON.serialize(record); - return (SObject) JSON.deserialize( - original.left(original.length() - 1) + ',"' - + sObjectField.getDescribe().getName() + '":"' - + String.valueOf(value) + '"}', - SObject.class); + String fieldName = sObjectField.getDescribe().getName(); + + String serializedRecord = JSON.serialize(record); + Map valuesByFieldName = + (Map) JSON.deserializeUntyped(serializedRecord); + + valuesByFieldName.put(fieldName, value); + serializedRecord = JSON.serialize(valuesByFieldName); + + return (SObject) JSON.deserialize(serializedRecord, SObject.class); + } + + @IsTest + static void itShouldTestAddingReadOnlyField() + { + final Decimal amount = 10.0; + Opportunity opp = new Opportunity(Id = fflib_IDGenerator.generate(Schema.Opportunity.SObjectType)); + SObject result = addFieldValue(opp, Opportunity.ExpectedRevenue, amount); + System.assertEquals(amount, result.get(Opportunity.ExpectedRevenue)); + } + + @IsTest + static void itShouldTestSettingDateField() + { + final Date today = Date.today(); + Lead record = new Lead(Id = fflib_IDGenerator.generate(Schema.Lead.SObjectType)); + SObject result = addFieldValue(record, Lead.ConvertedDate, today); + System.assertEquals(today, result.get(Lead.ConvertedDate)); + System.debug('result: '+result); } } \ No newline at end of file