Files
oh-my-pi/packages/coding-agent/test/helpers/settings-test-state.ts
T
can1357 93347438ed fix(coding-agent): prevented async leaks and state pollution on disposal
- Added `#disposed` flags and guards to `StatusLineComponent` to stop async callbacks running post-dispose.
- Updated `onThemeChange` to return an unsubscribe function and registered it in `InteractiveMode`.
- Fixed schema validation for `spinnerFramesSchema` to narrower types instead of dynamic or-validation.
- Resolved settings leaks by saving and restoring `tuiTight` state in tests.
- Added regression tests verifying that pending async microtasks do not trigger updates after disposal.
2026-06-18 01:57:23 +02:00

78 lines
1.8 KiB
TypeScript

import { vi } from "bun:test";
import { resetSettingsForTest } from "@oh-my-pi/pi-coding-agent/config/settings";
import { isTuiTight, setTuiTight } from "@oh-my-pi/pi-tui";
import {
getAgentDir,
getDefaultTabWidth,
getProjectDir,
setAgentDir,
setDefaultTabWidth,
setProjectDir,
} from "@oh-my-pi/pi-utils";
export interface SettingsTestState {
agentDir: string;
env: Record<string, string | undefined>;
projectDir: string;
tabWidth: number;
tuiTight: boolean;
}
export function beginSettingsTest(): SettingsTestState {
const env: Record<string, string | undefined> = {};
for (const key in process.env) {
env[key] = process.env[key];
}
for (const key in Bun.env) {
env[key] = Bun.env[key];
}
const state: SettingsTestState = {
agentDir: getAgentDir(),
env,
projectDir: getProjectDir(),
tabWidth: getDefaultTabWidth(),
tuiTight: isTuiTight(),
};
resetSettingsForTest();
return state;
}
export function restoreSettingsTestState(state: SettingsTestState | undefined): void {
vi.restoreAllMocks();
resetSettingsForTest();
if (!state) return;
restoreEnv(state.env);
setDefaultTabWidth(state.tabWidth);
setProjectDir(state.projectDir);
setAgentDir(state.agentDir);
setTuiTight(state.tuiTight);
restoreEnvValue("PI_CODING_AGENT_DIR", state.env.PI_CODING_AGENT_DIR);
}
function restoreEnv(snapshot: Record<string, string | undefined>): void {
for (const key in process.env) {
if (!(key in snapshot)) {
restoreEnvValue(key, undefined);
}
}
for (const key in Bun.env) {
if (!(key in snapshot)) {
restoreEnvValue(key, undefined);
}
}
for (const key in snapshot) {
restoreEnvValue(key, snapshot[key]);
}
}
function restoreEnvValue(key: string, value: string | undefined): void {
if (value === undefined) {
delete process.env[key];
delete Bun.env[key];
return;
}
process.env[key] = value;
Bun.env[key] = value;
}