mirror of
https://github.com/google-gemini/gemini-cli.git
synced 2026-05-12 12:54:07 -07:00
test(cli): fix AppContainer act() warnings and improve waitFor resilience (#18676)
This commit is contained in:
@@ -5,6 +5,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { act } from 'react';
|
import { act } from 'react';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
// The waitFor from vitest doesn't properly wrap in act(), so we have to
|
// The waitFor from vitest doesn't properly wrap in act(), so we have to
|
||||||
// implement our own like the one in @testing-library/react
|
// implement our own like the one in @testing-library/react
|
||||||
@@ -13,7 +14,7 @@ import { act } from 'react';
|
|||||||
// for React state updates.
|
// for React state updates.
|
||||||
export async function waitFor(
|
export async function waitFor(
|
||||||
assertion: () => void,
|
assertion: () => void,
|
||||||
{ timeout = 1000, interval = 50 } = {},
|
{ timeout = 2000, interval = 50 } = {},
|
||||||
): Promise<void> {
|
): Promise<void> {
|
||||||
const startTime = Date.now();
|
const startTime = Date.now();
|
||||||
|
|
||||||
@@ -27,7 +28,11 @@ export async function waitFor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
await act(async () => {
|
await act(async () => {
|
||||||
await new Promise((resolve) => setTimeout(resolve, interval));
|
if (vi.isFakeTimers()) {
|
||||||
|
await vi.advanceTimersByTimeAsync(interval);
|
||||||
|
} else {
|
||||||
|
await new Promise((resolve) => setTimeout(resolve, interval));
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -147,12 +147,28 @@ vi.mock('./hooks/useLogger.js');
|
|||||||
vi.mock('./hooks/useInputHistoryStore.js');
|
vi.mock('./hooks/useInputHistoryStore.js');
|
||||||
vi.mock('./hooks/atCommandProcessor.js');
|
vi.mock('./hooks/atCommandProcessor.js');
|
||||||
vi.mock('./hooks/useHookDisplayState.js');
|
vi.mock('./hooks/useHookDisplayState.js');
|
||||||
|
vi.mock('./hooks/useBanner.js', () => ({
|
||||||
|
useBanner: vi.fn((bannerData) => ({
|
||||||
|
bannerText: (
|
||||||
|
bannerData.warningText ||
|
||||||
|
bannerData.defaultText ||
|
||||||
|
''
|
||||||
|
).replace(/\\n/g, '\n'),
|
||||||
|
})),
|
||||||
|
}));
|
||||||
|
vi.mock('./hooks/useShellInactivityStatus.js', () => ({
|
||||||
|
useShellInactivityStatus: vi.fn(() => ({
|
||||||
|
shouldShowFocusHint: false,
|
||||||
|
inactivityStatus: 'none',
|
||||||
|
})),
|
||||||
|
}));
|
||||||
vi.mock('./hooks/useTerminalTheme.js', () => ({
|
vi.mock('./hooks/useTerminalTheme.js', () => ({
|
||||||
useTerminalTheme: vi.fn(),
|
useTerminalTheme: vi.fn(),
|
||||||
}));
|
}));
|
||||||
|
|
||||||
import { useHookDisplayState } from './hooks/useHookDisplayState.js';
|
import { useHookDisplayState } from './hooks/useHookDisplayState.js';
|
||||||
import { useTerminalTheme } from './hooks/useTerminalTheme.js';
|
import { useTerminalTheme } from './hooks/useTerminalTheme.js';
|
||||||
|
import { useShellInactivityStatus } from './hooks/useShellInactivityStatus.js';
|
||||||
|
|
||||||
// Mock external utilities
|
// Mock external utilities
|
||||||
vi.mock('../utils/events.js');
|
vi.mock('../utils/events.js');
|
||||||
@@ -256,6 +272,7 @@ describe('AppContainer State Management', () => {
|
|||||||
const mockedUseInputHistoryStore = useInputHistoryStore as Mock;
|
const mockedUseInputHistoryStore = useInputHistoryStore as Mock;
|
||||||
const mockedUseHookDisplayState = useHookDisplayState as Mock;
|
const mockedUseHookDisplayState = useHookDisplayState as Mock;
|
||||||
const mockedUseTerminalTheme = useTerminalTheme as Mock;
|
const mockedUseTerminalTheme = useTerminalTheme as Mock;
|
||||||
|
const mockedUseShellInactivityStatus = useShellInactivityStatus as Mock;
|
||||||
|
|
||||||
const DEFAULT_GEMINI_STREAM_MOCK = {
|
const DEFAULT_GEMINI_STREAM_MOCK = {
|
||||||
streamingState: 'idle',
|
streamingState: 'idle',
|
||||||
@@ -385,6 +402,10 @@ describe('AppContainer State Management', () => {
|
|||||||
});
|
});
|
||||||
mockedUseHookDisplayState.mockReturnValue([]);
|
mockedUseHookDisplayState.mockReturnValue([]);
|
||||||
mockedUseTerminalTheme.mockReturnValue(undefined);
|
mockedUseTerminalTheme.mockReturnValue(undefined);
|
||||||
|
mockedUseShellInactivityStatus.mockReturnValue({
|
||||||
|
shouldShowFocusHint: false,
|
||||||
|
inactivityStatus: 'none',
|
||||||
|
});
|
||||||
|
|
||||||
// Mock Config
|
// Mock Config
|
||||||
mockConfig = makeFakeConfig();
|
mockConfig = makeFakeConfig();
|
||||||
@@ -1247,8 +1268,15 @@ describe('AppContainer State Management', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
describe('Shell Focus Action Required', () => {
|
describe('Shell Focus Action Required', () => {
|
||||||
beforeEach(() => {
|
beforeEach(async () => {
|
||||||
vi.useFakeTimers();
|
vi.useFakeTimers();
|
||||||
|
// Use real implementation for these tests to verify title updates
|
||||||
|
const actual = await vi.importActual<
|
||||||
|
typeof import('./hooks/useShellInactivityStatus.js')
|
||||||
|
>('./hooks/useShellInactivityStatus.js');
|
||||||
|
mockedUseShellInactivityStatus.mockImplementation(
|
||||||
|
actual.useShellInactivityStatus,
|
||||||
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
afterEach(() => {
|
||||||
|
|||||||
Reference in New Issue
Block a user