0
Fork 0
mirror of https://github.com/logto-io/logto.git synced 2025-02-10 21:58:23 -05:00
logto/packages/integration-tests/tests/api/connector.test.ts

154 lines
5.2 KiB
TypeScript

import { HTTPError } from 'got';
import {
mockEmailConnectorConfig,
mockEmailConnectorId,
mockSmsConnectorConfig,
mockSmsConnectorId,
mockSocialConnectorConfig,
mockSocialConnectorId,
mockStandardEmailConnectorConfig,
mockStandardEmailConnectorId,
} from '@/__mocks__/connectors-mock';
import {
deleteConnectorById,
getConnector,
listConnectors,
postConnector,
sendEmailTestMessage,
sendSmsTestMessage,
updateConnectorConfig,
} from '@/api/connector';
const connectorIdMap = new Map();
/*
* We'd better only use mock connectors in integration tests.
* Since we will refactor connectors soon, keep using some real connectors
* for testing updating configs and enabling/disabling for now.
*/
test('connector set-up flow', async () => {
const connectors = await listConnectors();
await Promise.all(
connectors.map(async ({ id }) => {
await deleteConnectorById(id);
})
);
connectorIdMap.clear();
/*
* Set up social/SMS/email connectors
*/
await Promise.all(
[
{ connectorId: mockSmsConnectorId, config: mockSmsConnectorConfig },
{ connectorId: mockEmailConnectorId, config: mockEmailConnectorConfig },
{ connectorId: mockSocialConnectorId, config: mockSocialConnectorConfig },
].map(async ({ connectorId, config }) => {
const { id } = await postConnector(connectorId);
connectorIdMap.set(connectorId, id);
const updatedConnector = await updateConnectorConfig(id, config);
expect(updatedConnector.config).toEqual(config);
// The result of getting a connector should be same as the result of updating a connector above.
const connector = await getConnector(id);
expect(connector.config).toEqual(config);
})
);
/*
* It should update the connector config successfully when it is valid; otherwise, it should fail.
* We will test updating to the invalid connector config, that is the case not covered above.
*/
await expect(
updateConnectorConfig(connectorIdMap.get(mockSocialConnectorId), mockSmsConnectorConfig)
).rejects.toThrow(HTTPError);
// To confirm the failed updating request above did not modify the original config,
// we check: the mock connector config should stay the same.
const mockSocialConnector = await getConnector(connectorIdMap.get(mockSocialConnectorId));
expect(mockSocialConnector.config).toEqual(mockSocialConnectorConfig);
/*
* Change to another SMS/Email connector
*/
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(mockStandardEmailConnectorId))
).resolves.not.toThrow();
connectorIdMap.delete(mockStandardEmailConnectorId);
/**
* List connectors after manually setting up connectors.
* The result of listing connectors should be same as the result of updating connectors above.
*/
expect(await listConnectors()).toEqual(
expect.arrayContaining([
expect.objectContaining({
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
id: connectorIdMap.get(mockSmsConnectorId),
connectorId: mockSmsConnectorId,
config: mockSmsConnectorConfig,
}),
expect.objectContaining({
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
id: connectorIdMap.get(mockSocialConnectorId),
connectorId: mockSocialConnectorId,
config: mockSocialConnectorConfig,
}),
])
);
});
test('send SMS/email test message', async () => {
const connectors = await listConnectors();
await Promise.all(
connectors.map(async ({ id }) => {
await deleteConnectorById(id);
})
);
connectorIdMap.clear();
await Promise.all(
[{ connectorId: mockSmsConnectorId }, { connectorId: mockEmailConnectorId }].map(
async ({ connectorId }) => {
const { id } = await postConnector(connectorId);
connectorIdMap.set(connectorId, id);
}
)
);
const phone = '8612345678901';
const email = 'test@example.com';
await expect(
sendSmsTestMessage(connectorIdMap.get(mockSmsConnectorId), phone, mockSmsConnectorConfig)
).resolves.not.toThrow();
await expect(
sendEmailTestMessage(connectorIdMap.get(mockEmailConnectorId), email, mockEmailConnectorConfig)
).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);
}
});