@@ -10,10 +10,12 @@ import {describe, it} from 'node:test';
1010
1111import sinon from 'sinon' ;
1212
13+ import type { McpResponse } from '../../src/McpResponse.js' ;
1314import {
1415 installExtension ,
1516 uninstallExtension ,
1617 listExtensions ,
18+ reloadExtension ,
1719} from '../../src/tools/extensions.js' ;
1820import { withMcpContext } from '../utils.js' ;
1921
@@ -22,6 +24,15 @@ const EXTENSION_PATH = path.join(
2224 '../../../tests/tools/fixtures/extension' ,
2325) ;
2426
27+ function extractId ( response : McpResponse ) {
28+ const responseLine = response . responseLines [ 0 ] ;
29+ assert . ok ( responseLine , 'Response should not be empty' ) ;
30+ const match = responseLine . match ( / E x t e n s i o n i n s t a l l e d \. I d : ( .+ ) / ) ;
31+ const extensionId = match ? match [ 1 ] : null ;
32+ assert . ok ( extensionId , 'Response should contain a valid key' ) ;
33+ return extensionId ;
34+ }
35+
2536describe ( 'extension' , ( ) => {
2637 it ( 'installs and uninstalls an extension and verifies it in chrome://extensions' , async ( ) => {
2738 await withMcpContext ( async ( response , context ) => {
@@ -32,12 +43,7 @@ describe('extension', () => {
3243 context ,
3344 ) ;
3445
35- const responseLine = response . responseLines [ 0 ] ;
36- assert . ok ( responseLine , 'Response should not be empty' ) ;
37- const match = responseLine . match ( / E x t e n s i o n i n s t a l l e d \. I d : ( .+ ) / ) ;
38- const extensionId = match ? match [ 1 ] : null ;
39- assert . ok ( extensionId , 'Response should contain a valid key' ) ;
40-
46+ const extensionId = extractId ( response ) ;
4147 const page = context . getSelectedPage ( ) ;
4248 await page . goto ( 'chrome://extensions' ) ;
4349
@@ -84,4 +90,38 @@ describe('extension', () => {
8490 ) ;
8591 } ) ;
8692 } ) ;
93+ it ( 'reloads an extension' , async ( ) => {
94+ await withMcpContext ( async ( response , context ) => {
95+ await installExtension . handler (
96+ { params : { path : EXTENSION_PATH } } ,
97+ response ,
98+ context ,
99+ ) ;
100+
101+ const extensionId = extractId ( response ) ;
102+ const installSpy = sinon . spy ( context , 'installExtension' ) ;
103+ response . resetResponseLineForTesting ( ) ;
104+
105+ await reloadExtension . handler (
106+ { params : { id : extensionId ! } } ,
107+ response ,
108+ context ,
109+ ) ;
110+ assert . ok (
111+ installSpy . calledOnceWithExactly ( EXTENSION_PATH ) ,
112+ 'installExtension should be called with the extension path' ,
113+ ) ;
114+
115+ const reloadResponseLine = response . responseLines [ 0 ] ;
116+ assert . ok (
117+ reloadResponseLine . includes ( 'Extension reloaded' ) ,
118+ 'Response should indicate reload' ,
119+ ) ;
120+
121+ const list = context . listExtensions ( ) ;
122+ assert . ok ( list . length === 1 , 'List should have only one extension' ) ;
123+ const reinstalled = list . find ( e => e . id === extensionId ) ;
124+ assert . ok ( reinstalled , 'Extension should be present after reload' ) ;
125+ } ) ;
126+ } ) ;
87127} ) ;
0 commit comments