@@ -10,29 +10,25 @@ import {afterEach, describe, it} from 'node:test';
1010
1111import sinon from 'sinon' ;
1212
13- import type { McpResponse } from '../../src/McpResponse .js' ;
13+ import type { ParsedArguments } from '../../src/cli .js' ;
1414import {
1515 installExtension ,
1616 uninstallExtension ,
1717 listExtensions ,
1818 reloadExtension ,
19+ triggerExtensionAction ,
1920} from '../../src/tools/extensions.js' ;
20- import { withMcpContext } from '../utils.js' ;
21+ import { extractExtensionId , withMcpContext } from '../utils.js' ;
2122
23+ const EXTENSION_WITH_SW_PATH = path . join (
24+ import . meta. dirname ,
25+ '../../../tests/tools/fixtures/extension-sw' ,
26+ ) ;
2227const EXTENSION_PATH = path . join (
2328 import . meta. dirname ,
2429 '../../../tests/tools/fixtures/extension' ,
2530) ;
2631
27- export 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-
3632describe ( 'extension' , ( ) => {
3733 afterEach ( ( ) => {
3834 sinon . restore ( ) ;
@@ -47,7 +43,7 @@ describe('extension', () => {
4743 context ,
4844 ) ;
4945
50- const extensionId = extractId ( response ) ;
46+ const extensionId = extractExtensionId ( response ) ;
5147 const page = context . getSelectedPptrPage ( ) ;
5248 await page . goto ( 'chrome://extensions' ) ;
5349
@@ -102,7 +98,7 @@ describe('extension', () => {
10298 context ,
10399 ) ;
104100
105- const extensionId = extractId ( response ) ;
101+ const extensionId = extractExtensionId ( response ) ;
106102 const installSpy = sinon . spy ( context , 'installExtension' ) ;
107103 response . resetResponseLineForTesting ( ) ;
108104
@@ -128,4 +124,36 @@ describe('extension', () => {
128124 assert . ok ( reinstalled , 'Extension should be present after reload' ) ;
129125 } ) ;
130126 } ) ;
127+ it ( 'triggers an extension action' , async ( ) => {
128+ await withMcpContext (
129+ async ( response , context ) => {
130+ const extensionId = await context . installExtension (
131+ EXTENSION_WITH_SW_PATH ,
132+ ) ;
133+
134+ const targetsBefore = context . browser . targets ( ) ;
135+ const pageTargetBefore = targetsBefore . find (
136+ t => t . type ( ) === 'page' && t . url ( ) . includes ( extensionId ) ,
137+ ) ;
138+ assert . ok ( ! pageTargetBefore , 'Page should not exist before action' ) ;
139+
140+ await triggerExtensionAction . handler (
141+ { params : { id : extensionId } } ,
142+ response ,
143+ context ,
144+ ) ;
145+
146+ const pageTargetAfter = await context . browser . waitForTarget (
147+ t => t . type ( ) === 'page' && t . url ( ) . includes ( extensionId ) ,
148+ ) ;
149+ assert . ok ( pageTargetAfter , 'Page should exist after action' ) ;
150+ } ,
151+ {
152+ executablePath : process . env . CANARY_EXECUTABLE_PATH ,
153+ } ,
154+ {
155+ categoryExtensions : true ,
156+ } as ParsedArguments ,
157+ ) ;
158+ } ) ;
131159} ) ;
0 commit comments