---
id: TST-PFM-MTD-052
title: custom objects
kind: api-lifecycle
product_area: platform
module: metadata
revision: 1
status: draft
source_sha:
  services-platform: ad3f6a6582843008ed0f5a17b131878d15829af1
repository: services-platform
files:
  - modules/custom-objects/tests/e2e/custom-objects.e2e.spec.js
implements:
  - ATS-PFM-MTD-009-01
  - ATS-PFM-MTD-009-03
  - ATS-PFM-MTD-009-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: >-
  Prepared integration database and the suite fixture records; fixture teardown restores or removes its own
  rows.
evidence:
  - 'services-platform:modules/custom-objects/tests/e2e/custom-objects.e2e.spec.js'
  - >-
    services-platform:modules/custom-objects/tests/e2e/custom-objects.e2e.spec.js#answers the public health
    route with no context
  - >-
    services-platform:modules/custom-objects/tests/e2e/custom-objects.e2e.spec.js#lists the tenant’s objects
    by plural label
  - 'services-platform:modules/custom-objects/tests/e2e/custom-objects.e2e.spec.js#reads the well-known Boat'
  - >-
    services-platform:modules/custom-objects/tests/e2e/custom-objects.e2e.spec.js#creates a draft object whose
    object id is objects. and the plural key
  - >-
    services-platform:modules/custom-objects/tests/e2e/custom-objects.e2e.spec.js#answers 400 to a create
    whose plural key is not a snake_case word
  - >-
    services-platform:modules/custom-objects/tests/e2e/custom-objects.e2e.spec.js#answers 400 to a create
    whose label is blank, as required
  - >-
    services-platform:modules/custom-objects/tests/e2e/custom-objects.e2e.spec.js#answers 400 to a create
    whose plural label is empty, as required
  - >-
    services-platform:modules/custom-objects/tests/e2e/custom-objects.e2e.spec.js#replaces an object with the
    record read back, at its version
  - >-
    services-platform:modules/custom-objects/tests/e2e/custom-objects.e2e.spec.js#answers 409 to a replacement
    at a stale version
  - >-
    services-platform:modules/custom-objects/tests/e2e/custom-objects.e2e.spec.js#answers 400 to a replacement
    that changes the status, which only the actions change
  - >-
    services-platform:modules/custom-objects/tests/e2e/custom-objects.e2e.spec.js#answers 404 for an object
    the tenant does not have
  - >-
    services-platform:modules/custom-objects/tests/e2e/custom-objects.e2e.spec.js#answers 401 to a call with
    no context
  - >-
    services-platform:modules/custom-objects/tests/e2e/custom-objects.e2e.spec.js#answers 403 to a create by a
    caller who may only read
  - >-
    services-platform:modules/custom-objects/tests/e2e/custom-objects.e2e.spec.js#answers 403 to a context of
    another tenant, which the path cannot reach
  - >-
    services-platform:modules/custom-objects/tests/e2e/custom-objects.e2e.spec.js#creates a property of the
    draft with a plain key
  - >-
    services-platform:modules/custom-objects/tests/e2e/custom-objects.e2e.spec.js#answers 400 to a property of
    a custom object keyed with the __c suffix
  - >-
    services-platform:modules/custom-objects/tests/e2e/custom-objects.e2e.spec.js#activates the draft once its
    display property exists
  - >-
    services-platform:modules/custom-objects/tests/e2e/custom-objects.e2e.spec.js#answers 409 to activating it
    again, which its status does not allow
  - >-
    services-platform:modules/custom-objects/tests/e2e/custom-objects.e2e.spec.js#archives it, then restores
    it as a draft
  - >-
    services-platform:modules/custom-objects/tests/e2e/custom-objects.e2e.spec.js#answers 409 to an action at
    a stale version
  - >-
    services-platform:modules/custom-objects/tests/e2e/custom-objects.e2e.spec.js#answers 400 to activating a
    draft whose display property does not exist
  - >-
    services-platform:modules/custom-objects/tests/e2e/custom-objects.e2e.spec.js#describes objects.boats as
    custom, its fixed fields first, then its properties in order
  - >-
    services-platform:modules/custom-objects/tests/e2e/custom-objects.e2e.spec.js#describes each property with
    its rules, exposure staff where none is stored
  - >-
    services-platform:modules/custom-objects/tests/e2e/custom-objects.e2e.spec.js#answers 404 to a description
    of a custom object the tenant does not have
  - >-
    services-platform:modules/custom-objects/tests/e2e/custom-objects.e2e.spec.js#lists the tenant’s custom
    objects among the objects, with their status
  - 'services-platform:modules/custom-objects/tests/e2e/custom-objects.e2e.spec.js#reads a property’s rules'
  - >-
    services-platform:modules/custom-objects/tests/e2e/custom-objects.e2e.spec.js#replaces a property’s rules
    and reads them back
  - >-
    services-platform:modules/custom-objects/tests/e2e/custom-objects.e2e.spec.js#answers 400 to a unique
    rule, which nothing can check yet
  - >-
    services-platform:modules/custom-objects/tests/e2e/custom-objects.e2e.spec.js#answers 403 to a rules
    replacement by a caller who may only read objects
