mirror of
https://github.com/google-gemini/gemini-cli.git
synced 2026-03-31 08:20:54 -07:00
Disable tips after 10 runs (#17101)
This commit is contained in:
@@ -4,7 +4,7 @@
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
import { render } from '../../test-utils/render.js';
|
||||
import { render, persistentStateMock } from '../../test-utils/render.js';
|
||||
import { Notifications } from './Notifications.js';
|
||||
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
||||
import { useAppContext, type AppState } from '../contexts/AppContext.js';
|
||||
@@ -30,6 +30,7 @@ vi.mock('node:fs/promises', async () => {
|
||||
access: vi.fn(),
|
||||
writeFile: vi.fn(),
|
||||
mkdir: vi.fn().mockResolvedValue(undefined),
|
||||
unlink: vi.fn().mockResolvedValue(undefined),
|
||||
};
|
||||
});
|
||||
vi.mock('node:os', () => ({
|
||||
@@ -68,10 +69,11 @@ describe('Notifications', () => {
|
||||
const mockUseUIState = vi.mocked(useUIState);
|
||||
const mockUseIsScreenReaderEnabled = vi.mocked(useIsScreenReaderEnabled);
|
||||
const mockFsAccess = vi.mocked(fs.access);
|
||||
const mockFsWriteFile = vi.mocked(fs.writeFile);
|
||||
const mockFsUnlink = vi.mocked(fs.unlink);
|
||||
|
||||
beforeEach(() => {
|
||||
vi.clearAllMocks();
|
||||
persistentStateMock.reset();
|
||||
mockUseAppContext.mockReturnValue({
|
||||
startupWarnings: [],
|
||||
version: '1.0.0',
|
||||
@@ -134,51 +136,47 @@ describe('Notifications', () => {
|
||||
expect(lastFrame()).toMatchSnapshot();
|
||||
});
|
||||
|
||||
it('renders screen reader nudge when enabled and not seen', async () => {
|
||||
it('renders screen reader nudge when enabled and not seen (no legacy file)', async () => {
|
||||
mockUseIsScreenReaderEnabled.mockReturnValue(true);
|
||||
|
||||
let rejectAccess: (err: Error) => void;
|
||||
mockFsAccess.mockImplementation(
|
||||
() =>
|
||||
new Promise((_, reject) => {
|
||||
rejectAccess = reject;
|
||||
}),
|
||||
);
|
||||
persistentStateMock.setData({ hasSeenScreenReaderNudge: false });
|
||||
mockFsAccess.mockRejectedValue(new Error('No legacy file'));
|
||||
|
||||
const { lastFrame } = render(<Notifications />);
|
||||
|
||||
// Trigger rejection inside act
|
||||
await act(async () => {
|
||||
rejectAccess(new Error('File not found'));
|
||||
});
|
||||
|
||||
// Wait for effect to propagate
|
||||
await vi.waitFor(() => {
|
||||
expect(mockFsWriteFile).toHaveBeenCalled();
|
||||
});
|
||||
expect(lastFrame()).toContain('screen reader-friendly view');
|
||||
expect(persistentStateMock.set).toHaveBeenCalledWith(
|
||||
'hasSeenScreenReaderNudge',
|
||||
true,
|
||||
);
|
||||
|
||||
expect(lastFrame()).toMatchSnapshot();
|
||||
});
|
||||
|
||||
it('does not render screen reader nudge when already seen', async () => {
|
||||
it('migrates legacy screen reader nudge file', async () => {
|
||||
mockUseIsScreenReaderEnabled.mockReturnValue(true);
|
||||
persistentStateMock.setData({ hasSeenScreenReaderNudge: undefined });
|
||||
mockFsAccess.mockResolvedValue(undefined);
|
||||
|
||||
let resolveAccess: (val: undefined) => void;
|
||||
mockFsAccess.mockImplementation(
|
||||
() =>
|
||||
new Promise((resolve) => {
|
||||
resolveAccess = resolve;
|
||||
}),
|
||||
);
|
||||
render(<Notifications />);
|
||||
|
||||
await act(async () => {
|
||||
await vi.waitFor(() => {
|
||||
expect(persistentStateMock.set).toHaveBeenCalledWith(
|
||||
'hasSeenScreenReaderNudge',
|
||||
true,
|
||||
);
|
||||
expect(mockFsUnlink).toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it('does not render screen reader nudge when already seen in persistent state', async () => {
|
||||
mockUseIsScreenReaderEnabled.mockReturnValue(true);
|
||||
persistentStateMock.setData({ hasSeenScreenReaderNudge: true });
|
||||
|
||||
const { lastFrame } = render(<Notifications />);
|
||||
|
||||
// Trigger resolution inside act
|
||||
await act(async () => {
|
||||
resolveAccess(undefined);
|
||||
});
|
||||
|
||||
expect(lastFrame()).toBe('');
|
||||
expect(mockFsWriteFile).not.toHaveBeenCalled();
|
||||
expect(persistentStateMock.set).not.toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user