diff --git a/packages/app-runtime/src/AppRuntime.ts b/packages/app-runtime/src/AppRuntime.ts index 6df2cc176..25f57966b 100644 --- a/packages/app-runtime/src/AppRuntime.ts +++ b/packages/app-runtime/src/AppRuntime.ts @@ -305,10 +305,19 @@ export class AppRuntime extends Runtime { for (const account of accounts) { const session = await this.selectAccount(account.id.toString()); - const syncResult = await session.transportServices.account.syncDatawallet(); + const syncResult = await session.transportServices.account.syncDatawallet(); if (syncResult.isSuccess) continue; - // TODO: can I check whether the error is a 400? + // TODO: should we log the syncResult error? + + session.accountController.authenticator.clear(); + try { + await session.accountController.authenticator.getToken(); + continue; + } catch (error) { + this.logger.error(error); + // if (!(error.status === 400)) continue; + } const checkDeletionResult = await session.transportServices.account.checkDeletionOfIdentity(); diff --git a/packages/app-runtime/test/lib/TestUtil.ts b/packages/app-runtime/test/lib/TestUtil.ts index 2190dbcf6..a6383ea9a 100644 --- a/packages/app-runtime/test/lib/TestUtil.ts +++ b/packages/app-runtime/test/lib/TestUtil.ts @@ -15,6 +15,9 @@ import { SyncEverythingResponse } from "@nmshd/runtime"; import { IConfigOverwrite, TransportLoggerFactory } from "@nmshd/transport"; +import fs from "fs"; +import path from "path"; +import { GenericContainer, Wait } from "testcontainers"; import { LogLevel } from "typescript-logging"; import { AppConfig, AppRuntime, IUIBridge, LocalAccountDTO, LocalAccountSession, createAppConfig as runtime_createAppConfig } from "../../src"; import { FakeUIBridge } from "./FakeUIBridge"; @@ -262,4 +265,26 @@ export class TestUtil { // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition expect(result.isSuccess, `${result.error?.code} | ${result.error?.message}`).toBe(true); } + + public static async runDeletionJob(): Promise { + const backboneVersion = this.getBackboneEnvVar("BACKBONE_VERSION"); + + await new GenericContainer(`ghcr.io/nmshd/backbone-identity-deletion-jobs:${backboneVersion}`) + .withWaitStrategy(Wait.forOneShotStartup()) + .withCommand(["--Worker", "ActualDeletionWorker"]) + .withNetworkMode("backbone") + .withCopyFilesToContainer([{ source: `${__dirname}/../../../../.dev/appsettings.override.json`, target: "/app/appsettings.override.json" }]) + .start(); + } + + private static getBackboneEnvVar(name: string) { + const envFile = fs.readFileSync(path.resolve(`${__dirname}/../../../../.dev/compose.backbone.env`)); + const env = envFile + .toString() + .split("\n") + .map((line) => line.split("=")) + .reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {} as Record); + + return env[name]; + } } diff --git a/packages/app-runtime/test/runtime/Startup.test.ts b/packages/app-runtime/test/runtime/Startup.test.ts index 2649ea483..53b30d00e 100644 --- a/packages/app-runtime/test/runtime/Startup.test.ts +++ b/packages/app-runtime/test/runtime/Startup.test.ts @@ -1,4 +1,4 @@ -import { AppRuntime, LocalAccountDTO } from "../../src"; +import { AppRuntime, LocalAccountDTO, LocalAccountSession } from "../../src"; import { EventListener, TestUtil } from "../lib"; describe("Runtime Startup", function () { @@ -64,3 +64,41 @@ describe("Runtime Startup", function () { expect(selectedAccount.account.id.toString()).toBe(localAccount.id.toString()); }); }); + +describe("Start Accounts", function () { + let runtime: AppRuntime; + + let sessionA: LocalAccountSession; + + let errorSpy: jest.SpyInstance; + + beforeAll(async function () { + runtime = await TestUtil.createRuntime(); + await runtime.start(); + + const accounts = await TestUtil.provideAccounts(runtime, 1); + sessionA = await runtime.selectAccount(accounts[0].id); + + errorSpy = jest.spyOn(console, "error").mockImplementation(() => {}); + }); + + afterEach(() => errorSpy.mockRestore()); + + afterAll(async () => await runtime.stop()); + + test("should run startAccounts", async function () { + await runtime["startAccounts"](); + expect(errorSpy).not.toHaveBeenCalled(); + }); + + test.only("should run startAccounts for one deleted Account", async function () { + await sessionA.transportServices.identityDeletionProcesses["initiateIdentityDeletionProcessUseCase"]["identityDeletionProcessController"].initiateIdentityDeletionProcess( + 0 + ); + await TestUtil.runDeletionJob(); + + await runtime["startAccounts"](); + // TODO: check for error message + expect(errorSpy).toHaveBeenCalled(); + }); +});