@@ -8,7 +8,10 @@ import assert from 'node:assert';
88import path from 'node:path' ;
99import { describe , it } from 'node:test' ;
1010
11- import { installExtension } from '../../src/tools/extensions.js' ;
11+ import {
12+ installExtension ,
13+ uninstallExtension ,
14+ } from '../../src/tools/extensions.js' ;
1215import { withMcpContext } from '../utils.js' ;
1316
1417const EXTENSION_PATH = path . join (
@@ -17,8 +20,9 @@ const EXTENSION_PATH = path.join(
1720) ;
1821
1922describe ( 'extension' , ( ) => {
20- it ( 'installs an extension and verifies it is listed in chrome://extensions' , async ( ) => {
23+ it ( 'installs and uninstalls an extension and verifies it in chrome://extensions' , async ( ) => {
2124 await withMcpContext ( async ( response , context ) => {
25+ // Install the extension
2226 await installExtension . handler (
2327 { params : { path : EXTENSION_PATH } } ,
2428 response ,
@@ -41,6 +45,30 @@ describe('extension', () => {
4145 element ,
4246 `Extension with ID "${ extensionId } " should be visible on chrome://extensions` ,
4347 ) ;
48+
49+ // Uninstall the extension
50+ await uninstallExtension . handler (
51+ { params : { id : extensionId ! } } ,
52+ response ,
53+ context ,
54+ ) ;
55+
56+ const uninstallResponseLine = response . responseLines [ 1 ] ;
57+ assert . ok (
58+ uninstallResponseLine . includes ( 'Extension uninstalled' ) ,
59+ 'Response should indicate uninstallation' ,
60+ ) ;
61+
62+ await page . waitForSelector ( 'extensions-manager' ) ;
63+
64+ const elementAfterUninstall = await page . $ (
65+ `extensions-manager >>> extensions-item[id="${ extensionId } "]` ,
66+ ) ;
67+ assert . strictEqual (
68+ elementAfterUninstall ,
69+ null ,
70+ `Extension with ID "${ extensionId } " should NOT be visible on chrome://extensions` ,
71+ ) ;
4472 } ) ;
4573 } ) ;
4674} ) ;
0 commit comments