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. Submission commits before processing can account for it. Keyed submission remains identifiable in inspection. Dialog input becomes a durable inspectable job. Operation declarations constrain submitted work. The interaction scenarios use the related capabilities' rule references and identify the shared fixture and observable outcome.
Coverage
Rulegap: FND-PFM-DJE-061
Transitiongap: FND-PFM-DJE-061
Validationcovered
Permissioncovered
Edgecovered
Failuregap: FND-PFM-DJE-061
Boundarycovered
Concurrencygap: FND-PFM-DJE-061
Invariantcovered
Interactioncovered
Test Scenarios
15 scenarios proving CAP-PFM-DJE-001; 9 bound to an existing test.
01Both operation and bulk access are requiredpermissionapinegativetest
Prepare callers with each permission alone and with both.
Steps
[
{
"do": "Submit the contact change under each identity.",
"expect": "The single-permission callers receive 403; the fully authorized caller succeeds.",
"provenance": "test",
"source": "services-crm:modules/data-jobs/tests/e2e/data-jobs.e2e.spec.js#refuses a caller who may update one contact but holds no bulk key with 403"
}
]
Expected
The single-permission callers receive 403; the fully authorized caller succeeds.
[
{
"do": "Send 501 identifiers, then both input forms, then no input form.",
"expect": "Each request receives 400 before work is submitted.",
"provenance": "test",
"source": "services-crm:modules/data-jobs/tests/e2e/organization-update.e2e.spec.js#refuses a selection past the interactive lane’s 500 with 400"
}
]
Expected
Each request receives 400 before work is submitted.
Prepare a contact update with an undeclared collection and an organization update with a system column.
Steps
[
{
"do": "Submit each disallowed change.",
"expect": "Each refusal names the disallowed field.",
"provenance": "test",
"source": "services-crm:modules/data-jobs/tests/integration/services/jobs/contact-data-jobs.integration.spec.js#refuses a field the bulk update may not set, naming it, before any contact is touched"
}
]
[
{
"do": "Inspect the job input and process it.",
"expect": "Input order and submitted field values are retained.",
"provenance": "test",
"source": "services-crm:modules/data-jobs/tests/integration/services/jobs/contact-data-jobs.integration.spec.js#freezes one item per id, in the order the request named them"
}
]
Expected
Input order and submitted field values are retained.
[
{
"do": "Repeat it, reuse its key with a different body, and exercise the console double-click path.",
"expect": "The retry returns the same job; the changed request is refused; the console sends one apply request.",
"provenance": "test",
"source": "services-crm:modules/data-jobs/tests/integration/services/jobs/contact-data-jobs.integration.spec.js#answers the second submission with the first job, having written nothing"
}
]
Expected
The retry returns the same job; the changed request is refused; the console sends one apply request.
No setup beyond an authorized caller is necessary.
Steps
[
{
"do": "Request an operation for an unsupported record kind.",
"expect": "The refusal describes the supported choices.",
"provenance": "test",
"source": "services-crm:modules/data-jobs/tests/integration/services/jobs/contact-data-jobs.integration.spec.js#refuses an object type CRM performs no bulk operation on, naming what it does perform"
}
]
[
{
"do": "Submit inline input for an insert with a producer key.",
"expect": "The schema refuses the import without changing a contact.",
"provenance": "test",
"source": "react-console:acceptance/crm/playwright/journeys/data-operations/CRM-ACC-0653.spec.ts#CRM-ACC-0653"
}
]
Expected
The schema refuses the import without changing a contact.
[
{
"do": "Attempt its reads, apply and controls through contact-type routes.",
"expect": "Every mismatched call reports not found and preserves the job.",
"provenance": "test",
"source": "services-crm:modules/data-jobs/tests/integration/services/jobs/configuration-data-jobs.integration.spec.js#is not found by the apply, so a validated job of contacts cannot be started from here"
}
]
Expected
Every mismatched call reports not found and preserves the job.
[
{
"do": "Attempt to inspect and process it from the second.",
"expect": "The job is not found and records in both workspaces remain intact.",
"provenance": "test",
"source": "macroservice-libraries:packages/data-jobs/src/tests/integration/tenant-isolation.integration.spec.ts#does not let another tenant see a job, or learn that it exists"
}
]
Expected
The job is not found and records in both workspaces remain intact.
Prepare a keyed two-batch request and inject an exception before its transaction commits.
Steps
[
{
"do": "Submit in the failing transaction, inspect all engine records, then retry successfully.",
"expect": "The failed request leaves no job, input, batches, queue entries or ledger key; the retry records one complete submission.",
"provenance": "proposed",
"source": "macroservice-libraries:packages/data-jobs/README.md#A worked example: updating contacts in bulk"
}
]
Expected
The failed request leaves no job, input, batches, queue entries or ledger key; the retry records one complete submission.
Data
Prepare a keyed two-batch request and inject an exception before its transaction commits.
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 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.
Create an authorized caller and two selected contacts.
Steps
[
{
"do": "Submit a keyed update, repeat it, process it, and read its job and result pages.",
"expect": "Both submissions identify the same job and inspection contains each input position once.",
"provenance": "proposed",
"source": "services-crm:modules/data-jobs/tests/integration/services/jobs/contact-data-jobs.integration.spec.js#answers the second submission with the first job, having written nothing; 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"
}
]
Expected
Both submissions identify the same job and inspection contains each input position once.
Data
Create an authorized caller and two selected contacts.
[
{
"do": "Preview and apply an update from the dialog, close the dialog, and inspect the job after completion.",
"expect": "Closing the dialog leaves the submitted change active and its recorded job remains inspectable.",
"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; react-console:acceptance/data-jobs/playwright/journeys/dialogs/DJE-ACC-0111.spec.ts#DJE-ACC-0111; react-console:acceptance/data-jobs/playwright/journeys/dialogs/DJE-ACC-0113.spec.ts#DJE-ACC-0113"
}
]
Expected
Closing the dialog leaves the submitted change active and its recorded job remains inspectable.
Prepare a supported Platform field-definition operation and authorized and unauthorized callers.
Steps
[
{
"do": "Submit a supported definition, an unsupported operation, and the supported input without bulk authority.",
"expect": "Only the permitted declared operation creates work; the refused requests leave no definition or job.",
"provenance": "proposed",
"source": "services-crm:modules/data-jobs/tests/integration/services/jobs/contact-data-jobs.integration.spec.js#refuses an object type CRM performs no bulk operation on, naming what it does perform; macroservice-libraries:packages/data-jobs/src/validate-data-job-request.spec.ts#refuses a delete that declares patchable fields, which a delete never sets; services-platform:modules/data-jobs/tests/integration/services/jobs/custom-field-data-jobs.integration.spec.js#refuses a caller who may create a definition but holds no bulk right"
}
]
Expected
Only the permitted declared operation creates work; the refused requests leave no definition or job.
Data
Prepare a supported Platform field-definition operation and authorized and unauthorized callers.