Skip to content

ATS-PFM-DJE-001Submit an accountable change across many records: Capability Test Specification

Markdown

ATS-PFM-DJE-001

Submit an accountable change across many records: Capability Test Specification

Markdown
  • DocumentProposed

KindAcceptance test setProduct areaPlatformModuleData Job EngineRevision2

Read atmacroservice-libraries 54536a44services-crm a8d1364fservices-platform ad3f6a65react-console baf6dae3

Coverage

  • Rule gap: FND-PFM-DJE-061
  • Transition gap: FND-PFM-DJE-061
  • Validation covered
  • Permission covered
  • Edge covered
  • Failure gap: FND-PFM-DJE-061
  • Boundary covered
  • Concurrency gap: FND-PFM-DJE-061
  • Invariant covered
  • Interaction covered

Test Scenarios

15 scenarios proving CAP-PFM-DJE-001; 9 bound to an existing test.

01 Both operation and bulk access are requiredpermissionapinegativetest
Proves
BR-CAP-PFM-DJE-001-01
Preconditions
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.
Data
Signed caller contexts with distinct grants.
Bound to
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
02 Interactive requests obey size and shape limitsboundaryapinegativetest
Proves
BR-CAP-PFM-DJE-001-02
Preconditions
Use an authorized organization updater.
Steps
[ { "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.
Data
No additional fixture is needed.
Bound to
Source
services-crm:modules/data-jobs/tests/e2e/organization-update.e2e.spec.js#refuses a selection past the interactive lane’s 500 with 400
03 Undeclared fields are named in the refusalvalidationapinegativetest
Proves
BR-CAP-PFM-DJE-001-03
Preconditions
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" } ]
Expected
Each refusal names the disallowed field.
Data
No additional fixture is needed.
Bound to
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
04 Saved input retains order and valuesinvariantapitest
Proves
BR-CAP-PFM-DJE-001-04
Preconditions
Submit a multi-contact change.
Steps
[ { "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.
Data
No additional fixture is needed.
Bound to
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
05 A keyed retry retrieves existing workedgebrowsertest
Proves
BR-CAP-PFM-DJE-001-05
Preconditions
Submit a request with an idempotency key.
Steps
[ { "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.
Data
No additional fixture is needed.
Bound to
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
06 Unsupported record kinds identify supported operationsvalidationapinegativetest
Proves
BR-CAP-PFM-DJE-001-06
Preconditions
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" } ]
Expected
The refusal describes the supported choices.
Data
No additional fixture is needed.
Bound to
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
07 CRM refuses imports on the interactive routevalidationapinegativetest
Proves
BR-CAP-PFM-DJE-001-07
Preconditions
Use a caller authorized to change contacts.
Steps
[ { "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.
Data
No additional fixture is needed.
Bound to
Source
react-console:acceptance/crm/playwright/journeys/data-operations/CRM-ACC-0653.spec.ts#CRM-ACC-0653
08 Collection boundaries conceal mismatched jobsboundaryapinegativetest
Proves
BR-CAP-PFM-DJE-001-08
Preconditions
Prepare a validated contact job.
Steps
[ { "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.
Data
No additional fixture is needed.
Bound to
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
09 Workspace boundaries conceal jobsboundaryapinegativetest
Proves
BR-CAP-PFM-DJE-001-09
Preconditions
Create a job in the first of two workspaces.
Steps
[ { "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.
Data
Two independent workspaces.
Bound to
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
10 A failed submission leaves no durable workinvariantapinegativeproposed
Proves
BR-CAP-PFM-DJE-001-10
Preconditions
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.
Source
macroservice-libraries:packages/data-jobs/README.md#A worked example: updating contacts in bulk
11 Saved submission reaches approval unchangedinteractionapiproposed
Proves
BR-CAP-PFM-DJE-001-04 BR-CAP-PFM-DJE-002-01 BR-CAP-PFM-DJE-002-02
Preconditions
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.
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
12 Submission commits before processing can account for itinteractionapinegativeproposed
Proves
BR-CAP-PFM-DJE-001-10 BR-CAP-PFM-DJE-003-01
Preconditions
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.
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
13 Keyed submission remains identifiable in inspectioninteractionapiproposed
Proves
BR-CAP-PFM-DJE-001-05 BR-CAP-PFM-DJE-005-03
Preconditions
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.
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
14 Dialog input becomes a durable inspectable jobinteractionapiproposed
Proves
BR-CAP-PFM-DJE-001-04 BR-CAP-PFM-DJE-009-02 BR-CAP-PFM-DJE-009-08
Preconditions
Select contacts on a record list.
Steps
[ { "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.
Data
Select contacts on a record list.
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
15 Operation declarations constrain submitted workinteractionapinegativeproposed
Proves
BR-CAP-PFM-DJE-001-06 BR-CAP-PFM-DJE-018-01 BR-CAP-PFM-DJE-018-07
Preconditions
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.
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

The Markdown files under specs/ in rhythmsoftware/rhythm-v2-docs are the canonical source of truth. This reader is a generated, read-only projection of them.