This commit is contained in:
@@ -176,6 +176,42 @@ describe("更新 API", () => {
|
||||
expect(ownDetail.json().job.errorMessage).toBe("更新失败,请查看服务器日志或重试");
|
||||
});
|
||||
|
||||
it("取消任务按管理员隔离,并只删除匹配任务的请求文件", async () => {
|
||||
const owner = await login("cancel-owner");
|
||||
const other = await login("cancel-other");
|
||||
const ownerId = (database.sqlite.prepare("SELECT id FROM admins WHERE username=?").get("cancel-owner") as { id: string }).id;
|
||||
const otherId = (database.sqlite.prepare("SELECT id FROM admins WHERE username=?").get("cancel-other") as { id: string }).id;
|
||||
const now = Date.now();
|
||||
const ownerJobId = randomUUID();
|
||||
const otherJobId = randomUUID();
|
||||
const insert = database.sqlite.prepare(`
|
||||
INSERT INTO update_jobs(id, admin_id, operation, status, version, platform, asset_url, created_at, updated_at)
|
||||
VALUES (?, ?, 'download', 'queued', '1.3.0', ?, 'https://updates.example/update.tar.gz', ?, ?)
|
||||
`);
|
||||
insert.run(ownerJobId, ownerId, detectPlatform().target, now, now);
|
||||
insert.run(otherJobId, otherId, detectPlatform().target, now + 1, now + 1);
|
||||
await import("node:fs/promises").then(({ writeFile }) => writeFile(config.updateRequestPath, JSON.stringify({ jobId: otherJobId }), { encoding: "utf8", mode: 0o600 }));
|
||||
|
||||
const ownerCancel = await app.inject({
|
||||
method: "POST", url: "/api/update/cancel",
|
||||
headers: { origin: config.publicOrigin, cookie: owner.cookies, "x-csrf-token": owner.csrf },
|
||||
payload: { jobId: ownerJobId },
|
||||
});
|
||||
expect(ownerCancel.statusCode).toBe(200);
|
||||
expect((database.sqlite.prepare("SELECT status FROM update_jobs WHERE id=?").get(ownerJobId) as { status: string }).status).toBe("cancelled");
|
||||
expect((database.sqlite.prepare("SELECT status FROM update_jobs WHERE id=?").get(otherJobId) as { status: string }).status).toBe("queued");
|
||||
expect(existsSync(config.updateRequestPath)).toBe(true);
|
||||
|
||||
const otherCancel = await app.inject({
|
||||
method: "POST", url: "/api/update/cancel",
|
||||
headers: { origin: config.publicOrigin, cookie: other.cookies, "x-csrf-token": other.csrf },
|
||||
payload: {},
|
||||
});
|
||||
expect(otherCancel.statusCode).toBe(200);
|
||||
expect((database.sqlite.prepare("SELECT status FROM update_jobs WHERE id=?").get(otherJobId) as { status: string }).status).toBe("cancelled");
|
||||
expect(existsSync(config.updateRequestPath)).toBe(false);
|
||||
});
|
||||
|
||||
it("应用前重新校验失败时写入失败审计", async () => {
|
||||
const session = await login("update-audit");
|
||||
globalThis.fetch = (async () => new Response("upstream unavailable", { status: 503 })) as typeof fetch;
|
||||
|
||||
Reference in New Issue
Block a user