From 8ab7aa7efd65614c6e260a9acb43b4f6f8a8798c Mon Sep 17 00:00:00 2001 From: Dotta Date: Fri, 11 Sep 2026 17:21:46 -0500 Subject: [PATCH 1/2] test(daytona): preserve reusable work after stop failure Co-Authored-By: Paperclip --- .../plugins/sandbox-providers/daytona/src/plugin.test.ts | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/packages/plugins/sandbox-providers/daytona/src/plugin.test.ts b/packages/plugins/sandbox-providers/daytona/src/plugin.test.ts index 12b863e2180..d3551fee1b6 100644 --- a/packages/plugins/sandbox-providers/daytona/src/plugin.test.ts +++ b/packages/plugins/sandbox-providers/daytona/src/plugin.test.ts @@ -1330,16 +1330,16 @@ describe("Daytona sandbox provider plugin", () => { expect(sandbox.stop).toHaveBeenCalled(); }); - it("does not acknowledge termination when both provider stop and delete fail", async () => { + it("does not acknowledge termination or delete a reusable sandbox when stopping fails", async () => { process.env.DAYTONA_API_KEY = "host-key"; const sandbox = createMockSandbox({ id: "sandbox-failed-stop", state: "started" }); sandbox.stop.mockRejectedValueOnce(new Error("stop failed")); - sandbox.delete.mockRejectedValueOnce(new Error("delete failed")); mockGet.mockResolvedValue(sandbox); await expect(plugin.definition.onEnvironmentReleaseLease?.({ driverKey: "daytona", companyId: "company-1", environmentId: "env-1", providerLeaseId: sandbox.id, config: { reuseLease: true }, - })).rejects.toThrow("delete failed"); + })).rejects.toThrow("stop failed"); + expect(sandbox.delete).not.toHaveBeenCalled(); }); it("stops reusable leases and deletes ephemeral leases on release", async () => { @@ -1621,8 +1621,7 @@ describe("Daytona sandbox provider plugin", () => { it("deletes the session at destroy even when the sandbox delete throws", async () => { process.env.DAYTONA_API_KEY = "host-key"; const sandbox = createMockSandbox(); - sandbox.delete.mockRejectedValueOnce(new Error("delete failed")); - mockGet.mockResolvedValue(sandbox); + mockGet.mockResolvedValue(sandbox); await plugin.definition.onEnvironmentExecute?.(sessionExecParams()); const sessionId = sandbox.process.createSession.mock.calls[0]![0] as string; From 30e3738c009932b35f0ae583f94a223bf5a5e286 Mon Sep 17 00:00:00 2001 From: Dotta Date: Fri, 11 Sep 2026 17:22:01 -0500 Subject: [PATCH 2/2] test(daytona): retain explicit destroy failure coverage Co-Authored-By: Paperclip --- packages/plugins/sandbox-providers/daytona/src/plugin.test.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/plugins/sandbox-providers/daytona/src/plugin.test.ts b/packages/plugins/sandbox-providers/daytona/src/plugin.test.ts index d3551fee1b6..e2b5e85d473 100644 --- a/packages/plugins/sandbox-providers/daytona/src/plugin.test.ts +++ b/packages/plugins/sandbox-providers/daytona/src/plugin.test.ts @@ -1621,7 +1621,8 @@ describe("Daytona sandbox provider plugin", () => { it("deletes the session at destroy even when the sandbox delete throws", async () => { process.env.DAYTONA_API_KEY = "host-key"; const sandbox = createMockSandbox(); - mockGet.mockResolvedValue(sandbox); + sandbox.delete.mockRejectedValueOnce(new Error("delete failed")); + mockGet.mockResolvedValue(sandbox); await plugin.definition.onEnvironmentExecute?.(sessionExecParams()); const sessionId = sandbox.process.createSession.mock.calls[0]![0] as string;