---
id: TST-PFM-MTD-065
title: custom object records
kind: integration
product_area: platform
module: metadata
revision: 1
status: draft
source_sha:
  services-platform: ad3f6a6582843008ed0f5a17b131878d15829af1
repository: services-platform
files:
  - modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js
implements:
  - ATS-PFM-MTD-006-03
  - ATS-PFM-MTD-012-01
  - ATS-PFM-MTD-012-02
  - ATS-PFM-MTD-012-03
  - ATS-PFM-MTD-012-04
  - ATS-PFM-MTD-012-05
  - ATS-PFM-MTD-012-06
  - ATS-PFM-MTD-012-07
  - ATS-PFM-MTD-012-08
  - ATS-PFM-MTD-012-09
  - ATS-PFM-MTD-012-10
  - ATS-PFM-MTD-012-11
  - ATS-PFM-MTD-012-12
  - ATS-PFM-MTD-012-13
  - ATS-PFM-MTD-012-14
  - ATS-PFM-MTD-012-17
  - ATS-PFM-MTD-013-01
  - ATS-PFM-MTD-013-02
  - ATS-PFM-MTD-013-03
  - ATS-PFM-MTD-013-04
  - ATS-PFM-MTD-013-05
  - ATS-PFM-MTD-013-06
  - ATS-PFM-MTD-013-07
  - ATS-PFM-MTD-013-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/integration/services/persistence/custom-object-records.integration.spec.js
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#creates
    a boat at version 1, as a draft of a publishable object, named by its display properties
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#answers
    every live property, null where the record holds none
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#numbers
    a boat after the well-known twelve, and the next one after it
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#leaves
    the publication state null on an object that is not publishable
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#stores
    a decimal with its scaled integer shadow
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#records
    the create in the audit events
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#refuses
    a record of a draft object, and writes nothing
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#refuses
    a record of an object the tenant does not have
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#refuses
    a property the object does not have, by name
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#names
    the object’s label in that refusal, never "custom records" (D4)
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#refuses
    a record without a property required by the API
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#refuses
    a value its data type does not accept, without echoing it
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#requires
    the sail area of a sloop
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#accepts
    a sloop with its sail area
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#refuses
    a sail area on a vessel that is not a sloop, the property being hidden
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#accepts
    a patch that hides the sail area while clearing it
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#defaults
    a date to the tenant’s today, and a text to its literal
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#defaults
    a property a create sends as an empty string
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#defaults
    a property a create sends as null
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#counts
    a property a data job’s create line sends empty among those its default fills
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#keeps
    the value a create gives over the default
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#defaults
    a contact reference to the portal caller’s contact
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#leaves
    a contact reference empty for a caller who is nobody’s contact
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#refuses
    a create under an external id another record of the object holds, naming sys_external_id
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#writes
    no record for a create refused for its external id
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#refuses
    a patch to an external id another record of the object holds, and leaves the record unchanged
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#refuses
    a hull number another boat holds, naming the property and the boat
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#refuses
    the same hull number in another case and with spaces around it
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#writes
    nothing for a refused duplicate
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#holds
    a new boat’s hull number as its unique value, lower-cased
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#frees
    a hull number a patch changes, so another boat may take it
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#refuses
    a unique rule on a property two records already share, with the count
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#stores
    a unique rule once the values are unique, and enforces it from then on
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#accepts
    a manufacturer that is a record of the manufacturers object
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#refuses
    a manufacturer the tenant has no record of
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#refuses
    a manufacturer that is a boat
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#refuses
    a value for an archived property
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#copies
    an uploaded image into the record’s custom-objects folder and stores its permanent reference
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#attaches
    the copied file’s lifecycle row to the record
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#refuses
    an upload that is not there, and writes no record
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#names
    a create’s missing upload at properties.<key>, without the address sent
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#names
    a patch’s missing upload at properties.<key>, without the address sent, and leaves the record unchanged
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#names
    a data job line’s missing upload at properties.<key>, without the address sent
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#names
    a reference outside the file store at properties.<key>, without the address sent
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#names
    a file it cannot save by its property, properties.photo, without the address sent
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#detaches
    a deleted record’s file, due for retirement
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#changes
    the properties a patch names and keeps the others
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#recomposes
    the display name on a patch
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#clears
    a property a patch sends as null
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#clears
    every property a replacement leaves out
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#refuses
    a change at another version, and leaves the record as it was
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#refuses
    a change of an archived record
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#refuses
    a record of another object under this one’s key
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#records
    the update in the audit events
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#sets
    published_at when a record is published
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#clears
    published_at when it is unpublished
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#moves
    a record to pending review
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#refuses
    publication on an object that is not publishable
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#records
    the publication and its state in the audit events
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#lets
    publication be turned off once no record of the object is published
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#archives
    a record with everything kept
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#restores
    an archived record
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#refuses
    to archive an archived record
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#refuses
    a new record of an archived object
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#records
    the archive and the restore in the audit events
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#reads
    the record by id, with its properties
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#refuses
    a patch, a replacement and a publication of it, leaving the record at version 1
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#refuses
    to archive it, and to restore it
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#refuses
    to delete it, and leaves it stored
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#lists
    the record’s associations for a read, each with its type, direction, label and the other record’s name
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#refuses
    the same list as a write-side lookup, because the object is archived
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#refuses
    a create whose secondary display property holds one, naming the property, and writes no record
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#refuses
    a primary display property holding a carriage return
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#refuses
    a patch adding one, and leaves the record unchanged
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#accepts
    a line break in a property the display name is not composed from
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#trims
    line breaks at the ends of a value, as every string is trimmed
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#deletes
    a record with its values and unique values
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#deletes
    the record a cascading association names, with the association
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#writes
    every dependant’s event before the record it depended on: the associations, then the cascade deepest first
    (B1)
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#applies
    the owner’s cascade to a record of an archived custom object (B5: the rule applies whatever the type’s
    state)
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#refuses
    to delete a record an open restricting association names, and removes nothing
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#refuses
    a delete at another version
  - >-
    services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#records
    the delete in the audit events
