import { createMockPool, createMockQueryResult } from 'slonik'; import Libraries from '#src/tenants/Libraries.js'; import Queries from '#src/tenants/Queries.js'; import type TenantContext from '#src/tenants/TenantContext.js'; import type { GrantMock } from './oidc-provider.js'; import { createMockProvider } from './oidc-provider.js'; export class MockQueries extends Queries { constructor(queriesOverride?: Partial2) { super( createMockPool({ query: async (sql, values) => { return createMockQueryResult([]); }, }) ); if (!queriesOverride) { return; } const overrideKey = (key: Key) => { this[key] = { ...this[key], ...queriesOverride[key] }; }; // eslint-disable-next-line no-restricted-syntax for (const key of Object.keys(queriesOverride) as Array) { overrideKey(key); } } } // eslint-disable-next-line @typescript-eslint/ban-types export type DeepPartial = T extends object ? { [P in keyof T]?: DeepPartial; } : T; export type Partial2 = { [key in keyof T]?: Partial }; export class MockTenant implements TenantContext { public queries: Queries; public libraries: Libraries; constructor( public provider = createMockProvider(), queriesOverride?: Partial2, librariesOverride?: Partial2 ) { this.queries = new MockQueries(queriesOverride); this.libraries = new Libraries(this.queries); this.setPartial('libraries', librariesOverride); } setPartialKey( type: Type, key: Key, value: Partial ) { this[type][key] = { ...this[type][key], ...value }; } setPartial(type: Type, value?: Partial2) { if (!value) { return; } // eslint-disable-next-line no-restricted-syntax for (const key of Object.keys(value) as Array) { this.setPartialKey(type, key, { ...this[type][key], ...value[key] }); } } } export const createMockTenantWithInteraction = ( interactionDetails?: jest.Mock, Grant?: typeof GrantMock ) => new MockTenant(createMockProvider(interactionDetails, Grant));