@@ -7,6 +7,16 @@ import { Variable } from '@/helpers/variables'
77
88import { simpleSubstitute , VariableInfoMap } from '../RichTextEditor/utils'
99
10+ interface TableData {
11+ columns ?: { name : string } [ ]
12+ rows ?: unknown [ ]
13+ }
14+
15+ const STEP_ID_REGEX =
16+ / s t e p \. [ 0 - 9 a - f ] { 8 } - [ 0 - 9 a - f ] { 4 } - [ 0 - 9 a - f ] { 4 } - [ 0 - 9 a - f ] { 4 } - [ 0 - 9 a - f ] { 12 } / i
17+
18+ const getTableData = ( data : unknown ) : TableData => data as TableData
19+
1020const deepCompare = ( a : any , b : any , varInfoMap : VariableInfoMap ) : boolean => {
1121 if ( a === b ) {
1222 return true
@@ -98,6 +108,32 @@ export const matchParamsToDataIn = (
98108 )
99109 }
100110
111+ // NOTE: special handling for for-each step
112+ if ( key === 'items' ) {
113+ const match = String ( paramValue ) . match ( STEP_ID_REGEX )
114+ const searchKey = match ?. [ 0 ]
115+ if ( ! searchKey ) {
116+ return false
117+ }
118+
119+ const tableData = getTableData ( lastTest )
120+ const varRowsFound = varInfoMap . get (
121+ `{{${ searchKey } .rowsFound}}` ,
122+ ) ?. testRunValue
123+
124+ if ( Number ( varRowsFound ) !== Number ( tableData . rows ?. length ) ) {
125+ return false
126+ }
127+
128+ const lastTestColumns = tableData . columns ?. map ( ( c ) => c . name ) ?? [ ]
129+ const varInfo = Array . from ( varInfoMap . entries ( ) )
130+ . filter ( ( [ key ] ) => key . includes ( `${ searchKey } .data` ) )
131+ . map ( ( [ , value ] ) => value )
132+ const varColumns = new Set ( varInfo . map ( ( item ) => item . label ) )
133+
134+ return lastTestColumns . every ( ( label ) => varColumns . has ( label ) )
135+ }
136+
101137 // Handle arrays and objects using deep comparison
102138 if ( Array . isArray ( paramValue ) || typeof paramValue === 'object' ) {
103139 return deepCompare ( paramValue , lastTest , varInfoMap )
0 commit comments