Files
openchamber/packages/ui/src/lib/desktop.vscodeRuntime.test.ts
T
Bohdan Triapitsyn 48bcac1758 fix: harden and de-slop the merged sidebar/chat/settings batch
Post-merge follow-ups for #2740 #2735 #2734 #2690 #2676 #2738 #2684
#2689 #2733 #2739 #2462 #2687 #2736 #2618 #2697, plus three regressions
found while reviewing them:

- ctrl/cmd+digit while typing no longer switches session tabs (#2503 was
  still open in practice: the guard only covered the mod+alt surface binding)
- Shiki template-call sanitizer now covers every bundled grammar, including
  the js/ts aliases and embedding grammars; timed-out highlight requests are
  memoized and no longer cancel unrelated in-flight requests
- settings flush on suspend uses keepalive and also fires on Capacitor
  appStateChange; keeps the selected model persisted across mode switches
- remote-only branches fetch before checkout; range helpers fail clearly
- git status invalidation now fires for runtime adapters too
- settings number inputs and select triggers size in ch so they scale with
  the interface font
- recent-activity timestamps tick from one list-level ticker
- Markdown preview find goes through the shared find_in_file keybind with
  containment, no longer counts its own bar, and debounces observer runs
- #2676 reverted; #2524 fixed by fading the sticky header's own background
  instead of overlaying the content below it
- sticky group headers in the model picker and sidebar render again
  (oc-sticky-fade-scroller class restored after 9b9d7069c)
- project switcher names are left-aligned again (wrapper lost in 26dbc2f30)
- tool card quick-open icon is always visible and opens the same line as the
  expanded card's button
- tautological tests replaced or removed; new oxlint findings fixed
2026-08-29 01:06:43 +03:00

64 lines
1.8 KiB
TypeScript

import { afterEach, describe, expect, mock, test } from 'bun:test';
type RuntimeApisStub = { runtime?: { isVSCode?: boolean } } | null;
let registeredRuntimeApis: RuntimeApisStub = null;
mock.module('@/contexts/runtimeAPIRegistry', () => ({
getRegisteredRuntimeAPIs: (): RuntimeApisStub => registeredRuntimeApis,
}));
interface TestWindow {
__VSCODE_CONFIG__?: { workspaceFolder: string; workspaceFolders: { name: string; path: string }[] };
}
/**
* bun test runs without a DOM, so `globalThis` has no `window` binding to
* assign through. Defining the property directly installs the stub without
* asserting that it is a real `Window`.
*/
const setTestWindow = (value: TestWindow | undefined): void => {
if (value === undefined) {
Reflect.deleteProperty(globalThis, 'window');
return;
}
Object.defineProperty(globalThis, 'window', { value, configurable: true, writable: true });
};
const { isVSCodeRuntime } = await import('./desktop');
describe('desktop isVSCodeRuntime bootstrap detection', () => {
afterEach(() => {
registeredRuntimeApis = null;
setTestWindow(undefined);
});
test('detects VS Code from bootstrap config before RuntimeAPIs register', () => {
registeredRuntimeApis = null;
setTestWindow({
__VSCODE_CONFIG__: {
workspaceFolder: '/Users/me/project-a',
workspaceFolders: [{ name: 'project-a', path: '/Users/me/project-a' }],
},
});
expect(isVSCodeRuntime()).toBe(true);
});
test('falls back to registered RuntimeAPIs when bootstrap is absent', () => {
registeredRuntimeApis = {
runtime: { isVSCode: true },
};
setTestWindow({});
expect(isVSCodeRuntime()).toBe(true);
});
test('does not classify an unregistered web runtime as VS Code', () => {
registeredRuntimeApis = null;
setTestWindow({});
expect(isVSCodeRuntime()).toBe(false);
});
});