From 94129a97914ef1b550d30b39de216ce737fc2c8a Mon Sep 17 00:00:00 2001 From: robinreditus Date: Wed, 5 Aug 2026 10:23:06 +0200 Subject: [PATCH] Override getRecordsWithNotBlankFieldValues for non-String fields (#90) * Override getRecordsWithNotBlankFieldValues in fflib_SObjects2 The base fflib_SObjects implementation casts every value to String, which throws a TypeException on Date/Datetime/Number/Lookup fields. This override generalises the check to "any non-null value, and for Strings also non-blank" so the helper works for every field type. Co-Authored-By: Claude Opus 4.7 (1M context) * Update fflib_SObjects2.cls Rename method to getRecordsWithNonBlankFieldValues * Update fflib_SObjects2Test.cls Rename method to getRecordsWithNonBlankFieldValues * Update fflib_SObjects2.cls Rename variable Co-authored-by: Robin Weymans Co-authored-by: Claude Opus 4.7 (1M context) Co-authored-by: William Velzeboer <6429417+wimvelzeboer@users.noreply.github.com> --- .github/workflows/deploy.and.test.yml | 10 ++++- .../classes/domains/fflib_SObjects2.cls | 25 +++++++++++- .../classes/domains/fflib_SObjects2Test.cls | 40 ++++++++++++++++++- 3 files changed, 71 insertions(+), 4 deletions(-) diff --git a/.github/workflows/deploy.and.test.yml b/.github/workflows/deploy.and.test.yml index d50e75e..efc4fe0 100644 --- a/.github/workflows/deploy.and.test.yml +++ b/.github/workflows/deploy.and.test.yml @@ -26,7 +26,13 @@ jobs: run: npm install @salesforce/cli --global - name: Authorize with the dev hub - run: echo "${{ secrets.SFDX_AUTH_URL }}" | sf org login sfdx-url --alias SFDX-ENV --set-default-dev-hub --sfdx-url-stdin + env: + SFDX_AUTH_URL: ${{ secrets.SFDX_AUTH_URL }} + run: | + echo "$SFDX_AUTH_URL" | wc -c + echo "${{ secrets.SFDX_AUTH_URL }}" | wc -c + echo "$Env:SFDX_AUTH_URL" | wc -c + echo "${{ secrets.SFDX_AUTH_URL }}" | sf org login sfdx-url --alias SFDX-ENV --set-default-dev-hub --sfdx-url-stdin - name: Setup the config parameters needed run: | @@ -82,4 +88,4 @@ jobs: - name: Push changes to GIT run: | - git push \ No newline at end of file + git push diff --git a/sfdx-source/apex-extensions/main/default/classes/domains/fflib_SObjects2.cls b/sfdx-source/apex-extensions/main/default/classes/domains/fflib_SObjects2.cls index dcbb89b..2a5ecc6 100644 --- a/sfdx-source/apex-extensions/main/default/classes/domains/fflib_SObjects2.cls +++ b/sfdx-source/apex-extensions/main/default/classes/domains/fflib_SObjects2.cls @@ -1078,6 +1078,29 @@ public virtual class fflib_SObjects2 return getRecordsNotIn(sObjectField, new Set{ value }); } + /** + * Overrides the fflib_SObjects base implementation, which casts every value to `String` and + * uses `String.isNotBlank` — that throws a TypeException on Date / Datetime / Number / Lookup + * fields. This override generalises to "any non-null value, and for Strings also non-blank", + * so the helper works for every field type. + * + * @param field The field to check. + * + * @return The records whose value for `field` is non-null (and, for Strings, non-blank). + */ + protected override List getRecordsWithNonBlankFieldValues(Schema.SObjectField sObjectField) + { + List result = new List(); + for (SObject record : getRecords()) + { + Object value = record.get(sObjectField); + if (value == null) continue; + if (value instanceof String && String.isBlank((String) value)) continue; + result.add(record); + } + return result; + } + @TestVisible protected virtual List getRecordsNotIn(Schema.SObjectField sObjectField, Set values) { @@ -1455,4 +1478,4 @@ public virtual class fflib_SObjects2 } public class DeveloperException extends Exception { } -} \ No newline at end of file +} diff --git a/sfdx-source/apex-extensions/tests/classes/domains/fflib_SObjects2Test.cls b/sfdx-source/apex-extensions/tests/classes/domains/fflib_SObjects2Test.cls index bea4072..a1d8b5d 100644 --- a/sfdx-source/apex-extensions/tests/classes/domains/fflib_SObjects2Test.cls +++ b/sfdx-source/apex-extensions/tests/classes/domains/fflib_SObjects2Test.cls @@ -679,6 +679,30 @@ private class fflib_SObjects2Test System.Assert.areEqual(3, domain.selectWithShippingCountry().size()); } + @IsTest + static void itShouldReturnRecordsWithNonNullNumericField() + { + DomainAccounts domain = generateDomain(); + + System.Assert.areEqual(4, domain.selectWithAnnualRevenue().size()); + } + + @IsTest + static void itShouldReturnRecordsWithNonNullDatetimeField() + { + Datetime now = Datetime.now(); + DomainAccounts domain = new DomainAccounts( + new List + { + (Account) fflib_MockSObjectUtil.addFieldValue(new Account(Name = 'A'), Account.CreatedDate, now), + (Account) fflib_MockSObjectUtil.addFieldValue(new Account(Name = 'B'), Account.CreatedDate, now), + new Account(Name = 'C') + } + ); + + System.Assert.areEqual(2, domain.selectWithCreatedDate().size()); + } + @IsTest static void itShouldReturnRecordsWithAllFieldValues() { @@ -845,11 +869,25 @@ private class fflib_SObjects2Test public List selectWithShippingCountry() { - return getRecordsWithNotBlankFieldValues( + return getRecordsWithNonBlankFieldValues( Schema.Account.ShippingCountry ); } + public List selectWithAnnualRevenue() + { + return getRecordsWithNonBlankFieldValues( + Schema.Account.AnnualRevenue + ); + } + + public List selectWithCreatedDate() + { + return getRecordsWithNonBlankFieldValues( + Schema.Account.CreatedDate + ); + } + public List selectWithEmptyRecord() { return getRecordsWithAllBlankFieldValues(