

























@@ -4,6 +4,8 @@ import { beforeEach, describe, expect, it, vi } from "vitest";
4455const runExec = vi.hoisted(() => vi.fn());
66const resolvePreferredOpenClawTmpDirMock = vi.hoisted(() => vi.fn(() => "/tmp/openclaw"));
7+const OPENCLAW_TMP_ROOT = "/tmp/openclaw";
8+const TRASH_SOURCE = `${OPENCLAW_TMP_ROOT}/demo`;
79810vi.mock("../process/exec.js", () => ({
911 runExec,
@@ -46,7 +48,7 @@ describe("browser trash", () => {
4648const cpSync = vi.spyOn(fs, "cpSync");
4749const rmSync = vi.spyOn(fs, "rmSync");
485049-await expect(movePathToTrash("/tmp/openclaw/demo")).resolves.toBe(
51+await expect(movePathToTrash(TRASH_SOURCE)).resolves.toBe(
5052"/home/test/.Trash/demo-123-secure/demo",
5153);
5254expect(runExec).not.toHaveBeenCalled();
@@ -55,10 +57,7 @@ describe("browser trash", () => {
5557mode: 0o700,
5658});
5759expect(mkdtempSync).toHaveBeenCalledWith("/home/test/.Trash/demo-123-");
58-expect(renameSync).toHaveBeenCalledWith(
59-"/tmp/openclaw/demo",
60-"/home/test/.Trash/demo-123-secure/demo",
61-);
60+expect(renameSync).toHaveBeenCalledWith(TRASH_SOURCE, "/home/test/.Trash/demo-123-secure/demo");
6261expect(cpSync).not.toHaveBeenCalled();
6362expect(rmSync).not.toHaveBeenCalled();
6463});
@@ -79,12 +78,12 @@ describe("browser trash", () => {
7978const mkdtempSync = mockTrashContainer("secure");
8079const renameSync = vi.spyOn(fs, "renameSync").mockImplementation(() => undefined);
818082-await expect(movePathToTrash("/tmp/openclaw/demo")).resolves.toBe(
81+await expect(movePathToTrash(TRASH_SOURCE)).resolves.toBe(
8382"/real/home/test/.Trash/demo-123-secure/demo",
8483);
8584expect(mkdtempSync).toHaveBeenCalledWith("/real/home/test/.Trash/demo-123-");
8685expect(renameSync).toHaveBeenCalledWith(
87-"/tmp/openclaw/demo",
86+TRASH_SOURCE,
8887"/real/home/test/.Trash/demo-123-secure/demo",
8988);
9089});
@@ -106,12 +105,15 @@ describe("browser trash", () => {
106105it("refuses to use a symlinked trash directory", async () => {
107106const { movePathToTrash } = await import("./trash.js");
108107vi.spyOn(fs, "mkdirSync").mockImplementation(() => undefined);
109-vi.spyOn(fs, "lstatSync").mockReturnValue({
110-isDirectory: () => true,
111-isSymbolicLink: () => true,
112-} as fs.Stats);
108+vi.spyOn(fs, "lstatSync").mockImplementation(
109+(candidate) =>
110+({
111+isDirectory: () => true,
112+isSymbolicLink: () => String(candidate) === "/home/test/.Trash",
113+}) as fs.Stats,
114+);
113115114-await expect(movePathToTrash("/tmp/openclaw/demo")).rejects.toThrow(
116+await expect(movePathToTrash(TRASH_SOURCE)).rejects.toThrow(
115117"Refusing to use non-directory/symlink trash directory",
116118);
117119});
@@ -127,22 +129,15 @@ describe("browser trash", () => {
127129const cpSync = vi.spyOn(fs, "cpSync").mockImplementation(() => undefined);
128130const rmSync = vi.spyOn(fs, "rmSync").mockImplementation(() => undefined);
129131130-await expect(movePathToTrash("/tmp/openclaw/demo")).resolves.toBe(
132+await expect(movePathToTrash(TRASH_SOURCE)).resolves.toBe(
131133"/home/test/.Trash/demo-123-secure/demo",
132134);
133-expect(cpSync).toHaveBeenCalledWith(
134-"/tmp/openclaw/demo",
135-"/home/test/.Trash/demo-123-secure/demo",
136-{
137-recursive: true,
138-force: false,
139-errorOnExist: true,
140-},
141-);
142-expect(rmSync).toHaveBeenCalledWith("/tmp/openclaw/demo", {
135+expect(cpSync).toHaveBeenCalledWith(TRASH_SOURCE, "/home/test/.Trash/demo-123-secure/demo", {
143136recursive: true,
144137force: false,
138+errorOnExist: true,
145139});
140+expect(rmSync).toHaveBeenCalledWith(TRASH_SOURCE, { recursive: true, force: false });
146141});
147142148143it("retries copy fallback when the copy destination is created concurrently", async () => {
@@ -164,12 +159,12 @@ describe("browser trash", () => {
164159.mockImplementation(() => undefined);
165160const rmSync = vi.spyOn(fs, "rmSync").mockImplementation(() => undefined);
166161167-await expect(movePathToTrash("/tmp/openclaw/demo")).resolves.toBe(
162+await expect(movePathToTrash(TRASH_SOURCE)).resolves.toBe(
168163"/home/test/.Trash/demo-123-second/demo",
169164);
170165expect(cpSync).toHaveBeenNthCalledWith(
1711661,
172-"/tmp/openclaw/demo",
167+TRASH_SOURCE,
173168"/home/test/.Trash/demo-123-first/demo",
174169{
175170recursive: true,
@@ -179,7 +174,7 @@ describe("browser trash", () => {
179174);
180175expect(cpSync).toHaveBeenNthCalledWith(
1811762,
182-"/tmp/openclaw/demo",
177+TRASH_SOURCE,
183178"/home/test/.Trash/demo-123-second/demo",
184179{
185180recursive: true,
@@ -203,17 +198,17 @@ describe("browser trash", () => {
203198})
204199.mockImplementation(() => undefined);
205200206-await expect(movePathToTrash("/tmp/openclaw/demo")).resolves.toBe(
201+await expect(movePathToTrash(TRASH_SOURCE)).resolves.toBe(
207202"/home/test/.Trash/demo-123-second/demo",
208203);
209204expect(renameSync).toHaveBeenNthCalledWith(
2102051,
211-"/tmp/openclaw/demo",
206+TRASH_SOURCE,
212207"/home/test/.Trash/demo-123-first/demo",
213208);
214209expect(renameSync).toHaveBeenNthCalledWith(
2152102,
216-"/tmp/openclaw/demo",
211+TRASH_SOURCE,
217212"/home/test/.Trash/demo-123-second/demo",
218213);
219214expect(Date.now).toHaveBeenCalledTimes(1);
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。