From 21bdeb772a34a791300345c5b7e97bddfb77b7ee Mon Sep 17 00:00:00 2001 From: Peter Wright Date: Tue, 10 Dec 2024 15:02:53 +0000 Subject: [PATCH 1/2] feat: add method to set global retry options on queries --- src/query/QueryHelper.ts | 13 ++++++++++-- test/query/QueryHelper.spec.ts | 37 ++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/src/query/QueryHelper.ts b/src/query/QueryHelper.ts index ae1f267..c627e11 100644 --- a/src/query/QueryHelper.ts +++ b/src/query/QueryHelper.ts @@ -21,6 +21,12 @@ export class QueryHelper { retryConfig: { delay?: number; retries?: number }; logger?: Logger; + private static globalOptions?: QueryOptions; + + static setGlobalRetryOptions(opts?: QueryOptions) { + QueryHelper.globalOptions = opts; + } + static instance( connection: Connection, logger?: Logger, @@ -37,8 +43,11 @@ export class QueryHelper { ) { this.connection = connection; this.retryConfig = { - retries: options.maxQueryRetries, - delay: options.queryInitialIntervalMs, + retries: + options.maxQueryRetries || QueryHelper.globalOptions?.maxQueryRetries, + delay: + options.queryInitialIntervalMs || + QueryHelper.globalOptions?.queryInitialIntervalMs, }; this.logger = logger; } diff --git a/test/query/QueryHelper.spec.ts b/test/query/QueryHelper.spec.ts index 3007e7a..19f111d 100644 --- a/test/query/QueryHelper.spec.ts +++ b/test/query/QueryHelper.spec.ts @@ -49,6 +49,7 @@ describe('QueryHelper', () => { afterEach(() => { sandbox.restore(); + QueryHelper.setGlobalRetryOptions(undefined); }); it('should retry with default options', async () => { @@ -105,6 +106,42 @@ describe('QueryHelper', () => { ); }); + it('should retry with custom global options', async () => { + queryMock.execute.resolves([]); + queryMock.execute.onFirstCall().rejects(new Error('error')); + queryMock.execute.onSecondCall().rejects(new Error('400')); + + const logger = new CapturingLogger(); + + QueryHelper.setGlobalRetryOptions({ + maxQueryRetries: 2, + queryInitialIntervalMs: 500, + }); + + await QueryHelper.instance(mockConnection, logger).query( + 'sobject', + 'clause', + 'fields' + ); + + expect(queryMock.execute.callCount).to.equal(3); + expect(sobjectStub.alwaysCalledWith('sobject')).to.be.true; + expect(sobjectMock.find.alwaysCalledWith('clause', 'fields')).to.be.true; + expect(logger.entries.length).to.equal(4); + expect(logger.entries[0]).to.match( + logRegex('Warning: Request failed. Cause: error') + ); + expect(logger.entries[1]).to.match( + logRegex('Waiting 0.5 seconds to retry \\(attempts: 1\\)') + ); + expect(logger.entries[2]).to.match( + logRegex('Warning: Request failed. Cause: 400') + ); + expect(logger.entries[3]).to.match( + logRegex('Waiting 1 seconds to retry \\(attempts: 2\\)') + ); + }); + it('should throw error after max retries', async () => { const error = new Error('400'); queryMock.execute.rejects(error); From 306e6be43a23ae84ea48528ecea382313c6d0d37 Mon Sep 17 00:00:00 2001 From: Peter Wright Date: Tue, 10 Dec 2024 15:03:16 +0000 Subject: [PATCH 2/2] chore: update changelog and version --- CHANGELOG.md | 5 +++++ package.json | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index aad042a..83057f2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # test-runner - Changelog +## 3.2.0 - 2024-12-10 + +* Add `QueryHelper.setGlobalRetryOptions()` static method. + * Use to change the retry behaviour of queries across all instances. + ## 3.1.3 - 2024-11-20 * Exclude `@testSetup` methods from `ApexTestResult` queries. diff --git a/package.json b/package.json index fdcd8d7..9a6b1af 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@apexdevtools/test-runner", - "version": "3.1.3", + "version": "3.2.0", "description": "Apex parallel test runner with reliability goodness", "author": { "name": "Apex Dev Tools Team",