/** * File Name: fflib_CriteriaTest * @description * * @author architect ir. Wilhelmus G.J. Velzeboer * * Copyright (c), W.G.J. Velzeboer, * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above author notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither the name of the author nor the names of its contributors * may be used to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ @IsTest(IsParallel=true) private with sharing class fflib_CriteriaTest { private static final Integer HIGHER_NUMBER = 98765; private static final Integer A_NUMBER = 54321; private static final Integer SAME_NUMBER = A_NUMBER; private static final Integer LOWER_NUMBER = 0; private static final String A_STRING = 'Example'; private static final String SAME_STRING = A_STRING; private static final String ANOTHER_STRING = 'Something Else'; private static final String HELLO_WORLD = 'Hello World!'; private static final Boolean FAILING = false; @IsTest static void itShouldEvaluateAnEqualsToCondition() { System.assert( new fflib_Criteria() .andCriteria() .equalTo(Account.Name, A_STRING) .evaluate(new Account(Name = SAME_STRING)) ); } @IsTest static void itShouldEvaluateAnEqualsToCondition_ReturningFalse() { System.assert( new fflib_Criteria() .equalTo(Account.Name, A_STRING) .evaluate(new Account(Name = ANOTHER_STRING)) == FAILING ); } @IsTest static void itShouldEvaluateAnEqualsToCondition_NullValues() { System.assert( new fflib_Criteria() .equalTo(Account.Name, A_STRING) .evaluate(new Account()) == FAILING ); } @IsTest static void itShouldEvaluateANotEqualsToCondition() { System.assert( new fflib_Criteria() .notEqualTo(Account.Name, A_STRING) .evaluate(new Account(Name = ANOTHER_STRING)) ); } @IsTest static void itShouldEvaluateANotEqualsToCondition_ReturningFalse() { System.assert( new fflib_Criteria() .notEqualTo(Account.Name, A_STRING) .evaluate(new Account(Name = SAME_STRING)) == FAILING ); } @IsTest static void itShouldEvaluateAddGreaterOrEqualToCondition() { System.assert( new fflib_Criteria() .greaterOrEqualTo(Account.AnnualRevenue, A_NUMBER) .evaluate(new Account(AnnualRevenue = HIGHER_NUMBER)) ); } @IsTest static void itShouldEvaluateAddGreaterOrEqualToCondition_Equal() { System.assert( new fflib_Criteria() .greaterOrEqualTo(Account.AnnualRevenue, A_NUMBER) .evaluate(new Account(AnnualRevenue = SAME_NUMBER)) ); } @IsTest static void itShouldEvaluateAddGreaterOrEqualToCondition_ReturningFalse() { System.assert( new fflib_Criteria() .greaterOrEqualTo(Account.AnnualRevenue, A_NUMBER) .evaluate(new Account(AnnualRevenue = LOWER_NUMBER)) == FAILING ); } @IsTest static void itShouldEvaluateAddGreaterOrEqualToCondition_NullValues() { System.assert( new fflib_Criteria() .greaterOrEqualTo(Account.AnnualRevenue, A_NUMBER) .evaluate(new Account()) == FAILING ); } @IsTest static void itShouldEvaluateAddGreaterThanCondition() { System.assert( new fflib_Criteria() .greaterThan(Account.AnnualRevenue, A_NUMBER) .evaluate(new Account(AnnualRevenue = HIGHER_NUMBER)) ); } @IsTest static void itShouldEvaluateAddGreaterThanCondition_EqualValues() { System.assert( new fflib_Criteria() .greaterThan(Account.AnnualRevenue, A_NUMBER) .evaluate(new Account(AnnualRevenue = SAME_NUMBER)) == FAILING ); } @IsTest static void itShouldEvaluateAddGreaterThanCondition_ReturningFalse() { System.assert( new fflib_Criteria() .greaterThan(Account.AnnualRevenue, A_NUMBER) .evaluate(new Account(AnnualRevenue = LOWER_NUMBER)) == FAILING ); } @IsTest static void itShouldEvaluateAddGreaterThanCondition_NullValues() { System.assert( new fflib_Criteria() .greaterThan(Account.AnnualRevenue, A_NUMBER) .evaluate(new Account()) == FAILING ); } @IsTest static void itShouldEvaluateAddLessOrEqualToCondition() { System.assert( new fflib_Criteria() .lessOrEqualTo(Account.AnnualRevenue, A_NUMBER) .evaluate(new Account(AnnualRevenue = LOWER_NUMBER)) ); } @IsTest static void itShouldEvaluateAddLessOrEqualToCondition_Equal() { System.assert( new fflib_Criteria() .lessOrEqualTo(Account.AnnualRevenue, A_NUMBER) .evaluate(new Account(AnnualRevenue = SAME_NUMBER)) ); } @IsTest static void itShouldEvaluateAddLessOrEqualToCondition_ReturningFalse() { System.assert( new fflib_Criteria() .lessOrEqualTo(Account.AnnualRevenue, A_NUMBER) .evaluate(new Account(AnnualRevenue = HIGHER_NUMBER)) == FAILING ); } @IsTest static void itShouldEvaluateAddLessOrEqualToCondition_NullValues() { System.assert( new fflib_Criteria() .lessOrEqualTo(Account.AnnualRevenue, A_NUMBER) .evaluate(new Account()) ); } @IsTest static void itShouldEvaluateAddLessThanCondition() { System.assert( new fflib_Criteria() .lessThan(Account.AnnualRevenue, A_NUMBER) .evaluate(new Account(AnnualRevenue = LOWER_NUMBER)) ); } @IsTest static void itShouldEvaluateAddLessThanCondition_EqualValues() { System.assert( new fflib_Criteria() .lessThan(Account.AnnualRevenue, A_NUMBER) .evaluate(new Account(AnnualRevenue = SAME_NUMBER)) == FAILING ); } @IsTest static void itShouldEvaluateAddLessThanCondition_ReturningFalse() { System.assert( new fflib_Criteria() .lessThan(Account.AnnualRevenue, A_NUMBER) .evaluate(new Account(AnnualRevenue = HIGHER_NUMBER)) == FAILING ); } @IsTest static void itShouldEvaluateAddLessThanCondition_NullValues() { System.assert( new fflib_Criteria() .lessThan(Account.AnnualRevenue, A_NUMBER) .evaluate(new Account()) ); } @IsTest static void itShouldEvaluateInSetCondition_Decimal() { System.assert( new fflib_Criteria() .inSet(Account.AnnualRevenue, new Set {1.1, 2.2}) .evaluate(new Account(AnnualRevenue = 1.1)) ); } @IsTest static void itShouldEvaluateInSetCondition_Id() { Id idOne = fflib_IDGenerator.generate(Account.SObjectType); Id idTwo = fflib_IDGenerator.generate(Account.SObjectType); System.assert( new fflib_Criteria() .inSet(Account.Id, new Set {idOne, idTwo}) .evaluate(new Account(Id = idOne)) ); } @IsTest static void itShouldEvaluateInSetCondition_Integer() { System.assert( new fflib_Criteria() .inSet(Account.NumberOfEmployees, new Set {1, 10}) .evaluate(new Account(NumberOfEmployees = 1)) ); } @IsTest static void itShouldEvaluateInSetCondition() { System.assert( new fflib_Criteria() .inSet(Account.Type, new Set {A_STRING, HELLO_WORLD}) .evaluate(new Account(Type = SAME_STRING)) ); } @IsTest static void itShouldEvaluateInSetCondition_ReturningFalse() { System.assert( new fflib_Criteria() .inSet(Account.Type, new Set {A_STRING, HELLO_WORLD}) .evaluate(new Account(Type = ANOTHER_STRING)) == FAILING ); } @IsTest static void itShouldEvaluateInSetCondition_NullValues() { System.assert( new fflib_Criteria() .inSet(Account.Type, new Set {A_STRING, HELLO_WORLD}) .evaluate(new Account()) == FAILING ); } @IsTest static void itShouldEvaluateNotInSetCondition() { System.assert( new fflib_Criteria() .notInSet(Account.Name, new Set {A_STRING, HELLO_WORLD}) .evaluate(new Account(Name = ANOTHER_STRING)) ); } @IsTest static void itShouldEvaluateNotInSetCondition_Failing() { System.assert( new fflib_Criteria() .notInSet(Account.Name, new Set {A_STRING, HELLO_WORLD}) .evaluate(new Account(Name = SAME_STRING)) == FAILING ); } @IsTest static void itShouldEvaluateNotInSetCondition_Decimal() { System.assert( new fflib_Criteria() .notInSet(Account.AnnualRevenue, new Set {1.1, 2.2}) .evaluate(new Account(AnnualRevenue = 3.3)) ); } @IsTest static void itShouldEvaluateNotInSetCondition_Id() { Id idOne = fflib_IDGenerator.generate(Account.SObjectType); Id idTwo = fflib_IDGenerator.generate(Account.SObjectType); Id idThree = fflib_IDGenerator.generate(Account.SObjectType); System.assert( new fflib_Criteria() .notInSet(Account.Id, new Set {idOne, idTwo}) .evaluate(new Account(Id = idThree)) ); } @IsTest static void itShouldEvaluateNotInSetCondition_Integer() { System.assert( new fflib_Criteria() .notInSet(Account.NumberOfEmployees, new Set {1, 10}) .evaluate(new Account(NumberOfEmployees = 2)) ); } @IsTest static void itShouldEvaluateOrCondition_First() { System.assert( new fflib_Criteria() .orCriteria() .equalTo(Account.Name, A_STRING) .equalTo(Account.Name, ANOTHER_STRING) .evaluate(new Account(Name = A_STRING)) ); } @IsTest static void itShouldEvaluateOrCondition_Second() { System.assert( new fflib_Criteria() .orCriteria() .equalTo(Account.Name, A_STRING) .equalTo(Account.Name, ANOTHER_STRING) .evaluate(new Account(Name = ANOTHER_STRING)) ); } @IsTest static void itShouldEvaluateOrCondition_Failing() { System.assert( new fflib_Criteria() .orCriteria() .equalTo(Account.Name, A_STRING) .equalTo(Account.Name, ANOTHER_STRING) .evaluate(new Account(Name = HELLO_WORLD)) == FAILING ); } @IsTest static void itShouldEvaluateAddOrCondition_First() { System.assert( new fflib_Criteria() .equalTo(Account.Name, A_STRING) .addOrCriteria( new fflib_Criteria() .equalTo(Account.AccountNumber, '001') .equalTo(Account.AccountNumber, '002') ) .evaluate(new Account(Name = A_STRING, AccountNumber = '001')) ); } @IsTest static void itShouldEvaluateAddOrCondition_Second() { System.assert( new fflib_Criteria() .equalTo(Account.Name, A_STRING) .addOrCriteria( new fflib_Criteria() .equalTo(Account.AccountNumber, '001') .equalTo(Account.AccountNumber, '002') ) .evaluate(new Account(Name = A_STRING, AccountNumber = '002')) ); } @IsTest static void itShouldEvaluateAddOrCondition_Failing() { System.assert( new fflib_Criteria() .equalTo(Account.Name, A_STRING) .addOrCriteria( new fflib_Criteria() .equalTo(Account.AccountNumber, '001') .equalTo(Account.AccountNumber, '002') ) .evaluate(new Account(Name = ANOTHER_STRING, AccountNumber = '001')) == FAILING ); } @IsTest static void itShouldEvaluateAddAndCondition_First() { System.assert( new fflib_Criteria() .orCriteria() .equalTo(Account.Name, A_STRING) .equalTo(Account.Name, ANOTHER_STRING) .addAndCriteria( new fflib_Criteria() .equalTo(Account.Name, HELLO_WORLD) .equalTo(Account.AccountNumber, '002') ) .evaluate(new Account(Name = ANOTHER_STRING)) ); } @IsTest static void itShouldEvaluateAddAndCondition_Second() { System.assert( new fflib_Criteria() .orCriteria() .equalTo(Account.Name, A_STRING) .equalTo(Account.Name, ANOTHER_STRING) .addAndCriteria( new fflib_Criteria() .equalTo(Account.Name, HELLO_WORLD) .equalTo(Account.AccountNumber, '002') ) .evaluate(new Account(Name = HELLO_WORLD, AccountNumber = '002')) ); } @IsTest static void itShouldEvaluateAddAndCondition_SecondFailing() { System.assert( new fflib_Criteria() .orCriteria() .equalTo(Account.Name, A_STRING) .equalTo(Account.Name, ANOTHER_STRING) .addAndCriteria( new fflib_Criteria() .equalTo(Account.Name, HELLO_WORLD) .equalTo(Account.AccountNumber, '002') ) .evaluate(new Account(Name = HELLO_WORLD)) == FAILING ); } @IsTest static void itShouldEvaluateEmptyCondition() { System.assert( new fflib_Criteria() .evaluate(new Account()) ); } @IsTest static void itShouldGenerateQueryString_EqualsToCondition() { System.assertEquals( 'Name=\'Example\'', new fflib_Criteria() .andCriteria() .equalTo(Account.Name, A_STRING) .toSOQL() ); } @IsTest static void itShouldGenerateQueryString_AddOrCondition() { System.assertEquals( 'Name=\'Example\' AND (AccountNumber=\'001\' OR AccountNumber=\'002\')', new fflib_Criteria() .equalTo(Account.Name, A_STRING) .addOrCriteria( new fflib_Criteria() .equalTo(Account.AccountNumber, '001') .equalTo(Account.AccountNumber, '002') ) .toSOQL() ); } @IsTest static void itShouldEvaluateValuesOnRelatedObject() { // GIVEN a Contact record with related Account records Contact contact = new Contact(LastName = 'Smith'); Account account = new Account( Id = fflib_IDGenerator.generate(Account.SObjectType), Name = 'Dummy' ); SObject record = fflib_MockSObjectUtil.addRelatedParentObject(contact, account, 'Account'); // WHEN we run a criteria con the contact record validating related data on the parent Account System.assert( new fflib_Criteria() .equalTo('Account.Name', 'Dummy') .evaluate(record) ); } @IsTest static void itShouldEvaluateFormula() { // GIVEN a record Contact record = new Contact( LastName = 'Smith', FirstName = 'John', Department = 'MIB1' ); // WHEN we process a formula criteria it should evaluate the formula System.assert( new fflib_Criteria() .FormulaCriteria('(1 AND 2) OR (1 AND 3)') .equalTo(Contact.LastName, 'Smith') .equalTo(Contact.FirstName, 'John') .equalTo(Contact.Department, 'MIB') .evaluate(record) ); System.assertEquals(false, new fflib_Criteria() .FormulaCriteria('(1 AND 2) OR (1 AND 3)') .equalTo(Contact.LastName, 'Ford') .equalTo(Contact.FirstName, 'John') .equalTo(Contact.Department, 'MIB') .evaluate(record) ); } }