UNPKG

@dossierhq/integration-test

Version:

Integration test to ensure that different Dossier database adapters work as expected.

89 lines 4.24 kB
/// <reference types="./SyncScenarioUtils.d.ts" /> import { assertOkResult, ErrorType, EventType, } from '@dossierhq/core'; import { assertEquals, assertErrorResult, assertResultValue, assertTruthy } from '../Asserts.js'; import { assertSyncEventsEqual } from '../shared-entity/EventsTestUtils.js'; import { createDossierClientProvider } from '../shared-entity/TestClients.js'; export async function ensureServerIsEmpty(server) { const initialSyncEvents = (await server.getSyncEvents({ after: null, limit: 10 })).valueOrThrow(); assertEquals(initialSyncEvents.events.length, 0); assertResultValue(await server.getPrincipals(), null); } export async function createPrincipalSyncAndInitializeScenarioContext(context) { const { sourceServer, targetServer } = context; // Setup source Dossier client const sourceClient = createDossierClientProvider(sourceServer).dossierClient(); // Use source Dossier client to force lazy creation of the main principal assertErrorResult(await sourceClient.getEntity({ id: crypto.randomUUID() }), ErrorType.NotFound, 'No such entity'); // Get source principals assertResultValue(await sourceServer.getPrincipalsTotalCount(), 1); const sourcePrincipalConnection = (await sourceServer.getPrincipals()).valueOrThrow(); assertTruthy(sourcePrincipalConnection); const sourcePrincipals = sourcePrincipalConnection.edges.map((it) => it.node.valueOrThrow()); assertEquals(sourcePrincipals.length, 1); const createdBy = sourcePrincipalConnection.edges[0].node.valueOrThrow().subjectId; // Apply sync events const { events, nextContext } = await applyEventsOnTargetAndResolveNextContext({ ...context, after: null, events: [], }); assertSyncEventsEqual(events, [ { type: EventType.createPrincipal, parentId: null, createdBy, provider: 'test', identifier: 'main', }, ]); // Check that the target principals are identical assertResultValue(await targetServer.getPrincipalsTotalCount(), 1); const targetPrincipalConnection = (await targetServer.getPrincipals()).valueOrThrow(); assertTruthy(targetPrincipalConnection); const targetPrincipals = targetPrincipalConnection.edges.map((it) => it.node.valueOrThrow()); assertEquals(targetPrincipals, sourcePrincipals); // Create target Dossier client after the principals have been created const targetClient = createDossierClientProvider(targetServer).dossierClient(); const scenarioContext = { ...context, sourceClient, targetClient, createdBy, after: nextContext.after, events, }; return scenarioContext; } export async function applyEventsOnTargetAndResolveNextContext(context) { const { sourceServer, targetServer, after } = context; // Apply source events on target server const sourceSyncEvents = (await sourceServer.getSyncEvents({ after, limit: 10 })).valueOrThrow(); let nextAfter = after; for (const syncEvent of sourceSyncEvents.events) { assertOkResult(await targetServer.applySyncEvent(syncEvent)); nextAfter = syncEvent.id; } const targetSyncEvents = (await targetServer.getSyncEvents({ after, limit: 10 })).valueOrThrow(); assertEquals(targetSyncEvents.events, sourceSyncEvents.events); // Process all dirty entities for (const server of [sourceServer, targetServer]) { let processOneMore = true; while (processOneMore) { const info = (await server.processNextDirtyEntity()).valueOrThrow(); processOneMore = !!info; } } // Construct nextContext const nextContext = { ...context, after: nextAfter, events: [...context.events, ...sourceSyncEvents.events], }; return { nextContext, events: sourceSyncEvents.events }; } export async function ensureServerHasTheSameSyncEventsAsFirstSeen(context, server) { const syncEvents = (await server.getSyncEvents({ after: null, limit: 100 })).valueOrThrow(); assertEquals(syncEvents.hasMore, false); assertEquals(syncEvents.events, context.events); } //# sourceMappingURL=SyncScenarioUtils.js.map