mirror of
https://github.com/stablyai/orca.git
synced 2026-10-30 16:47:34 +00:00
* [comment audit] Align legacy failure-read counts with cached display * [comment audit] Condense shared provider lifecycle and browser recovery comments [skip ci] * [comment audit] Condense shared generation, path and preview comments [skip ci] * [comment audit] Condense host, file and Git contract rationale [skip ci] * [comment audit] Tighten Git lifecycle and provider contract comments [skip ci] * [comment audit] Clarify shared host authority and launch isolation [skip ci] * [comment audit] simplify local access mobile and native chat contracts [skip ci] * [comment audit] simplify native chat presentation and state contracts [skip ci] * [comment audit] simplify native runtime and provider contracts [skip ci] * [comment audit] simplify migration and orchestration contracts [skip ci] * [comment audit] simplify plugin trust and process capture rationale [skip ci] * [comment audit] simplify terminal delivery and remote compatibility rationale [skip ci] * [comment audit] clarify remote recovery and launch wire rationale [skip ci] * [comment audit] shorten shared RPC compatibility and runtime evidence comments [skip ci] * [comment audit] simplify secure storage shell startup and sidebar rationale [skip ci] * [comment audit] clarify sidebar, skill and SSH invariants [skip ci] * [comment audit] condense structured chat delivery and timing rationale [skip ci] * [comment audit] condense terminal replay and telemetry invariants [skip ci] * [comment audit] clarify launch permission and terminal delivery rationale [skip ci] * [comment audit] clarify workspace ownership and layout contracts [skip ci] * [comment audit] wait for fitted and painted SSH terminal links * [comment audit] clarify layout persistence and session ownership [skip ci] * [comment audit] clarify host routing and workspace lifecycle contracts [skip ci] * [comment audit] clarify startup persistence and app lifetime comments [skip ci] * [comment audit] clarify recovery and activity boundaries [skip ci] * [comment audit] condense activity and artifact invariants [skip ci] * [comment audit] condense automation authority contracts [skip ci] * [comment audit] simplify automation scheduling and history contracts [skip ci] * [comment audit] clarify browser chrome and annotation lifecycles [skip ci] * [comment audit] clarify browser routing and retained guest ownership [skip ci] * [comment audit] clarify browser recovery and document ownership comments [skip ci] * [comment audit] restore hosted runners required by native IME fixtures * [comment audit] shorten preview, palette and dashboard invariants [skip ci] * [comment audit] clarify terminal preview, dashboard and retention comments [skip ci] * [comment audit] clarify diff-note recovery and editor lifecycle comments [skip ci] * [comment audit] shorten rich-text and combined-diff ownership comments [skip ci] * [comment audit] shorten autosave, draft recovery and model ownership comments [skip ci] * [comment audit] shorten save-queue, notebook and Markdown constraints [skip ci] * [comment audit] shorten Monaco, PDF and rich Markdown safeguards [skip ci] * [comment audit] clarify rich Markdown source and selection safeguards [skip ci] * [comment audit] clarify editor loading and emulator stream lifetimes [skip ci] * [comment audit] trim emulator and feature tour narration [skip ci] * [comment audit] clarify floating workspace and GitHub cache ownership [skip ci] * [comment audit] trim provider controls and Linear filter explanations [skip ci] * [comment audit] clarify pairing and chat resume lifetimes [skip ci] * [comment audit] clarify chat delivery and transcript lifetimes [skip ci] * [comment audit] clarify session options and host-owned status [skip ci] * [comment audit] clarify draft durability and live-status precedence [skip ci] * [comment audit] Trim chat send and model ownership explanations [skip ci] * [comment audit] Shorten transcript ownership and send recovery comments [skip ci] * [comment audit] Simplify native chat composer and transcript hook comments [skip ci] * [comment audit] Shorten native chat scroll and structured session explanations [skip ci] * [comment audit] Trim workspace picker and onboarding commentary [skip ci] * [comment audit] Simplify pet rendering, review cache and quick open comments [skip ci] * [comment audit] Trim sidebar and session history explanations [skip ci] * [comment audit] Condense session resume and review checks comments [skip ci] * [comment audit] Shorten checks state and file explorer refresh comments [skip ci] * [comment audit] Trim plugin bridge and source-control action rationale [skip ci] * [comment audit] Trim source-control listing and review rationale [skip ci] * [comment audit] Shorten sidebar lifecycle and explorer safeguards [skip ci] * [comment audit] Condense Settings account and appearance rationale [skip ci] * [comment audit] Trim pairing and repository Settings explanations [skip ci] * [comment audit] Condense Settings search SSH and terminal safeguards [skip ci] * [comment audit] Shorten Settings voice and provider ownership comments [skip ci] * [comment audit] Condense Settings draft persistence and host-state rationale [skip ci] * [comment audit] Trim Settings hooks and sidebar setup rationale [skip ci] * [comment audit] Condense sidebar deletion and board-filter safeguards [skip ci] * [comment audit] Condense worktree cards, host ownership and Markdown contracts [skip ci] * [comment audit] Condense sidebar drag, folder and filtering contracts [skip ci] * [comment audit] Condense sidebar parity, sleep and host ownership contracts [skip ci] * [comment audit] Prune focus-read baseline after comment cleanup * [comment audit] Clarify sidebar visibility, board drops and agent evidence [skip ci] * [comment audit] Tighten sidebar listing, drag and reveal contracts [skip ci] * [comment audit] Clarify viewport geometry and skill update safeguards [skip ci] * [comment audit] Tighten skill inventory, usage and host status comments [skip ci] * [comment audit] Clarify usage ownership and resource kill safeguards [skip ci] * [comment audit] Tighten tab selection, rename and search contracts [skip ci] * [comment audit] Tighten tab-strip geometry and drag ownership comments [skip ci] * [comment audit] Tighten Tasks recovery, pagination and mutation comments [skip ci] * [comment audit] Tighten provider loading and terminal recovery comments [skip ci] * [comment audit] Tighten completion, cadence and PTY ownership comments [skip ci] * [comment audit] Clarify terminal restore and parked-pane boundaries [skip ci] * [comment audit] Tighten PTY startup and replay explanations [skip ci] * [comment audit] Clarify PTY identity and delivery ownership [skip ci] * [comment audit] Shorten remote reconnect and input replay rationale [skip ci] * [comment audit] Condense terminal parking clipboard and file link comments [skip ci] * [comment audit] Clarify IME ownership and trim trace history [skip ci] * [comment audit] Shorten pane recovery and parked watcher explanations [skip ci] * [comment audit] Condense snapshot replay and visibility recovery rationale [skip ci] * [comment audit] Shorten terminal parking and keyboard ownership rationale [skip ci] * [comment audit] Trim renderer lifecycle and menu rationale [skip ci] * [comment audit] Condense workspace cleanup ownership and settlement notes [skip ci] * [comment audit] Clarify renderer hook evidence and source ownership [skip ci] * [comment audit] Tighten IPC ownership and reconnect explanations [skip ci] * [comment audit] Trim renderer focus, paste and attention comments [skip ci] * [comment audit] Shorten scroll, locale and agent lifecycle comments [skip ci] * [comment audit] Trim agent launch, resume and ownership commentary [skip ci] * [comment audit] Shorten account, browser and editor comments [skip ci] * [comment audit] Clarify host-mirror waits, previews and input ownership [skip ci] * [comment audit] Condense launch recovery and editor tokenization comments [skip ci] * [comment audit] Condense workspace selection and terminal pane rationale [skip ci] * [comment audit] Condense terminal fitting and rendering recovery comments [skip ci] * [comment audit] Condense terminal input and host routing explanations [skip ci] * [comment audit] Condense ownership and sleeping-session recovery rationale [skip ci] * [comment audit] Condense structured launch and terminal link explanations [skip ci] * [comment audit] Condense terminal ownership and workspace file routing rationale [skip ci] * [comment audit] Condense session persistence and workspace activation rationale [skip ci] * [comment audit] Condense workspace routing and browser ownership rationale [skip ci] * [comment audit] Condense mirror recovery and layout authority rationale [skip ci] * [comment audit] Condense runtime transport and file safety rationale [skip ci] * [comment audit] Condense runtime graph and structured session rationale [skip ci] * [comment audit] Condense browser creation and remote tab recovery rationale [skip ci] * [comment audit] Condense snapshot authority and publisher recovery rationale [skip ci] * [comment audit] Condense frame, startup and provider cache rationale [skip ci] * [comment audit] Condense host twin and agent lifecycle rationale [skip ci] * [comment audit] Condense browser authority and editor cleanup rationale [skip ci] * [comment audit] Condense editor buffer identity and review cache rationale [skip ci] * [comment audit] Condense provider lifetime and repository ownership rationale [skip ci] * [comment audit] Condense reconnect, hydration and terminal retirement rationale [skip ci] * [comment audit] Condense recovery, reconciliation and persistence rationale [skip ci] * [comment audit] Condense cleanup ownership and listing admission rationale [skip ci] * [comment audit] Condense teardown ordering and terminal ownership rationale [skip ci] * [comment audit] Condense recovery ledger and web host-boundary rationale [skip ci] * [comment audit] Condense web reconnect and credential lifecycle rationale [skip ci] * [comment audit] Condense cloud rollout and assignment safety rationale [skip ci] * [comment audit] Condense relay session and database recovery rationale [skip ci] * [comment audit] Condense relay placement and protocol compatibility rationale [skip ci] * [comment audit] Condense build and packaging constraints [skip ci] * [comment audit] Condense CI gates and validation isolation rationale [skip ci] * [comment audit] Condense catalog identity and browser validation rationale [skip ci] * [comment audit] Condense mobile browser and frame-budget rationale [skip ci] * [comment audit] Shorten mobile route and browser test explanations [skip ci] * [comment audit] Condense editor and session seam test rationale [skip ci] * [comment audit] Trim session and terminal closure history [skip ci] * [comment audit] Shorten terminal browser and census explanations [skip ci] * [comment audit] Preserve root-only E2E diagnostic baseline * [comment audit] Condense mobile seam and HTML preview test rationale [skip ci] * [comment audit] Condense preview instrumentation and render harness rationale [skip ci] * [comment audit] Condense bundle contracts and native-build constraints [skip ci] * [comment audit] Shorten native packaging and CI routing rationale [skip ci] * [comment audit] Condense release tooling and benchmark constraints [skip ci] * [comment audit] Condense packaging and platform gate rationale [skip ci] * [comment audit] Shorten mobile route and history rationale [skip ci] * [comment audit] Condense mobile browser and component rationale [skip ci] * [comment audit] Shorten drawer and workspace-form rationale [skip ci] * [comment audit] Trim mobile review and editor-document explanations [skip ci] * [comment audit] Condense editor lifecycle and Markdown explanations [skip ci] * [comment audit] Trim mobile file, diagnostics and dictation commentary [skip ci] * [comment audit] Simplify mobile host-list and workspace-view explanations [skip ci] * [comment audit] Clarify mobile shell lifetime and bridge delivery constraints [skip ci] * [comment audit] Condense bridge stream, native request and audio rationale [skip ci] * [comment audit] Reduce bridge schema and page-client commentary [skip ci] * [comment audit] Tighten mobile page bridge contracts [skip ci] * [comment audit] Clarify mobile cache and session constraints [skip ci] * [comment audit] Condense mobile route and lifecycle rationale [skip ci] * [comment audit] Tighten mobile shell hook timing rationale [skip ci] * [comment audit] Clarify route handoff and notification compatibility [skip ci] * [comment audit] Clarify push registration and dictation cleanup constraints [skip ci] * [comment audit] Condense keyboard geometry and native media ownership rationale [skip ci] * [comment audit] Tighten mobile chat scroll and composer concurrency rationale [skip ci] * [comment audit] Condense mobile reply compatibility and upload ownership rationale [skip ci] * [comment audit] Condense optimistic echo and scroll ownership rationale [skip ci] * [comment audit] Tighten stream replay and queued session ownership rationale [skip ci] * [comment audit] Condense mobile composer and reply-schema constraints [skip ci] * [comment audit] Clarify mobile transcript recovery and session ownership [skip ci] * [comment audit] Clarify mobile queue and source-control compatibility [skip ci] * [comment audit] Condense storage and task launch constraints [skip ci] * [comment audit] Clarify task schemas and terminal document ownership [skip ci] * [comment audit] Tighten terminal input and viewport rationale [skip ci] * [comment audit] Shorten terminal and RPC recorder contracts [skip ci] * [comment audit] Condense recorder engine and connection contracts [skip ci] * [comment audit] Shorten host credential and relay recovery comments [skip ci] * [comment audit] Tighten pairing recovery and bundle transport rationale [skip ci] * [comment audit] Clarify RPC delivery and workspace catalog boundaries [skip ci] * [comment audit] Condense catalog and relay entry contracts [skip ci] * [comment audit] Shorten shutdown and SSH relay delivery contracts [skip ci] * [comment audit] Condense WSL relay and E2E regression rationale [skip ci] * [comment audit] Shorten cross-version harness and renderer fixture explanations [skip ci] * [comment audit] Condense paired-host and E2E lifecycle rationale [skip ci] * [comment audit] Shorten layout oracle and regression explanations [skip ci] * [comment audit] Condense paired recovery and ownership regression contracts [skip ci] * [comment audit] Shorten restart, sidebar and SSH lifecycle contracts [skip ci] * [comment audit] Condense terminal rendering and IME regression rationale [skip ci] * [comment audit] Shorten terminal recovery and benchmark contracts [skip ci] * [comment audit] Condense tooling and Windows lifecycle proof rationale [skip ci] * [comment audit] Condense workflow routing and release rationale [skip ci] * [comment audit] Condense mobile security and installer contracts [skip ci] * [comment audit] Shorten native rationale and stylesheet workarounds [skip ci] * [comment audit] Shorten Windows visibility probe rationale [skip ci] * [comment audit] Condense embedded release and signing rationale [skip ci] * [comment audit] Retain current main test behavior in final reconciliation [skip ci] * [comment audit] Complete final comment review across current source inventory * [comment audit] Handle consolidated audit reports before final CI * [comment audit] Preserve credential storage census detail [skip ci] * [comment audit] Scale broad changed E2E selections with verified timing shards * [comment audit] Align E2E assertions with browser close and settled session metadata * [comment audit] Match existing E2Es to current resource and windowing contracts * [comment audit] Observe the shared server outage notice in reconnect coverage * [comment audit] Make existing renderer probes measure settled tab and PTY work * [comment audit] Align palette E2E selector with task search * [comment audit] Refresh remaining palette search selectors * [comment audit] Keep selector correction within selected audit specs * [comment audit] Await emoji fixture settings inside renderer evaluation * [comment audit] Cancel fixture fit retries between terminal tests --------- Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
298 lines
14 KiB
JavaScript
298 lines
14 KiB
JavaScript
import { DEDICATED_E2E_SPECS } from './ci-e2e-job-selection.mjs'
|
|
import { existsSync, readFileSync } from 'node:fs'
|
|
import { join, resolve } from 'node:path'
|
|
import { describe, expect, it } from 'vitest'
|
|
import { parse as parseYaml } from 'yaml'
|
|
import {
|
|
hasNativeImeSourceChange,
|
|
PR_E2E_SOURCE_ROUTES,
|
|
selectPrE2eSpecs
|
|
} from './pr-e2e-source-routing.mjs'
|
|
|
|
const projectDir = resolve(import.meta.dirname, '../..')
|
|
const prWorkflow = parseYaml(readFileSync(join(projectDir, '.github/workflows/pr.yml'), 'utf8'))
|
|
|
|
const filterStep = prWorkflow.jobs.code_paths.steps.find(
|
|
(step) => step.name === 'Filter changed E2E specs'
|
|
)
|
|
const rollbackStep = prWorkflow.jobs.preflight.steps.find(
|
|
(step) => step.name === 'Check VM runtime rollback compatibility'
|
|
)
|
|
/** The route that sends a change to the two-Electron restart-survival spec. */
|
|
const restartSurvivalRoute = PR_E2E_SOURCE_ROUTES.find(
|
|
(route) => route.id === 'client-hosted-browser.restart-survival'
|
|
)
|
|
|
|
describe('restart-survival E2E routing', () => {
|
|
// Every file below carries behavior the restart spec is the only test that exercises end to end.
|
|
it.each([
|
|
'src/main/runtime/orca-runtime.ts',
|
|
'src/main/runtime/browser/browser-commands.ts',
|
|
'src/main/runtime/client-hosted-page-reconciliation-window.ts',
|
|
'src/main/runtime/runtime-browser-client-page-adoption.ts',
|
|
'src/main/runtime/runtime-browser-client-page-recovery.ts',
|
|
'src/main/runtime/browser-host/browser-host-client-page-adoption.ts',
|
|
'src/main/runtime/browser-host/browser-host-page-reconciliation-orchestration.ts',
|
|
'src/main/runtime/rpc/methods/browser-client-host.ts',
|
|
'src/main/browser/browser-client-host-authority-replacement-wait.ts',
|
|
'src/main/browser/paired-runtime-browser-client-host-composition.ts',
|
|
'src/renderer/src/runtime/web-session-tabs-sync/snapshot-api.ts',
|
|
'src/renderer/src/runtime/host-session-snapshot-authority.ts',
|
|
'src/renderer/src/runtime/restored-client-hosted-browser-host-attach.ts',
|
|
'src/renderer/src/store/slices/runtime-status.ts',
|
|
'src/shared/runtime-types.ts',
|
|
'src/shared/browser-client-host-protocol.ts'
|
|
])('routes %s', (path) => {
|
|
expect(restartSurvivalRoute.matches(path)).toBe(true)
|
|
if (path === 'src/main/runtime/browser/browser-commands.ts') {
|
|
expect(existsSync(join(projectDir, path))).toBe(true)
|
|
}
|
|
})
|
|
|
|
// Keep restart-survival routing narrow to avoid two-Electron cost on every source change.
|
|
it.each([
|
|
'src/main/git/git-status.ts',
|
|
'src/renderer/src/components/tab-bar/BrowserTab.tsx',
|
|
'src/main/terminal/pty-manager.ts',
|
|
// The status/types entries name whole files, not a suffix any longer name may end with.
|
|
'src/shared/computer-use-runtime-types.ts',
|
|
'src/main/runtime/browser/browser-commands.test.ts',
|
|
'src/main/runtime/browser/browser-commands.test-fixture.ts',
|
|
'src/main/runtime/browser/browser-commands.fixture.ts',
|
|
'src/main/runtime/browser/browser-commands-extra.ts',
|
|
'src/main/runtime/browser/browser-navigation.ts'
|
|
])('does not route %s', (path) => {
|
|
expect(restartSurvivalRoute.matches(path)).toBe(false)
|
|
})
|
|
})
|
|
|
|
describe('PR E2E gate contract', () => {
|
|
it('selects modified Playwright specs without running deleted tests', () => {
|
|
expect(filterStep.run).toContain('--diff-filter=AMCR')
|
|
expect(filterStep.run).toContain('config/scripts/pr-e2e-source-routing.mjs')
|
|
expect(filterStep.run).not.toContain('tests/playwright\\.')
|
|
expect(
|
|
selectPrE2eSpecs([
|
|
'tests/e2e/active-view-restart-restore.spec.ts',
|
|
'tests/e2e/deleted.spec.ts.bak',
|
|
'tests/e2e/global-teardown.unit.test.ts'
|
|
])
|
|
).toEqual(['tests/e2e/active-view-restart-restore.spec.ts'])
|
|
})
|
|
|
|
it('scopes the VM rollback oracle to the PR range and recipe schema authorities', () => {
|
|
expect(rollbackStep.run).toMatch(/diff-base\.mjs "\$BASE_SHA"[\s\S]*"\$DIFF_BASE" HEAD --/)
|
|
expect(rollbackStep.run).toContain('src/shared/ephemeral-vm-recipes.ts')
|
|
expect(rollbackStep.run).toContain('src/shared/orca-yaml-hook-types.ts')
|
|
})
|
|
|
|
it('routes P0 sentinels from their causal sources', () => {
|
|
const cases = [
|
|
[
|
|
'src/renderer/src/components/tab-bar/TabBarQuickCommandsMenu.tsx',
|
|
'tests/e2e/terminal-quick-command-pre-bind-recovery.spec.ts'
|
|
],
|
|
['src/main/runtime/orca-runtime-files.ts', 'tests/e2e/paired-quick-open-large-tree.spec.ts'],
|
|
[
|
|
'src/renderer/src/runtime/sync-runtime-graph.ts',
|
|
'tests/e2e/host-parked-pane-remote-viewer.spec.ts'
|
|
],
|
|
[
|
|
'src/renderer/src/runtime/remote-runtime-terminal-multiplexer.ts',
|
|
'tests/e2e/paired-remote-terminal-materialization-reconnect.spec.ts'
|
|
],
|
|
[
|
|
'src/renderer/src/components/terminal-pane/remote-pane-layout-push.ts',
|
|
'tests/e2e/paired-remote-pane-layout-retry.spec.ts'
|
|
]
|
|
]
|
|
for (const [source, spec] of cases) {
|
|
expect(selectPrE2eSpecs([source]), source).toEqual([spec])
|
|
expect(selectPrE2eSpecs([source.replace(/\.tsx?$/, '.test.ts')]), source).toEqual([])
|
|
expect(existsSync(join(projectDir, spec)), spec).toBe(true)
|
|
}
|
|
const parkedSplitSpec = 'tests/e2e/terminal-parked-cli-split.spec.ts'
|
|
for (const source of [
|
|
'src/main/window/attach-main-window-services.ts',
|
|
'src/preload/api/ui-command-event-api.ts',
|
|
'src/preload/index.ts',
|
|
'src/renderer/src/components/terminal-pane/terminal-pane-split-request-routing.ts',
|
|
'src/renderer/src/components/terminal-pane/use-terminal-pane-lifecycle.ts',
|
|
'src/renderer/src/components/terminal-pane/use-terminal-tab-cold-parking.ts',
|
|
'src/renderer/src/hooks/ipc-events/terminal-ui-routing-ipc-bridge.ts'
|
|
]) {
|
|
expect(selectPrE2eSpecs([source]), source).toContain(parkedSplitSpec)
|
|
expect(selectPrE2eSpecs([source.replace(/\.ts$/, '.test.ts')]), source).not.toContain(
|
|
parkedSplitSpec
|
|
)
|
|
}
|
|
expect(existsSync(join(projectDir, parkedSplitSpec)), parkedSplitSpec).toBe(true)
|
|
|
|
const restartContinuitySpec = 'tests/e2e/paired-remote-terminal-serve-restart-binding.spec.ts'
|
|
for (const source of [
|
|
'src/main/daemon/daemon-attach-only-retirement.ts',
|
|
'src/main/daemon/daemon-pty-applied-size.ts',
|
|
'src/main/daemon/daemon-pty-session-control.ts',
|
|
'src/main/daemon/daemon-pty-spawn-result.ts',
|
|
'src/renderer/src/components/terminal-pane/remote-runtime-pty-transport.ts',
|
|
'src/renderer/src/components/terminal-pane/terminal-error-accumulation.ts',
|
|
'src/renderer/src/runtime/web-runtime-terminal-creation.ts',
|
|
'src/renderer/src/runtime/web-runtime-session-tab-lifecycle.ts',
|
|
'src/renderer/src/runtime/web-session-tabs-sync/use-web-session-tabs-sync.ts',
|
|
'src/renderer/src/runtime/web-session-terminal-orphan-recovery.ts',
|
|
'src/renderer/src/runtime/web-session-terminal-orphan-recovery-adoption.ts',
|
|
'src/renderer/src/runtime/web-session-terminal-orphan-recovery-surface.ts',
|
|
'src/renderer/src/runtime/web-session-terminal-orphan-recovery-inventory.ts',
|
|
'src/renderer/src/runtime/web-session-terminal-orphan-recovery-inventory-validation.ts',
|
|
'src/renderer/src/runtime/web-session-terminal-orphan-recovery-cache.ts',
|
|
'src/renderer/src/runtime/web-session-terminal-orphan-recovery-pane.ts',
|
|
'src/renderer/src/runtime/web-session-terminal-orphan-recovery-queue.ts',
|
|
'src/renderer/src/runtime/web-session-terminal-orphan-recovery-rpc-lane.ts',
|
|
'src/renderer/src/runtime/web-session-terminal-orphan-topology.ts'
|
|
]) {
|
|
expect(selectPrE2eSpecs([source]), source).toContain(restartContinuitySpec)
|
|
expect(selectPrE2eSpecs([source.replace(/\.ts$/, '.test.ts')]), source).not.toContain(
|
|
restartContinuitySpec
|
|
)
|
|
}
|
|
expect(existsSync(join(projectDir, restartContinuitySpec)), restartContinuitySpec).toBe(true)
|
|
const quickCommandSpec = 'tests/e2e/terminal-quick-command-pre-bind-recovery.spec.ts'
|
|
for (const source of [
|
|
'src/renderer/src/components/terminal-pane/pty-connection.ts',
|
|
'src/renderer/src/components/terminal-pane/pty-connection/connect-pane-pty.ts',
|
|
'src/renderer/src/components/terminal-pane/pty-connection/fresh-spawn-start.ts',
|
|
'src/renderer/src/components/terminal-pane/pty-connection/pane-pty-visibility-bind.ts',
|
|
'src/renderer/src/components/terminal-pane/pty-connection/pty-input-recovery.ts'
|
|
]) {
|
|
expect(selectPrE2eSpecs([source]), source).toContain(quickCommandSpec)
|
|
expect(selectPrE2eSpecs([source.replace(/\.ts$/, '.test.ts')]), source).not.toContain(
|
|
quickCommandSpec
|
|
)
|
|
}
|
|
for (const source of [
|
|
'src/main/ripgrep/bundled-ripgrep-path.ts',
|
|
'src/shared/bundled-ripgrep.ts',
|
|
'src/shared/ripgrep-process-availability.ts'
|
|
]) {
|
|
expect(selectPrE2eSpecs([source]), source).toEqual([
|
|
'tests/e2e/paired-quick-open-large-tree.spec.ts'
|
|
])
|
|
}
|
|
expect(
|
|
selectPrE2eSpecs([
|
|
'src/main/runtime/orca-runtime-files.ts',
|
|
'tests/e2e/paired-quick-open-large-tree.spec.ts'
|
|
])
|
|
).toEqual(['tests/e2e/paired-quick-open-large-tree.spec.ts'])
|
|
expect(selectPrE2eSpecs(['src/renderer/src/components/FileExplorer.tsx'])).toEqual([])
|
|
expect(
|
|
selectPrE2eSpecs([
|
|
'src/renderer/src/components/terminal-pane/remote-runtime-pty-transport.ts'
|
|
])
|
|
).toContain('tests/e2e/paired-remote-terminal-materialization-reconnect.spec.ts')
|
|
expect(
|
|
selectPrE2eSpecs([
|
|
'src/renderer/src/components/terminal-pane/remote-runtime-pty-transport-test-harness.ts'
|
|
])
|
|
).not.toContain('tests/e2e/paired-remote-terminal-materialization-reconnect.spec.ts')
|
|
expect(selectPrE2eSpecs(['src/main/ipc/pty/register-handlers.ts'])).not.toContain(
|
|
'tests/e2e/paired-remote-terminal-materialization-reconnect.spec.ts'
|
|
)
|
|
})
|
|
|
|
it('triggers the real-IME lane from every surface an input method can judge', () => {
|
|
for (const file of [
|
|
'src/renderer/src/components/terminal-pane/terminal-ime-composition-route.ts',
|
|
'src/renderer/src/components/terminal-pane/terminal-ime-native-text-forwarder.ts',
|
|
'src/renderer/src/components/terminal-pane/terminal-ios-hangul-preedit.ts',
|
|
'src/renderer/src/components/terminal-pane/xterm-bypass-policy.ts',
|
|
'src/renderer/src/lib/pane-manager/terminal-ime-anchor.ts',
|
|
'src/shared/terminal-unicode-provider.ts',
|
|
// The xterm fork owns the helper textarea the IME attaches to; no file here says "ime".
|
|
'config/patches/@xterm__xterm@6.1.0-beta.304.patch',
|
|
'config/patches/xterm-src/@xterm__xterm@6.1.0-beta.304.src.patch',
|
|
// The harness is source too: breaking the runner or a probe is how the lane goes blind.
|
|
'config/scripts/run-terminal-ibus-hangul-e2e.mjs',
|
|
'config/scripts/terminal-ime-engagement-receipt.mjs',
|
|
'tests/e2e/terminal-ime-boundary-probe.ts',
|
|
'tests/e2e/terminal-ime-byte-reader.ts',
|
|
'tests/e2e/terminal-ime-engagement-receipt.ts',
|
|
'tests/e2e/terminal-ibus-hangul-native.spec.ts'
|
|
]) {
|
|
expect(hasNativeImeSourceChange([file]), file).toBe(true)
|
|
}
|
|
|
|
// Exclude unrelated Git/tab-bar edits and unit tests from costly real-ibus lane.
|
|
for (const file of [
|
|
'src/main/git/git-status.ts',
|
|
'src/renderer/src/components/tab-bar/BrowserTab.tsx',
|
|
'src/main/terminal/pty-manager.ts',
|
|
'docs/STYLEGUIDE.md',
|
|
'src/renderer/src/components/terminal-pane/terminal-ime-composition-route.test.ts',
|
|
'src/renderer/src/lib/pane-manager/terminal-ime-anchor.test.ts'
|
|
]) {
|
|
expect(hasNativeImeSourceChange([file]), file).toBe(false)
|
|
}
|
|
})
|
|
|
|
it('routes only core xterm patches to both IME lanes across version updates', () => {
|
|
for (const file of [
|
|
'config/patches/@xterm__xterm@6.1.0-beta.304.patch',
|
|
'config/patches/xterm-src/@xterm__xterm@6.1.0-beta.304.src.patch',
|
|
'config/patches/@xterm__xterm@7.0.0.patch',
|
|
'config/patches/xterm-src/@xterm__xterm@7.0.0.src.patch'
|
|
]) {
|
|
const specs = selectPrE2eSpecs([file])
|
|
expect(hasNativeImeSourceChange([file]), file).toBe(true)
|
|
expect(specs, file).toContain('tests/e2e/terminal-ime-exact-byte.spec.ts')
|
|
expect(specs, file).toContain('tests/e2e/terminal-ibus-hangul-native.spec.ts')
|
|
}
|
|
for (const file of [
|
|
'config/patches/i18next-cli@1.74.2.patch',
|
|
'config/patches/node-pty@1.1.0.patch',
|
|
'config/patches/monaco-editor@0.55.1.patch',
|
|
'config/patches/@xterm__addon-webgl@0.20.0-beta.300.patch',
|
|
'config/patches/xterm-src/@xterm__addon-search@0.17.0-beta.301.src.patch',
|
|
'config/patches/xterm-upstream.json',
|
|
'config/patches/@xterm__xterm@7.0.0.patch.bak'
|
|
]) {
|
|
expect(hasNativeImeSourceChange([file]), file).toBe(false)
|
|
expect(selectPrE2eSpecs([file]), file).toEqual([])
|
|
}
|
|
const corePatch = 'config/patches/@xterm__xterm@6.1.0-beta.304.patch'
|
|
const mixedChanges = ['config/patches/i18next-cli@1.74.2.patch', corePatch]
|
|
expect(hasNativeImeSourceChange(mixedChanges)).toBe(true)
|
|
expect(selectPrE2eSpecs(mixedChanges)).toEqual(selectPrE2eSpecs([corePatch]))
|
|
})
|
|
|
|
it('keeps the native IME spec out of the lane that would silently skip it', () => {
|
|
expect(DEDICATED_E2E_SPECS).toContain('tests/e2e/terminal-ibus-hangul-native.spec.ts')
|
|
// Route native spec itself: its presence in test_files selects dedicated real-IME lane on spec-only changes.
|
|
expect(selectPrE2eSpecs(['src/shared/terminal-unicode-provider.ts'])).toContain(
|
|
'tests/e2e/terminal-ibus-hangul-native.spec.ts'
|
|
)
|
|
})
|
|
})
|
|
|
|
describe('Daemon mock modified-only source routing', () => {
|
|
const helper = 'src/main/daemon/daemon-init-dependency-mocks.ts'
|
|
const verified = { allowDaemonInitTestSupport: true }
|
|
it('omits the real D7 route only for the proven unit-support scope', () => {
|
|
expect(selectPrE2eSpecs([helper])).toContain('tests/e2e/orcad-serve-mode-switch.spec.ts')
|
|
expect(selectPrE2eSpecs([helper], undefined, verified)).toEqual([])
|
|
const companion = 'config/scripts/process-host-build-dist.test.mjs'
|
|
expect(selectPrE2eSpecs([helper, companion], undefined, verified)).toEqual(
|
|
selectPrE2eSpecs([companion])
|
|
)
|
|
})
|
|
it.each([
|
|
{ files: [] },
|
|
{ files: [helper, 'src/main/daemon/daemon-init.ts'] },
|
|
{ files: [helper, 'package.json'] },
|
|
{ files: [helper, 'src/main/daemon/unknown-support.ts'] },
|
|
{ files: [helper, helper] }
|
|
])('retains existing routes for an uncertain or mixed vector $files', ({ files }) => {
|
|
expect(selectPrE2eSpecs(files, undefined, verified)).toEqual(selectPrE2eSpecs(files))
|
|
})
|
|
})
|