11import { testBothModes , renderInMode } from "./TUIChat.dualModeHelper.js" ;
2+ import {
3+ waitForFrameToContain ,
4+ waitForFrameToNotContain ,
5+ } from "./TUIChat.testHelper.js" ;
26
37/**
48 * Integration tests for the message edit feature in TUIChat
@@ -16,9 +20,10 @@ describe("TUIChat - Message Edit Feature", () => {
1620 const { lastFrame, stdin } = renderInMode ( mode ) ;
1721
1822 // Verify selector is not open initially
19- let frame = lastFrame ( ) ;
20- expect ( frame ) . toBeDefined ( ) ;
21- expect ( frame ) . not . toContain ( "No user messages to edit" ) ;
23+ let frame = await waitForFrameToNotContain (
24+ lastFrame ,
25+ "No user messages to edit" ,
26+ ) ;
2227
2328 // Press Esc twice quickly (within 500ms)
2429 stdin . write ( "\u001b" ) ; // First Esc
@@ -28,9 +33,7 @@ describe("TUIChat - Message Edit Feature", () => {
2833 await new Promise ( ( resolve ) => setTimeout ( resolve , 100 ) ) ;
2934
3035 // Verify selector is now open
31- frame = lastFrame ( ) ;
32- expect ( frame ) . toBeDefined ( ) ;
33- expect ( frame ) . toContain ( "No user messages to edit" ) ;
36+ frame = await waitForFrameToContain ( lastFrame , "No user messages to edit" ) ;
3437 } ) ;
3538
3639 testBothModes ( "edit selector should handle navigation" , async ( mode ) => {
@@ -42,9 +45,10 @@ describe("TUIChat - Message Edit Feature", () => {
4245 await new Promise ( ( resolve ) => setTimeout ( resolve , 100 ) ) ;
4346
4447 // Verify selector is open
45- let frame = lastFrame ( ) ;
46- expect ( frame ) . toBeDefined ( ) ;
47- expect ( frame ) . toContain ( "No user messages to edit" ) ;
48+ let frame = await waitForFrameToContain (
49+ lastFrame ,
50+ "No user messages to edit" ,
51+ ) ;
4852
4953 // Try navigation keys
5054 stdin . write ( "j" ) ; // Down
@@ -54,9 +58,7 @@ describe("TUIChat - Message Edit Feature", () => {
5458 await new Promise ( ( resolve ) => setTimeout ( resolve , 50 ) ) ;
5559
5660 // Verify selector is still open after navigation
57- frame = lastFrame ( ) ;
58- expect ( frame ) . toBeDefined ( ) ;
59- expect ( frame ) . toContain ( "No user messages to edit" ) ;
61+ frame = await waitForFrameToContain ( lastFrame , "No user messages to edit" ) ;
6062 } ) ;
6163
6264 testBothModes ( "edit selector should exit with Esc" , async ( mode ) => {
@@ -68,18 +70,20 @@ describe("TUIChat - Message Edit Feature", () => {
6870 await new Promise ( ( resolve ) => setTimeout ( resolve , 100 ) ) ;
6971
7072 // Verify edit selector is open
71- let frame = lastFrame ( ) ;
72- expect ( frame ) . toBeDefined ( ) ;
73- expect ( frame ) . toContain ( "No user messages to edit" ) ;
73+ let frame = await waitForFrameToContain (
74+ lastFrame ,
75+ "No user messages to edit" ,
76+ ) ;
7477
7578 // Press Esc to exit
7679 stdin . write ( "\u001b" ) ;
7780 await new Promise ( ( resolve ) => setTimeout ( resolve , 100 ) ) ;
7881
7982 // Verify edit selector is closed
80- frame = lastFrame ( ) ;
81- expect ( frame ) . toBeDefined ( ) ;
82- expect ( frame ) . not . toContain ( "No user messages to edit" ) ;
83+ frame = await waitForFrameToNotContain (
84+ lastFrame ,
85+ "No user messages to edit" ,
86+ ) ;
8387 } ) ;
8488
8589 testBothModes ( "should handle edit flow without crashing" , async ( mode ) => {
@@ -122,22 +126,25 @@ describe("TUIChat - Message Edit Feature", () => {
122126 await new Promise ( ( resolve ) => setTimeout ( resolve , 100 ) ) ;
123127
124128 // Verify selector opened
125- let frame = lastFrame ( ) ;
126- expect ( frame ) . toBeDefined ( ) ;
127- expect ( frame ) . toContain ( "No user messages to edit" ) ;
129+ let frame = await waitForFrameToContain (
130+ lastFrame ,
131+ "No user messages to edit" ,
132+ ) ;
128133
129134 stdin . write ( "k" ) ; // Navigate (no-op with 0 messages)
130135 await new Promise ( ( resolve ) => setTimeout ( resolve , 50 ) ) ;
131136
132137 stdin . write ( "\u001b" ) ; // Close
133138 await new Promise ( ( resolve ) => setTimeout ( resolve , 100 ) ) ;
134139
135- frame = lastFrame ( ) ;
140+ frame = await waitForFrameToNotContain (
141+ lastFrame ,
142+ "No user messages to edit" ,
143+ ) ;
136144
137145 // UI should remain stable and edit selector should be closed
138146 expect ( frame ) . toBeDefined ( ) ;
139147 expect ( frame ! . length ) . toBeGreaterThan ( 0 ) ;
140- expect ( frame ) . not . toContain ( "No user messages to edit" ) ;
141148 } ,
142149 ) ;
143150} ) ;
@@ -207,17 +214,19 @@ describe("TUIChat - Edit Feature Edge Cases", () => {
207214 await new Promise ( ( resolve ) => setTimeout ( resolve , 600 ) ) ; // Wait longer than 500ms threshold
208215
209216 // Verify selector did not open
210- let frame = lastFrame ( ) ;
211- expect ( frame ) . toBeDefined ( ) ;
212- expect ( frame ) . not . toContain ( "No user messages to edit" ) ;
217+ let frame = await waitForFrameToNotContain (
218+ lastFrame ,
219+ "No user messages to edit" ,
220+ ) ;
213221
214222 stdin . write ( "\u001b" ) ; // Another single Esc after timeout
215223 await new Promise ( ( resolve ) => setTimeout ( resolve , 100 ) ) ;
216224
217225 // Verify selector still did not open
218- frame = lastFrame ( ) ;
219- expect ( frame ) . toBeDefined ( ) ;
220- expect ( frame ) . not . toContain ( "No user messages to edit" ) ;
226+ frame = await waitForFrameToNotContain (
227+ lastFrame ,
228+ "No user messages to edit" ,
229+ ) ;
221230 } ) ;
222231
223232 testBothModes (
0 commit comments