---
id: ATS-MBR-MEM-017
scope: CAP-MBR-MEM-017
product_area: membership
module: memberships
revision: 2
status: proposed
approved_by: null
approved_at: null
source_sha:
  services-membership: 5994c270e8a37a30f848e99ba5b5ee6b87c08893
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
scenarios:
  - id: ATS-MBR-MEM-017-01
    title: An export captures the requester's scope at request time
    level: api
    proves:
      - BR-CAP-MBR-MEM-017-01
    preconditions: >-
      The well-known FAA workspace fixtures, or a workspace the test builds from
      them.
    steps:
      - do: >-
          The Atlanta officer requests an export; staff and an officer with no
          reach request too.
        expect: >-
          Each captures exactly the memberships its scope reaches with the
          filters.
        provenance: test
        source:
          - >-
            services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#captures
            the ids the requester’s set reaches at request time
          - >-
            services-membership:tests/acceptance/security/MBR-ACC-0460.acceptance.ts#MBR-ACC-0460
    expected: Each captures exactly the memberships its scope reaches with the filters.
    negative: false
    data_needs: 'FAA programs, packages, units and members from the integration seed.'
    bound_to:
      - TST-MBR-MEM-031
      - TST-MBR-MEM-222
    provenance: test
    source: >-
      services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#captures
      the ids the requester’s set reaches at request time
    category: permission
    binding_evidence:
      - suite: TST-MBR-MEM-031
        source: >-
          services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#captures
          the ids the requester’s set reaches at request time
      - suite: TST-MBR-MEM-222
        source: >-
          services-membership:tests/acceptance/security/MBR-ACC-0460.acceptance.ts#MBR-ACC-0460
  - id: ATS-MBR-MEM-017-02
    title: Export rows hold the captured members with their units on the date
    level: api
    proves:
      - BR-CAP-MBR-MEM-017-02
    preconditions: >-
      The well-known FAA workspace fixtures, or a workspace the test builds from
      them.
    steps:
      - do: Let the export job run.
        expect: >-
          One row per captured membership with number, owner, program, status
          and units on the date.
        provenance: test
        source:
          - >-
            services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#writes
            rows for the captured memberships only, with their units on the date
    expected: >-
      One row per captured membership with number, owner, program, status and
      units on the date.
    negative: false
    data_needs: 'FAA programs, packages, units and members from the integration seed.'
    bound_to:
      - TST-MBR-MEM-031
    provenance: test
    source: >-
      services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#writes
      rows for the captured memberships only, with their units on the date
    category: rule
    binding_evidence:
      - suite: TST-MBR-MEM-031
        source: >-
          services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#writes
          rows for the captured memberships only, with their units on the date
  - id: ATS-MBR-MEM-017-03
    title: An export is read by its requester and staff only
    level: api
    proves:
      - BR-CAP-MBR-MEM-017-03
    preconditions: >-
      The well-known FAA workspace fixtures, or a workspace the test builds from
      them.
    steps:
      - do: 'The requester, staff and another officer read the export.'
        expect: The first two read it; the other officer gets not found.
        provenance: test
        source:
          - >-
            services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#answers
            the export to the person who asked for it and to staff, and not to
            another officer
    expected: The first two read it; the other officer gets not found.
    negative: true
    data_needs: 'FAA programs, packages, units and members from the integration seed.'
    bound_to:
      - TST-MBR-MEM-031
    provenance: test
    source: >-
      services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#answers
      the export to the person who asked for it and to staff, and not to another
      officer
    category: permission
    binding_evidence:
      - suite: TST-MBR-MEM-031
        source: >-
          services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#answers
          the export to the person who asked for it and to staff, and not to
          another officer
  - id: ATS-MBR-MEM-017-04
    title: 'No reach, no capture'
    level: api
    proves:
      - BR-CAP-MBR-MEM-017-05
    preconditions: >-
      The well-known FAA workspace fixtures, or a workspace the test builds from
      them.
    steps:
      - do: A caller whose scope reaches nobody requests an export.
        expect: It captures nothing.
        provenance: test
        source:
          - >-
            services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#captures
            nothing for a caller with NONE
    expected: It captures nothing.
    negative: false
    data_needs: 'FAA programs, packages, units and members from the integration seed.'
    bound_to:
      - TST-MBR-MEM-031
    provenance: test
    source: >-
      services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#captures
      nothing for a caller with NONE
    category: permission
    binding_evidence:
      - suite: TST-MBR-MEM-031
        source: >-
          services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#captures
          nothing for a caller with NONE
  - id: ATS-MBR-MEM-017-05
    title: A portal member sees their own memberships only
    level: api
    proves:
      - BR-CAP-MBR-MEM-017-06
    preconditions: >-
      The well-known FAA workspace fixtures, or a workspace the test builds from
      them.
    steps:
      - do: >-
          Jo reads her own memberships and tries the staff read; Dana, with
          none, reads her own.
        expect: Jo sees hers; the staff read is refused; Dana gets an empty answer.
        provenance: test
        source:
          - >-
            services-membership:tests/e2e/s07-regional-officer.e2e.spec.ts#lets
            Jo read her own memberships in the portal
          - >-
            services-membership:tests/e2e/s07-regional-officer.e2e.spec.ts#refuses
            Jo the staff read of her own membership: a portal member holds no
            members.read
          - >-
            services-membership:tests/e2e/s07-regional-officer.e2e.spec.ts#answers
            Dana’s own portal read with no membership, Dana holding none
          - >-
            services-membership:tests/acceptance/memberships/MBR-ACC-0188.acceptance.ts#MBR-ACC-0188
    expected: Jo sees hers; the staff read is refused; Dana gets an empty answer.
    negative: false
    data_needs: 'FAA programs, packages, units and members from the integration seed.'
    bound_to:
      - TST-MBR-MEM-250
      - TST-MBR-MEM-207
    provenance: test
    source: >-
      services-membership:tests/e2e/s07-regional-officer.e2e.spec.ts#lets Jo
      read her own memberships in the portal
    category: permission
    binding_evidence:
      - suite: TST-MBR-MEM-250
        source: >-
          services-membership:tests/e2e/s07-regional-officer.e2e.spec.ts#lets Jo
          read her own memberships in the portal
      - suite: TST-MBR-MEM-250
        source: >-
          services-membership:tests/e2e/s07-regional-officer.e2e.spec.ts#refuses
          Jo the staff read of her own membership: a portal member holds no
          members.read
      - suite: TST-MBR-MEM-250
        source: >-
          services-membership:tests/e2e/s07-regional-officer.e2e.spec.ts#answers
          Dana’s own portal read with no membership, Dana holding none
      - suite: TST-MBR-MEM-207
        source: >-
          services-membership:tests/acceptance/memberships/MBR-ACC-0188.acceptance.ts#MBR-ACC-0188
  - id: ATS-MBR-MEM-017-06
    title: Export the standing of the captured roster on its date
    category: interaction
    level: api
    proves:
      - BR-CAP-MBR-MEM-005-10
      - BR-CAP-MBR-MEM-017-02
    interacts_with:
      - CAP-MBR-MEM-005
    workflows: []
    relies_on:
      - ATS-MBR-MEM-005-09
      - ATS-MBR-MEM-017-02
    preconditions: >-
      A requester has chapter reach and a roster containing active and lapsed
      fixtures.
    steps:
      - do: >-
          Capture an export for a selected date, generate its rows and compare
          the matching dated member reads.
        expect: >-
          Each exported row belongs to the captured set and carries the matching
          dated standing.
        provenance: proposed
        source: &ref_0
          - >-
            services-membership:modules/memberships/tests/integration/services/affiliations.integration.spec.ts#lists
            a member of two chapters once under their zone and region, and under
            each chapter
          - >-
            services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#writes
            rows for the captured memberships only, with their units on the date
    expected: >-
      Each exported row belongs to the captured set and carries the matching
      dated standing.
    negative: false
    data_needs: >-
      An isolated workspace with the specified membership, package, chapter and
      partner-port fixtures.
    bound_to: []
    provenance: proposed
    source: *ref_0
  - id: ATS-MBR-MEM-017-07
    title: Capture export inclusion from officer reach
    category: interaction
    level: api
    proves:
      - BR-CAP-MBR-MEM-015-03
      - BR-CAP-MBR-MEM-017-01
    interacts_with:
      - CAP-MBR-MEM-015
    workflows:
      - WF-MBR-MEM-023
    relies_on:
      - ATS-MBR-MEM-015-03
      - ATS-MBR-MEM-017-01
    preconditions: An officer reaches a chapter containing a multi-chapter member.
    steps:
      - do: >-
          List the officer’s roster, request its export, then withdraw the
          officer’s appointment before generation.
        expect: >-
          The export retains the originally captured membership set and adds no
          member outside that set.
        provenance: proposed
        source: &ref_1
          - >-
            services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#lists
            exactly the memberships IN{eastern} reaches, the same in one page
            and a page at a time
          - >-
            services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#captures
            the ids the requester’s set reaches at request time
    expected: >-
      The export retains the originally captured membership set and adds no
      member outside that set.
    negative: false
    data_needs: >-
      An isolated workspace with the specified membership, package, chapter and
      partner-port fixtures.
    bound_to: []
    provenance: proposed
    source: *ref_1
