From 0943def0dfa184df254051f6db23ccc79135da3c Mon Sep 17 00:00:00 2001 From: WimVelzeboer Date: Tue, 8 Mar 2022 11:27:58 +0000 Subject: [PATCH] Add domain methods getRecords(sObjectField, Id) getRecords(sObjectField, Set) getRecords(sObjectField, String) getRecords(sObjectField, Set) getRecordsIsNot(sObjectField, Id) getRecordsNotIn(sObjectField, Set) getRecordsIsNot(sObjectField, String) getRecordsNotIn(sObjectField, Set) Signed-off-by: WimVelzeboer --- .../classes/domains/fflib_SObjects2.cls | 98 ++++++++++++++++++- .../classes/domains/fflib_SObjects2Test.cls | 81 +++++---------- 2 files changed, 119 insertions(+), 60 deletions(-) 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 45f1490..b5b73be 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 @@ -585,6 +585,12 @@ public virtual class fflib_SObjects2 .getLongFieldValues(sObjectField); } + @TestVisible + protected virtual List getRecords(Schema.SObjectField sObjectField, Id idValue) + { + return getRecords(sObjectField, new Set{ idValue }); + } + @TestVisible protected virtual List getRecords(Schema.SObjectField sObjectField, Set values) { @@ -599,6 +605,12 @@ public virtual class fflib_SObjects2 return result; } + @TestVisible + protected virtual List getRecords(Schema.SObjectField sObjectField, String value) + { + return getRecords(sObjectField, new Set{ value }); + } + @TestVisible protected virtual List getRecords(Schema.SObjectField sObjectField, Set values) { @@ -613,17 +625,35 @@ public virtual class fflib_SObjects2 return result; } - protected virtual List getRecordsByFieldValueIsNot(Schema.SObjectField sObjectField, Object value) + @TestVisible + protected virtual List getRecordsIsNot(Schema.SObjectField sObjectField, String value) { - return getRecordsByFieldValuesNotIn(sObjectField, new Set{ value }); + return getRecordsNotIn(sObjectField, new Set{ value }); } - protected virtual List getRecordsByFieldValuesNotIn(Schema.SObjectField sObjectField, Set values) + @TestVisible + protected virtual List getRecordsNotIn(Schema.SObjectField sObjectField, Set values) { List result = new List(); for (SObject record : getRecords()) { - if (values?.contains(record.get(sObjectField)) == false) + if (values?.contains((String) record.get(sObjectField))) continue; + result.add(record); + } + return result; + } + + protected virtual List getRecordsIsNot(Schema.SObjectField sObjectField, Id idValue) + { + return getRecordsNotIn(sObjectField, new Set{ idValue }); + } + + protected virtual List getRecordsNotIn(Schema.SObjectField sObjectField, Set idValues) + { + List result = new List(); + for (SObject record : getRecords()) + { + if (idValues?.contains((Id) record.get(sObjectField)) == false) { result.add(record); } @@ -767,6 +797,66 @@ public virtual class fflib_SObjects2 return result; } + /** + * Get a map with the given Date field value mapped to the given Id field + * Key fields containing null values are omitted + * + * @param valueField The Date field to use as value for the map + * @param keyField The Id field to use as key for the map + * + * @return a map with the given Date field value mapped to the given Id field + * + * @example + * Account account = Account.newInstance(records); + * Map createdDateById = account.getDateFieldByIdField(Account.CreatedDate, Account.Id); + */ + @TestVisible + protected virtual Map getDateFieldByIdField(Schema.SObjectField valueField, Schema.SObjectField keyField) + { + Map result = new Map(); + Map fieldByField = getFieldByField(valueField, keyField); + for (Object obj : fieldByField.keySet()) + { + Object value = fieldByField.get(obj); + Date dateValue; + if (value instanceof Date) + { + dateValue = (Date) value; + } + else if (value != null) + { + dateValue = ((Datetime) value).date(); + } + result.put((Id) obj, dateValue); + } + return result; + } + + /** + * Get a map with the given Date field value mapped to the given Id field + * Key fields containing null values are omitted + * + * @param valueField The DateTime field to use as value for the map + * @param keyField The Id field to use as key for the map + * + * @return a map with the given Date field value mapped to the given Id field + * + * @example + * Account account = Account.newInstance(records); + * Map createdDateById = account.getDateFieldByIdField(Account.CreatedDate, Account.Id); + */ + @TestVisible + protected virtual Map getDateTimeFieldByIdField(Schema.SObjectField valueField, Schema.SObjectField keyField) + { + Map result = new Map(); + Map fieldByField = getFieldByField(valueField, keyField); + for (Object obj : fieldByField.keySet()) + { + result.put((Id) obj, (Datetime) fieldByField.get(obj)); + } + return result; + } + /** * Get a map with the records mapped to the given String field value * Key fields containing null values are omitted 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 c854fcb..7cb06b7 100644 --- a/sfdx-source/apex-extensions/tests/classes/domains/fflib_SObjects2Test.cls +++ b/sfdx-source/apex-extensions/tests/classes/domains/fflib_SObjects2Test.cls @@ -112,6 +112,7 @@ private class fflib_SObjects2Test domain.getDoubleFieldValues(Account.BillingLatitude); domain.getDoubleFieldValues(Account.BillingLatitude, criteria); domain.getSObjectByIdField(Account.Id); + domain.getSObjectsByIdField(Account.Id); domain.getSObjectByStringField(Account.Name); domain.getSObjectsByStringField(Account.Name); domain.getStringFieldByStringField(Account.Name, Account.AccountNumber); @@ -155,6 +156,29 @@ private class fflib_SObjects2Test System.assertEquals(accountName, result.get(accountId), 'Incorrect returned account name'); } + @IsTest + static void itShouldReturnDateFieldByIdField() + { + final Date today = Date.today(); + final Datetime todayDatetime = Datetime.newInstance(today.year(), today.month(), today.day()); + final String accountName = 'My Account'; + final Id accountId = fflib_IDGenerator.generate(Account.SObjectType); + DomainAccounts domain = new DomainAccounts( + new List + { + (Account) fflib_MockSObjectUtil.addFieldValue(new Account(Id = accountId), Account.CreatedDate, todayDatetime), + new Account(Name = accountName + ' 2') // This one should be ignored + }); + + System.Test.startTest(); + Map result = domain.getDateFieldByIdField(Account.CreatedDate, Account.Id); + System.Test.stopTest(); + + System.assertEquals(1, result.size(), 'Incorrect returned amount of results'); + System.assert(result.keySet().contains(accountId), 'The accountId is missing from the results'); + System.assertEquals(today, result.get(accountId), 'Incorrect returned date'); + } + @IsTest static void itShouldReturnIntegerFieldValues() { @@ -303,7 +327,7 @@ private class fflib_SObjects2Test 'A', domain.getRecords( new fflib_Criteria() - .equalTo(Schema.Account.Id, idA) + .equalTo(Schema.Account.Id, idA) ) .get(0) .get('Name') @@ -481,61 +505,6 @@ private class fflib_SObjects2Test System.assert(domain.getFirstSObject().get('Rating') == 'Warm'); } - @IsTest - static void itShouldGetRecordByIdFieldValues() - { - final Id accountId = fflib_IDGenerator.generate(Schema.Account.SObjectType); - List records = new List { - new Account(Id = accountId), - new Account(Id = fflib_IDGenerator.generate(Schema.Account.SObjectType)), - new Account(Id = fflib_IDGenerator.generate(Schema.Account.SObjectType)) - }; - fflib_SObjects2 domain = new fflib_SObjects2(records); - - List results = domain.getRecords(Schema.Account.Id, new Set {accountId}); - - System.assertEquals(1, results.size()); - System.assertEquals(accountId, results.get(0).Id); - } - - @IsTest - static void itShouldGetRecordByStringFieldValues() - { - final String accountName = 'Test'; - List records = new List { - new Account(Name = accountName), - new Account(Name = accountName + 'A'), - new Account(Name = 'Demo') - }; - fflib_SObjects2 domain = new fflib_SObjects2(records); - - List results = domain.getRecords(Schema.Account.Name, new Set {accountName}); - - System.assertEquals(1, results.size()); - System.assertEquals(accountName, (String) results.get(0).get(Schema.Account.Name)); - } - - @IsTest - static void itShouldGetRecordsByIdFieldValues() - { - final Id accountIdA = fflib_IDGenerator.generate(Schema.Account.SObjectType); - final Id accountIdB = fflib_IDGenerator.generate(Schema.Account.SObjectType); - List records = new List { - new Contact(AccountId = accountIdA), - new Contact(AccountId = accountIdA), - new Contact(AccountId = accountIdB), - new Contact(AccountId = accountIdB), - new Contact(AccountId = accountIdB) - }; - fflib_SObjects2 domain = new fflib_SObjects2(records); - - Map> results = domain.getSObjectsByIdField(Schema.Contact.AccountId); - - System.assertEquals(2, results.size()); - System.assertEquals(2, results.get(accountIdA).size()); - System.assertEquals(3, results.get(accountIdB).size()); - } - @IsTest static void itShouldSetField() {