diff --git a/src/tools/auth0/handlers/emailProvider.ts b/src/tools/auth0/handlers/emailProvider.ts index 08442cc7e..81a9dd1c7 100644 --- a/src/tools/auth0/handlers/emailProvider.ts +++ b/src/tools/auth0/handlers/emailProvider.ts @@ -44,6 +44,8 @@ export default class EmailProviderHandler extends DefaultHandler { // HTTP DELETE on emails/provider is not supported, as this is not part of our vNext SDK. if (Object.keys(emailProvider).length === 0) { if (this.config('AUTH0_ALLOW_DELETE') === true) { + // If no existing provider, there is nothing to delete + if (!existing.name) return; // await this.client.emails.delete(); is not supported if (isEmpty(existing.credentials)) { delete existing.credentials; diff --git a/test/tools/auth0/handlers/emailProvider.tests.js b/test/tools/auth0/handlers/emailProvider.tests.js index 656296f90..108f8a1fa 100644 --- a/test/tools/auth0/handlers/emailProvider.tests.js +++ b/test/tools/auth0/handlers/emailProvider.tests.js @@ -84,6 +84,38 @@ describe('#emailProvider handler', () => { expect(wasUpdateCalled).to.equal(true); }); + it('should not call update when emailProvider is empty and no existing provider exists, even when AUTH0_ALLOW_DELETE is true', async () => { + const AUTH0_ALLOW_DELETE = true; + let wasUpdateCalled = false; + let wasCreateCalled = false; + const auth0 = { + emails: { + provider: { + create: () => { + wasCreateCalled = true; + return Promise.resolve({}); + }, + update: () => { + wasUpdateCalled = true; + return Promise.resolve({}); + }, + get: () => Promise.resolve({}), + }, + }, + }; + + const handler = new emailProvider.default({ + client: auth0, + config: () => AUTH0_ALLOW_DELETE, + }); + const stageFn = Object.getPrototypeOf(handler).processChanges; + + await stageFn.apply(handler, [{ emailProvider: {} }]); + + expect(wasUpdateCalled).to.equal(false); + expect(wasCreateCalled).to.equal(false); + }); + it('should not delete email provider if set to empty object and if AUTH0_ALLOW_DELETE is false', async () => { const AUTH0_ALLOW_DELETE = false;