---
id: TST-PFM-MTD-051
title: custom object records
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-object-records.e2e.spec.js
implements:
  - ATS-PFM-MTD-010-06
  - ATS-PFM-MTD-011-01
  - ATS-PFM-MTD-011-02
  - ATS-PFM-MTD-012-01
  - ATS-PFM-MTD-012-14
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-object-records.e2e.spec.js'
  - >-
    services-platform:modules/custom-objects/tests/e2e/custom-object-records.e2e.spec.js#lists the unarchived
    boats by display name, a page with its cursor
  - >-
    services-platform:modules/custom-objects/tests/e2e/custom-object-records.e2e.spec.js#lists the published
    boats when asked for them
  - >-
    services-platform:modules/custom-objects/tests/e2e/custom-object-records.e2e.spec.js#creates a boat,
    numbered and named
  - >-
    services-platform:modules/custom-objects/tests/e2e/custom-object-records.e2e.spec.js#reads a boat with its
    properties and its associations
  - >-
    services-platform:modules/custom-objects/tests/e2e/custom-object-records.e2e.spec.js#audits the read of a
    record as a view
  - >-
    services-platform:modules/custom-objects/tests/e2e/custom-object-records.e2e.spec.js#patches the
    properties a body names
  - >-
    services-platform:modules/custom-objects/tests/e2e/custom-object-records.e2e.spec.js#replaces the
    properties with a record sent back as it was read
  - 'services-platform:modules/custom-objects/tests/e2e/custom-object-records.e2e.spec.js#publishes a boat'
  - >-
    services-platform:modules/custom-objects/tests/e2e/custom-object-records.e2e.spec.js#archives and restores
    a boat
  - 'services-platform:modules/custom-objects/tests/e2e/custom-object-records.e2e.spec.js#deletes a boat'
  - >-
    services-platform:modules/custom-objects/tests/e2e/custom-object-records.e2e.spec.js#answers 401 with no
    context
  - >-
    services-platform:modules/custom-objects/tests/e2e/custom-object-records.e2e.spec.js#answers 403 to a
    caller who may only read, creating a record
  - >-
    services-platform:modules/custom-objects/tests/e2e/custom-object-records.e2e.spec.js#answers 400 to a
    duplicate hull number, naming the boat that has it
  - >-
    services-platform:modules/custom-objects/tests/e2e/custom-object-records.e2e.spec.js#answers 400 to a body
    naming a property the object does not have
  - >-
    services-platform:modules/custom-objects/tests/e2e/custom-object-records.e2e.spec.js#answers 403 to a
    record of another tenant’s path, which the context does not reach
  - >-
    services-platform:modules/custom-objects/tests/e2e/custom-object-records.e2e.spec.js#answers 404 to an
    object the tenant does not have
  - >-
    services-platform:modules/custom-objects/tests/e2e/custom-object-records.e2e.spec.js#answers 409 to a
    change at another version
  - >-
    services-platform:modules/custom-objects/tests/e2e/custom-object-records.e2e.spec.js#answers 409 to a
    record of a draft object
  - >-
    services-platform:modules/custom-objects/tests/e2e/custom-object-records.e2e.spec.js#reads the record by
    id with its properties and an empty association list
  - >-
    services-platform:modules/custom-objects/tests/e2e/custom-object-records.e2e.spec.js#refuses every write
    of it with 409 and changes nothing
  - >-
    services-platform:modules/custom-objects/tests/e2e/custom-object-records.e2e.spec.js#lets a role scoped to
    custom_object:boat list boats
  - >-
    services-platform:modules/custom-objects/tests/e2e/custom-object-records.e2e.spec.js#refuses the same role
    another object’s records, answering as if the object were not there
  - >-
    services-platform:modules/custom-objects/tests/e2e/custom-object-records.e2e.spec.js#keeps a roles-only
    object from a customer-wide assignment, answering as if it were not there
  - >-
    services-platform:modules/custom-objects/tests/e2e/custom-object-records.e2e.spec.js#lets an assignment
    scoped to the roles-only object reach it
  - >-
    services-platform:modules/custom-objects/tests/e2e/custom-object-records.e2e.spec.js#answers a role scoped
    to custom_object:boat the boats alone
  - >-
    services-platform:modules/custom-objects/tests/e2e/custom-object-records.e2e.spec.js#answers a role scoped
    to the roles-only object that object, which a customer-wide reader does not see
  - >-
    services-platform:modules/custom-objects/tests/e2e/custom-object-records.e2e.spec.js#answers a
    customer-wide reader every active object it reaches, the boats among them
  - >-
    services-platform:modules/custom-objects/tests/e2e/custom-object-records.e2e.spec.js#refuses 403 a caller
    who reads no object’s records