fixture_imports:
  - drizzle-orm
  - '@rhythmsoftware/macroservice-testing/refusals'
  - '@rhythmsoftware/macroservice-testing/stage'
  - '@rhythmsoftware/macroservice-testing/execution-context'
  - '@rhythmsoftware/macroservice-errors/errors'
  - '@rhythmsoftware/macroservice-assets/testing/in-memory-asset-storage'
  - '@rhythmsoftware/macroservice-assets/asset-configuration'
  - '@rhythmsoftware/macroservice-assets/asset-pipeline'
  - '@rhythmsoftware/macroservice-assets/external-fetch'
  - ../../../../../../db/seeds/well-known/well-known-objects
  - ../../../../../audit/db/audit-events.table
  - ../../../../../associations/db/associations.table
  - ../../../../../associations/services/persistence/associations
  - ../../../../../metadata/services/persistence/custom-fields
  - ../../../../db/business-events.table
  - ../../../../db/custom-object-records.table
  - ../../../../db/custom-object-record-values.table
  - ../../../../db/custom-object-unique-values.table
  - ../../../../db/managed-assets.table
  - ../../../../services/assets/custom-object-record-assets
  - ../../../../services/persistence/custom-object-records
  - ../../../../services/persistence/custom-objects
  - ../../support
test_doubles: []
limitations:
  - Conditional or skipped cases remain outside any claimed passing execution.
