---
id: ATS-MBR-MEM-018
scope: CAP-MBR-MEM-018
product_area: membership
module: memberships
revision: 1
status: proposed
approved_by:
approved_at:
source_sha:
  services-membership: 5994c270e8a37a30f848e99ba5b5ee6b87c08893
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
scenarios:
  - id: ATS-MBR-MEM-018-01
    title: "Every committed change is one attributed revision, and caches record nothing"
    level: api
    proves:
      - BR-CAP-MBR-MEM-018-01
    preconditions: "The well-known FAA workspace fixtures, or a workspace the test builds from them."
    steps: "Create a membership, correct its term, change its stored status alone, and undo a change in the same save."
    expected: "One revision for the creation with its term and affiliation, one for the correction, nothing for the cache or the undone change; each names its person then and its source."
    negative: false
    data_needs: "FAA programs, packages, units and members from the integration seed."
    bound_to:
      - "services-membership:modules/history/tests/integration/membership-history.integration.spec.ts#records the creation as one revision of the membership, its term and affiliation as collections"
      - "services-membership:modules/history/tests/integration/membership-history.integration.spec.ts#names who made each change by the name they had then, and where it came from"
      - "services-membership:modules/history/tests/integration/membership-history.integration.spec.ts#records nothing for a change of the cached status alone, nor for a change undone in the same save"
    provenance: test
    source: "services-membership:modules/history/tests/integration/membership-history.integration.spec.ts#records the creation as one revision of the membership, its term and affiliation as collections"
  - id: ATS-MBR-MEM-018-02
    title: "An unattributed write is refused with its business write"
    level: api
    proves:
      - BR-CAP-MBR-MEM-018-02
    preconditions: "The well-known FAA workspace fixtures, or a workspace the test builds from them."
    steps: "Write with no source and no actor."
    expected: "Refused at commit; nothing is written."
    negative: true
    data_needs: "FAA programs, packages, units and members from the integration seed."
    bound_to:
      - "services-membership:modules/history/tests/integration/membership-history.integration.spec.ts#refuses at commit a write that names no source and no actor, and the write with it (a program, which has no versions)"
    provenance: test
    source: "services-membership:modules/history/tests/integration/membership-history.integration.spec.ts#refuses at commit a write that names no source and no actor, and the write with it (a program, which has no versions)"
  - id: ATS-MBR-MEM-018-03
    title: "The timeline pages, filters and opens section by section"
    level: api
    proves:
      - BR-CAP-MBR-MEM-018-03
    preconditions: "The well-known FAA workspace fixtures, or a workspace the test builds from them."
    steps: "Read a busy membership's timeline by page, by operation and by person; open one revision; list the people."
    expected: "Newest first by cursor; filters narrow it; the revision opens by section; each person listed once."
    negative: false
    data_needs: "FAA programs, packages, units and members from the integration seed."
    bound_to:
      - "services-membership:modules/history/tests/integration/membership-history.integration.spec.ts#pages the timeline newest first by its sequence, the cursor continuing where a page ended"
      - "services-membership:modules/history/tests/integration/membership-history.integration.spec.ts#filters the timeline by operation and by actor"
      - "services-membership:modules/history/tests/integration/membership-history.integration.spec.ts#finds one revision of this record, and not another record’s revision by its id"
      - "services-membership:modules/history/tests/integration/membership-history.integration.spec.ts#lists everyone who changed the record, once each, by their names"
      - "services-membership:tests/e2e/history-api.e2e.spec.ts#answers the three revisions newest first: the suspension, the term correction, the creation"
    provenance: test
    source: "services-membership:modules/history/tests/integration/membership-history.integration.spec.ts#pages the timeline newest first by its sequence, the cursor continuing where a page ended"
  - id: ATS-MBR-MEM-018-04
    title: "A term keeps its own history"
    level: api
    proves:
      - BR-CAP-MBR-MEM-018-04
    preconditions: "The well-known FAA workspace fixtures, or a workspace the test builds from them."
    steps: "Correct a term and read the term's history."
    expected: "The correction appears on the term's timeline as on the membership's terms section."
    negative: false
    data_needs: "FAA programs, packages, units and members from the integration seed."
    bound_to:
      - "services-membership:modules/history/tests/integration/membership-history.integration.spec.ts#records the same correction on the term’s own history"
    provenance: test
    source: "services-membership:modules/history/tests/integration/membership-history.integration.spec.ts#records the same correction on the term’s own history"
  - id: ATS-MBR-MEM-018-05
    title: "History needs its own key"
    level: api
    proves:
      - BR-CAP-MBR-MEM-018-05
    preconditions: "The well-known FAA workspace fixtures, or a workspace the test builds from them."
    steps: "A reader with membership-read but not history asks for history."
    expected: "Refused."
    negative: true
    data_needs: "FAA programs, packages, units and members from the integration seed."
    bound_to:
      - "services-membership:tests/e2e/history-api.e2e.spec.ts#refuses the history to a reader of memberships who does not hold membership.memberships.history"
    provenance: test
    source: "services-membership:tests/e2e/history-api.e2e.spec.ts#refuses the history to a reader of memberships who does not hold membership.memberships.history"
  - id: ATS-MBR-MEM-018-06
    title: "A past date is reconstructed with its units, fields, seats and contact"
    level: api
    proves:
      - BR-CAP-MBR-MEM-018-06
    preconditions: "The well-known FAA workspace fixtures, or a workspace the test builds from them."
    steps: "Ask Jo as of a date in her term, with and without Committees' history, and her custom fields at the end of the date."
    expected: "Her term, type, package, status, chapters with names and ancestors then, custom fields as recorded, seats or unavailable, and the contact marked captured."
    negative: false
    data_needs: "FAA programs, packages, units and members from the integration seed."
    bound_to:
      - "services-membership:modules/history/tests/integration/membership-as-of.integration.spec.ts#answers Jo’s chapters on the date with each unit’s name, parent and ancestors then"
      - "services-membership:modules/history/tests/integration/membership-as-of.integration.spec.ts#answers the committee seats as unavailable where Committees’ versions do not exist"
      - "services-membership:modules/history/tests/integration/membership-as-of.integration.spec.ts#answers the seats a committee appointment reader holds for the contact on the date"
      - "services-membership:modules/history/tests/integration/membership-as-of.integration.spec.ts#answers a membership custom field as it was recorded at the end of the date"
      - "services-membership:modules/history/tests/integration/membership-as-of.integration.spec.ts#answers the contact as it is now, said to be captured rather than reconstructed"
    provenance: test
    source: "services-membership:modules/history/tests/integration/membership-as-of.integration.spec.ts#answers Jo’s chapters on the date with each unit’s name, parent and ancestors then"
  - id: ATS-MBR-MEM-018-07
    title: "Without an instant the past-date answer equals the live read"
    level: api
    proves:
      - BR-CAP-MBR-MEM-018-07
    preconditions: "The well-known FAA workspace fixtures, or a workspace the test builds from them."
    steps: "Read every FAA membership as of today with no instant."
    expected: "Each equals the live read."
    negative: false
    data_needs: "FAA programs, packages, units and members from the integration seed."
    bound_to:
      - "services-membership:modules/history/tests/integration/membership-as-of.integration.spec.ts#answers every FAA membership as the live read does, known now and as recorded now"
    provenance: test
    source: "services-membership:modules/history/tests/integration/membership-as-of.integration.spec.ts#answers every FAA membership as the live read does, known now and as recorded now"
  - id: ATS-MBR-MEM-018-08
    title: "A backdated correction shows only to readers asking after it"
    level: api
    proves:
      - BR-CAP-MBR-MEM-018-08
    preconditions: "The well-known FAA workspace fixtures, or a workspace the test builds from them."
    steps: "Correct a term, then ask as known before and after the correction."
    expected: "The earlier and the corrected term respectively."
    negative: false
    data_needs: "FAA programs, packages, units and members from the integration seed."
    bound_to:
      - "services-membership:modules/history/tests/integration/membership-as-of.integration.spec.ts#answers the term as it was known before the correction, with a known_at before it"
      - "services-membership:modules/history/tests/integration/membership-as-of.integration.spec.ts#answers the corrected term with a known_at after the correction"
      - "services-membership:tests/acceptance/history/MBR-ACC-0539.acceptance.ts#MBR-ACC-0539"
    provenance: test
    source: "services-membership:modules/history/tests/integration/membership-as-of.integration.spec.ts#answers the term as it was known before the correction, with a known_at before it"
