fix model del & rename

This commit is contained in:
2026-07-31 11:15:54 +08:00
parent d45acaf50f
commit feaddfee7b
8 changed files with 196 additions and 28 deletions
@@ -0,0 +1,59 @@
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");
const { callServer } = require("../server-client");
const { createApp } = require("../../server/src/app");
const { JsonStore } = require("../../server/src/store");
test("panel model kernel renames, overwrites, lists both names, and deletes on the server", async (context) => {
const dataDirectory = await fs.promises.mkdtemp(path.join(os.tmpdir(), "reinloop-panel-server-"));
const store = new JsonStore(dataDirectory);
await store.initialize();
const app = createApp({ store, adminToken: "test-token" });
const server = await new Promise((resolve) => {
const listeningServer = app.listen(0, "127.0.0.1", () => resolve(listeningServer));
});
context.after(async () => {
await new Promise((resolve, reject) => server.close((error) => error ? reject(error) : resolve()));
await fs.promises.rm(dataDirectory, { recursive: true, force: true });
});
const credentials = {
apiUrl: `http://127.0.0.1:${server.address().port}/api`,
adminToken: "test-token"
};
const handlers = createModelHandlers({ callServer });
const sourcePath = path.join(dataDirectory, "controller-original.bin");
const request = {
deviceId: "company-a/line-1",
sourcePath,
fileName: "controller-original.bin",
modelName: "pressure-controller.bin",
credentials
};
await fs.promises.writeFile(sourcePath, "first-version");
const uploaded = await handlers.upload(request);
assert.equal(uploaded.fileName, "pressure-controller.bin");
assert.equal(uploaded.originalFileName, "controller-original.bin");
await fs.promises.writeFile(sourcePath, "second-version");
const overwritten = await handlers.upload({ ...request, overwrite: true });
assert.equal(overwritten.fileID, uploaded.fileID);
const listed = await handlers.list({ deviceId: request.deviceId, credentials });
assert.equal(listed.fileList.length, 1);
assert.equal(listed.fileList[0].fileName, "pressure-controller.bin");
assert.equal(listed.fileList[0].originalFileName, "controller-original.bin");
const deleted = await handlers.delete({ fileID: overwritten.fileID, credentials });
assert.equal(deleted.deletedCount, 1);
const afterDelete = await handlers.list({ deviceId: request.deviceId, credentials });
assert.deepEqual(afterDelete.fileList, []);
await assert.rejects(fs.promises.access(
path.join(dataDirectory, "models", "company-a", "line-1", "pressure-controller.bin")
), { code: "ENOENT" });
});
+61
View File
@@ -0,0 +1,61 @@
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 === "uploadDataFile") {
const fileID = `model://${payload.folder.replace(/\/model_config$/, "")}/${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);
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);
});