---
id: TST-PFM-DJE-169
title: Custom object data jobs
kind: integration
product_area: platform
module: data-job-engine
revision: 1
status: draft
source_sha:
  services-platform: ad3f6a6582843008ed0f5a17b131878d15829af1
  macroservice-libraries: 54536a441935c6e09fdb7f96f0bec71c52ba4e03
  services-crm: a8d1364f1dd44b723bb5f9acba12f983e9ec8d69
  services-membership: 5994c270e8a37a30f848e99ba5b5ee6b87c08893
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
repository: services-platform
files:
  - modules/data-jobs/tests/integration/services/jobs/custom-object-data-jobs.integration.spec.js
implements:
  - ATS-PFM-DJE-018-08
environment: local
implementation_state: implemented
latest_result: not-run
latest_run_at: null
latest_run_ref: null
conformance: not-verified
estimated_minutes: 5
isolation: >-
  Suite-owned fixture records, job identifiers and workspace contexts; teardown removes the fixture
  data.
evidence:
  - >-
    services-platform:modules/data-jobs/tests/integration/services/jobs/custom-object-data-jobs.integration.spec.js
assertion_inventory:
  - 'custom object records and associations data operations: loading a package'
  - finishes every dataset of the first load succeeded
  - 'creates each boat under its source key as its external id, numbered and named by the write path'
  - resolves a reference given by source key to the record that key became
  - writes a property the package’s own definitions dataset created
  - publishes a boat whose line asks for it
  - 'holds the imported hull numbers unique, as an API write does'
  - 'associates each boat with the owner its line names, by CRM’s crosswalk and by id'
  - answers every record of the second load unchanged
  - leaves every boat at the version the first load wrote
  - makes no second association on the second load
  - 'custom object records and associations data operations: refusals by line'
  - completes the dataset with its rejections
  - 'refuses each bad line, and only those'
  - names the line of the dataset in each refusal’s message
  - refuses an unknown object as not found
  - refuses a value of the wrong type naming the property
  - 'refuses a hull number another boat already holds, naming that boat'
  - 'refuses a hull number an earlier line of the same file holds, naming that line'
  - writes the one good line
  - writes no refused line
  - 'refuses an owner whose source key nothing loaded, by its line'
  - 'custom object records data operation: a file’s unique values across its batches'
  - validates the file in more than one batch
  - 'refuses the later line, in the second batch, naming the earlier line in the first'
  - 'custom object records data operation: a reload of a boat with a photo'
  - stores the copied photo’s permanent reference on the first load
  - answers the second load of the same file unchanged
  - leaves the boat at the version and the photo the first load wrote
  - copies the photo once
  - 'custom object records data operation: a reload of an archived boat'
  - 'reports the line as a locked record, not a version conflict'
  - says the record is archived
  - leaves the archived boat as the archive left it
  - >-
    custom object records and associations data operations: an association validation checks what
    its apply checks
  - 'refuses in validation each line whose own fields the write would refuse, and only those'
  - 'names the rule each line breaks, as the write names it'
  - 'custom object records and associations data operations: refusals found while a line is applied'
  - >-
    refuses a boat changed since the version its line expects by its line, without the error’s class
    name
  - leaves the boat of the refused line as the package wrote it
  - >-
    refuses an owner moved to another boat by its line, naming the field the line changed in the
    associations API’s sentence
  - >-
    custom object records and associations data operations: an association load validated and then
    applied
  - >-
    refuses at validation each line the write refuses for its own values, by the write’s own
    sentence
  - validates an impact of the two good lines created and the five refused blocked
  - 'applies what the validation said: the two good lines, and the same five rejections'
  - writes the two good owners and nothing of the refused lines
  - 'custom object records data operation: reloading a file nothing has changed since'
  - creates the three records on the first load
  - >-
    stores the uploaded picture as the permanent reference it was copied to, not the upload the line
    names
  - 'answers every line unchanged on every reload, before the custom fields are reloaded and after'
  - leaves every record at the version the first load wrote
  - publishes no event for any reload
  - >-
    still writes a line that names another upload, as an update to a new version with the new file
    (the control)
  - 'custom object records and associations data operations: the reset participants'
  - starts from a tenant holding each kind of row
  - >-
    empties the records, their values, their unique values and the associations, and keeps the
    object and the type
  - answers done from both participants
  - 'keeps the object’s properties, which the metadata participant answers for'
  - 'custom object records data operation: a tenant reset, then the package reloaded'
  - gives the field its unique rule on the first load
  - empties the tenant’s definitions in the reset
  - creates the definitions again on the reload
  - restores the unique rule with the definition
  - holds the code unique again after the reload
registration_note: Registration describes existing source; the suite is not executed by this documentation job.
---

# Custom object data jobs

## Verification Boundary

The suite checks the production service or shared engine against its database fixture. The structured assertion inventory records the checks present at the pinned revision.

## What This Suite Proves

The existing checks exercise custom object data jobs. The specification bindings identify the narrower outcomes supported by those assertions.

## What It Does Not Prove

Local execution does not establish deployed queue, storage or service behavior. Independent test cases do not establish a complete cross-feature process.

## Real Dependencies and Test Doubles

The owning service exercises production persistence and domain behavior against real Postgres. The fixture supplies caller contexts; queue delivery, storage and external calls are doubled where the file installs a test port.

## Must Not Be Doubled

The database effects, security context and production operation under examination remain real. Their outcomes cannot be replaced with canned success responses.
