---
id: TST-PFM-INT-468
title: extension handlers
kind: integration
product_area: platform
module: integrations
revision: 1
status: draft
source_sha:
  services-platform: ad3f6a6582843008ed0f5a17b131878d15829af1
  macroservice-libraries: 54536a441935c6e09fdb7f96f0bec71c52ba4e03
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
repository: services-platform
files:
  - modules/extensions/tests/integration/services/persistence/extension-handlers.integration.spec.js
implements:
  - ATS-PFM-INT-017-01
  - ATS-PFM-INT-017-03
  - ATS-PFM-INT-017-04
  - ATS-PFM-INT-017-05
environment: local
implementation_state: implemented
latest_result: not-run
latest_run_at: null
latest_run_ref: null
conformance: not-verified
estimated_minutes: 5
isolation: >-
  Use the suite-owned database fixtures and its declared cleanup; prepare the test database before
  integration or lifecycle execution.
evidence:
  - >-
    services-platform:modules/extensions/tests/integration/services/persistence/extension-handlers.integration.spec.js
test_cases:
  - source: >-
      services-platform:modules/extensions/tests/integration/services/persistence/extension-handlers.integration.spec.js#creates
      a Lambda handler with a minted UUIDv7 id and its qualifier defaulted to live
    provenance: test
  - source: >-
      services-platform:modules/extensions/tests/integration/services/persistence/extension-handlers.integration.spec.js#refuses
      an HTTPS handler as not available, naming decision D-02, and writes nothing
    provenance: test
  - source: >-
      services-platform:modules/extensions/tests/integration/services/persistence/extension-handlers.integration.spec.js#refuses
      a target property the kind does not name, so no secret value reaches the row
    provenance: test
  - source: >-
      services-platform:modules/extensions/tests/integration/services/persistence/extension-handlers.integration.spec.js#refuses
      implements naming a point that is not registered
    provenance: test
  - source: >-
      services-platform:modules/extensions/tests/integration/services/persistence/extension-handlers.integration.spec.js#refuses
      a timeout above the shortest ceiling of the points it implements
    provenance: test
  - source: >-
      services-platform:modules/extensions/tests/integration/services/persistence/extension-handlers.integration.spec.js#refuses
      a rule without a definition, and a definition on a Lambda handler
    provenance: test
  - source: >-
      services-platform:modules/extensions/tests/integration/services/persistence/extension-handlers.integration.spec.js#creates
      a rule handler with its definition
    provenance: test
  - source: >-
      services-platform:modules/extensions/tests/integration/services/persistence/extension-handlers.integration.spec.js#refuses
      a second handler of one name in the tenant as InvalidRequest naming the field
    provenance: test
  - source: >-
      services-platform:modules/extensions/tests/integration/services/persistence/extension-handlers.integration.spec.js#hands
      the secret to the port under the handler’s own name, and stores only that name
    provenance: test
  - source: >-
      services-platform:modules/extensions/tests/integration/services/persistence/extension-handlers.integration.spec.js#never
      stores the secret value anywhere in the row
    provenance: test
  - source: >-
      services-platform:modules/extensions/tests/integration/services/persistence/extension-handlers.integration.spec.js#writes
      no row when the secret cannot be written
    provenance: test
  - source: >-
      services-platform:modules/extensions/tests/integration/services/persistence/extension-handlers.integration.spec.js#records
      the creation in the security trail, naming the secret by field and never by value
    provenance: test
  - source: >-
      services-platform:modules/extensions/tests/integration/services/persistence/extension-handlers.integration.spec.js#creates
      a rule that fits the point’s current version
    provenance: test
  - source: >-
      services-platform:modules/extensions/tests/integration/services/persistence/extension-handlers.integration.spec.js#refuses
      a rule that does not fit, naming each problem by its path and code, and writes nothing
    provenance: test
  - source: >-
      services-platform:modules/extensions/tests/integration/services/persistence/extension-handlers.integration.spec.js#accepts
      a rule that implements no point yet, to be checked when it is bound
    provenance: test
  - source: >-
      services-platform:modules/extensions/tests/integration/services/persistence/extension-handlers.integration.spec.js#refuses
      a rule that no longer fits once it implements a point, leaving the row as it was
    provenance: test
  - source: >-
      services-platform:modules/extensions/tests/integration/services/persistence/extension-handlers.integration.spec.js#refuses
      a change of the definition to one that does not fit, leaving the row as it was
    provenance: test
  - source: >-
      services-platform:modules/extensions/tests/integration/services/persistence/extension-handlers.integration.spec.js#changes
      a handler at the version read, and bumps its version
    provenance: test
  - source: >-
      services-platform:modules/extensions/tests/integration/services/persistence/extension-handlers.integration.spec.js#refuses
      a change at a version that is no longer current, leaving the row as it was
    provenance: test
  - source: >-
      services-platform:modules/extensions/tests/integration/services/persistence/extension-handlers.integration.spec.js#disables
      a handler and makes it active again
    provenance: test
  - source: >-
      services-platform:modules/extensions/tests/integration/services/persistence/extension-handlers.integration.spec.js#rotates
      the secret through the port as a new write under the same name
    provenance: test
  - source: >-
      services-platform:modules/extensions/tests/integration/services/persistence/extension-handlers.integration.spec.js#does
      not find another tenant’s handler to change
    provenance: test
  - source: >-
      services-platform:modules/extensions/tests/integration/services/persistence/extension-handlers.integration.spec.js#refuses
      to delete a handler a binding uses, naming why, and keeps it
    provenance: test
  - source: >-
      services-platform:modules/extensions/tests/integration/services/persistence/extension-handlers.integration.spec.js#deletes
      a handler no binding uses, scheduling its secret’s deletion, and records it
    provenance: test
dependency_evidence:
  provenance: test
  source: >-
    services-platform:modules/extensions/tests/integration/services/persistence/extension-handlers.integration.spec.js
  reviewed:
    - Suite introduction
    - Fixture setup
    - Client substitutions
    - Assertions and cleanup
---
# extension handlers

## Verification Boundary

This database and service suite exercises extension handlers. Its registration records the executable definition; no run result is asserted.

## What This Suite Proves

The bindings identify the detailed outcomes asserted by this suite. Test-level evidence retains the individual checks, including cases where several suites contribute to one scenario.

## What It Does Not Prove

In-process execution does not establish deployed infrastructure or a real provider response. Several bindings can supply different parts of a detailed scenario; no single-file completeness is implied.

## Real Dependencies and Test Doubles

The suite definition identifies its database fixtures and replaced clients, hooks, clocks or executors. Integration runs use the prepared database; lifecycle runs exercise the in-process route or adapter path.

## Must Not Be Doubled

The database constraints, transactions and service behavior claimed by an integration binding must execute. Replaced external seams cannot establish live provider or infrastructure behavior.
