---
id: TST-PFM-NOT-024
title: requests
kind: api-lifecycle
product_area: platform
module: notifications
revision: 1
status: draft
source_sha:
  services-platform: ad3f6a6582843008ed0f5a17b131878d15829af1
repository: services-platform
files:
  - modules/communications/tests/e2e/requests.e2e.spec.js
implements:
  - ATS-PFM-NOT-017-03
  - ATS-PFM-NOT-017-04
  - ATS-PFM-NOT-017-05
  - ATS-PFM-NOT-017-12
  - ATS-PFM-NOT-019-07
environment: local
implementation_state: implemented
latest_result: not-run
latest_run_at: null
latest_run_ref: null
conformance: not-verified
estimated_minutes: 5
isolation: >-
  Suite-owned records in the prepared integration workspaces; seeded workspace
  identities remain shared fixtures.
assertion_bindings:
  - scenario: ATS-PFM-NOT-017-03
    suite: TST-PFM-NOT-024
    assertions:
      - >-
        services-platform:modules/communications/tests/e2e/requests.e2e.spec.js#answers
        the same request id, marked duplicate, when the idempotency key is
        repeated
  - scenario: ATS-PFM-NOT-017-04
    suite: TST-PFM-NOT-024
    assertions:
      - >-
        services-platform:modules/communications/tests/e2e/requests.e2e.spec.js#answers
        invalid in front of the caller for an envelope it can judge there,
        naming the problem by path
      - >-
        services-platform:modules/communications/tests/e2e/requests.e2e.spec.js#takes
        nothing for that request, so its key is still free
  - scenario: ATS-PFM-NOT-017-05
    suite: TST-PFM-NOT-024
    assertions:
      - >-
        services-platform:modules/communications/tests/e2e/requests.e2e.spec.js#blocks
        a request that names no template, recording the reason staff can act on
      - >-
        services-platform:modules/communications/tests/e2e/requests.e2e.spec.js#blocks
        a request naming a template that was never published
      - >-
        services-platform:modules/communications/tests/e2e/requests.e2e.spec.js#takes
        data the purpose’s contract does not accept, and stores it invalid
        behind the queue
      - >-
        services-platform:modules/communications/tests/e2e/requests.e2e.spec.js#withholds
        every message of a request to a suppressed address, which is the
        suppressed outcome
  - scenario: ATS-PFM-NOT-017-12
    suite: TST-PFM-NOT-024
    assertions:
      - >-
        services-platform:modules/communications/tests/e2e/requests.e2e.spec.js#refuses
        a console caller the system route that asks for a communication
      - >-
        services-platform:modules/communications/tests/e2e/requests.e2e.spec.js#answers
        a receipt naming the request the caller may read it under, and the
        messages it will have
  - scenario: ATS-PFM-NOT-019-07
    suite: TST-PFM-NOT-024
    assertions:
      - >-
        services-platform:modules/communications/tests/e2e/requests.e2e.spec.js#lists
        nothing of this tenant under the other tenant
evidence:
  - 'services-platform:modules/communications/tests/e2e/requests.e2e.spec.js'
  - The file and referenced assertion titles exist at the pinned commit.
dependency_evidence:
  - >-
    Real: the dispatcher, the route table, signed-context verification, the
    authorization evaluation, the handlers, real
  - >-
    and messages persistence services, and PostgreSQL with row-level security
    on. Doubled: the object store, the send queue
  - >-
    (recorded) and the signing key, which is this run's own. Never doubled: the
    dispatcher, the route table, signed-context
---

# requests

## Verification Boundary

This suite exercises the local services and prepared PostgreSQL database. API lifecycle cases use signed test contexts through the real route handler; they do not invoke the deployed gateway.

## What This Suite Proves

Its cases exercise deduplicate ordinary request retries and recovery; validate before consuming the submission key; retain all non-sending outcomes and reasons; deny direct association sends from console callers; enforce workspace isolation on all mail detail.

The registered scenario bindings identify the assertions this executable file contributes. They retain individual test references so that a composite scenario does not become a claim of complete execution by one file.

## What It Does Not Prove

Local outcomes do not prove deployed queues, external provider acceptance, production credentials or complete browser behavior. No fresh execution or conformance result is claimed.

## Real Dependencies and Test Doubles

The communication fixtures use real PostgreSQL and module logic. Shared support records queue and transport calls and stores objects in memory; sender provisioning substitutes a provider identity store. Signed API contexts replace the authorizer key in API suites.

## Must Not Be Doubled

Database constraints, workspace policy, state guards and the service operation under test must remain real. Recording a provider or queue call must not replace the submission, claim or outcome logic being checked.
