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.
Submission commits before processing can account for it. Cancellation accounts for settled and abandoned work. Inspection reconciles partial processing. An invalid owned detail reserves no producer identity. The interaction scenarios use the related capabilities' rule references and identify the shared fixture and observable outcome.
Coverage
Rulecovered
Transitiongap: FND-PFM-DJE-063
Validationgap: FND-PFM-DJE-063
Permissioncovered
Edgecovered
Failurecovered
Boundarycovered
Concurrencycovered
Invariantcovered
Interactioncovered
Test Scenarios
14 scenarios proving CAP-PFM-DJE-003; 9 bound to an existing test.
01Redelivery does not repeat committed changesconcurrencyapitest
[
{
"do": "Process it twice and also deliver two copies concurrently.",
"expect": "Each contact receives one change and one receipt.",
"provenance": "test",
"source": "services-crm:modules/data-jobs/tests/integration/services/queue/data-job-worker.integration.spec.js#applies nothing the second time"
}
]
Prepare 100 contacts with five inputs that are invalid, missing or locked.
Steps
[
{
"do": "Run the contact update.",
"expect": "The job reports 95 applied and five coded refusals; refused records are left intact.",
"provenance": "test",
"source": "services-crm:modules/data-jobs/tests/integration/services/jobs/contact-data-jobs.integration.spec.js#refuses the other five, counting each as what refused it"
}
]
Expected
The job reports 95 applied and five coded refusals; refused records are left intact.
Grant the submitter access to one of two contacts.
Steps
[
{
"do": "Process an update covering both.",
"expect": "The accessible contact changes; the other is reported not found.",
"provenance": "test",
"source": "services-crm:modules/data-jobs/tests/integration/services/jobs/contact-data-jobs.integration.spec.js#rejects that contact as not found, which tells the person nothing about a record they may not see"
}
]
Expected
The accessible contact changes; the other is reported not found.
[
{
"do": "Inspect the refusal information.",
"expect": "The code and affected field are present; the supplied value is absent.",
"provenance": "test",
"source": "services-crm:modules/data-jobs/tests/integration/services/jobs/contact-data-jobs.integration.spec.js#names the rule a refused value broke, and quotes no value of the record"
}
]
Expected
The code and affected field are present; the supplied value is absent.
Prepare 25 objects including one rejected by the database.
Steps
[
{
"do": "Execute the commit unit.",
"expect": "Only the failing object is isolated and refused, within the bounded number of transactions.",
"provenance": "test",
"source": "macroservice-libraries:packages/data-jobs/src/commit-split.spec.ts#halves the unit until the failing object stands alone, and isolates only it"
}
]
Expected
Only the failing object is isolated and refused, within the bounded number of transactions.
Prepare three grouped items with one invalid member and separate ungrouped items.
Steps
[
{
"do": "Apply the request and separately validate it.",
"expect": "The group is unwritten, its other members receive group-member refusals, and the ungrouped items proceed; validation reports equivalent refusals.",
"provenance": "test",
"source": "macroservice-libraries:packages/data-jobs/src/tests/integration/group-refusals.integration.spec.ts#writes none of the group, rejects the other two as group_member_refused, and applies the items of no group"
}
]
Expected
The group is unwritten, its other members receive group-member refusals, and the ungrouped items proceed; validation reports equivalent refusals.
Inject repeated transient errors and a separate systemic error.
Steps
[
{
"do": "Process the job, then resume after the transient condition clears.",
"expect": "The transient case pauses and can finish after recovery; the systemic case fails with a safe summary.",
"provenance": "proposed",
"source": "services-crm:docs/data-jobs.md#What each contact's outcome can be"
}
]
Expected
The transient case pauses and can finish after recovery; the systemic case fails with a safe summary.
Remove bulk access from the submitter of a running job.
Steps
[
{
"do": "Deliver another batch.",
"expect": "The job fails with access revoked, retains commits and marks remaining work unattempted.",
"provenance": "test",
"source": "services-crm:modules/data-jobs/tests/integration/services/queue/data-job-worker.integration.spec.js#fails the whole job with the code, not just the batch"
}
]
Expected
The job fails with access revoked, retains commits and marks remaining work unattempted.
Prepare a contact already holding the requested value.
Steps
[
{
"do": "Process that same change.",
"expect": "The receipt reports applied and unchanged at the existing version; no new history entry is written.",
"provenance": "test",
"source": "services-crm:modules/data-jobs/tests/integration/services/jobs/contact-data-jobs.integration.spec.js#answers the item applied and unchanged, at the version the contact still stands at"
}
]
Expected
The receipt reports applied and unchanged at the existing version; no new history entry is written.
Prepare a submission and a transaction failure immediately before commit.
Steps
[
{
"do": "Refuse the first transaction, inspect job storage, then submit successfully and process the saved batches twice.",
"expect": "The refused submission leaves no job or queued work; the successful job has one committed outcome per position.",
"provenance": "proposed",
"source": "macroservice-libraries:packages/data-jobs/README.md#A worked example: updating contacts in bulk; services-crm:modules/data-jobs/tests/integration/services/queue/data-job-worker.integration.spec.js#changes each contact once between them, whichever delivery got there first"
}
]
Expected
The refused submission leaves no job or queued work; the successful job has one committed outcome per position.
Data
Prepare a submission and a transaction failure immediately before commit.
Prepare a multi-batch job and hold one batch in flight.
Steps
[
{
"do": "Cancel while that batch is active, let it settle, and inspect receipts and unattempted positions.",
"expect": "The active batch may commit once; later batches do not start and the job settles cancelled with unattempted work counted.",
"provenance": "proposed",
"source": "services-crm:modules/data-jobs/tests/integration/services/queue/data-job-worker.integration.spec.js#changes each contact once between them, whichever delivery got there first; services-crm:modules/data-jobs/tests/integration/services/jobs/contact-data-jobs.integration.spec.js#ends the job cancelled, not failed, once the batch it waited for has finished"
}
]
Expected
The active batch may commit once; later batches do not start and the job settles cancelled with unattempted work counted.
Data
Prepare a multi-batch job and hold one batch in flight.
Prepare valid, invalid and inaccessible contacts in one job.
Steps
[
{
"do": "Process the job and read all result and refusal pages alongside the changed records' history.",
"expect": "The pages account for each position; eligible changes have attribution and refusals disclose no record values.",
"provenance": "proposed",
"source": "services-crm:modules/data-jobs/tests/integration/services/jobs/contact-data-jobs.integration.spec.js#refuses the other five, counting each as what refused it; services-crm:modules/data-jobs/tests/integration/services/jobs/contact-data-jobs.integration.spec.js#names the rule a refused value broke, and quotes no value of the record; services-crm:modules/data-jobs/tests/integration/services/jobs/contact-data-jobs.integration.spec.js#answers the next page from the cursor the last one gave, so no item is read twice; services-crm:modules/data-jobs/tests/integration/services/jobs/contact-data-jobs.integration.spec.js#stamps the job on the revision, so every record one job changed can be listed"
}
]
Expected
The pages account for each position; eligible changes have attribution and refusals disclose no record values.
Data
Prepare valid, invalid and inaccessible contacts in one job.
Prepare a keyed contact with an invalid address and a valid neighboring contact.
Steps
[
{
"do": "Import both, inspect records and mappings, then submit corrected input under the refused key.",
"expect": "The valid neighbor commits, the invalid record has no partial detail or mapping, and correction can create it.",
"provenance": "proposed",
"source": "services-crm:modules/data-jobs/tests/integration/services/jobs/contact-data-jobs.integration.spec.js#refuses the other five, counting each as what refused it; macroservice-libraries:packages/data-jobs/src/tests/integration/keyed-data-jobs.integration.spec.ts#writes no crosswalk row for an item it refused, so the corrected delivery of that key is a create; services-crm:modules/data-jobs/tests/integration/services/operations/record-imports.integration.spec.js#writes nothing at all of the rejected organization: not the row, not its addresses, not its mapping"
}
]
Expected
The valid neighbor commits, the invalid record has no partial detail or mapping, and correction can create it.
Data
Prepare a keyed contact with an invalid address and a valid neighboring contact.