evidence:
  - "services-membership at 5994c270e8a37a30f848e99ba5b5ee6b87c08893: the capability sources and the bound test files."
---

# See how a membership changed and what it was on any date: Acceptance Test Set

## Coverage

| Rule | Proved by |
|---|---|
| `BR-CAP-MBR-MEM-018-01` | `ATS-MBR-MEM-018-01` |
| `BR-CAP-MBR-MEM-018-02` | `ATS-MBR-MEM-018-02` |
| `BR-CAP-MBR-MEM-018-03` | `ATS-MBR-MEM-018-03` |
| `BR-CAP-MBR-MEM-018-04` | `ATS-MBR-MEM-018-04` |
| `BR-CAP-MBR-MEM-018-05` | `ATS-MBR-MEM-018-05` |
| `BR-CAP-MBR-MEM-018-06` | `ATS-MBR-MEM-018-06` |
| `BR-CAP-MBR-MEM-018-07` | `ATS-MBR-MEM-018-07` |
| `BR-CAP-MBR-MEM-018-08` | `ATS-MBR-MEM-018-08` |
| `BR-CAP-MBR-MEM-018-10` | no scenario: `FND-MBR-MEM-058` |
| `BR-CAP-MBR-MEM-018-11` | no scenario: `FND-MBR-MEM-059` |
