/* eslint-disable @typescript-eslint/no-explicit-any */ import type { App } from "@solid/community-server"; import { createApp } from "./createServer.js"; import path from "path"; import type { ResourceInfo } from "./resourceUtils.js"; import { cleanResources, initResources } from "./resourceUtils.js"; import { generateAuthFetch } from "./authFetch.js"; import fs from "fs/promises"; import { beforeAll, afterAll, beforeEach, afterEach, vi, type MockedFunction, } from "vitest"; import { dirname } from "node:path"; import { fileURLToPath } from "node:url"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore const __dirname = dirname(fileURLToPath(import.meta.url)); // Use an increased timeout, since the CSS server takes too much setup time. vi.setConfig({ testTimeout: 40_000, hookTimeout: 40_000 }); export function setupServer( port: number, resourceInfo: ResourceInfo, customConfigPath?: string, skipAuthentication?: boolean, ) { const data: { app: App; fetchMock: MockedFunction< ( input: RequestInfo | URL, init?: RequestInit | undefined, ) => Promise >; authFetch: typeof fetch; rootUri: string; } = { rootUri: `http://localhost:${port}/`, } as any; let previousJestId: string | undefined; let previousNodeEnv: string | undefined; beforeAll(async () => { // Remove Jest ID so that community solid server doesn't use the Jest Import process.env.NODE_ENV = "other_test"; // Start up the server data.app = await createApp(port, customConfigPath); await data.app.start(); data.authFetch = skipAuthentication ? fetch : await generateAuthFetch(port); }); afterAll(async () => { // We're potentially ignoring data clean up and server shutdown because // sometimes this doesn't work in CI. try { await Promise.race([ data.app.stop?.(), new Promise((_, reject) => setTimeout(() => reject(new Error("Shutdown timeout")), 10000), ), ]); } catch (err) { console.warn("⚠️ Ignoring shutdown error in CI:", (err as Error).message); } try { const testDataPath = path.join(__dirname, `./data${port}`); await fs.rm(testDataPath, { recursive: true, force: true }); } catch (err) { console.warn( "⚠️ Ignoring data cleanup error in CI:", (err as Error).message, ); } process.env.JEST_WORKER_ID = previousJestId; process.env.NODE_ENV = previousNodeEnv; }); beforeEach(async () => { data.fetchMock = vi.fn(data.authFetch); // Create a new document called sample.ttl await initResources(data.rootUri, resourceInfo, data.authFetch); }); afterEach(async () => { await cleanResources(data.rootUri, resourceInfo, data.authFetch); }); return data; }