From 03e66a496bc02e84029e29320f3ba84875ef89af Mon Sep 17 00:00:00 2001 From: m4air Date: Mon, 7 Sep 2026 22:37:14 -0700 Subject: [PATCH] test: retain PR 19376 visual evidence in isolated CI run --- .github/workflows/e2e.yml | 19 +++++++++++-------- .../e2e/markdown-literal-save-reopen.spec.ts | 1 + tests/e2e/markdown-nested-toggle.spec.ts | 3 +++ tests/e2e/markdown-ordered-list-exit.spec.ts | 3 ++- tests/e2e/markdown-prose-reflow.spec.ts | 4 ++++ ...rich-markdown-link-bubble-stacking.spec.ts | 2 ++ 6 files changed, 23 insertions(+), 9 deletions(-) diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index f75d7ba00bb..e91c146d4f2 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -3,6 +3,9 @@ name: E2E run-name: E2E ${{ inputs.ref || github.ref }} # Why: checkout + artifact upload only; callers can only further restrict. +env: + ORCA_BACKGROUND_LAUNCH: "1" + permissions: contents: read @@ -177,12 +180,12 @@ jobs: # them as an artifact makes post-mortem debugging on CI possible without # re-running locally. - name: Upload Playwright traces - if: failure() + if: always() uses: actions/upload-artifact@v7 with: name: playwright-traces-${{ matrix.shard_name }} path: test-results/ - retention-days: 7 + retention-days: 30 if-no-files-found: ignore changed-e2e: @@ -254,12 +257,12 @@ jobs: pnpm run test:e2e "${TEST_FILES[@]}" --workers=1 "${E2E_PROJECT_ARGS[@]}" - name: Upload Playwright traces - if: failure() + if: always() uses: actions/upload-artifact@v7 with: name: playwright-traces-changed path: test-results/ - retention-days: 7 + retention-days: 30 if-no-files-found: ignore ssh-docker-watcher-isolation: @@ -349,12 +352,12 @@ jobs: fi - name: Upload watcher isolation traces - if: failure() + if: always() uses: actions/upload-artifact@v7 with: name: playwright-traces-ssh-docker-watcher-isolation path: e2e-traces/ - retention-days: 7 + retention-days: 30 if-no-files-found: ignore ssh-browser-network-route: @@ -434,9 +437,9 @@ jobs: ORCA_E2E_FORWARD_APP_LOGS: '1' run: xvfb-run --auto-servernum bash .github/scripts/e2e-with-window-manager.sh pnpm exec playwright test --config tests/playwright.config.ts tests/e2e/ssh-localhost.spec.ts --project=electron-headless --workers=1 - uses: actions/upload-artifact@v7 - if: failure() + if: always() with: name: localhost-ssh-traces path: test-results/ - retention-days: 7 + retention-days: 30 if-no-files-found: ignore diff --git a/tests/e2e/markdown-literal-save-reopen.spec.ts b/tests/e2e/markdown-literal-save-reopen.spec.ts index 745396d8771..ba822384bbc 100644 --- a/tests/e2e/markdown-literal-save-reopen.spec.ts +++ b/tests/e2e/markdown-literal-save-reopen.spec.ts @@ -110,6 +110,7 @@ for (const workspace of ['git', 'folder', 'paired remote'] as const) { body: await page.screenshot(), contentType: 'image/png' }) + await page.screenshot({ path: testInfo.outputPath('reopened-editor.png') }) await closeActiveEditorTab(page, filePath) } finally { await client?.dispose() diff --git a/tests/e2e/markdown-nested-toggle.spec.ts b/tests/e2e/markdown-nested-toggle.spec.ts index 537e6b65775..182f0f81d1b 100644 --- a/tests/e2e/markdown-nested-toggle.spec.ts +++ b/tests/e2e/markdown-nested-toggle.spec.ts @@ -42,6 +42,7 @@ test.describe('Markdown nested toggle regression', () => { await waitForRichMarkdownEditor(orcaPage) await expectEditableNestedToggles(orcaPage) + await orcaPage.screenshot({ path: testInfo.outputPath('verified-editor.png') }) } finally { await cleanupMarkdownFixture(filePath) } @@ -83,6 +84,7 @@ test.describe('Markdown nested toggle regression', () => { await waitForRichMarkdownEditor(orcaPage) await expectEditableNestedToggles(orcaPage) await expectSentinelInsideNestedToggle(orcaPage, sentinel) + await orcaPage.screenshot({ path: testInfo.outputPath('verified-editor.png') }) } finally { await cleanupMarkdownFixture(filePath) } @@ -106,6 +108,7 @@ test.describe('Markdown nested toggle regression', () => { await waitForRichMarkdownEditor(orcaPage) await expectPassthroughFallback(orcaPage) + await orcaPage.screenshot({ path: testInfo.outputPath('verified-editor.png') }) } finally { await cleanupMarkdownFixture(filePath) } diff --git a/tests/e2e/markdown-ordered-list-exit.spec.ts b/tests/e2e/markdown-ordered-list-exit.spec.ts index db249e272ba..2909396d39a 100644 --- a/tests/e2e/markdown-ordered-list-exit.spec.ts +++ b/tests/e2e/markdown-ordered-list-exit.spec.ts @@ -84,7 +84,8 @@ test.describe('Markdown ordered-list exit regression', () => { await expectSentinelParagraphOutsideOrderedList(orcaPage, row.sentinel) await expectSerializedDraftOutsideOrderedList(orcaPage, draftKey, row.sentinel) - } finally { + await orcaPage.screenshot({ path: testInfo.outputPath('verified-editor.png') }) + } finally { await cleanupMarkdownFixture(filePath) } }) diff --git a/tests/e2e/markdown-prose-reflow.spec.ts b/tests/e2e/markdown-prose-reflow.spec.ts index 6767d3ea2ae..6b72b0a9964 100644 --- a/tests/e2e/markdown-prose-reflow.spec.ts +++ b/tests/e2e/markdown-prose-reflow.spec.ts @@ -169,6 +169,7 @@ test.describe('Markdown prose reflow', () => { expect(metrics.sourceLineCount).toBe(4) expect(metrics.whiteSpace).toBe('normal') expect(metrics.lineCount).toBeLessThan(metrics.sourceLineCount) + await orcaPage.screenshot({ path: testInfo.outputPath('verified-editor.png') }) } finally { await cleanupMarkdownFixture(filePath) } @@ -192,6 +193,7 @@ test.describe('Markdown prose reflow', () => { expect(metrics.sourceLineCount).toBe(4) expect(metrics.whiteSpace).toBe('normal') expect(metrics.lineCount).toBeLessThan(metrics.sourceLineCount) + await orcaPage.screenshot({ path: testInfo.outputPath('verified-editor.png') }) } finally { await cleanupMarkdownFixture(filePath) } @@ -217,6 +219,7 @@ test.describe('Markdown prose reflow', () => { expect(metrics.sourceLineCount).toBe(4) expect(metrics.whiteSpace).toBe('normal') expect(metrics.lineCount).toBeLessThan(metrics.sourceLineCount) + await orcaPage.screenshot({ path: testInfo.outputPath('verified-editor.png') }) } finally { await cleanupMarkdownFixture(filePath) } @@ -239,6 +242,7 @@ test.describe('Markdown prose reflow', () => { expect(metrics.sourceLineCount).toBe(4) expect(metrics.whiteSpace).toBe('normal') expect(metrics.lineCount).toBeLessThan(metrics.sourceLineCount) + await orcaPage.screenshot({ path: testInfo.outputPath('verified-editor.png') }) } finally { await cleanupMarkdownFixture(filePath) } diff --git a/tests/e2e/rich-markdown-link-bubble-stacking.spec.ts b/tests/e2e/rich-markdown-link-bubble-stacking.spec.ts index 090c8cb071d..2751aa76060 100644 --- a/tests/e2e/rich-markdown-link-bubble-stacking.spec.ts +++ b/tests/e2e/rich-markdown-link-bubble-stacking.spec.ts @@ -101,6 +101,7 @@ test.describe('Rich markdown link bubble stacking', () => { expect(overlap.bubbleRight).toBeGreaterThan(overlap.explorerLeft) expect(overlap.overlapWidth).toBeGreaterThan(8) expect(overlap.topElementIsBubble).toBe(true) + await orcaPage.screenshot({ path: testInfo.outputPath('link-bubble-over-explorer.png') }) // The Edit action exposes its label via aria-label (a shadcn Button + // Radix tooltip), not a title attribute, so match by accessible name. @@ -115,6 +116,7 @@ test.describe('Rich markdown link bubble stacking', () => { await expect(input).toBeFocused() await input.fill(`https://example.com/${'long-url-segment/'.repeat(30)}`) await input.press('End') + await orcaPage.screenshot({ path: testInfo.outputPath('link-bubble-edit.png') }) expect(await input.evaluate((element) => element.scrollLeft)).toBeGreaterThan(0) await expect(input).toBeFocused() await expect(bubble).toBeVisible()