@@ -223,12 +223,18 @@ async function mockBackendAPIs(page: Page) {
223223 messages : { messages : [ ...accumulatedMessages ] } ,
224224 } ) ,
225225 } ) ;
226+ } else if ( route . request ( ) . method ( ) === "GET" ) {
227+ // FIX: Handle GET so loadConversation doesn't hang in mock mode.
228+ // See detailed comment in chat.spec.ts mockBackendAPIs.
229+ await route . fulfill ( {
230+ status : 200 ,
231+ contentType : "application/json" ,
232+ body : JSON . stringify ( { messages : [ ...accumulatedMessages ] } ) ,
233+ } ) ;
226234 } else {
227235 await route . continue ( ) ;
228236 }
229237 } ) ;
230-
231- // Conversations list
232238 await page . route ( / \/ a p i \/ a t t a c k s \/ [ ^ / ] + \/ c o n v e r s a t i o n s / , async ( route ) => {
233239 if ( route . request ( ) . method ( ) === "GET" ) {
234240 await route . fulfill ( {
@@ -340,7 +346,7 @@ async function activateMockTarget(page: Page) {
340346 await expect ( setActiveBtn ) . toBeVisible ( { timeout : 5000 } ) ;
341347 await setActiveBtn . click ( ) ;
342348
343- await page . getByTitle ( "Chat" ) . click ( ) ;
349+ await page . getByTitle ( "Chat" , { exact : true } ) . click ( ) ;
344350 await expect ( page . getByText ( "PyRIT Attack" ) ) . toBeVisible ( { timeout : 5000 } ) ;
345351}
346352
@@ -351,9 +357,9 @@ async function selectConverter(page: Page, converterName: string) {
351357 await expect ( page . getByTestId ( "converter-panel" ) ) . toBeVisible ( { timeout : 5000 } ) ;
352358
353359 // Open combobox and select
354- const combobox = page . getByRole ( "combobox ") ;
360+ const combobox = page . getByTestId ( "converter-panel-select ") ;
355361 await combobox . click ( ) ;
356- await page . getByRole ( " option" , { name : new RegExp ( converterName ) } ) . click ( ) ;
362+ await page . getByTestId ( `converter- option- ${ converterName } ` ) . click ( ) ;
357363
358364 // Wait for detail card
359365 await expect ( page . getByTestId ( `converter-item-${ converterName } ` ) ) . toBeVisible ( { timeout : 5000 } ) ;
@@ -376,19 +382,19 @@ test.describe("Converter Panel", () => {
376382
377383 // Panel should appear with combobox
378384 await expect ( page . getByTestId ( "converter-panel" ) ) . toBeVisible ( { timeout : 5000 } ) ;
379- const combobox = page . getByRole ( "combobox ") ;
385+ const combobox = page . getByTestId ( "converter-panel-select ") ;
380386 await expect ( combobox ) . toBeVisible ( ) ;
381387
382388 // Open dropdown — converters should be listed
383389 await combobox . click ( ) ;
384- await expect ( page . getByRole ( " option" , { name : / B a s e 6 4 C o n v e r t e r / } ) ) . toBeVisible ( ) ;
385- await expect ( page . getByRole ( " option" , { name : / C a e s a r C o n v e r t e r / } ) ) . toBeVisible ( ) ;
386- await expect ( page . getByRole ( " option" , { name : / T r a n s l a t i o n C o n v e r t e r / } ) ) . toBeVisible ( ) ;
390+ await expect ( page . getByTestId ( "converter- option- Base64Converter" ) ) . toBeVisible ( ) ;
391+ await expect ( page . getByTestId ( "converter- option- CaesarConverter" ) ) . toBeVisible ( ) ;
392+ await expect ( page . getByTestId ( "converter- option- TranslationConverter" ) ) . toBeVisible ( ) ;
387393 } ) ;
388394
389395 test ( "should select a converter, show details and preview output" , async ( { page } ) => {
390396 // Type text BEFORE opening panel
391- await page . getByRole ( "textbox ") . fill ( "hello" ) ;
397+ await page . getByTestId ( "chat-input ") . fill ( "hello" ) ;
392398
393399 // Select Base64Converter
394400 await selectConverter ( page , "Base64Converter" ) ;
@@ -402,7 +408,7 @@ test.describe("Converter Panel", () => {
402408
403409 test ( "should apply converted value and send message with original+converted sections" , async ( { page } ) => {
404410 // Type text BEFORE opening the converter panel
405- await page . getByRole ( "textbox ") . fill ( "hello" ) ;
411+ await page . getByTestId ( "chat-input ") . fill ( "hello" ) ;
406412
407413 // Select converter and wait for auto-preview
408414 await selectConverter ( page , "Base64Converter" ) ;
@@ -421,7 +427,7 @@ test.describe("Converter Panel", () => {
421427 await expect ( page . getByTestId ( "converter-panel" ) ) . not . toBeVisible ( ) ;
422428
423429 // Send the message
424- await page . getByRole ( "button" , { name : / s e n d / i } ) . click ( ) ;
430+ await page . getByTestId ( " send-message-btn" ) . click ( ) ;
425431
426432 // Wait for the user message to appear (local optimistic display)
427433 // The converted value (base64 of "hello") should be shown
@@ -431,21 +437,21 @@ test.describe("Converter Panel", () => {
431437
432438 test ( "should show converter badge in attack history after sending with converter" , async ( { page } ) => {
433439 // Type text BEFORE opening panel
434- await page . getByRole ( "textbox ") . fill ( "hello" ) ;
440+ await page . getByTestId ( "chat-input ") . fill ( "hello" ) ;
435441 await selectConverter ( page , "Base64Converter" ) ;
436442 await expect ( page . getByTestId ( "use-converted-btn" ) ) . toBeVisible ( { timeout : 10000 } ) ;
437443 await page . getByTestId ( "use-converted-btn" ) . click ( ) ;
438444
439445 // Close converter panel before sending
440446 await page . getByTestId ( "close-converter-panel-btn" ) . click ( ) ;
441447
442- await page . getByRole ( "button" , { name : / s e n d / i } ) . click ( ) ;
448+ await page . getByTestId ( " send-message-btn" ) . click ( ) ;
443449
444450 // Wait for response to confirm send completed
445451 await expect ( page . getByText ( / M o c k r e s p o n s e f o r : / ) ) . toBeVisible ( { timeout : 15000 } ) ;
446452
447453 // Navigate to History view
448- await page . getByTitle ( "History" ) . click ( ) ;
454+ await page . getByTitle ( "Attack History" ) . click ( ) ;
449455
450456 // Converter badge should appear in the attack table
451457 await expect ( page . getByText ( "Base64Converter" ) ) . toBeVisible ( { timeout : 10000 } ) ;
@@ -454,7 +460,7 @@ test.describe("Converter Panel", () => {
454460 test ( "should show validation error when required parameter is missing" , async ( { page } ) => {
455461 // Type text
456462 // Type text BEFORE opening panel
457- await page . getByRole ( "textbox ") . fill ( "hello" ) ;
463+ await page . getByTestId ( "chat-input ") . fill ( "hello" ) ;
458464
459465 // Select CaesarConverter (has required caesar_offset param)
460466 await selectConverter ( page , "CaesarConverter" ) ;
@@ -476,20 +482,20 @@ test.describe("Converter Panel", () => {
476482 await expect ( page . getByTestId ( "converter-panel" ) ) . toBeVisible ( { timeout : 5000 } ) ;
477483
478484 // Open combobox
479- const combobox = page . getByRole ( "combobox ") ;
485+ const combobox = page . getByTestId ( "converter-panel-select ") ;
480486 await combobox . click ( ) ;
481487
482488 // Text converters should be visible
483- await expect ( page . getByRole ( " option" , { name : / B a s e 6 4 C o n v e r t e r / } ) ) . toBeVisible ( ) ;
484- await expect ( page . getByRole ( " option" , { name : / C a e s a r C o n v e r t e r / } ) ) . toBeVisible ( ) ;
489+ await expect ( page . getByTestId ( "converter- option- Base64Converter" ) ) . toBeVisible ( ) ;
490+ await expect ( page . getByTestId ( "converter- option- CaesarConverter" ) ) . toBeVisible ( ) ;
485491
486492 // Image-only converter should NOT appear
487- await expect ( page . getByRole ( " option" , { name : / I m a g e C o m p r e s s i o n C o n v e r t e r / } ) ) . not . toBeVisible ( ) ;
493+ await expect ( page . getByTestId ( "converter- option- ImageCompressionConverter" ) ) . not . toBeVisible ( ) ;
488494 } ) ;
489495
490496 test ( "should show converter type in history filter options" , async ( { page } ) => {
491497 // Navigate to History view
492- await page . getByTitle ( "History" ) . click ( ) ;
498+ await page . getByTitle ( "Attack History" ) . click ( ) ;
493499
494500 // The converter badge should be visible in the attack table
495501 await expect ( page . getByText ( "Base64Converter" ) ) . toBeVisible ( { timeout : 10000 } ) ;
0 commit comments