0
Fork 0
mirror of https://github.com/logto-io/logto.git synced 2025-02-17 22:04:19 -05:00

chore(connector): fix connector validator type (#1667)

This commit is contained in:
Darcy Ye 2022-07-25 13:51:59 +08:00 committed by GitHub
parent 3773701fc9
commit fe5a10e92e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
14 changed files with 48 additions and 39 deletions

View file

@ -9,6 +9,7 @@ import nock from 'nock';
import AlipayNativeConnector from '.';
import { alipayEndpoint } from './constant';
import { mockedAlipayNativeConfig, mockedAlipayNativeConfigWithValidPrivateKey } from './mock';
import { AlipayNativeConfig } from './types';
const getConnectorConfig = jest.fn() as GetConnectorConfig;
@ -25,21 +26,21 @@ describe('validateConfig', () => {
*/
it('should pass on valid config', async () => {
const validator: ValidateConfig = alipayNativeMethods.validateConfig;
const validator: ValidateConfig<AlipayNativeConfig> = alipayNativeMethods.validateConfig;
expect(() => {
validator(mockedAlipayNativeConfig);
}).not.toThrow();
});
it('should fail on empty config', async () => {
const validator: ValidateConfig = alipayNativeMethods.validateConfig;
const validator: ValidateConfig<AlipayNativeConfig> = alipayNativeMethods.validateConfig;
expect(() => {
validator({});
}).toThrow();
});
it('should fail when missing required properties', async () => {
const validator: ValidateConfig = alipayNativeMethods.validateConfig;
const validator: ValidateConfig<AlipayNativeConfig> = alipayNativeMethods.validateConfig;
expect(() => {
validator({ appId: 'appId' });
}).toThrow();

View file

@ -9,6 +9,7 @@ import nock from 'nock';
import AlipayConnector from '.';
import { alipayEndpoint, authorizationEndpoint } from './constant';
import { mockedAlipayConfig, mockedAlipayConfigWithValidPrivateKey } from './mock';
import { AlipayConfig } from './types';
const getConnectorConfig = jest.fn() as GetConnectorConfig;
@ -25,7 +26,7 @@ describe('validateConfig', () => {
*/
it('should pass on valid config', async () => {
const validator: ValidateConfig = alipayMethods.validateConfig;
const validator: ValidateConfig<AlipayConfig> = alipayMethods.validateConfig;
expect(() => {
validator({
appId: 'appId',
@ -36,14 +37,14 @@ describe('validateConfig', () => {
});
it('should fail on empty config', async () => {
const validator: ValidateConfig = alipayMethods.validateConfig;
const validator: ValidateConfig<AlipayConfig> = alipayMethods.validateConfig;
expect(() => {
validator({});
}).toThrow();
});
it('should fail when missing required properties', async () => {
const validator: ValidateConfig = alipayMethods.validateConfig;
const validator: ValidateConfig<AlipayConfig> = alipayMethods.validateConfig;
expect(() => {
validator({ appId: 'appId' });
}).toThrow();

View file

@ -3,6 +3,7 @@ import { GetConnectorConfig, ValidateConfig } from '@logto/connector-types';
import AliyunDmConnector from '.';
import { mockedConfig } from './mock';
import { singleSendMail } from './single-send-mail';
import { AliyunDmConfig } from './types';
const getConnectorConfig = jest.fn() as GetConnectorConfig;
@ -34,7 +35,7 @@ describe('validateConfig()', () => {
*/
it('should pass on valid config', async () => {
const validator: ValidateConfig = aliyunDmMethods.validateConfig;
const validator: ValidateConfig<AliyunDmConfig> = aliyunDmMethods.validateConfig;
expect(() => {
validator({
accessKeyId: 'accessKeyId',
@ -46,7 +47,7 @@ describe('validateConfig()', () => {
});
it('should fail if config is invalid', async () => {
const validator: ValidateConfig = aliyunDmMethods.validateConfig;
const validator: ValidateConfig<AliyunDmConfig> = aliyunDmMethods.validateConfig;
expect(() => {
validator({});
}).toThrow();

View file

@ -3,6 +3,7 @@ import { GetConnectorConfig, ValidateConfig } from '@logto/connector-types';
import AliyunSmsConnector from '.';
import { mockedConnectorConfig, mockedValidConnectorConfig, phoneTest, codeTest } from './mock';
import { sendSms } from './single-send-text';
import { AliyunSmsConfig } from './types';
const getConnectorConfig = jest.fn() as GetConnectorConfig;
@ -30,14 +31,14 @@ describe('validateConfig()', () => {
*/
it('should pass on valid config', async () => {
const validator: ValidateConfig = aliyunSmsMethods.validateConfig;
const validator: ValidateConfig<AliyunSmsConfig> = aliyunSmsMethods.validateConfig;
expect(() => {
validator(mockedValidConnectorConfig);
}).not.toThrow();
});
it('should fail if config is invalid', async () => {
const validator: ValidateConfig = aliyunSmsMethods.validateConfig;
const validator: ValidateConfig<AliyunSmsConfig> = aliyunSmsMethods.validateConfig;
expect(() => {
validator({});
}).toThrow();

View file

@ -9,6 +9,7 @@ import { jwtVerify } from 'jose';
import AppleConnector from '.';
import { authorizationEndpoint } from './constant';
import { mockedConfig } from './mock';
import { AppleConfig } from './types';
const getConnectorConfig = jest.fn() as GetConnectorConfig;
@ -50,14 +51,14 @@ describe('validateConfig', () => {
*/
it('should be true on valid config', async () => {
const validator: ValidateConfig = appleMethods.validateConfig;
const validator: ValidateConfig<AppleConfig> = appleMethods.validateConfig;
expect(() => {
validator({ clientId: 'clientId' });
}).not.toThrow();
});
it('should be false on empty config', async () => {
const validator: ValidateConfig = appleMethods.validateConfig;
const validator: ValidateConfig<AppleConfig> = appleMethods.validateConfig;
expect(() => {
validator({});
}).toThrow();

View file

@ -9,6 +9,7 @@ import nock from 'nock';
import FacebookConnector from '.';
import { accessTokenEndpoint, authorizationEndpoint, userInfoEndpoint } from './constant';
import { clientId, clientSecret, code, dummyRedirectUri, fields, mockedConfig } from './mock';
import { FacebookConfig } from './types';
const getConnectorConfig = jest.fn() as GetConnectorConfig;
@ -30,14 +31,14 @@ describe('facebook connector', () => {
*/
it('should pass on valid config', async () => {
const validator: ValidateConfig = facebookMethods.validateConfig;
const validator: ValidateConfig<FacebookConfig> = facebookMethods.validateConfig;
expect(() => {
validator({ clientId, clientSecret });
}).not.toThrow();
});
it('should fail on invalid config', async () => {
const validator: ValidateConfig = facebookMethods.validateConfig;
const validator: ValidateConfig<FacebookConfig> = facebookMethods.validateConfig;
expect(() => {
validator({});
}).toThrow();

View file

@ -10,6 +10,7 @@ import * as qs from 'query-string';
import GithubConnector from '.';
import { accessTokenEndpoint, authorizationEndpoint, userInfoEndpoint } from './constant';
import { mockedConfig } from './mock';
import { GithubConfig } from './types';
const getConnectorConfig = jest.fn() as GetConnectorConfig;
@ -77,21 +78,21 @@ describe('validateConfig', () => {
*/
it('should pass on valid config', async () => {
const validator: ValidateConfig = githubMethods.validateConfig;
const validator: ValidateConfig<GithubConfig> = githubMethods.validateConfig;
expect(() => {
validator({ clientId: 'clientId', clientSecret: 'clientSecret' });
}).not.toThrow();
});
it('should fail on empty config', async () => {
const validator: ValidateConfig = githubMethods.validateConfig;
const validator: ValidateConfig<GithubConfig> = githubMethods.validateConfig;
expect(() => {
validator({});
}).toThrow();
});
it('should fail when missing clientSecret', async () => {
const validator: ValidateConfig = githubMethods.validateConfig;
const validator: ValidateConfig<GithubConfig> = githubMethods.validateConfig;
expect(() => {
validator({ clientId: 'clientId' });
}).toThrow();

View file

@ -9,6 +9,7 @@ import nock from 'nock';
import GoogleConnector from '.';
import { accessTokenEndpoint, authorizationEndpoint, userInfoEndpoint } from './constant';
import { mockedConfig } from './mock';
import { GoogleConfig } from './types';
const getConnectorConfig = jest.fn() as GetConnectorConfig;
@ -30,14 +31,14 @@ describe('google connector', () => {
*/
it('should pass on valid config', async () => {
const validator: ValidateConfig = googleMethods.validateConfig;
const validator: ValidateConfig<GoogleConfig> = googleMethods.validateConfig;
expect(() => {
validator({ clientId: 'clientId', clientSecret: 'clientSecret' });
}).not.toThrow();
});
it('should fail on invalid config', async () => {
const validator: ValidateConfig = googleMethods.validateConfig;
const validator: ValidateConfig<GoogleConfig> = googleMethods.validateConfig;
expect(() => {
validator({});
}).toThrow();

View file

@ -2,7 +2,7 @@ import { GetConnectorConfig, ValidateConfig } from '@logto/connector-types';
import SendGridMailConnector from '.';
import { mockedConfig } from './mock';
import { ContextType } from './types';
import { ContextType, SendGridMailConfig } from './types';
const getConnectorConfig = jest.fn() as GetConnectorConfig;
@ -25,7 +25,7 @@ describe('validateConfig()', () => {
*/
it('should pass on valid config', async () => {
const validator: ValidateConfig = sendGridMailMethods.validateConfig;
const validator: ValidateConfig<SendGridMailConfig> = sendGridMailMethods.validateConfig;
expect(() => {
validator({
apiKey: 'apiKey',
@ -44,7 +44,7 @@ describe('validateConfig()', () => {
});
it('should be false if config is invalid', async () => {
const validator: ValidateConfig = sendGridMailMethods.validateConfig;
const validator: ValidateConfig<SendGridMailConfig> = sendGridMailMethods.validateConfig;
expect(() => {
validator({});
}).toThrow();

View file

@ -1,6 +1,7 @@
import { GetConnectorConfig, ValidateConfig } from '@logto/connector-types';
import SmtpConnector from '.';
import { SmtpConfig } from './types';
const getConnectorConfig = jest.fn() as GetConnectorConfig;
@ -17,7 +18,7 @@ describe('validateConfig()', () => {
*/
it('should pass on valid config', async () => {
const validator: ValidateConfig = smtpMethods.validateConfig;
const validator: ValidateConfig<SmtpConfig> = smtpMethods.validateConfig;
expect(() => {
validator({
host: 'smtp.testing.com',
@ -56,7 +57,7 @@ describe('validateConfig()', () => {
});
it('should be false if config is invalid', async () => {
const validator: ValidateConfig = smtpMethods.validateConfig;
const validator: ValidateConfig<SmtpConfig> = smtpMethods.validateConfig;
expect(() => {
validator({});
}).toThrow();

View file

@ -2,6 +2,7 @@ import { GetConnectorConfig, ValidateConfig } from '@logto/connector-types';
import TwilioSmsConnector from '.';
import { mockedConfig } from './mock';
import { TwilioSmsConfig } from './types';
const getConnectorConfig = jest.fn() as GetConnectorConfig;
@ -18,14 +19,14 @@ describe('validateConfig()', () => {
*/
it('should pass on valid config', async () => {
const validator: ValidateConfig = twilioSmsMethods.validateConfig;
const validator: ValidateConfig<TwilioSmsConfig> = twilioSmsMethods.validateConfig;
expect(() => {
validator(mockedConfig);
}).not.toThrow();
});
it('throws if config is invalid', async () => {
const validator: ValidateConfig = twilioSmsMethods.validateConfig;
const validator: ValidateConfig<TwilioSmsConfig> = twilioSmsMethods.validateConfig;
expect(() => {
validator({});
}).toThrow();

View file

@ -9,6 +9,7 @@ import nock from 'nock';
import WechatNativeConnector from '.';
import { accessTokenEndpoint, authorizationEndpoint, userInfoEndpoint } from './constant';
import { mockedConfig } from './mock';
import { WechatNativeConfig } from './types';
const getConnectorConfig = jest.fn() as GetConnectorConfig;
@ -102,21 +103,21 @@ describe('validateConfig', () => {
*/
it('should pass on valid config', async () => {
const validator: ValidateConfig = wechatNativeMethods.validateConfig;
const validator: ValidateConfig<WechatNativeConfig> = wechatNativeMethods.validateConfig;
expect(() => {
validator({ appId: 'appId', appSecret: 'appSecret' });
}).not.toThrow();
});
it('should fail on empty config', async () => {
const validator: ValidateConfig = wechatNativeMethods.validateConfig;
const validator: ValidateConfig<WechatNativeConfig> = wechatNativeMethods.validateConfig;
expect(() => {
validator({});
}).toThrow();
});
it('should fail when missing appSecret', async () => {
const validator: ValidateConfig = wechatNativeMethods.validateConfig;
const validator: ValidateConfig<WechatNativeConfig> = wechatNativeMethods.validateConfig;
expect(() => {
validator({ appId: 'appId' });
}).toThrow();

View file

@ -9,6 +9,7 @@ import nock from 'nock';
import WechatConnector from '.';
import { accessTokenEndpoint, authorizationEndpoint, userInfoEndpoint } from './constant';
import { mockedConfig } from './mock';
import { WechatConfig } from './types';
const getConnectorConfig = jest.fn() as GetConnectorConfig;
@ -102,21 +103,21 @@ describe('validateConfig', () => {
*/
it('should pass on valid config', async () => {
const validator: ValidateConfig = wechatMethods.validateConfig;
const validator: ValidateConfig<WechatConfig> = wechatMethods.validateConfig;
expect(() => {
validator({ appId: 'appId', appSecret: 'appSecret' });
}).not.toThrow();
});
it('should fail on empty config', async () => {
const validator: ValidateConfig = wechatMethods.validateConfig;
const validator: ValidateConfig<WechatConfig> = wechatMethods.validateConfig;
expect(() => {
validator({});
}).toThrow();
});
it('should fail when missing appSecret', async () => {
const validator: ValidateConfig = wechatMethods.validateConfig;
const validator: ValidateConfig<WechatConfig> = wechatMethods.validateConfig;
expect(() => {
validator({ appId: 'appId' });
}).toThrow();

View file

@ -1,5 +1,4 @@
import {
ValidateConfig,
ConnectorInstance,
EmailConnectorInstance,
SmsConnectorInstance,
@ -89,6 +88,7 @@ export default function connectorRoutes<T extends AuthedRouter>(router: T) {
const connectorInstance = await getConnectorInstanceById(id);
const {
connector: { config },
validateConfig,
metadata,
} = connectorInstance;
@ -96,8 +96,7 @@ export default function connectorRoutes<T extends AuthedRouter>(router: T) {
* Assertion functions always need explicit annotations.
* See https://github.com/microsoft/TypeScript/issues/36931#issuecomment-589753014
*/
// eslint-disable-next-line unicorn/consistent-destructuring
const validator: ValidateConfig = connectorInstance.validateConfig;
const validator: typeof validateConfig = validateConfig;
if (enabled) {
validator(config);
@ -145,15 +144,13 @@ export default function connectorRoutes<T extends AuthedRouter>(router: T) {
body,
} = ctx.guard;
const connectorInstance = await getConnectorInstanceById(id);
const { metadata } = connectorInstance;
const { metadata, validateConfig } = await getConnectorInstanceById(id);
/**
* Assertion functions always need explicit annotations.
* See https://github.com/microsoft/TypeScript/issues/36931#issuecomment-589753014
*/
// eslint-disable-next-line unicorn/consistent-destructuring
const validator: ValidateConfig = connectorInstance.validateConfig;
const validator: typeof validateConfig = validateConfig;
if (body.config) {
validator(body.config);