11import React from "react"
2- import { render , screen } from "@/utils/test-utils"
2+ import { render , screen , fireEvent } from "@/utils/test-utils"
33import { describe , test , expect , vi } from "vitest"
44import ModeSelector from "../ModeSelector"
55import { Mode } from "@roo/modes"
6+ import { ModeConfig } from "@roo-code/types"
67
78// Mock the dependencies
89vi . mock ( "@/utils/vscode" , ( ) => ( {
@@ -28,6 +29,23 @@ vi.mock("@/components/ui/hooks/useRooPortal", () => ({
2829 useRooPortal : ( ) => document . body ,
2930} ) )
3031
32+ vi . mock ( "@/utils/TelemetryClient" , ( ) => ( {
33+ telemetryClient : {
34+ capture : vi . fn ( ) ,
35+ } ,
36+ } ) )
37+
38+ // Create a variable to control what getAllModes returns
39+ let mockModes : ModeConfig [ ] = [ ]
40+
41+ vi . mock ( "@roo/modes" , async ( ) => {
42+ const actual = await vi . importActual < typeof import ( "@roo/modes" ) > ( "@roo/modes" )
43+ return {
44+ ...actual ,
45+ getAllModes : ( ) => mockModes ,
46+ }
47+ } )
48+
3149describe ( "ModeSelector" , ( ) => {
3250 test ( "shows custom description from customModePrompts" , ( ) => {
3351 const customModePrompts = {
@@ -55,4 +73,78 @@ describe("ModeSelector", () => {
5573 // The component should be rendered
5674 expect ( screen . getByTestId ( "mode-selector-trigger" ) ) . toBeInTheDocument ( )
5775 } )
76+
77+ test ( "shows search bar when there are more than 6 modes" , ( ) => {
78+ // Set up mock to return 7 modes
79+ mockModes = Array . from ( { length : 7 } , ( _ , i ) => ( {
80+ slug : `mode-${ i } ` ,
81+ name : `Mode ${ i } ` ,
82+ description : `Description for mode ${ i } ` ,
83+ roleDefinition : "Role definition" ,
84+ groups : [ "read" , "edit" ] ,
85+ } ) )
86+
87+ render ( < ModeSelector value = { "mode-0" as Mode } onChange = { vi . fn ( ) } modeShortcutText = "Ctrl+M" /> )
88+
89+ // Click to open the popover
90+ fireEvent . click ( screen . getByTestId ( "mode-selector-trigger" ) )
91+
92+ // Search input should be visible
93+ expect ( screen . getByTestId ( "mode-search-input" ) ) . toBeInTheDocument ( )
94+
95+ // Info icon should be visible
96+ expect ( screen . getByText ( "chat:modeSelector.title" ) ) . toBeInTheDocument ( )
97+ const infoIcon = document . querySelector ( ".codicon-info" )
98+ expect ( infoIcon ) . toBeInTheDocument ( )
99+ } )
100+
101+ test ( "shows info blurb instead of search bar when there are 6 or fewer modes" , ( ) => {
102+ // Set up mock to return 5 modes
103+ mockModes = Array . from ( { length : 5 } , ( _ , i ) => ( {
104+ slug : `mode-${ i } ` ,
105+ name : `Mode ${ i } ` ,
106+ description : `Description for mode ${ i } ` ,
107+ roleDefinition : "Role definition" ,
108+ groups : [ "read" , "edit" ] ,
109+ } ) )
110+
111+ render ( < ModeSelector value = { "mode-0" as Mode } onChange = { vi . fn ( ) } modeShortcutText = "Ctrl+M" /> )
112+
113+ // Click to open the popover
114+ fireEvent . click ( screen . getByTestId ( "mode-selector-trigger" ) )
115+
116+ // Search input should NOT be visible
117+ expect ( screen . queryByTestId ( "mode-search-input" ) ) . not . toBeInTheDocument ( )
118+
119+ // Info blurb should be visible
120+ expect ( screen . getByText ( / c h a t : m o d e S e l e c t o r .d e s c r i p t i o n / ) ) . toBeInTheDocument ( )
121+
122+ // Info icon should NOT be visible
123+ const infoIcon = document . querySelector ( ".codicon-info" )
124+ expect ( infoIcon ) . not . toBeInTheDocument ( )
125+ } )
126+
127+ test ( "filters modes correctly when searching" , ( ) => {
128+ // Set up mock to return 7 modes to enable search
129+ mockModes = Array . from ( { length : 7 } , ( _ , i ) => ( {
130+ slug : `mode-${ i } ` ,
131+ name : `Mode ${ i } ` ,
132+ description : `Description for mode ${ i } ` ,
133+ roleDefinition : "Role definition" ,
134+ groups : [ "read" , "edit" ] ,
135+ } ) )
136+
137+ render ( < ModeSelector value = { "mode-0" as Mode } onChange = { vi . fn ( ) } modeShortcutText = "Ctrl+M" /> )
138+
139+ // Click to open the popover
140+ fireEvent . click ( screen . getByTestId ( "mode-selector-trigger" ) )
141+
142+ // Type in search
143+ const searchInput = screen . getByTestId ( "mode-search-input" )
144+ fireEvent . change ( searchInput , { target : { value : "Mode 3" } } )
145+
146+ // Should show filtered results
147+ const modeItems = screen . getAllByTestId ( "mode-selector-item" )
148+ expect ( modeItems . length ) . toBeLessThan ( 7 ) // Should have filtered some out
149+ } )
58150} )
0 commit comments