fixture_imports:
  - chai
  - ../../../../aws/api/platform-api-handler
  - '@rhythmsoftware/macroservice-testing/signed-context'
  - '@rhythmsoftware/macroservice-execution/tenant-time-zones'
  - '@rhythmsoftware/macroservice-testing/stage'
  - ../../../tenants/services/persistence/tenants
  - ../../../metadata/aws/api/metadata.routes
  - ../../aws/api/custom-objects.routes
  - ../integration/support
test_doubles: []
limitations: []
unmatched_specification: null
binding_assertions:
  - scenario: ATS-PFM-MTD-009-01
    provenance: test
    source:
      - >-
        services-platform:modules/custom-objects/tests/e2e/custom-objects.e2e.spec.js#creates a draft object
        whose object id is objects. and the plural key
    note: >-
      These references identify the assertions this suite contributes; bindings to additional suites remain
      part of the scenario’s proof.
  - scenario: ATS-PFM-MTD-009-03
    provenance: test
    source:
      - >-
        services-platform:modules/custom-objects/tests/e2e/custom-objects.e2e.spec.js#answers 409 to a
        replacement at a stale version
      - >-
        services-platform:modules/custom-objects/tests/e2e/custom-objects.e2e.spec.js#answers 400 to a
        replacement that changes the status, which only the actions change
    note: >-
      These references identify the assertions this suite contributes; bindings to additional suites remain
      part of the scenario’s proof.
  - scenario: ATS-PFM-MTD-009-08
    provenance: test
    source:
      - >-
        services-platform:modules/custom-objects/tests/e2e/custom-objects.e2e.spec.js#archives it, then
        restores it as a draft
    note: >-
      These references identify the assertions this suite contributes; bindings to additional suites remain
      part of the scenario’s proof.
---

# Custom objects

## Verification Boundary

This API suite checks custom objects and records within the local test harness. The registered file and pinned revision define its boundary.

## What This Suite Proves

The bindings identify the detailed or feature scenarios whose outcomes have assertions in this suite. Original case references remain attached to the detailed scenarios so a reviewer can inspect the exact assertion. Assertions are evidence of implemented checks; no execution result is claimed.

## What It Does Not Prove

The register does not establish a current passing run or full specification conformance. Behavior outside the suite’s fixtures and assertions remains unverified.

## Real Dependencies and Test Doubles

The fixture uses PostgreSQL and the imported persistence or API code. The fixture imports identify the setup seams; this register makes no broader claim that dependencies are undoubled.

## Must Not Be Doubled

The operation under examination and its asserted stored outcomes must remain real within the declared harness. A fixture cannot replace the write, refusal or transactional effect that the bound scenario checks.
