diff --git a/test/e2e/ipv6.spec.ts b/test/e2e/ipv6.spec.ts index 7754c621..73eb6516 100644 --- a/test/e2e/ipv6.spec.ts +++ b/test/e2e/ipv6.spec.ts @@ -3,9 +3,9 @@ import { getLocal } from 'mockttp'; import request from 'supertest'; import { afterEach, beforeEach, describe, expect, it } from 'vitest'; -import { createApp, createProxyMiddleware } from './test-kit.js'; +import { createApp, createProxyMiddleware, isIPv6Available } from './test-kit.js'; -describe('ipv6 integration', () => { +describe.runIf(await isIPv6Available())('ipv6 integration', () => { let targetServer: Mockttp; beforeEach(async () => { diff --git a/test/e2e/test-kit.ts b/test/e2e/test-kit.ts index 65ae391e..5141e816 100644 --- a/test/e2e/test-kit.ts +++ b/test/e2e/test-kit.ts @@ -1,3 +1,5 @@ +import { createServer } from 'node:net'; + import express, { type Express, type RequestHandler } from 'express'; export { @@ -18,3 +20,21 @@ export function createAppWithPath(path: string | string[], middleware: RequestHa app.use(path, middleware); return app; } + +/** + * Detects if the current environment supports IPv6 + * Used to conditionally run tests that require IPv6 support + */ +export async function isIPv6Available(): Promise { + return new Promise((resolve) => { + const server = createServer(); + + const done = (result: boolean) => { + server.removeAllListeners('error'); + server.close(() => resolve(result)); + }; + + server.once('error', () => done(false)); + server.listen(0, '::1', () => done(true)); + }); +}