2023-04-07 01:13:15 +08:00
|
|
|
import { TtlCache } from '@logto/shared';
|
2023-01-08 22:45:09 +08:00
|
|
|
import { createMockPool, createMockQueryResult } from 'slonik';
|
|
|
|
|
2023-04-07 01:13:15 +08:00
|
|
|
import { WellKnownCache } from '#src/caches/well-known.js';
|
2023-03-15 21:32:08 +08:00
|
|
|
import type { ConnectorLibrary } from '#src/libraries/connector.js';
|
|
|
|
import { createConnectorLibrary } from '#src/libraries/connector.js';
|
2023-01-08 22:45:09 +08:00
|
|
|
import Libraries from '#src/tenants/Libraries.js';
|
|
|
|
import Queries from '#src/tenants/Queries.js';
|
2023-01-09 16:58:02 +08:00
|
|
|
import type TenantContext from '#src/tenants/TenantContext.js';
|
|
|
|
|
2023-02-09 18:31:14 +08:00
|
|
|
import { mockEnvSet } from './env-set.js';
|
2023-01-10 11:59:24 +08:00
|
|
|
import type { GrantMock } from './oidc-provider.js';
|
2023-01-09 16:58:02 +08:00
|
|
|
import { createMockProvider } from './oidc-provider.js';
|
|
|
|
|
2023-04-07 01:13:15 +08:00
|
|
|
export class MockWellKnownCache extends WellKnownCache {
|
|
|
|
constructor(public ttlCache = new TtlCache<string, string>(60_000)) {
|
|
|
|
super('mock_id', ttlCache);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-01-09 13:26:17 +08:00
|
|
|
export class MockQueries extends Queries {
|
|
|
|
constructor(queriesOverride?: Partial2<Queries>) {
|
|
|
|
super(
|
|
|
|
createMockPool({
|
|
|
|
query: async (sql, values) => {
|
|
|
|
return createMockQueryResult([]);
|
|
|
|
},
|
2023-04-07 01:13:15 +08:00
|
|
|
}),
|
|
|
|
new MockWellKnownCache()
|
2023-01-09 13:26:17 +08:00
|
|
|
);
|
|
|
|
|
|
|
|
if (!queriesOverride) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
const overrideKey = <Key extends keyof Queries>(key: Key) => {
|
|
|
|
this[key] = { ...this[key], ...queriesOverride[key] };
|
|
|
|
};
|
|
|
|
|
|
|
|
// eslint-disable-next-line no-restricted-syntax
|
|
|
|
for (const key of Object.keys(queriesOverride) as Array<keyof Queries>) {
|
|
|
|
overrideKey(key);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2023-01-08 22:45:09 +08:00
|
|
|
|
|
|
|
// eslint-disable-next-line @typescript-eslint/ban-types
|
|
|
|
export type DeepPartial<T> = T extends object
|
|
|
|
? {
|
|
|
|
[P in keyof T]?: DeepPartial<T[P]>;
|
|
|
|
}
|
|
|
|
: T;
|
|
|
|
|
|
|
|
export type Partial2<T> = { [key in keyof T]?: Partial<T[key]> };
|
2023-01-09 16:58:02 +08:00
|
|
|
|
|
|
|
export class MockTenant implements TenantContext {
|
2023-02-10 19:57:25 +08:00
|
|
|
public id = 'mock_id';
|
2023-02-09 18:31:14 +08:00
|
|
|
public envSet = mockEnvSet;
|
2023-01-08 22:45:09 +08:00
|
|
|
public queries: Queries;
|
2023-03-15 21:32:08 +08:00
|
|
|
public connectors: ConnectorLibrary;
|
2023-01-08 22:45:09 +08:00
|
|
|
public libraries: Libraries;
|
|
|
|
|
|
|
|
constructor(
|
|
|
|
public provider = createMockProvider(),
|
|
|
|
queriesOverride?: Partial2<Queries>,
|
2023-03-15 21:32:08 +08:00
|
|
|
connectorsOverride?: Partial<ConnectorLibrary>,
|
2023-01-08 22:45:09 +08:00
|
|
|
librariesOverride?: Partial2<Libraries>
|
|
|
|
) {
|
2023-01-09 13:26:17 +08:00
|
|
|
this.queries = new MockQueries(queriesOverride);
|
2023-03-15 21:32:08 +08:00
|
|
|
this.connectors = { ...createConnectorLibrary(this.queries), ...connectorsOverride };
|
|
|
|
this.libraries = new Libraries(this.id, this.queries, this.connectors);
|
2023-01-08 22:45:09 +08:00
|
|
|
this.setPartial('libraries', librariesOverride);
|
|
|
|
}
|
|
|
|
|
|
|
|
setPartialKey<Type extends 'queries' | 'libraries', Key extends keyof this[Type]>(
|
|
|
|
type: Type,
|
|
|
|
key: Key,
|
|
|
|
value: Partial<this[Type][Key]>
|
|
|
|
) {
|
|
|
|
this[type][key] = { ...this[type][key], ...value };
|
|
|
|
}
|
|
|
|
|
|
|
|
setPartial<Type extends 'queries' | 'libraries'>(type: Type, value?: Partial2<this[Type]>) {
|
|
|
|
if (!value) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// eslint-disable-next-line no-restricted-syntax
|
|
|
|
for (const key of Object.keys(value) as Array<keyof this[Type]>) {
|
|
|
|
this.setPartialKey(type, key, { ...this[type][key], ...value[key] });
|
|
|
|
}
|
|
|
|
}
|
2023-01-09 16:58:02 +08:00
|
|
|
}
|
|
|
|
|
2023-01-10 11:59:24 +08:00
|
|
|
export const createMockTenantWithInteraction = (
|
|
|
|
interactionDetails?: jest.Mock,
|
|
|
|
Grant?: typeof GrantMock
|
|
|
|
) => new MockTenant(createMockProvider(interactionDetails, Grant));
|