Skip to content

Commit acbd137

Browse files
authored
fix: Explicitly counting only number of queries run for the Evaluator (#236)
* fix: Explicitly counting only number of queries run for the Evaluator * fix: Accidentaly removed disable standard caching for test * fix: Similar issue with explicitly counting the queries executed by the Expression framework identified in other tests
1 parent 3b98e8f commit acbd137

3 files changed

Lines changed: 76 additions & 27 deletions

File tree

expression-src/spec/language/functions/FunctionDeclarationTest.cls

Lines changed: 39 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -162,48 +162,66 @@ private class FunctionDeclarationTest {
162162
static void functionsAreCachedWhenTheyAreCalledWithTheSameEnvironment() {
163163
insert new Account(Name = 'ACME');
164164

165-
Test.startTest();
166-
String expression = 'fun foo(n) => Query(Account(where: Name = n));\n' +
167-
'\n' +
168-
'[...foo("ACME"), ...foo("ACME")]';
169-
Test.stopTest();
165+
String expression =
166+
'fun foo(n) => Query(Account(where: Name = n));\n' +
167+
'\n' +
168+
'[...foo("ACME"), ...foo("ACME")]';
170169

170+
Test.startTest();
171+
Integer queriesBefore = Limits.getQueries();
171172
Evaluator.run(expression);
173+
Integer queriesAfter = Limits.getQueries();
174+
Test.stopTest();
172175

173-
Assert.areEqual(1, Limits.getQueries(), 'Only one query should have been consumed, ' +
174-
'since the function was called with the same argument');
176+
Assert.areEqual(
177+
1,
178+
queriesAfter - queriesBefore,
179+
'Exactly one SOQL query should be executed during Evaluator.run().'
180+
);
175181
}
176182

177183
@IsTest
178184
static void functionsAreNotCachedWhenTheyAreCalledWithDifferentEnvironments() {
179185
insert new Account(Name = 'ACME');
180186

181-
Test.startTest();
182-
String expression = 'fun foo(n) => Query(Account(where: Name = n));\n' +
183-
'\n' +
184-
'[...foo("ACME"), ...foo("Salesforce")]';
185-
Test.stopTest();
187+
String expression =
188+
'fun foo(n) => Query(Account(where: Name = n));\n' +
189+
'\n' +
190+
'[...foo("ACME"), ...foo("Salesforce")]';
186191

192+
Test.startTest();
193+
Integer queriesBefore = Limits.getQueries();
187194
Evaluator.run(expression);
195+
Integer queriesAfter = Limits.getQueries();
196+
Test.stopTest();
188197

189-
Assert.areEqual(2, Limits.getQueries(), 'Two queries should have been consumed, ' +
190-
'since the function was called with different arguments');
198+
Assert.areEqual(
199+
2,
200+
queriesAfter - queriesBefore,
201+
'Two queries should have been consumed, since the function was called with different arguments'
202+
);
191203
}
192204

193205
@IsTest
194206
static void functionsAreNotCachedWhenTheNoCacheKeywordIsUsed() {
195207
insert new Account(Name = 'ACME');
196208

197-
Test.startTest();
198-
String expression = 'fun nocache foo(n) => Query(Account(where: Name = n));\n' +
199-
'\n' +
200-
'[...foo("ACME"), ...foo("ACME")]';
201-
Test.stopTest();
209+
String expression =
210+
'fun nocache foo(n) => Query(Account(where: Name = n));\n' +
211+
'\n' +
212+
'[...foo("ACME"), ...foo("ACME")]';
202213

214+
Test.startTest();
215+
Integer queriesBefore = Limits.getQueries();
203216
Evaluator.run(expression, new Configuration().disableStandardFunctionResultCaching());
217+
Integer queriesAfter = Limits.getQueries();
218+
Test.stopTest();
204219

205-
Assert.areEqual(2, Limits.getQueries(), 'Two queries should have been consumed, ' +
206-
'since the function was called with the "nocache" keyword');
220+
Assert.areEqual(
221+
2,
222+
queriesAfter - queriesBefore,
223+
'Two queries should have been consumed, since the function was called with the "nocache" keyword'
224+
);
207225
}
208226

209227
@IsTest

expression-src/spec/language/global-context/GlobalContextTest.cls

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -230,10 +230,15 @@ private class GlobalContextTest {
230230
CustomRecordContext customRecordContext = new CustomRecordContext('TargetAccount', accountRecord.Id);
231231

232232
String expressionFormula = '@TargetAccount.Name';
233+
234+
Test.startTest();
235+
Integer queriesBefore = Limits.getQueries();
233236
Object result = Evaluator.run(expressionFormula, customRecordContext, new Configuration());
237+
Integer queriesAfter = Limits.getQueries();
238+
Test.stopTest();
234239

235240
Assert.areEqual('Acme', result);
236-
Assert.areEqual(1, Limits.getQueries(), 'Expect one query to retrieve the TargetAccount record');
241+
Assert.areEqual(1, queriesAfter - queriesBefore, 'Expect one query to retrieve the TargetAccount record');
237242
}
238243

239244
@IsTest
@@ -295,11 +300,16 @@ private class GlobalContextTest {
295300
CustomRecordContext contactRecordContext = new CustomRecordContext('TargetContact', contactRecord.Id);
296301

297302
String expressionFormula = '@TargetContact.LastName + TEXT(@TargetAccount.NumberOfEmployees)';
303+
304+
Test.startTest();
305+
Integer queriesBefore = Limits.getQueries();
298306
Object result = Evaluator.run(expressionFormula,
299307
new List<CustomRecordContext> { accountRecordContext, contactRecordContext }, new Configuration());
308+
Integer queriesAfter = Limits.getQueries();
309+
Test.stopTest();
300310

301311
Assert.areEqual('Doe50', result);
302-
Assert.areEqual(2, Limits.getQueries(), 'Expect one query per SObject type');
312+
Assert.areEqual(2, queriesAfter - queriesBefore, 'Expect one query per SObject type');
303313
}
304314

305315
@IsTest
@@ -314,11 +324,16 @@ private class GlobalContextTest {
314324
CustomRecordContext contactRecordContext = new CustomRecordContext('SecondAccount', accountRecord2.Id);
315325

316326
String expressionFormula = '@FirstAccount.NumberOfEmployees + @SecondAccount.NumberOfEmployees';
327+
328+
Test.startTest();
329+
Integer queriesBefore = Limits.getQueries();
317330
Object result = Evaluator.run(expressionFormula,
318331
new List<CustomRecordContext> { accountRecordContext, contactRecordContext }, new Configuration());
332+
Integer queriesAfter = Limits.getQueries();
333+
Test.stopTest();
319334

320335
Assert.areEqual(150, result);
321-
Assert.areEqual(1, Limits.getQueries(), 'Expect one query per SObject type');
336+
Assert.areEqual(1, queriesAfter - queriesBefore, 'Expect one query per SObject type');
322337
}
323338

324339
@IsTest
@@ -329,10 +344,15 @@ private class GlobalContextTest {
329344
CustomRecordContext customRecordContext = new CustomRecordContext('TargetAccount', accountRecord.Id, accountRecord);
330345

331346
String expressionFormula = '@TargetAccount.Name';
347+
348+
Test.startTest();
349+
Integer queriesBefore = Limits.getQueries();
332350
Object result = Evaluator.run(expressionFormula, customRecordContext, new Configuration());
351+
Integer queriesAfter = Limits.getQueries();
352+
Test.stopTest();
333353

334354
Assert.areEqual('Acme', result);
335-
Assert.areEqual(0, Limits.getQueries(), 'No queries should be consumed');
355+
Assert.areEqual(0, queriesAfter - queriesBefore, 'No queries should be consumed');
336356
}
337357

338358
@IsTest
@@ -369,14 +389,19 @@ private class GlobalContextTest {
369389

370390
String expression1 = '@TargetAccount.Name + " & " + @SourceAccount.Name';
371391
String expression2 = '@TargetAccount.NumberOfEmployees + @SourceAccount.NumberOfEmployees';
392+
393+
Test.startTest();
394+
Integer queriesBefore = Limits.getQueries();
372395
List<Result> results = Evaluator.run(new List<String> { expression1, expression2 },
373396
new List<CustomRecordContext> { customRecordContext1, customRecordContext2 },
374397
new Configuration()
375398
);
399+
Integer queriesAfter = Limits.getQueries();
400+
Test.stopTest();
376401

377402
Assert.areEqual(2, results.size(), 'Expect two results, one per expression');
378403
Assert.areEqual('Acme & Salesforce', results[0].getValue());
379404
Assert.areEqual(300, results[1].getValue());
380-
Assert.areEqual(1, Limits.getQueries(), 'Expected a single query per SObject type (only Account)');
405+
Assert.areEqual(1, queriesAfter - queriesBefore, 'Expected a single query per SObject type (only Account)');
381406
}
382407
}

expression-src/spec/language/query/QueryTest.cls

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ private class QueryTest {
2828

2929
private static List<Account> given10Accounts() {
3030
List<Account> accounts = SObjectTestDataBuilder.of(Account.SObjectType)
31+
.with(Account.Name, 'Test')
3132
.registerNewForInsert(10);
3233
SObjectTestDataBuilder.commitRecords();
3334
return accounts;
@@ -1102,9 +1103,14 @@ private class QueryTest {
11021103
dataBuilder.inTheDatabase();
11031104

11041105
String expr = 'QUERY(Account(where: NumberOfEmployees > 5) [Id, Name, NumberOfEmployees])';
1106+
1107+
Test.startTest();
1108+
Integer queriesBefore = Limits.getQueries();
11051109
Evaluator.run(expr);
11061110
Evaluator.run(expr);
1111+
Integer queriesAfter = Limits.getQueries();
1112+
Test.stopTest();
11071113

1108-
Assert.areEqual(1, Limits.getQueries());
1114+
Assert.areEqual(1, queriesAfter - queriesBefore);
11091115
}
11101116
}

0 commit comments

Comments
 (0)