const assert = require("node:assert/strict"); const fs = require("node:fs"); const os = require("node:os"); const path = require("node:path"); const test = require("node:test"); const { createModelHandlers } = require("../model-handlers"); test("panel model kernel renames, overwrites, and deletes by fileID", async (context) => { const directory = await fs.promises.mkdtemp(path.join(os.tmpdir(), "reinloop-panel-model-")); context.after(() => fs.promises.rm(directory, { recursive: true, force: true })); const sourcePath = path.join(directory, "controller-original.bin"); await fs.promises.writeFile(sourcePath, "first-version"); const records = new Map(); const requests = []; const callServer = async (payload) => { requests.push(payload); if (payload.type === "issueModelUpload") { const fileID = `model://${payload.deviceId}/${payload.modelName}`; if (records.has(fileID) && !payload.overwrite) throw new Error("文件已存在"); records.set(fileID, { fileID, fileName: payload.modelName, originalFileName: payload.fileName }); return { ...records.get(fileID), uploadMetadata: { url: `memory://${encodeURIComponent(fileID)}` } }; } if (payload.type === "deleteModel") { const deleted = records.delete(payload.fileID); return { success: true, deletedCount: deleted ? 1 : 0 }; } throw new Error(`unexpected request: ${payload.type}`); }; const handlers = createModelHandlers({ callServer, fetchImpl: async () => ({ status: 204 }) }); const request = { deviceId: "company-a/line-1", sourcePath, fileName: "controller-original.bin", modelName: "pressure-controller.bin", credentials: { adminToken: "test-token" } }; const uploaded = await handlers.upload(request); assert.equal(uploaded.fileName, "pressure-controller.bin"); assert.equal(uploaded.originalFileName, "controller-original.bin"); assert.equal(records.size, 1); assert.equal(requests[0].deviceId, request.deviceId); await fs.promises.writeFile(sourcePath, "second-version"); const overwritten = await handlers.upload({ ...request, overwrite: true }); assert.equal(overwritten.fileID, uploaded.fileID); assert.equal(records.size, 1); const deleted = await handlers.delete({ fileID: overwritten.fileID, credentials: request.credentials }); assert.equal(deleted.deletedCount, 1); assert.equal(records.size, 0); assert.equal(requests.at(-1).type, "deleteModel"); assert.equal(requests.at(-1).fileID, overwritten.fileID); });