---
id: TST-PFM-SEC-041
title: Customers request checks
kind: api-lifecycle
product_area: platform
module: security
revision: 2
status: draft
source_sha:
  services-platform: ad3f6a6582843008ed0f5a17b131878d15829af1
repository: services-platform
files:
  - modules/customers/tests/e2e/customers.e2e.spec.js
implements:
  - ATS-PFM-SEC-001-01
  - ATS-PFM-SEC-001-02
  - ATS-PFM-SEC-001-04
  - ATS-PFM-SEC-001-05
  - ATS-PFM-SEC-001-06
  - ATS-PFM-SEC-001-10
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 prepared test database and suite-owned fixture rows; retain shared seed records.
assertion_evidence:
  - provenance: test
    source: 'services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#customers API (end to end)'
  - provenance: test
    source: 'services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#the public health route'
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#answers 200 without a
      context
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#names the service and says
      it is well
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#carries the build the
      logic stack stamped
  - provenance: test
    source: 'services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#createCustomer'
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#answers 200 for a valid
      body
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#answers the record with
      the fields it was given and the server stamps
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#stores the customer under
      the id the body names, trimmed and lowercased
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#refuses a body that names
      no id as 400 customer_id_required, nothing generating one
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#refuses a UUID-shaped id
      as 400 customer_id_invalid
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#refuses a reserved id as
      400 customer_id_reserved
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#refuses an id another
      customer has as 409 customer_id_taken
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#carries none of the
      payment fields the customer no longer has
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#reads the created customer
      back through the API
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#refuses an invalid body as
      400
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#refuses a type that is
      nothing but whitespace as 400 naming type
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#stores no name at all when
      the box was left blank, because the column may hold nothing
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#trims a name that was
      pasted with surrounding space
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#names the contract prefix
      in the refusal of an invalid body
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#lists the offending field
      in the refusal of an invalid body
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#accepts a body carrying
      the server's own system properties
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#ignores the values a body
      gives the server's own system properties
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#refuses an anonymous call
      as 401
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#refuses a context signed
      by another key as 401
  - provenance: test
    source: 'services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#getCustomer'
  - provenance: test
    source: 'services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#reads a seeded customer'
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#projects the record to the
      requested fields
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#answers 404 for an unknown
      id
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#names the contract prefix
      in the 404
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#lets a portal caller read
      a customer, because the route declares portal access
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#refuses an anonymous call
      as 401
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#refuses a context signed
      by another key as 401
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#the reach a caller has
      over customers
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#reduces the list to the
      caller's own customer when the caller is not staff
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#answers a customer-scoped
      caller 404 for another customer's record, so the route cannot be walked
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#refuses a portal caller a
      console route, which is what the wall means
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#refuses a customer-scoped
      caller the system route that creates a customer
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#serves that same caller
      the one operation its grants do name
  - provenance: test
    source: 'services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#listCustomers'
  - provenance: test
    source: 'services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#answers 200'
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#lists the caller's own
      customer, and no other customer's record
  - provenance: test
    source: 'services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#lists them in name order'
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#projects each record to
      the requested fields
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#refuses an anonymous call
      as 401
  - provenance: test
    source: 'services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#updateCustomer'
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#answers 200 for a
      replacement at the version read
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#answers the replaced
      fields with the version bumped
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#answers the e-mail address
      in its canonical form, lowercase
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#persists the replacement,
      read back through the API
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#refuses a stale version as
      409
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#names StaleObject in the
      409
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#refuses a body whose id
      differs from the path as 400
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#refuses an unknown id as
      404
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#refuses an anonymous call
      as 401
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#refuses an invalid e-mail
      address as 400 naming emailAddress
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#refuses the retired
      property name email as 400
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#leaves the record
      unchanged after the refusals above
  - provenance: test
    source: 'services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#patchCustomer'
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#answers 200 for valid JSON
      Patch directives
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#applies the directives to
      the current record, bumping the version
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#persists the patched
      record, read back through the API
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#refuses a directive list
      that is not valid JSON Patch as 400
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#refuses a patch that makes
      the record invalid as 400
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#names the contract prefix
      when a patch makes the record invalid
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#refuses a patch of an
      unknown record as 404
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#refuses an anonymous call
      as 401
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#leaves the record
      unchanged after the refusals above
  - provenance: test
    source: 'services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#deleteCustomer'
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#read the customer before
      it was deleted
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#answers 200 and the id it
      deleted
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#no longer reads the
      deleted customer
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#answers 404 to a second
      delete of the same customer
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#refuses a customer that
      still has tenants as 409
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#names ForeignKeyViolation
      in the 409
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#leaves a customer that
      still has tenants readable
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#refuses an anonymous call
      as 401
  - provenance: test
    source: 'services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#routing'
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#answers 404 for a path no
      route declares
  - provenance: test
    source: >-
      services-platform:modules/customers/tests/e2e/customers.e2e.spec.js#answers 405 for a method a
      declared path does not take
dependency_evidence: >-
  The local request harness exercises the route dispatcher and the prepared database. The file
  declares no substituted collaborators.
evidence:
  - 'services-platform:modules/customers/tests/e2e/customers.e2e.spec.js'
  - >-
    Static review at the recorded source revision; executable results remain not-run and conformance
    remains not-verified.
binding_note: >-
  Each binding names the scenario to which this file contributes assertions. A binding is not a
  recorded pass and does not extend the file’s dependency boundary.
examiner: codex
examined_at: '2026-10-23'
final_text: OpenAI
dependency_review:
  provenance: test
  source: 'services-platform:modules/customers/tests/e2e/customers.e2e.spec.js'
  explicit_no_doubles: true
  identified_double_boundaries: []
---
# Customers request checks

## Verification Boundary

The file exercises public request handling through the local service harness. The assertion references identify the source checks for customers.

## What This Suite Proves

The source assertions support the observations named in the bound scenarios. A scenario spanning multiple files must retain the other files’ contributions.

## What It Does Not Prove

This examination does not run the suite. Passing behavior, deployed conformance and the behavior of substituted dependencies require separate execution evidence.

## Real Dependencies and Test Doubles

The local request harness exercises the route dispatcher and the prepared database. The file declares no substituted collaborators.

## Must Not Be Doubled

Keep route dispatch, signed-context verification and the exercised service decisions real. A test key can supply signatures, but replacing the authorization decision cannot prove request enforcement.
