From 4271f268c366b294b28974d54f68fab40c99dce5 Mon Sep 17 00:00:00 2001 From: Simeon Radivoev Date: Tue, 31 Mar 2026 04:44:42 +0300 Subject: [PATCH] test: made tests work in windows --- src/bun/api/app.ts | 15 +++++++------ src/bun/api/jobs/emulator-download-job.ts | 3 ++- src/bun/api/jobs/install-job.ts | 5 +++-- src/bun/api/rpc.ts | 2 +- src/bun/api/task-queue.ts | 2 +- src/bun/server.ts | 14 ++++++++++-- src/bun/utils/downloader.ts | 4 +++- src/tests/downloads.test.ts | 6 ++++++ src/tests/preload.ts | 26 +++++++++++++++++------ 9 files changed, 57 insertions(+), 20 deletions(-) diff --git a/src/bun/api/app.ts b/src/bun/api/app.ts index 1465dd0..350607e 100644 --- a/src/bun/api/app.ts +++ b/src/bun/api/app.ts @@ -41,8 +41,8 @@ export let taskQueue: TaskQueue; export let plugins: PluginManager; export let events: EventEmitter; let controlsHandle: { cleanup: () => void; }; -let api: any; -let bunServer: { stop: () => void; } | undefined; +let api: { cleanup: () => Promise; }; +let bunServer: { cleanup: () => Promise; } | undefined; export async function load () { @@ -97,13 +97,16 @@ export async function load () export async function cleanup () { console.log("Cleaning Up"); - bunServer?.stop(); - await api.apiServer.stop(true); + await bunServer?.cleanup(); await api.cleanup(); await taskQueue.close(); + await plugins.cleanup(); controlsHandle.cleanup(); - sqlite.close(); + cacheSqlite.close(); emulatorsSqlite.close(); + sqlite.close(); + config._closeWatcher(); + customEmulators._closeWatcher(); console.log("Finished Cleaning Up"); } @@ -117,7 +120,7 @@ export async function reloadDatabase () db = drizzle(sqlite, { schema }); cache = drizzle(cacheSqlite, { schema: cacheSchema }); migrate(db!, { migrationsFolder: appPath("./drizzle") }); - cache.run(` + await cache.run(` CREATE TABLE IF NOT EXISTS item_cache ( key TEXT PRIMARY KEY, data TEXT NOT NULL, diff --git a/src/bun/api/jobs/emulator-download-job.ts b/src/bun/api/jobs/emulator-download-job.ts index d1c9161..f79db72 100644 --- a/src/bun/api/jobs/emulator-download-job.ts +++ b/src/bun/api/jobs/emulator-download-job.ts @@ -11,6 +11,7 @@ import fs from "node:fs/promises"; import { Downloader } from "@/bun/utils/downloader"; import { ensureDir, move } from "fs-extra"; import { simulateProgress } from "@/bun/utils"; +import { path7za } from "7zip-bin"; type EmulatorDownloadStates = "download" | "extract"; @@ -97,7 +98,7 @@ export class EmulatorDownloadJob implements IJob { - const seven = Seven.extractFull(destinationPath, emulatorsFolder, { $bin: process.env.ZIP7_PATH, $progress: true }); + const seven = Seven.extractFull(destinationPath, emulatorsFolder, { $bin: process.env.ZIP7_PATH ?? path7za, $progress: true, noRootDuplication: true }); seven.on('progress', p => context.setProgress(p.percent, "extract")); seven.on('error', e => reject(e)); seven.on('end', () => resolve(true)); diff --git a/src/bun/api/jobs/install-job.ts b/src/bun/api/jobs/install-job.ts index d8647f1..a45fe7b 100644 --- a/src/bun/api/jobs/install-job.ts +++ b/src/bun/api/jobs/install-job.ts @@ -14,6 +14,7 @@ import Seven from 'node-7z'; import z from "zod"; import { checkFiles } from "../games/services/utils"; import { ensureDir } from "fs-extra"; +import { path7za } from "7zip-bin"; interface JobConfig { @@ -45,7 +46,7 @@ export class InstallJob implements IJob public async start (cx: JobContext) { cx.setProgress(0, 'download'); - fs.mkdir(config.get('downloadPath'), { recursive: true }); + await fs.mkdir(config.get('downloadPath'), { recursive: true }); const downloadPath = config.get('downloadPath'); let info: DownloadInfo | undefined; @@ -111,7 +112,7 @@ export class InstallJob implements IJob const extractPath = path.join(config.get('downloadPath'), info.extract_path); await new Promise((resolve, reject) => { - const seven = Seven.extractFull(filePath, extractPath, { $bin: process.env.ZIP7_PATH, $progress: true }); + const seven = Seven.extractFull(filePath, extractPath, { $bin: process.env.ZIP7_PATH ?? path7za, $progress: true }); seven.on('progress', p => { cx.setProgress(progress + p.percent * progressDelta, "extract"); diff --git a/src/bun/api/rpc.ts b/src/bun/api/rpc.ts index 721822d..c7e9bac 100644 --- a/src/bun/api/rpc.ts +++ b/src/bun/api/rpc.ts @@ -42,7 +42,7 @@ export async function RunAPIServer () apiServer: api, async cleanup () { - await api.stop(); + await api.stop(true); } }; } \ No newline at end of file diff --git a/src/bun/api/task-queue.ts b/src/bun/api/task-queue.ts index 017b75b..2ef241c 100644 --- a/src/bun/api/task-queue.ts +++ b/src/bun/api/task-queue.ts @@ -105,7 +105,7 @@ export class TaskQueue { this.queue = []; this.activeQueue.forEach(c => c.abort()); - return Promise.all(this.activeQueue.map(c => c.promise)); + return Promise.all(this.activeQueue.map(c => c.promise.promise)); } } diff --git a/src/bun/server.ts b/src/bun/server.ts index 945be5b..b82971b 100644 --- a/src/bun/server.ts +++ b/src/bun/server.ts @@ -4,7 +4,7 @@ import { appPath } from "./utils"; import Elysia from "elysia"; import cors from "@elysiajs/cors"; -export function RunBunServer () +export async function RunBunServer () { console.log("Launching Server on port ", SERVER_PORT); const server = new Elysia() @@ -24,11 +24,21 @@ export function RunBunServer () }) .get("/*", ({ params }) => Bun.file(appPath(`./dist/${params["*"]}`))); - return new Promise((resolve) => + + await new Promise((resolve) => { server.listen({ port: SERVER_PORT, hostname: host, development: true }, async ({ hostname, port }) => { resolve(server); }); }); + + await server.modules; + + return { + cleanup: async () => + { + await server.stop(true); + } + }; } \ No newline at end of file diff --git a/src/bun/utils/downloader.ts b/src/bun/utils/downloader.ts index e288e8c..2a014b9 100644 --- a/src/bun/utils/downloader.ts +++ b/src/bun/utils/downloader.ts @@ -191,6 +191,7 @@ export class Downloader return; } + reader.cancel(); console.log("Aborting Download: ", this.signal.reason); break; } @@ -203,7 +204,8 @@ export class Downloader await new Promise((resolve, reject) => { - stream.end(() => resolve(undefined)); + stream.end(); + stream.on("close", () => resolve(false)); stream.on("error", reject); }); } diff --git a/src/tests/downloads.test.ts b/src/tests/downloads.test.ts index 504c2b4..3c68d35 100644 --- a/src/tests/downloads.test.ts +++ b/src/tests/downloads.test.ts @@ -136,6 +136,12 @@ describe("Download Tests", () => type: "direct", url: `${server.url.href}download/zip_file_with_single_file.zip?root=test` } + ], + "win32:x64": [ + { + type: "direct", + url: `${server.url.href}download/zip_file_with_single_file.zip?root=test` + } ] }, keywords: [ diff --git a/src/tests/preload.ts b/src/tests/preload.ts index 38b9856..b71e8e0 100644 --- a/src/tests/preload.ts +++ b/src/tests/preload.ts @@ -2,6 +2,7 @@ import { afterAll, beforeAll, beforeEach, afterEach } from 'bun:test'; import { resolve } from 'node:path'; import * as app from '@/bun/api/app'; import { remove } from 'fs-extra'; +import { spawnSync } from "child_process"; export async function LoadApp () { @@ -12,7 +13,7 @@ export async function LoadApp () export async function CleanupApp () { console.log("Cleaning Up App"); - app.cleanup(); + await app.cleanup(); } beforeAll(async () => @@ -22,12 +23,25 @@ beforeAll(async () => process.env.DEFAULT_DOWNLOAD_PATH = resolve('./src/tests/mock-roms'); }); +async function FileCleanup () +{ + try + { + await remove(resolve('./src/tests/mock-config')); + await remove(resolve('./src/tests/mock-store')); + await remove(resolve('./src/tests/mock-roms')); + } catch + { + //TODO: Bun doesn't close DB correctly and it gets locked so it doesn't get removed + } +} + +beforeEach(FileCleanup); + afterEach(async () => { - await remove(resolve('./src/tests/mock-config')); - await remove(resolve('./src/tests/mock-roms')); - await remove(resolve('./src/tests/mock-store')); + await CleanupApp(); + await FileCleanup(); }); -beforeEach(LoadApp, { timeout: 30000 }); -afterEach(CleanupApp); \ No newline at end of file +beforeEach(LoadApp); \ No newline at end of file