From cab9d66b588fbaa5d0e431da1d724cd5934157a1 Mon Sep 17 00:00:00 2001 From: "paseo-bot[bot]" <266920839+paseo-bot[bot]@users.noreply.github.com> Date: Sun, 11 Oct 2026 13:03:15 +0200 Subject: [PATCH] test: verify TCP downloads and own relay fixture cleanup --- .../file-explorer-context-actions.spec.ts | 26 ++++++++++++++++-- .../app/e2e/support/helpers/file-explorer.ts | 9 ++++++- .../daemon-e2e/relay-transport.e2e.test.ts | 27 ++++++++++--------- 3 files changed, 47 insertions(+), 15 deletions(-) diff --git a/packages/app/e2e/browser/file-explorer-context-actions.spec.ts b/packages/app/e2e/browser/file-explorer-context-actions.spec.ts index bbc73b797e..faf7285a62 100644 --- a/packages/app/e2e/browser/file-explorer-context-actions.spec.ts +++ b/packages/app/e2e/browser/file-explorer-context-actions.spec.ts @@ -2,10 +2,10 @@ import { mkdir, readFile, rm, writeFile } from "node:fs/promises"; import path from "node:path"; import { expect, type Page } from "@playwright/test"; import { test } from "../support/fixtures"; -import { openFileExplorer } from "../support/helpers/file-explorer"; +import { downloadFileFromExplorer, openFileExplorer } from "../support/helpers/file-explorer"; import { openChangesPanel } from "../support/helpers/workspace-tabs"; import { gotoWorkspace } from "../support/helpers/launcher"; -import { daemonWsRoutePattern } from "../support/helpers/daemon-port"; +import { daemonWsRoutePattern, getE2EDaemonPort } from "../support/helpers/daemon-port"; import { seedWorkspace, type SeededWorkspace } from "../support/helpers/seed-client"; let workspace: SeededWorkspace; @@ -444,3 +444,25 @@ test("hides unsupported file operations and revert actions", async ({ page }) => await expect(page.getByTestId("diff-file-0-duplicate")).toHaveCount(0); await expect(page.getByTestId("diff-file-0-revert")).toHaveCount(0); }); + +test("downloads a file over direct TCP with its original filename and bytes", async ({ + page, +}, testInfo) => { + const fileName = "rapport données.bin"; + const source = Buffer.from([0, 1, 2, 127, 128, 255, 10]); + await writeFile(path.join(workspace.workspaceDirectory, fileName), source); + await gotoWorkspace(page, workspace.workspaceId); + await openFileExplorer(page); + + const downloaded = await downloadFileFromExplorer(page, fileName); + const url = new URL(downloaded.url()); + expect(url.protocol).toBe("http:"); + expect(url.port).toBe(getE2EDaemonPort()); + expect(url.pathname).toBe("/api/files/download"); + expect(url.searchParams.get("token")).toBeTruthy(); + expect(downloaded.suggestedFilename()).toBe(fileName); + const savedFile = testInfo.outputPath(fileName); + await downloaded.saveAs(savedFile); + expect(await downloaded.failure()).toBeNull(); + expect(await readFile(savedFile)).toEqual(source); +}); diff --git a/packages/app/e2e/support/helpers/file-explorer.ts b/packages/app/e2e/support/helpers/file-explorer.ts index 519f955536..a40adc5ad2 100644 --- a/packages/app/e2e/support/helpers/file-explorer.ts +++ b/packages/app/e2e/support/helpers/file-explorer.ts @@ -1,4 +1,4 @@ -import { expect, type Page } from "@playwright/test"; +import { expect, type Download, type Page } from "@playwright/test"; import { openFilesPanel } from "./workspace-tabs"; function fileExplorerTree(page: Page) { @@ -39,3 +39,10 @@ export async function expectFileTabOpen(page: Page, filePath: string): Promise { + await fileExplorerEntry(page, fileName).click({ button: "right" }); + const downloaded = page.waitForEvent("download"); + await page.getByRole("menuitem", { name: "Download", exact: true }).click(); + return downloaded; +} diff --git a/packages/server/src/server/daemon-e2e/relay-transport.e2e.test.ts b/packages/server/src/server/daemon-e2e/relay-transport.e2e.test.ts index b6dc8e6570..4da97d6eba 100644 --- a/packages/server/src/server/daemon-e2e/relay-transport.e2e.test.ts +++ b/packages/server/src/server/daemon-e2e/relay-transport.e2e.test.ts @@ -873,21 +873,22 @@ async function waitForCapturedLog( process.env.PASEO_PRIMARY_LAN_IP = "192.168.1.12"; const { logger, lines } = createCapturingLogger(); - await startRelay({ useLocalRelay: true }); - - const daemon = await createTestPaseoDaemon({ - listen: "127.0.0.1", - logger, - relayEnabled: true, - relayEndpoint: `127.0.0.1:${relayPort}`, - }); - const workspaceDir = await mkdtemp(path.join(os.tmpdir(), "paseo-relay-download-")); + let daemon: Awaited> | null = null; + let workspaceDir: string | null = null; const fileName = "rapport données.bin"; const source = randomBytes(4 * FILE_EXPLORER_STREAM_CHUNK_BYTES + 123); - await writeFile(path.join(workspaceDir, fileName), source); let client: DaemonClient | null = null; try { + await startRelay({ useLocalRelay: true }); + daemon = await createTestPaseoDaemon({ + listen: "127.0.0.1", + logger, + relayEnabled: true, + relayEndpoint: `127.0.0.1:${relayPort}`, + }); + workspaceDir = await mkdtemp(path.join(os.tmpdir(), "paseo-relay-download-")); + await writeFile(path.join(workspaceDir, fileName), source); const offerUrl = await getPairingOfferUrl({ paseoHome: daemon.paseoHome, relayEnabled: daemon.config.relayEnabled, @@ -923,9 +924,11 @@ async function waitForCapturedLog( throw err; } finally { await client?.close().catch(() => undefined); - await daemon.close(); + await daemon?.close(); await stopRelay(); - await rm(workspaceDir, { recursive: true, force: true }); + if (workspaceDir) { + await rm(workspaceDir, { recursive: true, force: true }); + } } }, 90000); });