evidence:
  - >-
    services-membership at 5994c270e8a37a30f848e99ba5b5ee6b87c08893: the
    capability sources and the bound test files.
  - >-
    rhythm-v2-docs:specs/membership/memberships/design/: domain objects, state
    models and workflows reviewed for coverage.
coverage:
  rule: 'gap: FND-MBR-MEM-099'
  transition: 'gap: FND-MBR-MEM-099'
  validation: 'gap: FND-MBR-MEM-099'
  permission: 'gap: FND-MBR-MEM-099'
  edge: 'gap: FND-MBR-MEM-099'
  failure: 'gap: FND-MBR-MEM-099'
  boundary: 'gap: FND-MBR-MEM-099'
  concurrency: 'gap: FND-MBR-MEM-099'
  invariant: 'gap: FND-MBR-MEM-099'
  interaction: covered
coverage_notes:
  transition: >-
    The scenarios do not enumerate every applicable object transition; the
    finding preserves the remaining transition matrix.
  permission: >-
    The finding records named permissions without a complete positive and
    negative proof.
  invariant: >-
    Existing invariant examples do not cover every applicable domain-object
    constraint.
  interaction: >-
    Every related capability and each cross-capability workflow has an explicit
    composite scenario. Unbound composites remain proposed.
---

# Export a roster and let members see their own memberships: Capability Test Specification

## Coverage

| Rule | Scenario or Finding |
|---|---|
| `BR-CAP-MBR-MEM-017-01` | `ATS-MBR-MEM-017-01`, `ATS-MBR-MEM-017-07` |
| `BR-CAP-MBR-MEM-017-02` | `ATS-MBR-MEM-017-02`, `ATS-MBR-MEM-017-06` |
| `BR-CAP-MBR-MEM-017-03` | `ATS-MBR-MEM-017-03` |
| `BR-CAP-MBR-MEM-017-05` | `ATS-MBR-MEM-017-04` |
| `BR-CAP-MBR-MEM-017-06` | `ATS-MBR-MEM-017-05` |
| `BR-CAP-MBR-MEM-017-08` | no scenario: `FND-MBR-MEM-057` |

## Interactions With Related Capabilities

The interaction cases test how a shared holding, period, chapter connection or recorded change affects related work. Each case names its related capabilities and workflows in frontmatter. A composite case remains proposed until executable assertions establish every part of its expected outcome.
