---
id: TST-PFM-DJE-180
title: Custom object data operations
kind: unit
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/unit/custom-object-data-operations.spec.ts
implements: []
environment: local
implementation_state: implemented
latest_result: not-run
latest_run_at: null
latest_run_ref: null
conformance: not-verified
estimated_minutes: 1
isolation: In-memory fixtures and restored dependency doubles.
evidence:
  - 'services-platform:modules/data-jobs/tests/unit/custom-object-data-operations.spec.ts'
assertion_inventory:
  - 'the custom object records operation: a line’s values'
  - 'reads the object, the properties and the publication state in camelCase'
  - reads the records API’s snake_case spelling of the envelope
  - refuses an object id that is not a custom object’s
  - refuses a publication state the records API does not have
  - 'refuses a property of the line the operation does not know, by name'
  - 'the custom object records operation: the crosswalk key'
  - writes the object and the producer’s key with a colon
  - 'reads the object up to the first colon, so the producer’s key may hold colons of its own'
  - reads nothing from a key without an object
  - 'the associations operation: a line’s values'
  - 'reads the type, both endpoints and the association’s own fields'
  - reads the associations API’s snake_case spelling
  - refuses a line without its type
  - refuses a primary that is not true or false
  - 'the associations operation: an endpoint'
  - 'reads our own record id after id:'
  - reads a producer’s key of an object
  - 'refuses a key that names no object, by its side'
  - 'the associations operation: the file’s own places (PLAT-M6 D2)'
  - 'refuses a second line for the boat whose days overlap the first, naming the first line'
  - accepts a second line for the boat that starts the day after the first ends
  - 'refuses a second line for one pair with no dates at all, as the file has always been checked'
  - accepts a line whose days are before an earlier line of the same pair
  - the two operations as the engine and a Data Run read them
  - 'registers both with Platform’s operations, as upserts'
  - loads records after the custom field definitions that are their properties
  - 'loads associations after the records they join, custom and CRM’s'
  - 'gates the records on the create key, the coarse gate under the per-line object scope'
  - matches a line only by the producer’s key
  - the data-job route surfaces
  - serves each object type through exactly one surface
  - finds a surface by the object route a Data Run step records
  - 'keeps the custom-field surface’s requirement: the bulk key and either record key'
registration_note: Registration describes existing source; the suite is not executed by this documentation job.
---

# Custom object data operations

## Verification Boundary

The suite checks an isolated production calculation, declaration or adapter. The structured assertion inventory records the checks present at the pinned revision.

## What This Suite Proves

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

## What It Does Not Prove

An isolated check does not establish a deployed workflow, database enforcement or complete feature acceptance.

## Real Dependencies and Test Doubles

The production function or declaration is exercised with in-memory inputs and dependency doubles. This boundary does not require a live database.

## Must Not Be Doubled

The production function under examination and its returned decisions remain real; replacing their answers defeats the check.
