Skip to content

test(performance): refactor input prompt tests into multiple files#25499

Open
jacob314 wants to merge 1 commit intomainfrom
optimize_input_prompt
Open

test(performance): refactor input prompt tests into multiple files#25499
jacob314 wants to merge 1 commit intomainfrom
optimize_input_prompt

Conversation

@jacob314
Copy link
Copy Markdown
Contributor

Summary

Details

Related Issues

How to Validate

Pre-Merge Checklist

  • Updated relevant documentation and README (if needed)
  • Added/updated tests (if needed)
  • Noted breaking changes (if any)
  • Validated on required platforms/methods:
    • MacOS
      • npm run
      • npx
      • Docker
      • Podman
      • Seatbelt
    • Windows
      • npm run
      • npx
      • Docker
    • Linux
      • npm run
      • npx
      • Docker

@jacob314 jacob314 requested a review from a team as a code owner April 15, 2026 22:12
@gemini-cli
Copy link
Copy Markdown
Contributor

gemini-cli bot commented Apr 15, 2026

Hi @jacob314, thank you so much for your contribution to Gemini CLI! We really appreciate the time and effort you've put into this.

We're making some updates to our contribution process to improve how we track and review changes. Please take a moment to review our recent discussion post: Improving Our Contribution Process & Introducing New Guidelines.

Key Update: Starting January 26, 2026, the Gemini CLI project will require all pull requests to be associated with an existing issue. Any pull requests not linked to an issue by that date will be automatically closed.

Thank you for your understanding and for being a part of our community!

@gemini-code-assist
Copy link
Copy Markdown
Contributor

Summary of Changes

Hello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request significantly improves the test architecture for the InputPrompt component by breaking down a monolithic test file into several smaller, more focused units. This change enhances the clarity and efficiency of the test suite, making it easier to understand, debug, and extend specific functionalities of the input prompt without affecting unrelated tests.

Highlights

  • Test Refactoring: The extensive test suite for the InputPrompt component has been refactored and split into multiple dedicated test files, improving organization and maintainability.
  • New Test Files Added: Four new test files were introduced: InputPrompt-BackgroundColor.test.tsx, InputPrompt-Highlighting.test.tsx, InputPrompt-IMECursor.test.tsx, and InputPrompt-Snapshots.test.tsx, each focusing on specific aspects of the InputPrompt component's behavior.
  • Centralized Test Helpers: A new helper file, InputPrompt.test.helpers.tsx, was created to centralize common setup, mocks, and utility functions used across the InputPrompt test suite.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for GitHub and other Google products, sign up here.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

@github-actions
Copy link
Copy Markdown

Size Change: -4 B (0%)

Total Size: 33.6 MB

