diff --git a/e2e/shared/mock-api-server.ts b/e2e/shared/mock-api-server.ts index 7e242baf9..10ccbcaab 100644 --- a/e2e/shared/mock-api-server.ts +++ b/e2e/shared/mock-api-server.ts @@ -1,7 +1,10 @@ import { createServer } from "node:http"; +import { getContainerRuntimeClient, TestContainers } from "testcontainers"; import type { Server } from "node:http"; +const TESTCONTAINERS_SSHD_LABEL = "org.testcontainers.sshd"; + export interface MockApiServer { url: string; close: () => Promise; @@ -21,11 +24,27 @@ export async function startMockApiServerAsync(responseBody: unknown): Promise - new Promise((resolve, reject) => { - server.close((error) => (error ? reject(error) : resolve())); - }), - }; + + try { + await TestContainers.exposeHostPorts(address.port); + const client = await getContainerRuntimeClient(); + const forwarder = (await client.container.list()).find( + (container) => container.State === "running" && container.Labels[TESTCONTAINERS_SSHD_LABEL] === "true", + ); + const forwarderAddress = forwarder + ? Object.values(forwarder.NetworkSettings.Networks).find((network) => network.IPAddress)?.IPAddress + : undefined; + if (!forwarderAddress) throw new Error("Failed to locate the Testcontainers host-port forwarder"); + + return { + url: `http://${forwarderAddress}:${address.port}`, + close: () => + new Promise((resolve, reject) => { + server.close((error) => (error ? reject(error) : resolve())); + }), + }; + } catch (error) { + server.close(); + throw error; + } }