@@ -26,10 +26,42 @@ import {
2626
2727const REFERENCE_ERROR_CODE = 'Referenced records must be removed before deletion' ;
2828const deleteTargetProgramIds = new Set ( ) ;
29- const blockedProgramIds = new Set ( ) ;
29+
30+ const getProjectId = ( project ) => project . cadTrustProjectId || project . cad_trust_project_id ;
31+ const getProgramId = ( project ) => project . cadTrustProgramId || project . cad_trust_program_id ;
32+
33+ const getProjectStagingReferences = async ( request ) => {
34+ const pendingDeleteProjectIds = new Set ( ) ;
35+ const stagedReferencedProgramIds = new Set ( ) ;
36+ const response = await request
37+ . get ( '/v2/staging' )
38+ . query ( { page : 1 , limit : 1000 , table : 'project' , type : 'staged' } )
39+ . expect ( 200 ) ;
40+ const rows = response . body ?. data || response . body || [ ] ;
41+
42+ for ( const row of rows ) {
43+ const records = row . diff ?. change || [ ] ;
44+ for ( const record of records ) {
45+ const projectId = getProjectId ( record ) ;
46+ const programId = getProgramId ( record ) ;
47+ if ( row . action === 'DELETE' && projectId ) {
48+ pendingDeleteProjectIds . add ( projectId ) ;
49+ } else if ( [ 'INSERT' , 'UPDATE' ] . includes ( row . action ) && programId ) {
50+ stagedReferencedProgramIds . add ( programId ) ;
51+ }
52+ }
53+ }
54+
55+ return { pendingDeleteProjectIds, stagedReferencedProgramIds } ;
56+ } ;
3057
3158const getReferencedProgramIds = async ( request ) => {
3259 const referencedProgramIds = new Set ( ) ;
60+ const { pendingDeleteProjectIds, stagedReferencedProgramIds } = await getProjectStagingReferences ( request ) ;
61+ for ( const programId of stagedReferencedProgramIds ) {
62+ referencedProgramIds . add ( programId ) ;
63+ }
64+
3365 let page = 1 ;
3466 const limit = 1000 ;
3567 let hasMore = true ;
@@ -38,8 +70,10 @@ const getReferencedProgramIds = async (request) => {
3870 const response = await request . get ( '/v2/project' ) . query ( { page, limit } ) . expect ( 200 ) ;
3971 const data = Array . isArray ( response . body ) ? response . body : ( response . body ?. data || [ ] ) ;
4072 for ( const project of data ) {
41- if ( project . cadTrustProgramId ) {
42- referencedProgramIds . add ( project . cadTrustProgramId ) ;
73+ const projectId = getProjectId ( project ) ;
74+ const programId = getProgramId ( project ) ;
75+ if ( programId && ! pendingDeleteProjectIds . has ( projectId ) ) {
76+ referencedProgramIds . add ( programId ) ;
4377 }
4478 }
4579
@@ -299,17 +333,20 @@ describe('Program Live API Validation Tests', function () {
299333 return ;
300334 }
301335 idsToDelete . forEach ( ( id ) => deleteTargetProgramIds . add ( id ) ) ;
336+ const expectedReferencedProgramIds = await getReferencedProgramIds ( request ) ;
302337
303338 // Delete in reverse order
304339 for ( let i = idsToDelete . length - 1 ; i >= 0 ; i -- ) {
305340 const id = idsToDelete [ i ] ;
306341 const response = await makeDeleteRequest ( request , '/v2/program' , id ) ;
307- if ( response . success === false && response . error === REFERENCE_ERROR_CODE ) {
342+ if ( expectedReferencedProgramIds . has ( id ) ) {
343+ expect ( response . success ) . to . be . false ;
344+ expect ( response . error ) . to . equal ( REFERENCE_ERROR_CODE ) ;
308345 expect ( response . references ) . to . be . an ( 'array' ) . that . is . not . empty ;
309346 expect ( response . references . some ( ( ref ) => ref . table === 'project' && ref . count > 0 ) ) . to . be . true ;
310- blockedProgramIds . add ( id ) ;
311347 continue ;
312348 }
349+
313350 expect ( response . success ) . to . be . true ;
314351
315352 if ( shouldAutoCommit ( ) ) {
@@ -339,7 +376,7 @@ describe('Program Live API Validation Tests', function () {
339376 }
340377 expect ( response . status ) . to . equal ( 200 ) ;
341378 expect (
342- referencedProgramIds . has ( id ) || blockedProgramIds . has ( id ) ,
379+ referencedProgramIds . has ( id ) ,
343380 `Program ${ id } remains without committed or delete-time project references` ,
344381 ) . to . be . true ;
345382 }
0 commit comments