Skip to content

Commit e445c91

Browse files
committed
fix(V2): assert expected program delete outcomes
1 parent 1237cd6 commit e445c91

1 file changed

Lines changed: 43 additions & 6 deletions

File tree

tests/v2/live-api/program-validation.live.spec.js

Lines changed: 43 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,42 @@ import {
2626

2727
const REFERENCE_ERROR_CODE = 'Referenced records must be removed before deletion';
2828
const 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

3158
const 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

Comments
 (0)