The structured coverage rows link required rules to their scenarios. A covered category has a defined check; executable coverage and successful execution require separate evidence. The category map keeps incomplete lifecycle matrices and other missing checks visible as findings.
Saved submission reaches approval unchanged. A later edit changes the approved job's result. A stale deletion approval removes nothing. Dialog approval is tied to its saved preview. The interaction scenarios use the related capabilities' rule references and identify the shared fixture and observable outcome.
Coverage
Rulecovered
Transitiongap: FND-PFM-DJE-062
Validationcovered
Permissiongap: FND-PFM-DJE-062
Edgegap: FND-PFM-DJE-062
Failuregap: FND-PFM-DJE-062
Boundarycovered
Concurrencygap: FND-PFM-DJE-062
Invariantgap: FND-PFM-DJE-062
Interactioncovered
Test Scenarios
9 scenarios proving CAP-PFM-DJE-002; 4 bound to an existing test.
01Validation leaves records intacttransitionapitest
[
{
"do": "Validate the request and inspect its job detail.",
"expect": "The job waits in validated state and exposes planned impact and outcomes; target records are unchanged.",
"provenance": "test",
"source": "services-crm:modules/data-jobs/tests/integration/services/jobs/contact-data-jobs.integration.spec.js#changes nothing while it is validating"
}
]
Expected
The job waits in validated state and exposes planned impact and outcomes; target records are unchanged.
[
{
"do": "Attempt approval without a fingerprint, with a different one, and with the saved one.",
"expect": "Invalid fingerprints are refused while the jobs remain validated; a matching approval queues work.",
"provenance": "test",
"source": "services-crm:modules/data-jobs/tests/integration/services/jobs/contact-data-jobs.integration.spec.js#refuses an apply of the validated update that echoes no impact digest"
}
]
Expected
Invalid fingerprints are refused while the jobs remain validated; a matching approval queues work.
Prepare a job whose validation finished 25 hours earlier.
Steps
[
{
"do": "Read the job and then attempt approval.",
"expect": "The read still shows validated; approval expires the job and is refused.",
"provenance": "proposed",
"source": "macroservice-libraries:packages/data-jobs/src/job-control.ts:applyValidatedJob"
}
]
Expected
The read still shows validated; approval expires the job and is refused.
Submit an organization job directly for application.
Steps
[
{
"do": "Invoke its apply action.",
"expect": "The response is 409.",
"provenance": "test",
"source": "services-crm:modules/data-jobs/tests/e2e/organization-update.e2e.spec.js#refuses the apply of a job that was never validated with 409, because an apply is the approval of a validation"
}
]
[
{
"do": "Combine those reports.",
"expect": "Change counts, affected-collection counts and blocked-reason counts are added.",
"provenance": "test",
"source": "macroservice-libraries:packages/data-jobs/src/define-data-operation.spec.ts#adds the counts, which is what makes a digest speak for every batch and not the last one"
}
]
Expected
Change counts, affected-collection counts and blocked-reason counts are added.
Create two contacts with distinct starting values.
Steps
[
{
"do": "Submit a common change for validation, alter the caller's local request, and approve the saved preview.",
"expect": "The contacts receive the saved change; the altered local request supplies no replacement input.",
"provenance": "proposed",
"source": "services-crm:modules/data-jobs/tests/integration/services/jobs/contact-data-jobs.integration.spec.js#freezes the patch on every item, so a later apply writes what was submitted and not what is asked for then; services-crm:modules/data-jobs/tests/integration/services/jobs/contact-data-jobs.integration.spec.js#changes nothing while it is validating; services-crm:modules/data-jobs/tests/integration/services/jobs/contact-data-jobs.integration.spec.js#refuses an apply of the validated update whose digest is not the one the validation answered"
}
]
Expected
The contacts receive the saved change; the altered local request supplies no replacement input.
Data
Create two contacts with distinct starting values.
Prepare two contacts and a validated title change.
Steps
[
{
"do": "Edit one contact after preview and approve the original fingerprint.",
"expect": "The edited contact remains intact with a conflict while the other receives the saved title.",
"provenance": "proposed",
"source": "services-crm:modules/data-jobs/tests/integration/services/jobs/contact-data-jobs.integration.spec.js#changes nothing while it is validating; services-crm:modules/data-jobs/tests/integration/services/jobs/contact-data-jobs.integration.spec.js#refuses an apply of the validated update whose digest is not the one the validation answered; services-crm:modules/data-jobs/tests/integration/services/jobs/contact-update-versions.integration.spec.js#skips the contact that changed after the validation as a named conflict; services-crm:modules/data-jobs/services/operations/contact-update.ts:prevalidate"
}
]
Expected
The edited contact remains intact with a conflict while the other receives the saved title.
Data
Prepare two contacts and a validated title change.
Prepare a deletion preview with eligible and blocked contacts.
Steps
[
{
"do": "Attempt approval with another fingerprint or count phrase, inspect the records, then send the returned approval values.",
"expect": "Refused approvals preserve every record; the matching approval removes only eligible contacts.",
"provenance": "proposed",
"source": "services-crm:modules/data-jobs/tests/integration/services/jobs/contact-data-jobs.integration.spec.js#refuses an apply of the validated update whose digest is not the one the validation answered; services-crm:modules/data-jobs/tests/integration/services/jobs/contact-delete.integration.spec.js#refuses a delete submitted to be applied, because a delete is validated first; services-crm:modules/data-jobs/tests/integration/services/jobs/contact-delete.integration.spec.js#refuses an apply whose confirmation names another number of contacts"
}
]
Expected
Refused approvals preserve every record; the matching approval removes only eligible contacts.
Data
Prepare a deletion preview with eligible and blocked contacts.
Open a contact deletion dialog with an eligible selection.
Steps
[
{
"do": "Enter incorrect approval text, verify no apply request, then approve the returned phrase and repeat the click.",
"expect": "Incorrect text sends no approval and the accepted click applies one saved preview.",
"provenance": "proposed",
"source": "services-crm:modules/data-jobs/tests/integration/services/jobs/contact-data-jobs.integration.spec.js#refuses an apply of the validated update whose digest is not the one the validation answered; react-console:acceptance/data-jobs/playwright/journeys/dialogs/DJE-ACC-0112.spec.ts#DJE-ACC-0112; react-console:acceptance/data-jobs/playwright/journeys/dialogs/DJE-ACC-0105.spec.ts#DJE-ACC-0105"
}
]
Expected
Incorrect text sends no approval and the accepted click applies one saved preview.
Data
Open a contact deletion dialog with an eligible selection.