fixture_imports:
  - chai
  - drizzle-orm
  - ../../../../aws/api/platform-api-handler
  - '@rhythmsoftware/macroservice-testing/signed-context'
  - '@rhythmsoftware/macroservice-execution/tenant-time-zones'
  - '@rhythmsoftware/macroservice-testing/stage'
  - ../../../../db/seeds/well-known/well-known-objects
  - ../../../audit/db/audit-events.table
  - ../../../tenants/services/persistence/tenants
  - ../../aws/api/custom-objects.routes
  - ../../services/persistence/custom-objects
  - ../integration/support
test_doubles: []
limitations: []
unmatched_specification: null
binding_assertions:
  - scenario: ATS-PFM-MTD-010-06
    provenance: test
    source:
      - >-
        services-platform:modules/custom-objects/tests/e2e/custom-object-records.e2e.spec.js#answers a role
        scoped to custom_object:boat the boats alone
      - >-
        services-platform:modules/custom-objects/tests/e2e/custom-object-records.e2e.spec.js#answers a role
        scoped to the roles-only object that object, which a customer-wide reader does not see
      - >-
        services-platform:modules/custom-objects/tests/e2e/custom-object-records.e2e.spec.js#refuses 403 a
        caller who reads no object’s records
    note: >-
      These references identify the assertions this suite contributes; bindings to additional suites remain
      part of the scenario’s proof.
  - scenario: ATS-PFM-MTD-011-01
    provenance: test
    source:
      - >-
        services-platform:modules/custom-objects/tests/e2e/custom-object-records.e2e.spec.js#lets a role
        scoped to custom_object:boat list boats
      - >-
        services-platform:modules/custom-objects/tests/e2e/custom-object-records.e2e.spec.js#refuses the same
        role another object’s records, answering as if the object were not there
    note: >-
      These references identify the assertions this suite contributes; bindings to additional suites remain
      part of the scenario’s proof.
  - scenario: ATS-PFM-MTD-011-02
    provenance: test
    source:
      - >-
        services-platform:modules/custom-objects/tests/e2e/custom-object-records.e2e.spec.js#keeps a
        roles-only object from a customer-wide assignment, answering as if it were not there
      - >-
        services-platform:modules/custom-objects/tests/e2e/custom-object-records.e2e.spec.js#lets an
        assignment scoped to the roles-only object reach it
    note: >-
      These references identify the assertions this suite contributes; bindings to additional suites remain
      part of the scenario’s proof.
  - scenario: ATS-PFM-MTD-012-01
    provenance: test
    source:
      - >-
        services-platform:modules/custom-objects/tests/e2e/custom-object-records.e2e.spec.js#answers 409 to a
        record of a draft object
      - >-
        services-platform:modules/custom-objects/tests/e2e/custom-object-records.e2e.spec.js#reads the record
        by id with its properties and an empty association list
      - >-
        services-platform:modules/custom-objects/tests/e2e/custom-object-records.e2e.spec.js#refuses every
        write of it with 409 and changes nothing
    note: >-
      These references identify the assertions this suite contributes; bindings to additional suites remain
      part of the scenario’s proof.
  - scenario: ATS-PFM-MTD-012-14
    provenance: test
    source:
      - >-
        services-platform:modules/custom-objects/tests/e2e/custom-object-records.e2e.spec.js#lists the
        unarchived boats by display name, a page with its cursor
      - >-
        services-platform:modules/custom-objects/tests/e2e/custom-object-records.e2e.spec.js#lists the
        published boats when asked for them
      - >-
        services-platform:modules/custom-objects/tests/e2e/custom-object-records.e2e.spec.js#audits the read
        of a record as a view
    note: >-
      These references identify the assertions this suite contributes; bindings to additional suites remain
      part of the scenario’s proof.
---

# Custom object records

## 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.
