Skip to content

Commit 67f3569

Browse files
authored
Feature/mock stack (#188)
* Mock Stack * mocking stack
1 parent ba513b2 commit 67f3569

File tree

2 files changed

+65
-19
lines changed

2 files changed

+65
-19
lines changed

force-app/main/default/classes/main/standard-soql/SOQL.cls

Lines changed: 43 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -380,8 +380,11 @@ public virtual inherited sharing class SOQL implements Queryable {
380380

381381
@TestVisible
382382
private static Mockable mock(String mockId) {
383-
queryIdToMock.put(mockId, new SoqlMock());
384-
return queryIdToMock.get(mockId);
383+
if (!SOQL.queryIdToMock.containsKey(mockId)) {
384+
SOQL.queryIdToMock.put(mockId, new List<SoqlMock>());
385+
}
386+
SOQL.queryIdToMock.get(mockId).add(new SoqlMock());
387+
return SOQL.queryIdToMock.get(mockId).get(SOQL.queryIdToMock.get(mockId).size() - 1);
385388
}
386389

387390
@TestVisible
@@ -402,25 +405,25 @@ public virtual inherited sharing class SOQL implements Queryable {
402405

403406
@TestVisible // deprecated
404407
private static void setMock(String mockId, SObject record) {
405-
queryIdToMock.put(mockId, new SoqlMock().useLegacyMockingBehavior());
406-
queryIdToMock.get(mockId).thenReturn(record);
408+
SOQL.queryIdToMock.put(mockId, new List<SoqlMock>{ new SoqlMock().useLegacyMockingBehavior() });
409+
SOQL.queryIdToMock.get(mockId).get(SOQL.queryIdToMock.get(mockId).size() - 1).thenReturn(record);
407410
}
408411

409412
@TestVisible // deprecated
410413
private static void setMock(String mockId, List<SObject> records) {
411-
queryIdToMock.put(mockId, new SoqlMock().useLegacyMockingBehavior());
412-
queryIdToMock.get(mockId).thenReturn(records);
414+
SOQL.queryIdToMock.put(mockId, new List<SoqlMock>{ new SoqlMock().useLegacyMockingBehavior() });
415+
SOQL.queryIdToMock.get(mockId).get(SOQL.queryIdToMock.get(mockId).size() - 1).thenReturn(records);
413416
}
414417

415418
@TestVisible // deprecated
416419
private static void setCountMock(String mockId, Integer amount) {
417-
queryIdToMock.put(mockId, new SoqlMock().useLegacyMockingBehavior());
418-
queryIdToMock.get(mockId).thenReturn(amount);
420+
SOQL.queryIdToMock.put(mockId, new List<SoqlMock>{ new SoqlMock().useLegacyMockingBehavior() });
421+
SOQL.queryIdToMock.get(mockId).get(SOQL.queryIdToMock.get(mockId).size() - 1).thenReturn(amount);
419422
}
420423

421424
// Implementation
422425

423-
private static Map<String, SoqlMock> queryIdToMock = new Map<String, SoqlMock>();
426+
private static Map<String, List<SoqlMock>> queryIdToMock = new Map<String, List<SoqlMock>>();
424427

425428
private static Binder binder = new Binder();
426429
private static Integer syncQueriesIssued = 0;
@@ -896,7 +899,7 @@ public virtual inherited sharing class SOQL implements Queryable {
896899
}
897900

898901
public Queryable mockId(String queryIdentifier) {
899-
this.executor.mock(queryIdToMock.get(queryIdentifier));
902+
this.executor.mock(SOQL.queryIdToMock.get(queryIdentifier));
900903
return this;
901904
}
902905

@@ -2505,7 +2508,7 @@ public virtual inherited sharing class SOQL implements Queryable {
25052508
private AccessLevel accessMode;
25062509
private AccessType accessType;
25072510
private SoqlBuilder builder;
2508-
private SoqlMock mock;
2511+
private List<SoqlMock> mocks = new List<SoqlMock>();
25092512

25102513
public Executor(SoqlBuilder builder) {
25112514
this.builder = builder;
@@ -2529,8 +2532,8 @@ public virtual inherited sharing class SOQL implements Queryable {
25292532
this.accessMode = accessMode;
25302533
}
25312534

2532-
public void mock(SoqlMock mock) {
2533-
this.mock = mock;
2535+
public void mock(List<SoqlMock> mocks) {
2536+
this.mocks = mocks;
25342537
}
25352538

25362539
public SObject toObject() {
@@ -2550,8 +2553,8 @@ public virtual inherited sharing class SOQL implements Queryable {
25502553
public List<SObject> toList() {
25512554
this.incrementQueryIssued();
25522555

2553-
if (this.mock != null) {
2554-
return this.mock.sObjectMock.get(this.builder.fields, this.builder.subQueries);
2556+
if (!this.mocks.isEmpty()) {
2557+
return this.getMockedListProxy();
25552558
}
25562559

25572560
if (this.accessType == null) {
@@ -2564,26 +2567,47 @@ public virtual inherited sharing class SOQL implements Queryable {
25642567
).getRecords();
25652568
}
25662569

2570+
private List<SObject> getMockedListProxy() {
2571+
if (this.mocks.size() == 1) {
2572+
return this.mocks[0].sObjectMock.get(this.builder.fields, this.builder.subQueries);
2573+
}
2574+
return this.mocks.remove(0).sObjectMock.get(this.builder.fields, this.builder.subQueries);
2575+
}
2576+
25672577
public List<AggregateResultProxy> toAggregatedProxy() {
25682578
this.incrementQueryIssued();
25692579

2570-
if (this.mock != null) {
2571-
return this.mock.aggregateResultMock.get();
2580+
if (!this.mocks.isEmpty()) {
2581+
return this.getMockedAggregateProxy();
25722582
}
25732583

25742584
return new AggregateResultProxys().add((List<AggregateResult>) this.toList()).get();
25752585
}
25762586

2587+
private List<AggregateResultProxy> getMockedAggregateProxy() {
2588+
if (this.mocks.size() == 1) {
2589+
return this.mocks[0].aggregateResultMock.get();
2590+
}
2591+
return this.mocks.remove(0).aggregateResultMock.get();
2592+
}
2593+
25772594
public Integer toInteger() {
25782595
this.incrementQueryIssued();
25792596

2580-
if (this.mock != null) {
2581-
return this.mock.countMock.get();
2597+
if (!this.mocks.isEmpty()) {
2598+
return this.getMockedCount();
25822599
}
25832600

25842601
return this.sharingExecutor.toInteger(this.builder.toString(), binder.getBindingMap(), this.accessMode);
25852602
}
25862603

2604+
private Integer getMockedCount() {
2605+
if (this.mocks.size() == 1) {
2606+
return this.mocks[0].countMock.get();
2607+
}
2608+
return this.mocks.remove(0).countMock.get();
2609+
}
2610+
25872611
public Database.QueryLocator toQueryLocator() {
25882612
this.incrementQueryIssued();
25892613
return this.sharingExecutor.toQueryLocator(this.builder.toString(), binder.getBindingMap(), this.accessMode);

force-app/main/default/classes/main/standard-soql/SOQL_Test.cls

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3854,6 +3854,28 @@ private class SOQL_Test {
38543854
Assert.areEqual(0, account.Opportunities.size(), 'The size of the mocked opportunities should be 0, because it was not requested.');
38553855
}
38563856

3857+
@IsTest
3858+
static void mockStack() {
3859+
// Setup
3860+
SOQL.mock('mockingQuery').thenReturn(new Account(Name = 'Test 1'));
3861+
SOQL.mock('mockingQuery').thenReturn(new Account(Name = 'Test 2'));
3862+
SOQL.mock('mockingQuery').thenReturn(new Account(Name = 'Test 3'));
3863+
3864+
// Test
3865+
SOQL.Queryable query = SOQL.of(Account.SObjectType).with(Account.Name).mockId('mockingQuery');
3866+
3867+
Account acc1 = (Account) query.toObject();
3868+
Account acc2 = (Account) query.toObject();
3869+
Account acc3 = (Account) query.toObject();
3870+
Account acc4 = (Account) query.toObject();
3871+
3872+
// Verify
3873+
Assert.areEqual('Test 1', acc1.Name, 'The returned account name should match the expected one.');
3874+
Assert.areEqual('Test 2', acc2.Name, 'The returned account name should match the expected one.');
3875+
Assert.areEqual('Test 3', acc3.Name, 'The returned account name should match the expected one.');
3876+
Assert.areEqual('Test 3', acc4.Name, 'The returned account name should match the expected one.');
3877+
}
3878+
38573879
@IsTest
38583880
static void toId() {
38593881
// Setup

0 commit comments

Comments
 (0)