---
id: TST-MBR-MEM-008
title: Membership purchase eligibility decisions
kind: unit
product_area: membership
module: memberships
revision: 1
status: draft
source_sha:
  services-membership: 5994c270e8a37a30f848e99ba5b5ee6b87c08893
repository: services-membership
files:
  - modules/commerce-participant/tests/unit/eligibility.spec.ts
implements:
  - ATS-MBR-MEM-009-03
  - ATS-MBR-MEM-009-04
  - ATS-MBR-MEM-009-05
  - ATS-MBR-MEM-009-06
environment: local
implementation_state: implemented
latest_result: not-run
latest_run_at: null
latest_run_ref: null
conformance: not-verified
estimated_minutes: 1
isolation: Literal fixtures local to each test.
verification_notes: >-
  Bindings describe the assertions reviewed at the pinned commit; the suite is
  not executed by this documentation job.
coverage_gap: null
evidence:
  - >-
    services-membership:modules/commerce-participant/tests/unit/eligibility.spec.ts
assertion_anchors:
  - scenario: ATS-MBR-MEM-009-03
    source: >-
      services-membership:modules/commerce-participant/tests/unit/eligibility.spec.ts#refuses
      an owner already holding the membership, naming renew
  - scenario: ATS-MBR-MEM-009-03
    source: >-
      services-membership:modules/commerce-participant/tests/unit/eligibility.spec.ts#refuses
      a renewal of a lapsed membership, naming rejoin (07 §2)
  - scenario: ATS-MBR-MEM-009-03
    source: >-
      services-membership:modules/commerce-participant/tests/unit/eligibility.spec.ts#refuses
      a reinstatement of a current membership, naming renew
  - scenario: ATS-MBR-MEM-009-03
    source: >-
      services-membership:modules/commerce-participant/tests/unit/eligibility.spec.ts#refuses
      a rejoin inside the reinstatement window, naming reinstate
  - scenario: ATS-MBR-MEM-009-04
    source: >-
      services-membership:modules/commerce-participant/tests/unit/eligibility.spec.ts#refuses
      a renewal before the package’s renewal window opens
  - scenario: ATS-MBR-MEM-009-04
    source: >-
      services-membership:modules/commerce-participant/tests/unit/eligibility.spec.ts#refuses
      a membership marked do not renew
  - scenario: ATS-MBR-MEM-009-04
    source: >-
      services-membership:modules/commerce-participant/tests/unit/eligibility.spec.ts#refuses
      an on_date renewal
  - scenario: ATS-MBR-MEM-009-04
    source: >-
      services-membership:modules/commerce-participant/tests/unit/eligibility.spec.ts#refuses
      an effective date in the past
  - scenario: ATS-MBR-MEM-009-05
    source: >-
      services-membership:modules/commerce-participant/tests/unit/eligibility.spec.ts#refuses
      a suspended membership
  - scenario: ATS-MBR-MEM-009-05
    source: >-
      services-membership:modules/commerce-participant/tests/unit/eligibility.spec.ts#answers
      a fenced membership unavailable: fence
  - scenario: ATS-MBR-MEM-009-05
    source: >-
      services-membership:modules/commerce-participant/tests/unit/eligibility.spec.ts#answers
      a renewal while one is pending unavailable: renewal_in_progress
  - scenario: ATS-MBR-MEM-009-05
    source: >-
      services-membership:modules/commerce-participant/tests/unit/eligibility.spec.ts#answers
      an enrolment while a first term is pending unavailable: term_pending
  - scenario: ATS-MBR-MEM-009-06
    source: >-
      services-membership:modules/commerce-participant/tests/unit/eligibility.spec.ts#refuses
      an immediate upgrade as requires_amendment, naming prepare_change
  - scenario: ATS-MBR-MEM-009-06
    source: >-
      services-membership:modules/commerce-participant/tests/unit/eligibility.spec.ts#refuses
      a transfer as requires_amendment
  - scenario: ATS-MBR-MEM-009-06
    source: >-
      services-membership:modules/commerce-participant/tests/unit/eligibility.spec.ts#refuses
      a change of affiliation as requires_amendment
  - scenario: ATS-MBR-MEM-009-06
    source: >-
      services-membership:modules/commerce-participant/tests/unit/eligibility.spec.ts#takes
      an upgrade at term end as a renewal into the other type
---

# Membership purchase eligibility decisions

## Verification Boundary

The suite exercises pure membership decisions against literal inputs and expected outputs.

## What This Suite Proves

The structured bindings identify the capability and feature cases whose reviewed assertions this suite executes. Source anchors preserve the evidence for each binding.

## What It Does Not Prove

A pure-rule pass does not prove persistence, permission enforcement through the API or a complete business lifecycle. Registration records existing code and leaves execution and conformance unverified.

## Real Dependencies and Test Doubles

The decision functions and schemas are real. Literal inputs and checked-in fixtures supply their data; this boundary does not call live owners.

## Must Not Be Doubled

Keep the decision function or schema under test real; replacing its result would remove the proof.
