---
id: TST-PFM-MTD-100
title: portal forms
kind: integration
product_area: platform
module: metadata
revision: 1
status: draft
source_sha:
  services-platform: ad3f6a6582843008ed0f5a17b131878d15829af1
repository: services-platform
files:
  - modules/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js
implements: []
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/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js'
  - >-
    services-platform:modules/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js#answers
    the definition with the fields it was given
  - >-
    services-platform:modules/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js#trims
    the name rather than storing the whitespace a form sent
  - >-
    services-platform:modules/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js#answers
    the layout document unchanged
  - >-
    services-platform:modules/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js#stamps
    version 1 with the caller as creator and as last modifier
  - >-
    services-platform:modules/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js#stamps
    the created and last-modified instants at the same moment
  - >-
    services-platform:modules/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js#persists
    exactly the record it answered
  - >-
    services-platform:modules/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js#writes
    the row under the execution’s tenant, which no field of the request names
  - >-
    services-platform:modules/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js#leaves
    the definition unreachable from another tenant
  - >-
    services-platform:modules/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js#stamps
    the acting user, not a fixed actor
  - >-
    services-platform:modules/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js#accepts
    a body carrying the server-owned system properties and ignores their values
  - >-
    services-platform:modules/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js#writes
    the two client-settable system columns the body names
  - >-
    services-platform:modules/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js#stores
    a definition for each registered purpose
  - >-
    services-platform:modules/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js#stores
    an arbitrary nested document unchanged, because the backend never reads inside it
  - >-
    services-platform:modules/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js#refuses
    an id that already exists as an InvalidRequest
  - >-
    services-platform:modules/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js#leaves
    the existing definition untouched when it refuses the duplicate id
  - >-
    services-platform:modules/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js#refuses
    a purpose this build does not register, naming it
  - >-
    services-platform:modules/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js#writes
    no row at all when it refuses the purpose, so nobody could reach what nobody can administer
  - >-
    services-platform:modules/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js#refuses
    a blank name
  - >-
    services-platform:modules/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js#refuses
    a name longer than the column allows
  - >-
    services-platform:modules/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js#refuses
    a layout that is an array
  - >-
    services-platform:modules/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js#refuses
    a layout that is a scalar
  - >-
    services-platform:modules/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js#refuses
    a layout that is null
  - >-
    services-platform:modules/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js#accepts
    an empty object as a layout, which is a document with nothing in it yet
  - >-
    services-platform:modules/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js#refuses
    a layout larger than the stated maximum, telling the person the limit and the size
  - >-
    services-platform:modules/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js#accepts
    a layout just inside the maximum, so the limit is where it is stated
  - >-
    services-platform:modules/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js#answers
    the definition with the fields the replacement states
  - >-
    services-platform:modules/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js#clears
    a description the replacement states as null, and the record then carries no description at all
  - >-
    services-platform:modules/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js#raises
    the version and stamps the acting user as last modifier
  - >-
    services-platform:modules/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js#persists
    exactly the record it answered
  - >-
    services-platform:modules/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js#refuses
    the version the caller did not read, as a StaleObject
  - >-
    services-platform:modules/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js#leaves
    the definition at the version it had after the stale refusal
  - >-
    services-platform:modules/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js#refuses
    a replacement that names another purpose, naming both the stored one and the request’s
  - >-
    services-platform:modules/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js#leaves
    the definition untouched after refusing the purpose change
  - >-
    services-platform:modules/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js#accepts
    a replacement that states the purpose it already has
  - >-
    services-platform:modules/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js#refuses
    an id the tenant does not hold, as a RecordNotFound
  - >-
    services-platform:modules/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js#refuses
    a definition of another tenant as not found, rather than telling the caller it exists
  - >-
    services-platform:modules/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js#refuses
    a definition locked against updates
  - >-
    services-platform:modules/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js#allows
    the update of a definition locked only against deletes
  - >-
    services-platform:modules/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js#keeps
    the lock a replacement states again
  - >-
    services-platform:modules/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js#clears
    a lock the replacement does not state, as a replacement clears every field it leaves out
  - >-
    services-platform:modules/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js#refuses
    a blank name on a replacement too
  - >-
    services-platform:modules/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js#refuses
    a layout that is not an object on a replacement too
  - >-
    services-platform:modules/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js#leaves
    the definition untouched after refusing the layout
  - >-
    services-platform:modules/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js#answers
    the id it deleted
  - >-
    services-platform:modules/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js#leaves
    the definition unreadable afterwards
  - >-
    services-platform:modules/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js#refuses
    an id the tenant does not hold, as a RecordNotFound
  - >-
    services-platform:modules/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js#refuses
    a definition of another tenant as not found
  - >-
    services-platform:modules/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js#refuses
    a definition locked against deletes
  - >-
    services-platform:modules/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js#refuses
    a definition something still assigns, naming the referring row
  - >-
    services-platform:modules/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js#leaves
    the definition in place after refusing the assigned delete
  - >-
    services-platform:modules/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js#names
    every referring row, in a stable order, when more than one assigns it
  - >-
    services-platform:modules/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js#deletes
    the definition once the assignments are gone
  - >-
    services-platform:modules/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js#refuses
    exactly one of the two
  - >-
    services-platform:modules/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js#leaves
    no assignment pointing at a definition that is gone
  - >-
    services-platform:modules/layouts/tests/integration/services/persistence/portal-forms.integration.spec.js#leaves
    the definition assigned when the assignment is what won
fixture_imports:
  - drizzle-orm
  - ../../../../services/persistence/portal-forms
  - ../../../../db/portal-forms.table
  - ../../../../db/layout-assignments.table
  - ../../../../db/layout-resource-columns
  - ../../support
  - '@rhythmsoftware/macroservice-testing/refusals'
  - '@rhythmsoftware/macroservice-testing/stage'
  - '@rhythmsoftware/macroservice-errors/errors'
test_doubles: []
limitations: []
unmatched_specification: FND-PFM-MTD-083
binding_assertions: []
---

# Portal forms

## Verification Boundary

This integration suite checks reusable record presentations within the local test harness. The registered file and pinned revision define its boundary.

## What This Suite Proves

The suite contains executable checks for this module, but no matching detailed scenario is established in this back-fill. The executable coverage finding records that mapping gap. 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.
