import { Player } from "@player"; import fs from "node:fs"; import type { ScriptFilePath } from "../../../src/Paths/ScriptFilePath"; import { loadGame } from "../../../src/SaveObject"; import * as db from "../../../src/db"; import * as FileUtils from "../../../src/utils/FileUtils"; describe("v3", () => { test("v2.8.1 to v3.0.0", async () => { const saveData = new Uint8Array(fs.readFileSync("test/jest/Migration/save-files/v2.8.1.gz")); // Simulate loading the data in IndexedDB const mockedLoad = jest.spyOn(db, "load"); /** * We must use structuredClone(saveData) instead of saveData; otherwise, the check of mockedDownload won't catch * wrong changes in evaluateVersionCompatibility (e.g., unexpectedly mutating saveData before passing it to * downloadContentAsFile). */ mockedLoad.mockReturnValue(Promise.resolve(structuredClone(saveData))); const mockedDownload = jest.spyOn(FileUtils, "downloadContentAsFile"); const originalConsoleError = console.error; const originalConsoleWarning = console.warn; const consoleError = jest.spyOn(console, "error").mockImplementation((...data: unknown[]) => { if (Array.isArray(data) && data.length > 0 && (data[0] === "There was no Darknet savedata" || data[0] === "")) { return; } originalConsoleError(...data); }); const consoleWarning = jest.spyOn(console, "warn").mockImplementation((...data: unknown[]) => { if ( Array.isArray(data) && data.length > 0 && (data[0] === "Encountered the following issue while loading Darknet savedata:" || data[0] === "Savedata:") ) { return; } originalConsoleWarning(...data); }); await loadGame(await db.load()); consoleError.mockRestore(); consoleWarning.mockRestore(); // Check if auto-migration works expect( Player.getHomeComputer() .scripts.get("a.js" as ScriptFilePath) ?.code.includes("ns.ui.openTail()"), ).toStrictEqual(true); if (!Player.corporation) { throw new Error("The save file does not have corporation data"); } expect(Object.keys(Player.corporation.upgrades).includes("DreamSense")).toStrictEqual(false); expect(Player.corporation.funds).toStrictEqual(110e9); // Check if evaluateVersionCompatibility correctly loads the data in IndexedDB and passes it to downloadContentAsFile expect(mockedDownload).toHaveBeenCalledWith(saveData, "bitburnerSave_backup_2.8.1_1756913326.json.gz"); }); });