const assert = require("assert"); const fs = require("fs"); const os = require("os"); const path = require("path"); const { replacePluginDirectory } = require("../src/services/update-manager"); const root = fs.mkdtempSync(path.join(os.tmpdir(), "lumi-plugin-update-test-")); try { const source = path.join(root, "source"); const target = path.join(root, "target"); fs.mkdirSync(path.join(source, "data", "config"), { recursive: true }); fs.mkdirSync(path.join(target, "data", "models"), { recursive: true }); fs.writeFileSync(path.join(source, "plugin.json"), '{"id":"test"}'); fs.writeFileSync(path.join(source, "index.js"), "module.exports = 'new';"); fs.writeFileSync(path.join(source, "data", "config", "default.json"), '{"default":true}'); fs.writeFileSync(path.join(target, "index.js"), "module.exports = 'old';"); fs.writeFileSync(path.join(target, "stale.js"), "stale"); const model = path.join(target, "data", "models", "large.gguf"); const descriptor = fs.openSync(model, "w"); fs.ftruncateSync(descriptor, 3 * 1024 * 1024 * 1024); fs.closeSync(descriptor); replacePluginDirectory(source, target, { preserveData: true }); assert.equal(fs.readFileSync(path.join(target, "index.js"), "utf8"), "module.exports = 'new';"); assert.equal(fs.existsSync(path.join(target, "stale.js")), false); assert.equal(fs.statSync(model).size, 3 * 1024 * 1024 * 1024); assert.equal(fs.existsSync(path.join(target, "data", "config", "default.json")), false); console.log("Plugin update preservation verification passed."); } finally { fs.rmSync(root, { recursive: true, force: true }); }