Filename Size Change
./bundle/chunk-DF5F567H.js 0 B -3.43 MB (removed) 🏆
./bundle/chunk-LTOHRV5G.js 0 B -14.5 MB (removed) 🏆
./bundle/chunk-TPBGQAPH.js 0 B -3.8 kB (removed) 🏆
./bundle/core-SYHUAHZM.js 0 B -46.6 kB (removed) 🏆
./bundle/devtoolsService-7HOCY4ME.js 0 B -28.4 kB (removed) 🏆
./bundle/gemini-3QDRJNOT.js 0 B -553 kB (removed) 🏆
./bundle/interactiveCli-K5OSRQ2V.js 0 B -1.29 MB (removed) 🏆
./bundle/oauth2-provider-ZTNQ6M34.js 0 B -9.16 kB (removed) 🏆
./bundle/chunk-AGWDSIQ5.js 14.5 MB +14.5 MB (new file) 🆕
./bundle/chunk-BYG5ANEF.js 3.8 kB +3.8 kB (new file) 🆕
./bundle/chunk-OL5JHFFA.js 3.43 MB +3.43 MB (new file) 🆕
./bundle/core-67LWIHYB.js 46.6 kB +46.6 kB (new file) 🆕
./bundle/devtoolsService-OLVEUZYR.js 28.4 kB +28.4 kB (new file) 🆕
./bundle/gemini-Q42LPZ2P.js 553 kB +553 kB (new file) 🆕
./bundle/interactiveCli-I6Z2UJKM.js 1.29 MB +1.29 MB (new file) 🆕
./bundle/oauth2-provider-BYTZAMMQ.js 9.16 kB +9.16 kB (new file) 🆕
ℹ️ View Unchanged
Filename Size Change
./bundle/bundled/third_party/index.js 8 MB 0 B
./bundle/chunk-34MYV7JD.js 2.45 kB 0 B
./bundle/chunk-5AUYMPVF.js 858 B 0 B
./bundle/chunk-5PS3AYFU.js 1.18 kB 0 B
./bundle/chunk-664ZODQF.js 124 kB 0 B
./bundle/chunk-DAHVX5MI.js 206 kB 0 B
./bundle/chunk-IUUIT4SU.js 56.5 kB 0 B
./bundle/chunk-PC3Y4R7E.js 1.97 MB 0 B
./bundle/chunk-RJTRUG2J.js 39.8 kB 0 B
./bundle/cleanup-64C4QZRA.js 0 B -932 B (removed) 🏆
./bundle/devtools-36NN55EP.js 696 kB 0 B
./bundle/dist-T73EYRDX.js 356 B 0 B
./bundle/events-XB7DADIJ.js 418 B 0 B
./bundle/gemini.js 4.97 kB 0 B
./bundle/getMachineId-bsd-TXG52NKR.js 1.55 kB 0 B
./bundle/getMachineId-darwin-7OE4DDZ6.js 1.55 kB 0 B
./bundle/getMachineId-linux-SHIFKOOX.js 1.34 kB 0 B
./bundle/getMachineId-unsupported-5U5DOEYY.js 1.06 kB 0 B
./bundle/getMachineId-win-6KLLGOI4.js 1.72 kB 0 B
./bundle/memoryDiscovery-R4AKKXHF.js 980 B 0 B
./bundle/multipart-parser-KPBZEGQU.js 11.7 kB 0 B
./bundle/node_modules/@google/gemini-cli-devtools/dist/client/main.js 222 kB 0 B
./bundle/node_modules/@google/gemini-cli-devtools/dist/src/_client-assets.js 229 kB 0 B
./bundle/node_modules/@google/gemini-cli-devtools/dist/src/index.js 13.4 kB 0 B
./bundle/node_modules/@google/gemini-cli-devtools/dist/src/types.js 132 B 0 B
./bundle/sandbox-macos-permissive-open.sb 890 B 0 B
./bundle/sandbox-macos-permissive-proxied.sb 1.31 kB 0 B
./bundle/sandbox-macos-restrictive-open.sb 3.36 kB 0 B
./bundle/sandbox-macos-restrictive-proxied.sb 3.56 kB 0 B
./bundle/sandbox-macos-strict-open.sb 4.82 kB 0 B
./bundle/sandbox-macos-strict-proxied.sb 5.02 kB 0 B
./bundle/src-QVCVGIUX.js 47 kB 0 B
./bundle/tree-sitter-7U6MW5PS.js 274 kB 0 B
./bundle/tree-sitter-bash-34ZGLXVX.js 1.84 MB 0 B
./bundle/cleanup-KTAOALOR.js 932 B +932 B (new file) 🆕

compressed-size-action

Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request refactors the InputPrompt tests by extracting common setup logic and mock definitions into a new InputPrompt.test.helpers.tsx file and splitting the large test suite into smaller, domain-specific files (Background Color, Highlighting, IME Cursor, and Snapshots). While the reorganization improves maintainability, several issues were identified regarding type safety and mock consistency. Specifically, the refactoring introduced multiple instances of the any type where specific hook return types were previously used, and some tests were updated to bypass the mock buffer's setText logic by directly assigning to the text property, which can lead to inconsistent internal state in the mocks.

Comment on lines +23 to +29
import { useShellHistory } from '../hooks/useShellHistory.js';
import {
useCommandCompletion,
CompletionMode,
type UseCommandCompletionReturn,
} from '../hooks/useCommandCompletion.js';
import {
useInputHistory,
type UseInputHistoryReturn,
} from '../hooks/useInputHistory.js';
import {
useReverseSearchCompletion,
type UseReverseSearchCompletionReturn,
} from '../hooks/useReverseSearchCompletion.js';
import { useInputHistory } from '../hooks/useInputHistory.js';
import { useReverseSearchCompletion } from '../hooks/useReverseSearchCompletion.js';
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

The refactoring removed several important type imports that were previously used for mock variable declarations. Restoring these types will improve type safety and maintainability.