unmatched_specification: null
binding_assertions:
  - scenario: ATS-PFM-MTD-006-03
    provenance: test
    source:
      - >-
        services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#refuses
        a unique rule on a property two records already share, with the count
      - >-
        services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#stores
        a unique rule once the values are unique, and enforces it from then on
    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/integration/services/persistence/custom-object-records.integration.spec.js#refuses
        a record of another object under this one’s 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-012-02
    provenance: test
    source:
      - >-
        services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#refuses
        a property the object does not have, by name
      - >-
        services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#names
        the object’s label in that refusal, never "custom records" (D4)
      - >-
        services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#refuses
        a value its data type does not accept, without echoing it
      - >-
        services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#refuses
        a value for an archived property
    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-03
    provenance: test
    source:
      - >-
        services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#refuses
        a record without a property required by the API
    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-04
    provenance: test
    source:
      - >-
        services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#requires
        the sail area of a sloop
      - >-
        services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#refuses
        a sail area on a vessel that is not a sloop, the property being hidden
      - >-
        services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#accepts
        a patch that hides the sail area while clearing 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-05
    provenance: test
    source:
      - >-
        services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#defaults
        a date to the tenant’s today, and a text to its literal
      - >-
        services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#defaults
        a property a create sends as null
      - >-
        services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#keeps
        the value a create gives over the default
      - >-
        services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#defaults
        a contact reference to the portal caller’s contact
    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-06
    provenance: test
    source:
      - >-
        services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#accepts
        a manufacturer that is a record of the manufacturers object
      - >-
        services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#refuses
        a manufacturer the tenant has no record of
      - >-
        services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#refuses
        a manufacturer that is a boat
    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-07
    provenance: test
    source:
      - >-
        services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#refuses
        a hull number another boat holds, naming the property and the boat
      - >-
        services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#refuses
        the same hull number in another case and with spaces around it
      - >-
        services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#frees
        a hull number a patch changes, so another boat may take 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-08
    provenance: test
    source:
      - >-
        services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#refuses
        a create whose secondary display property holds one, naming the property, and writes no record
      - >-
        services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#refuses
        a primary display property holding a carriage return
      - >-
        services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#accepts
        a line break in a property the display name is not composed from
      - >-
        services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#trims
        line breaks at the ends of a value, as every string is trimmed
    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-09
    provenance: test
    source:
      - >-
        services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#numbers
        a boat after the well-known twelve, and the next one after 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-10
    provenance: test
    source:
      - >-
        services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#changes
        the properties a patch names and keeps the others
      - >-
        services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#clears
        a property a patch sends as null
      - >-
        services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#clears
        every property a replacement leaves out
    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-11
    provenance: test
    source:
      - >-
        services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#refuses
        a change at another version, and leaves the record as it was
      - >-
        services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#refuses
        a change of an archived record
    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-12
    provenance: test
    source:
      - >-
        services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#refuses
        a create under an external id another record of the object holds, naming sys_external_id
      - >-
        services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#refuses
        a patch to an external id another record of the object holds, and leaves the record unchanged
    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-13
    provenance: test
    source:
      - >-
        services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#copies
        an uploaded image into the record’s custom-objects folder and stores its permanent reference
      - >-
        services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#names
        a create’s missing upload at properties.<key>, without the address sent
      - >-
        services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#names
        a reference outside the file store at properties.<key>, without the address sent
    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/integration/services/persistence/custom-object-records.integration.spec.js#records
        the update in the audit events
    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-17
    provenance: test
    source:
      - >-
        services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#stores
        a decimal with its scaled integer shadow
    note: >-
      These references identify the assertions this suite contributes; bindings to additional suites remain
      part of the scenario’s proof.
  - scenario: ATS-PFM-MTD-013-01
    provenance: test
    source:
      - >-
        services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#sets
        published_at when a record is published
      - >-
        services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#clears
        published_at when it is unpublished
      - >-
        services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#moves
        a record to pending review
      - >-
        services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#refuses
        publication on an object that is not publishable
    note: >-
      These references identify the assertions this suite contributes; bindings to additional suites remain
      part of the scenario’s proof.
  - scenario: ATS-PFM-MTD-013-02
    provenance: test
    source:
      - >-
        services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#archives
        a record with everything kept
      - >-
        services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#refuses
        to archive an archived record
      - >-
        services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#restores
        an archived record
    note: >-
      These references identify the assertions this suite contributes; bindings to additional suites remain
      part of the scenario’s proof.
  - scenario: ATS-PFM-MTD-013-03
    provenance: test
    source:
      - >-
        services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#refuses
        a delete at another version
      - >-
        services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#deletes
        a record with its values and unique values
      - >-
        services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#detaches
        a deleted record’s file, due for retirement
    note: >-
      These references identify the assertions this suite contributes; bindings to additional suites remain
      part of the scenario’s proof.
  - scenario: ATS-PFM-MTD-013-04
    provenance: test
    source:
      - >-
        services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#refuses
        to delete a record an open restricting association names, and removes 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-013-05
    provenance: test
    source:
      - >-
        services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#deletes
        the record a cascading association names, with the association
    note: >-
      These references identify the assertions this suite contributes; bindings to additional suites remain
      part of the scenario’s proof.
  - scenario: ATS-PFM-MTD-013-06
    provenance: test
    source:
      - >-
        services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#writes
        every dependant’s event before the record it depended on: the associations, then the cascade deepest
        first (B1)
    note: >-
      These references identify the assertions this suite contributes; bindings to additional suites remain
      part of the scenario’s proof.
  - scenario: ATS-PFM-MTD-013-07
    provenance: test
    source:
      - >-
        services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#applies
        the owner’s cascade to a record of an archived custom object (B5: the rule applies whatever the type’s
        state)
      - >-
        services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#refuses
        to delete it, and leaves it stored
    note: >-
      These references identify the assertions this suite contributes; bindings to additional suites remain
      part of the scenario’s proof.
  - scenario: ATS-PFM-MTD-013-08
    provenance: test
    source:
      - >-
        services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#records
        the publication and its state in the audit events
      - >-
        services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#records
        the archive and the restore in the audit events
      - >-
        services-platform:modules/custom-objects/tests/integration/services/persistence/custom-object-records.integration.spec.js#records
        the delete in the audit events
    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 integration 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. Conditional or skipped cases remain outside any claimed passing execution.

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