---
id: TST-MBR-STR-096
title: Accounting product extensions through the API
kind: api-lifecycle
product_area: membership
module: structure
revision: 1
status: draft
source_sha:
  services-membership: 5994c270e8a37a30f848e99ba5b5ee6b87c08893
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
repository: services-membership
files:
  - tests/e2e/packages-as-products.e2e.spec.ts
implements:
  - ATS-MBR-STR-008-01
  - ATS-MBR-STR-008-04
  - ATS-MBR-STR-012-01
  - ATS-MBR-STR-012-02
  - ATS-MBR-STR-012-03
  - ATS-MBR-STR-012-04
environment: local
implementation_state: implemented
latest_result: not-run
latest_run_at: null
latest_run_ref: null
conformance: not-verified
estimated_minutes: 3
isolation: A uniquely named local workspace and its seeded records; the suite owns its fixture data and cleanup.
evidence:
  - 'services-membership:tests/e2e/packages-as-products.e2e.spec.ts'
bindings:
  - scenario: ATS-MBR-STR-008-01
    source: >-
      services-membership:tests/e2e/packages-as-products.e2e.spec.ts#packages as products, through the
      API › extends a product of type chapter_dues as a unit’s dues product, under the product’s id, with
      the product’s name
    provenance: test
  - scenario: ATS-MBR-STR-008-04
    source: >-
      services-membership:tests/e2e/packages-as-products.e2e.spec.ts#packages as products, through the
      API › re-points a unit’s dues product at another package at the version just read, 200 with the
      next version
    provenance: test
  - scenario: ATS-MBR-STR-012-01
    source: >-
      services-membership:tests/e2e/packages-as-products.e2e.spec.ts#packages as products, through the
      API › refuses a package create that names no product id: there is no name to make one from
    provenance: test
  - scenario: ATS-MBR-STR-012-01
    source: >-
      services-membership:tests/e2e/packages-as-products.e2e.spec.ts#packages as products, through the
      API › refuses a package whose product Accounting does not have, 400
    provenance: test
  - scenario: ATS-MBR-STR-012-01
    source: >-
      services-membership:tests/e2e/packages-as-products.e2e.spec.ts#packages as products, through the
      API › refuses a package on a product of another type, 400
    provenance: test
  - scenario: ATS-MBR-STR-012-02
    source: >-
      services-membership:tests/e2e/packages-as-products.e2e.spec.ts#packages as products, through the
      API › refuses the common fields a package no longer carries of its own (they are the product’s)
    provenance: test
  - scenario: ATS-MBR-STR-012-02
    source: >-
      services-membership:tests/e2e/packages-as-products.e2e.spec.ts#packages as products, through the
      API › extends a product of type membership_package and answers the product’s name, status and
      visibility as the package’s
    provenance: test
  - scenario: ATS-MBR-STR-012-03
    source: >-
      services-membership:tests/e2e/packages-as-products.e2e.spec.ts#packages as products, through the
      API › lists packages with the product’s fields and filters is_active by the product’s status
    provenance: test
  - scenario: ATS-MBR-STR-012-03
    source: >-
      services-membership:tests/e2e/packages-as-products.e2e.spec.ts#packages as products, through the
      API › refuses a renewal term on a package whose product Accounting deactivated
    provenance: test
  - scenario: ATS-MBR-STR-012-04
    source: >-
      services-membership:tests/e2e/packages-as-products.e2e.spec.ts#packages as products, through the
      API › refuses a second extension of the same product: the package id is the product id
    provenance: test
invocation: 'npm run test:e2e'
coverage_limit: >-
  Bindings identify the concrete cases executed in this file. A compound specification may also depend on
  other registered suites or remain partly proposed; registration is not a passing execution result.
provenance: test
source:
  - 'services-membership:tests/e2e/packages-as-products.e2e.spec.ts'
---

# Accounting product extensions through the API

## Verification Boundary

This suite runs public API operations through the local dispatcher and checks the resulting records and responses. Accounting product extensions through the API defines the scope of its examples.

## What This Suite Proves

The suite executes the concrete examples named by its binding ledger. Those examples contribute to the linked capability or feature scenarios within the boundary of the test assertions.

## What It Does Not Prove

Registration supplies no fresh execution result or deployed conformance verdict. Browser behavior, deployed infrastructure and unasserted variants require separate evidence.

## Real Dependencies and Test Doubles

PostgreSQL, local Membership services and the suite’s persistence path are real. The business clock and caller fixtures are controlled by the harness. API requests enter the real dispatcher with contexts signed by a test key rather than Platform’s production signer. Accounting tables or product functions are local stand-ins; this suite does not certify the deployed Accounting service.

## Must Not Be Doubled

The Membership path under examination, transaction behavior and database constraints stay real. Replacing those boundaries would remove the persisted proof the suite is intended to supply.
