@@ -5,7 +5,6 @@ import SettingsMenu from '../SettingsMenu'
55import { useNavigate , useMatches } from '@tanstack/react-router'
66import { useGeneralSetting } from '@/hooks/useGeneralSetting'
77import { useModelProvider } from '@/hooks/useModelProvider'
8- import { useAppState } from '@/hooks/useAppState'
98
109// Mock dependencies
1110vi . mock ( '@tanstack/react-router' , ( ) => ( {
@@ -25,9 +24,7 @@ vi.mock('@/i18n/react-i18next-compat', () => ({
2524} ) )
2625
2726vi . mock ( '@/hooks/useGeneralSetting' , ( ) => ( {
28- useGeneralSetting : vi . fn ( ( ) => ( {
29- experimentalFeatures : false ,
30- } ) ) ,
27+ useGeneralSetting : vi . fn ( ( ) => ( { } ) ) ,
3128} ) )
3229
3330vi . mock ( '@/hooks/useModelProvider' , ( ) => ( {
@@ -71,14 +68,14 @@ describe('SettingsMenu', () => {
7168
7269 beforeEach ( ( ) => {
7370 vi . clearAllMocks ( )
74-
71+
7572 vi . mocked ( useNavigate ) . mockReturnValue ( mockNavigate )
7673 vi . mocked ( useMatches ) . mockReturnValue ( mockMatches )
7774 } )
7875
7976 it ( 'renders all menu items' , ( ) => {
8077 render ( < SettingsMenu /> )
81-
78+
8279 expect ( screen . getByText ( 'common:general' ) ) . toBeInTheDocument ( )
8380 expect ( screen . getByText ( 'common:appearance' ) ) . toBeInTheDocument ( )
8481 expect ( screen . getByText ( 'common:privacy' ) ) . toBeInTheDocument ( )
@@ -88,29 +85,14 @@ describe('SettingsMenu', () => {
8885 expect ( screen . getByText ( 'common:local_api_server' ) ) . toBeInTheDocument ( )
8986 expect ( screen . getByText ( 'common:https_proxy' ) ) . toBeInTheDocument ( )
9087 expect ( screen . getByText ( 'common:extensions' ) ) . toBeInTheDocument ( )
91- } )
92-
93- it ( 'does not show MCP Servers when experimental features disabled' , ( ) => {
94- render ( < SettingsMenu /> )
95-
96- expect ( screen . queryByText ( 'common:mcp-servers' ) ) . not . toBeInTheDocument ( )
97- } )
98-
99- it ( 'shows MCP Servers when experimental features enabled' , ( ) => {
100- vi . mocked ( useGeneralSetting ) . mockReturnValue ( {
101- experimentalFeatures : true ,
102- } )
103-
104- render ( < SettingsMenu /> )
105-
10688 expect ( screen . getByText ( 'common:mcp-servers' ) ) . toBeInTheDocument ( )
10789 } )
10890
10991 it ( 'shows provider expansion chevron when providers are active' , ( ) => {
11092 render ( < SettingsMenu /> )
111-
93+
11294 const chevronButtons = screen . getAllByRole ( 'button' )
113- const chevron = chevronButtons . find ( button =>
95+ const chevron = chevronButtons . find ( ( button ) =>
11496 button . querySelector ( 'svg.tabler-icon-chevron-right' )
11597 )
11698 expect ( chevron ) . toBeInTheDocument ( )
@@ -119,14 +101,14 @@ describe('SettingsMenu', () => {
119101 it ( 'expands providers submenu when chevron is clicked' , async ( ) => {
120102 const user = userEvent . setup ( )
121103 render ( < SettingsMenu /> )
122-
104+
123105 const chevronButtons = screen . getAllByRole ( 'button' )
124- const chevron = chevronButtons . find ( button =>
106+ const chevron = chevronButtons . find ( ( button ) =>
125107 button . querySelector ( 'svg.tabler-icon-chevron-right' )
126108 )
127109 if ( ! chevron ) throw new Error ( 'Chevron button not found' )
128110 await user . click ( chevron )
129-
111+
130112 expect ( screen . getByTestId ( 'provider-avatar-openai' ) ) . toBeInTheDocument ( )
131113 expect ( screen . getByTestId ( 'provider-avatar-llama.cpp' ) ) . toBeInTheDocument ( )
132114 } )
@@ -138,52 +120,56 @@ describe('SettingsMenu', () => {
138120 params : { providerName : 'openai' } ,
139121 } ,
140122 ] )
141-
123+
142124 render ( < SettingsMenu /> )
143-
125+
144126 expect ( screen . getByTestId ( 'provider-avatar-openai' ) ) . toBeInTheDocument ( )
145127 expect ( screen . getByTestId ( 'provider-avatar-llama.cpp' ) ) . toBeInTheDocument ( )
146128 } )
147129
148130 it ( 'highlights active provider in submenu' , async ( ) => {
149131 const user = userEvent . setup ( )
150-
132+
151133 vi . mocked ( useMatches ) . mockReturnValue ( [
152134 {
153135 routeId : '/settings/providers/$providerName' ,
154136 params : { providerName : 'openai' } ,
155137 } ,
156138 ] )
157-
139+
158140 render ( < SettingsMenu /> )
159-
141+
160142 // First expand the providers submenu
161143 const chevronButtons = screen . getAllByRole ( 'button' )
162- const chevron = chevronButtons . find ( button =>
144+ const chevron = chevronButtons . find ( ( button ) =>
163145 button . querySelector ( 'svg.tabler-icon-chevron-right' )
164146 )
165147 if ( chevron ) await user . click ( chevron )
166-
167- const openaiProvider = screen . getByTestId ( 'provider-avatar-openai' ) . closest ( 'div' )
148+
149+ const openaiProvider = screen
150+ . getByTestId ( 'provider-avatar-openai' )
151+ . closest ( 'div' )
168152 expect ( openaiProvider ) . toBeInTheDocument ( )
169153 } )
170154
171155 it ( 'navigates to provider when provider is clicked' , async ( ) => {
172156 const user = userEvent . setup ( )
173157 render ( < SettingsMenu /> )
174-
158+
175159 // First expand the providers
176160 const chevronButtons = screen . getAllByRole ( 'button' )
177- const chevron = chevronButtons . find ( button =>
161+ const chevron = chevronButtons . find ( ( button ) =>
178162 button . querySelector ( 'svg.tabler-icon-chevron-right' )
179163 )
180164 if ( ! chevron ) throw new Error ( 'Chevron button not found' )
181165 await user . click ( chevron )
182-
166+
183167 // Then click on a provider
184- const openaiProvider = screen . getByTestId ( 'provider-avatar-openai' ) . closest ( 'div' )
168+ const openaiProvider = screen
169+ . getByTestId ( 'provider-avatar-openai' )
170+ . closest ( 'div' )
185171 await user . click ( openaiProvider ! )
186-
172+
187173 expect ( mockNavigate ) . toHaveBeenCalledWith ( {
188174 to : '/settings/providers/$providerName' ,
189175 params : { providerName : 'openai' } ,
@@ -192,18 +178,22 @@ describe('SettingsMenu', () => {
192178
193179 it ( 'shows mobile menu toggle button' , ( ) => {
194180 render ( < SettingsMenu /> )
195-
196- const menuToggle = screen . getByRole ( 'button' , { name : 'Toggle settings menu' } )
181+
182+ const menuToggle = screen . getByRole ( 'button' , {
183+ name : 'Toggle settings menu' ,
184+ } )
197185 expect ( menuToggle ) . toBeInTheDocument ( )
198186 } )
199187
200188 it ( 'opens mobile menu when toggle is clicked' , async ( ) => {
201189 const user = userEvent . setup ( )
202190 render ( < SettingsMenu /> )
203-
204- const menuToggle = screen . getByRole ( 'button' , { name : 'Toggle settings menu' } )
191+
192+ const menuToggle = screen . getByRole ( 'button' , {
193+ name : 'Toggle settings menu' ,
194+ } )
205195 await user . click ( menuToggle )
206-
196+
207197 // Menu should now be visible
208198 const menu = screen . getByText ( 'common:general' ) . closest ( 'div' )
209199 expect ( menu ) . toHaveClass ( 'flex' )
@@ -212,38 +202,40 @@ describe('SettingsMenu', () => {
212202 it ( 'closes mobile menu when X is clicked' , async ( ) => {
213203 const user = userEvent . setup ( )
214204 render ( < SettingsMenu /> )
215-
205+
216206 // Open menu first
217- const menuToggle = screen . getByRole ( 'button' , { name : 'Toggle settings menu' } )
207+ const menuToggle = screen . getByRole ( 'button' , {
208+ name : 'Toggle settings menu' ,
209+ } )
218210 await user . click ( menuToggle )
219-
211+
220212 // Then close it
221213 await user . click ( menuToggle )
222-
214+
223215 // Just verify the toggle button is still there after clicking twice
224216 expect ( menuToggle ) . toBeInTheDocument ( )
225217 } )
226218
227219 it ( 'hides llamacpp provider during setup remote provider step' , async ( ) => {
228220 const user = userEvent . setup ( )
229-
221+
230222 vi . mocked ( useMatches ) . mockReturnValue ( [
231223 {
232224 routeId : '/settings/providers/' ,
233225 params : { } ,
234226 search : { step : 'setup_remote_provider' } ,
235227 } ,
236228 ] )
237-
229+
238230 render ( < SettingsMenu /> )
239-
231+
240232 // First expand the providers submenu
241233 const chevronButtons = screen . getAllByRole ( 'button' )
242- const chevron = chevronButtons . find ( button =>
234+ const chevron = chevronButtons . find ( ( button ) =>
243235 button . querySelector ( 'svg.tabler-icon-chevron-right' )
244236 )
245237 if ( chevron ) await user . click ( chevron )
246-
238+
247239 // llamacpp provider div should have hidden class
248240 const llamacppElement = screen . getByTestId ( 'provider-avatar-llama.cpp' )
249241 expect ( llamacppElement . parentElement ) . toHaveClass ( 'hidden' )
@@ -253,7 +245,7 @@ describe('SettingsMenu', () => {
253245
254246 it ( 'filters out inactive providers from submenu' , async ( ) => {
255247 const user = userEvent . setup ( )
256-
248+
257249 vi . mocked ( useModelProvider ) . mockReturnValue ( {
258250 providers : [
259251 {
@@ -268,17 +260,19 @@ describe('SettingsMenu', () => {
268260 } ,
269261 ] ,
270262 } )
271-
263+
272264 render ( < SettingsMenu /> )
273-
265+
274266 // Expand providers
275267 const chevronButtons = screen . getAllByRole ( 'button' )
276- const chevron = chevronButtons . find ( button =>
268+ const chevron = chevronButtons . find ( ( button ) =>
277269 button . querySelector ( 'svg.tabler-icon-chevron-right' )
278270 )
279271 if ( chevron ) await user . click ( chevron )
280-
272+
281273 expect ( screen . getByTestId ( 'provider-avatar-openai' ) ) . toBeInTheDocument ( )
282- expect ( screen . queryByTestId ( 'provider-avatar-anthropic' ) ) . not . toBeInTheDocument ( )
274+ expect (
275+ screen . queryByTestId ( 'provider-avatar-anthropic' )
276+ ) . not . toBeInTheDocument ( )
283277 } )
284- } )
278+ } )
0 commit comments