Suggested change
import { useShellHistory } from '../hooks/useShellHistory.js';
import {
useCommandCompletion,
CompletionMode,
type UseCommandCompletionReturn,
} from '../hooks/useCommandCompletion.js';
import {
useInputHistory,
type UseInputHistoryReturn,
} from '../hooks/useInputHistory.js';
import {
useReverseSearchCompletion,
type UseReverseSearchCompletionReturn,
} from '../hooks/useReverseSearchCompletion.js';
import { useInputHistory } from '../hooks/useInputHistory.js';
import { useReverseSearchCompletion } from '../hooks/useReverseSearchCompletion.js';
import { useShellHistory, type UseShellHistoryReturn } from '../hooks/useShellHistory.js';
import {
useCommandCompletion,
CompletionMode,
type UseCommandCompletionReturn,
} from '../hooks/useCommandCompletion.js';
import { useInputHistory, type UseInputHistoryReturn } from '../hooks/useInputHistory.js';
import { useReverseSearchCompletion, type UseReverseSearchCompletionReturn } from '../hooks/useReverseSearchCompletion.js';

Comment on lines +107 to +114
// eslint-disable-next-line @typescript-eslint/no-explicit-any
let mockShellHistory: any;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
let mockCommandCompletion: any;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
let mockInputHistory: any;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
let mockReverseSearchCompletion: any;
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

Using any for these mock variables is a regression in type safety. Please use the proper return types from the respective hooks to ensure the mocks remain consistent with the actual implementations.

Suggested change
// eslint-disable-next-line @typescript-eslint/no-explicit-any
let mockShellHistory: any;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
let mockCommandCompletion: any;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
let mockInputHistory: any;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
let mockReverseSearchCompletion: any;
let mockShellHistory: UseShellHistoryReturn;
let mockCommandCompletion: UseCommandCompletionReturn;
let mockInputHistory: UseInputHistoryReturn;
let mockReverseSearchCompletion: UseReverseSearchCompletionReturn;

};
mockedUseInputHistory.mockImplementation(({ onSubmit }) => {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
mockedUseInputHistory.mockImplementation(({ onSubmit }: any) => {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

The use of any here is unnecessary as the type can be inferred or explicitly defined. Removing it maintains better type safety.

Suggested change
mockedUseInputHistory.mockImplementation(({ onSubmit }: any) => {
mockedUseInputHistory.mockImplementation(({ onSubmit }) => {

await act(async () => {
props.buffer.setText('some text to clear');
});
props.buffer.text = 'some text to clear';
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

Directly assigning to buffer.text bypasses the setText logic in the mock buffer, which is responsible for updating other dependent fields like lines, visualCursor, and transformationsByLine. This can lead to inconsistent state during tests. Use setText instead.

Suggested change
props.buffer.text = 'some text to clear';
props.buffer.setText('some text to clear');

const onEscapePromptChange = vi.fn();
props.onEscapePromptChange = onEscapePromptChange;
props.buffer.setText('text to clear');
props.buffer.text = 'text to clear';
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

Directly assigning to buffer.text bypasses the setText logic in the mock buffer. Use setText to ensure all dependent fields in the mock are correctly updated.

Suggested change
props.buffer.text = 'text to clear';
props.buffer.setText('text to clear');

import * as path from 'node:path';
import { CommandKind, type SlashCommand } from '../commands/types.js';
import { StreamingState } from '../types.js';
import { terminalCapabilityManager } from '../utils/terminalCapabilityManager.js';
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

The Key type is needed for the handleInput mock implementation to maintain type safety.

Suggested change
import { terminalCapabilityManager } from '../utils/terminalCapabilityManager.js';
import { terminalCapabilityManager } from '../utils/terminalCapabilityManager.js';
import { type Key } from '../hooks/useKeypress.js';

visualScrollRow: 0,
viewportHeight: 10,
// eslint-disable-next-line @typescript-eslint/no-explicit-any
handleInput: vi.fn((key: any) => {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

Using any for the key parameter reduces type safety. Please use the Key type.

Suggested change
handleInput: vi.fn((key: any) => {
handleInput: vi.fn((key: Key) => {

@gemini-cli gemini-cli bot added the priority/p1 Important and should be addressed in the near term. label Apr 15, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

priority/p1 Important and should be addressed in the near term.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant