---
id: ATS-MBR-MEM-016
scope: CAP-MBR-MEM-016
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-016-01
    title: Officers change only allowed fields of their own members
    level: api
    proves:
      - BR-CAP-MBR-MEM-016-01
    preconditions: >-
      The well-known FAA workspace fixtures, or a workspace the test builds from
      them.
    steps:
      - do: >-
          Dana changes Jo's e-mail and date of birth; the Atlanta officer
          changes a member outside Atlanta.
        expect: >-
          The e-mail goes to CRM; the date of birth is refused naming it and
          nothing is sent; the outside member is not found.
        provenance: test
        source:
          - >-
            services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#refuses
            a field outside the list, field_not_allowed naming it, and sends
            nothing
          - >-
            services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#refuses
            a member outside the officer’s units as not found
          - >-
            services-membership:tests/e2e/s07-regional-officer.e2e.spec.ts#refuses
            a date of birth 403 field_not_allowed, naming the field
    expected: >-
      The e-mail goes to CRM; the date of birth is refused naming it and nothing
      is sent; the outside member is not found.
    negative: true
    data_needs: 'FAA programs, packages, units and members from the integration seed.'
    bound_to:
      - TST-MBR-MEM-031
      - TST-MBR-MEM-250
    provenance: test
    source: >-
      services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#refuses
      a field outside the list, field_not_allowed naming it, and sends nothing
    category: permission
    binding_evidence:
      - suite: TST-MBR-MEM-031
        source: >-
          services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#refuses
          a field outside the list, field_not_allowed naming it, and sends
          nothing
      - suite: TST-MBR-MEM-031
        source: >-
          services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#refuses
          a member outside the officer’s units as not found
      - suite: TST-MBR-MEM-250
        source: >-
          services-membership:tests/e2e/s07-regional-officer.e2e.spec.ts#refuses
          a date of birth 403 field_not_allowed, naming the field
  - id: ATS-MBR-MEM-016-02
    title: The allowed fields are the union of the granting roles' lists
    level: unit
    proves:
      - BR-CAP-MBR-MEM-016-02
    preconditions: >-
      The well-known FAA workspace fixtures, or a workspace the test builds from
      them.
    steps:
      - do: >-
          Decide the fields for one role, two roles, a scoped role with no list,
          staff with no list, and no grant.
        expect: 'Its list, the union, nothing, everything, nothing.'
        provenance: test
        source:
          - >-
            services-membership:modules/memberships/tests/unit/unit-scope.spec.ts#allows
            the fields of the role that granted the key for a unit in the chain
          - >-
            services-membership:modules/memberships/tests/unit/unit-scope.spec.ts#unions
            the lists of two roles that reach the membership
          - >-
            services-membership:modules/memberships/tests/unit/unit-scope.spec.ts#allows
            nothing through a unit-scoped role with no list
          - >-
            services-membership:modules/memberships/tests/unit/unit-scope.spec.ts#allows
            every field through a tenant-wide role with no list (staff)
          - >-
            services-membership:modules/memberships/tests/unit/unit-scope.spec.ts#allows
            nothing with no applied grant
    expected: 'Its list, the union, nothing, everything, nothing.'
    negative: false
    data_needs: 'FAA programs, packages, units and members from the integration seed.'
    bound_to:
      - TST-MBR-MEM-039
    provenance: test
    source: >-
      services-membership:modules/memberships/tests/unit/unit-scope.spec.ts#allows
      the fields of the role that granted the key for a unit in the chain
    category: rule
    binding_evidence:
      - suite: TST-MBR-MEM-039
        source: >-
          services-membership:modules/memberships/tests/unit/unit-scope.spec.ts#allows
          the fields of the role that granted the key for a unit in the chain
      - suite: TST-MBR-MEM-039
        source: >-
          services-membership:modules/memberships/tests/unit/unit-scope.spec.ts#unions
          the lists of two roles that reach the membership
      - suite: TST-MBR-MEM-039
        source: >-
          services-membership:modules/memberships/tests/unit/unit-scope.spec.ts#allows
          nothing through a unit-scoped role with no list
      - suite: TST-MBR-MEM-039
        source: >-
          services-membership:modules/memberships/tests/unit/unit-scope.spec.ts#allows
          every field through a tenant-wide role with no list (staff)
      - suite: TST-MBR-MEM-039
        source: >-
          services-membership:modules/memberships/tests/unit/unit-scope.spec.ts#allows
          nothing with no applied grant
  - id: ATS-MBR-MEM-016-03
    title: The contact change reaches CRM as the officer
    level: api
    proves:
      - BR-CAP-MBR-MEM-016-03
    preconditions: >-
      The well-known FAA workspace fixtures, or a workspace the test builds from
      them.
    steps:
      - do: Dana changes Jo's e-mail address.
        expect: CRM's contact update receives the field with Dana as the acting user.
        provenance: test
        source:
          - >-
            services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#passes
            an allowed field to CRM’s contact update as the officer
          - >-
            services-membership:tests/e2e/s07-regional-officer.e2e.spec.ts#changes
            Jo’s e-mail address through CRM’s contact update, as Dana
    expected: CRM's contact update receives the field with Dana as the acting user.
    negative: false
    data_needs: 'FAA programs, packages, units and members from the integration seed.'
    bound_to:
      - TST-MBR-MEM-031
      - TST-MBR-MEM-250
    provenance: test
    source: >-
      services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#passes
      an allowed field to CRM’s contact update as the officer
    category: interaction
    binding_evidence:
      - suite: TST-MBR-MEM-031
        source: >-
          services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#passes
          an allowed field to CRM’s contact update as the officer
      - suite: TST-MBR-MEM-250
        source: >-
          services-membership:tests/e2e/s07-regional-officer.e2e.spec.ts#changes
          Jo’s e-mail address through CRM’s contact update, as Dana
  - id: ATS-MBR-MEM-016-04
    title: 'Officers renew members in scope, grace included'
    level: api
    proves:
      - BR-CAP-MBR-MEM-016-04
    preconditions: >-
      The well-known FAA workspace fixtures, or a workspace the test builds from
      them.
    steps:
      - do: 'The Atlanta officer renews Gil, in grace, and Sam, outside Atlanta.'
        expect: >-
          Gil's renewal is placed with the officer as acting user; Sam is not
          found.
        provenance: test
        source:
          - >-
            services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#places
            the Atlanta officer’s renewal of Gil, in grace, with the officer as
            acting user
          - >-
            services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#refuses
            the Atlanta officer a renewal of Sam as not found
          - >-
            services-membership:tests/acceptance/security/MBR-ACC-0466.acceptance.ts#MBR-ACC-0466
    expected: Gil's renewal is placed with the officer as acting user; Sam is not found.
    negative: false
    data_needs: 'FAA programs, packages, units and members from the integration seed.'
    bound_to:
      - TST-MBR-MEM-031
      - TST-MBR-MEM-228
    provenance: test
    source: >-
      services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#places
      the Atlanta officer’s renewal of Gil, in grace, with the officer as acting
      user
    category: permission
    binding_evidence:
      - suite: TST-MBR-MEM-031
        source: >-
          services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#places
          the Atlanta officer’s renewal of Gil, in grace, with the officer as
          acting user
      - suite: TST-MBR-MEM-031
        source: >-
          services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#refuses
          the Atlanta officer a renewal of Sam as not found
      - suite: TST-MBR-MEM-228
        source: >-
          services-membership:tests/acceptance/security/MBR-ACC-0466.acceptance.ts#MBR-ACC-0466
  - id: ATS-MBR-MEM-016-05
    title: 'Officers enrol only into their own units, and must name one'
    level: api
    proves:
      - BR-CAP-MBR-MEM-016-05
    preconditions: >-
      The well-known FAA workspace fixtures, or a workspace the test builds from
      them.
    steps:
      - do: >-
          The Atlanta officer enrols into Atlanta, into another chapter and into
          no unit; staff enrol into no unit.
        expect: >-
          Atlanta is placed; the other two are refused out_of_scope; staff's is
          allowed.
        provenance: test
        source:
          - >-
            services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#places
            an enrolment in the officer’s own chapter
          - >-
            services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#refuses
            an enrolment in a unit outside the officer’s scope, out_of_scope
          - >-
            services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#refuses
            an officer an enrolment of no unit (National’s), out_of_scope
          - >-
            services-membership:modules/memberships/tests/unit/unit-scope.spec.ts#allows
            staff an enrolment of no unit
    expected: >-
      Atlanta is placed; the other two are refused out_of_scope; staff's is
      allowed.
    negative: true
    data_needs: 'FAA programs, packages, units and members from the integration seed.'
    bound_to:
      - TST-MBR-MEM-031
      - TST-MBR-MEM-039
    provenance: test
    source: >-
      services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#places
      an enrolment in the officer’s own chapter
    category: permission
    binding_evidence:
      - suite: TST-MBR-MEM-031
        source: >-
          services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#places
          an enrolment in the officer’s own chapter
      - suite: TST-MBR-MEM-031
        source: >-
          services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#refuses
          an enrolment in a unit outside the officer’s scope, out_of_scope
      - suite: TST-MBR-MEM-031
        source: >-
          services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#refuses
          an officer an enrolment of no unit (National’s), out_of_scope
      - suite: TST-MBR-MEM-039
        source: >-
          services-membership:modules/memberships/tests/unit/unit-scope.spec.ts#allows
          staff an enrolment of no unit
  - id: ATS-MBR-MEM-016-06
    title: Officer orders are prepared like a checkout and are idempotent by request
    level: api
    proves:
      - BR-CAP-MBR-MEM-016-06
    preconditions: >-
      The well-known FAA workspace fixtures, or a workspace the test builds from
      them.
    steps:
      - do: >-
          The officer enrols a member, retries the same request, and asks for
          one the preparation refuses.
        expect: One order; the retry names it; the refusal answers its code.
        provenance: proposed
        source: >-
          services-membership:tests/acceptance/security/MBR-ACC-0465.acceptance.ts#MBR-ACC-0465
    expected: One order; the retry names it; the refusal answers its code.
    negative: false
    data_needs: 'FAA programs, packages, units and members from the integration seed.'
    bound_to: []
    provenance: proposed
    source: >-
      services-membership:tests/acceptance/security/MBR-ACC-0465.acceptance.ts#MBR-ACC-0465
    category: invariant
    binding_gap: FND-MBR-MEM-103
  - id: ATS-MBR-MEM-016-07
    title: The financial summary shows officers only their units' lines
    level: api
    proves:
      - BR-CAP-MBR-MEM-016-07
    preconditions: >-
      The well-known FAA workspace fixtures, or a workspace the test builds from
      them.
    steps:
      - do: >-
          Read Jo's summary as the Atlanta officer, a national-scoped officer,
          staff, and for an identity-bound member.
        expect: >-
          Atlanta's dues line only; both dues lines without the national package
          line; every line; the package line by the identity unit.
        provenance: test
        source:
          - >-
            services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#shows
            the Atlanta officer only the Atlanta dues line
          - >-
            services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#shows
            a National-scoped officer both dues lines and never the national
            package line
          - >-
            services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#shows
            staff every line
          - >-
            services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#shows
            the package line of an identity-bound membership by its identity
            unit
          - >-
            services-membership:tests/e2e/s08-cross-chapter-restrictions.e2e.spec.ts#shows
            Lee only the Atlanta dues line of Jo’s financial summary
    expected: >-
      Atlanta's dues line only; both dues lines without the national package
      line; every line; the package line by the identity unit.
    negative: false
    data_needs: 'FAA programs, packages, units and members from the integration seed.'
    bound_to:
      - TST-MBR-MEM-031
      - TST-MBR-MEM-251
    provenance: test
    source: >-
      services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#shows
      the Atlanta officer only the Atlanta dues line
    category: permission
    binding_evidence:
      - suite: TST-MBR-MEM-031
        source: >-
          services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#shows
          the Atlanta officer only the Atlanta dues line
      - suite: TST-MBR-MEM-031
        source: >-
          services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#shows
          a National-scoped officer both dues lines and never the national
          package line
      - suite: TST-MBR-MEM-031
        source: >-
          services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#shows
          staff every line
      - suite: TST-MBR-MEM-031
        source: >-
          services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#shows
          the package line of an identity-bound membership by its identity unit
      - suite: TST-MBR-MEM-251
        source: >-
          services-membership:tests/e2e/s08-cross-chapter-restrictions.e2e.spec.ts#shows
          Lee only the Atlanta dues line of Jo’s financial summary
  - id: ATS-MBR-MEM-016-08
    title: Prepare officer orders with the member as recipient
    category: interaction
    level: api
    proves:
      - BR-CAP-MBR-MEM-009-07
      - BR-CAP-MBR-MEM-016-06
    interacts_with:
      - CAP-MBR-MEM-009
    workflows:
      - WF-MBR-MEM-021
    relies_on:
      - ATS-MBR-MEM-009-07
      - ATS-MBR-MEM-016-06
    preconditions: An officer reaches a member and the selected renewal chapter.
    steps:
      - do: >-
          Request an officer renewal and inspect the prepared and placed
          checkout through the recording Commerce port.
        expect: >-
          The order acts as the officer, names the member as recipient and
          includes the required dues components.
        provenance: proposed
        source: &ref_0
          - >-
            services-membership:modules/commerce-participant/tests/integration/participant.integration.spec.ts#plans
            a join: kind, service period from the package rule, the dues
            chapter, audience new, a sql claim, no amount
          - >-
            services-membership:tests/acceptance/security/MBR-ACC-0465.acceptance.ts#MBR-ACC-0465
    expected: >-
      The order acts as the officer, names the member as recipient and includes
      the required dues components.
    negative: false
    data_needs: >-
      An isolated workspace with the specified membership, package, chapter and
      partner-port fixtures.
    bound_to: []
    provenance: proposed
    source: *ref_0
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-098'
  transition: 'gap: FND-MBR-MEM-098'
  validation: 'gap: FND-MBR-MEM-098'
  permission: 'gap: FND-MBR-MEM-098'
  edge: 'gap: FND-MBR-MEM-098'
  failure: 'gap: FND-MBR-MEM-098'
  boundary: 'gap: FND-MBR-MEM-098'
  concurrency: 'gap: FND-MBR-MEM-098'
  invariant: 'gap: FND-MBR-MEM-098'
  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.
---

# Let officers act for their members: Capability Test Specification

## Coverage

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

## 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.
