diff --git a/.github/workflows/integration-test.yml b/.github/workflows/integration-test.yml index 787e41aab..578674a77 100644 --- a/.github/workflows/integration-test.yml +++ b/.github/workflows/integration-test.yml @@ -84,7 +84,7 @@ jobs: - name: Add mock connectors working-directory: tests run: | - npm run cli connector add @logto/connector-mock-sms @logto/connector-mock-email @logto/connector-mock-social -- -p ../logto + npm run cli connector add @logto/connector-mock-sms @logto/connector-mock-email @logto/connector-mock-standard-email @logto/connector-mock-social -- -p ../logto - name: Run Logto working-directory: logto/ diff --git a/packages/integration-tests/src/__mocks__/connectors-mock.ts b/packages/integration-tests/src/__mocks__/connectors-mock.ts index 049e65ea5..a27714899 100644 --- a/packages/integration-tests/src/__mocks__/connectors-mock.ts +++ b/packages/integration-tests/src/__mocks__/connectors-mock.ts @@ -140,6 +140,45 @@ export const mockEmailConnectorConfig = { ], }; +export const mockStandardEmailConnectorId = 'mock-standard-email-service'; +export const mockStandardEmailConnectorConfig = { + apiKey: 'api-key-value', + fromEmail: 'noreply@logto.test.io', + fromName: 'from-name-value', + templates: [ + { + usageType: 'SignIn', + type: 'text/plain', + subject: 'Logto SignIn Template', + content: 'This is for sign-in purposes only. Your passcode is {{code}}.', + }, + { + usageType: 'Register', + type: 'text/plain', + subject: 'Logto Register Template', + content: 'This is for registering purposes only. Your passcode is {{code}}.', + }, + { + usageType: 'ForgotPassword', + type: 'text/plain', + subject: 'Logto Forgot Password Template', + content: 'This is for forgot-password purposes only. Your passcode is {{code}}.', + }, + { + usageType: 'Continue', + type: 'text/plain', + subject: 'Logto Continue Template', + content: 'This is for completing user profile purposes only. Your passcode is {{code}}.', + }, + { + usageType: 'Test', + type: 'text/plain', + subject: 'Logto Test Template', + content: 'This is for testing purposes only. Your passcode is {{code}}.', + }, + ], +}; + export const mockSocialConnectorId = 'mock-social-connector'; export const mockSocialConnectorTarget = 'mock-social'; export const mockSocialConnectorConfig = { diff --git a/packages/integration-tests/tests/api/admin-user.test.ts b/packages/integration-tests/tests/api/admin-user.test.ts index fbfd06b04..266ee2005 100644 --- a/packages/integration-tests/tests/api/admin-user.test.ts +++ b/packages/integration-tests/tests/api/admin-user.test.ts @@ -14,6 +14,7 @@ import { deleteUserIdentity, postConnector, updateConnectorConfig, + deleteConnectorById, } from '@/api'; import { createUserByAdmin, bindSocialToNewCreatedUser } from '@/helpers'; @@ -81,5 +82,7 @@ describe('admin console user management', () => { const updatedUser = await getUser(createdUserId); expect(updatedUser.identities).not.toHaveProperty(mockSocialConnectorTarget); + + await deleteConnectorById(id); }); }); diff --git a/packages/integration-tests/tests/api/connector.test.ts b/packages/integration-tests/tests/api/connector.test.ts index 9f777f8bc..ec5d65aca 100644 --- a/packages/integration-tests/tests/api/connector.test.ts +++ b/packages/integration-tests/tests/api/connector.test.ts @@ -7,6 +7,8 @@ import { mockSmsConnectorId, mockSocialConnectorConfig, mockSocialConnectorId, + mockStandardEmailConnectorConfig, + mockStandardEmailConnectorId, } from '@/__mocks__/connectors-mock'; import { deleteConnectorById, @@ -69,15 +71,29 @@ test('connector set-up flow', async () => { /* * Change to another SMS/Email connector */ - // FIXME @Darcy [LOG-4750,4751]: complete this IT after add another mock sms/email connector (or other current existing connector could be affected) + const { id } = await postConnector(mockStandardEmailConnectorId); + await updateConnectorConfig(id, mockStandardEmailConnectorConfig); + connectorIdMap.set(mockStandardEmailConnectorId, id); + const currentConnectors = await listConnectors(); + expect( + currentConnectors.some((connector) => connector.connectorId === mockEmailConnectorId) + ).toBeFalsy(); + expect( + currentConnectors.some((connector) => connector.connectorId === mockStandardEmailConnectorId) + ).toBeTruthy(); + expect( + currentConnectors.find((connector) => connector.connectorId === mockStandardEmailConnectorId) + ?.config + ).toEqual(mockStandardEmailConnectorConfig); + connectorIdMap.delete(mockEmailConnectorId); /* * Delete (i.e. disable) a connector */ await expect( - deleteConnectorById(connectorIdMap.get(mockEmailConnectorId)) + deleteConnectorById(connectorIdMap.get(mockStandardEmailConnectorId)) ).resolves.not.toThrow(); - connectorIdMap.delete(mockEmailConnectorId); + connectorIdMap.delete(mockStandardEmailConnectorId); /** * List connectors after manually setting up connectors. @@ -130,4 +146,9 @@ test('send SMS/email test message', async () => { ).resolves.not.toThrow(); await expect(sendSmsTestMessage(mockSmsConnectorId, phone, {})).rejects.toThrow(HTTPError); await expect(sendEmailTestMessage(mockEmailConnectorId, email, {})).rejects.toThrow(HTTPError); + + for (const [_connectorId, id] of connectorIdMap.entries()) { + // eslint-disable-next-line no-await-in-loop + await deleteConnectorById(id); + } }); diff --git a/packages/integration-tests/tests/api/social-session.test.ts b/packages/integration-tests/tests/api/social-session.test.ts index cacdde01c..4c5bf484b 100644 --- a/packages/integration-tests/tests/api/social-session.test.ts +++ b/packages/integration-tests/tests/api/social-session.test.ts @@ -15,6 +15,7 @@ import { getUser, postConnector, updateConnectorConfig, + deleteConnectorById, } from '@/api'; import MockClient from '@/client'; import { signUpIdentifiers } from '@/constants'; @@ -112,6 +113,13 @@ describe('social bind account', () => { await createUserByAdmin(username, password); }); + afterAll(async () => { + for (const [_connectorId, id] of connectorIdMap.entries()) { + // eslint-disable-next-line no-await-in-loop + await deleteConnectorById(id); + } + }); + it('bind new social account', async () => { const client = new MockClient();