Skip to content

ATS-MBR-MEM-008Preserve member connections through transfers and unit merges: Capability Test Specification

Markdown

ATS-MBR-MEM-008

Preserve member connections through transfers and unit merges: Capability Test Specification

Markdown
  • DocumentProposed

KindAcceptance test setProduct areaMembershipModuleMemberships, Applications and Membership BillingRevision2

Read atservices-membership 5994c270react-console baf6dae3

Coverage

  • Rule gap: FND-MBR-MEM-090
  • Transition gap: FND-MBR-MEM-090
  • Validation covered
  • Permission gap: FND-MBR-MEM-090
  • Edge gap: FND-MBR-MEM-090
  • Failure covered
  • Boundary covered
  • Concurrency gap: FND-MBR-MEM-090
  • Invariant gap: FND-MBR-MEM-090
  • Interaction covered

Test Scenarios

12 scenarios proving CAP-MBR-MEM-008; 7 bound to an existing test.

01 Continue an affiliation in the target unitinteractionapitest
Proves
BR-CAP-MBR-MEM-008-01
Preconditions
Jo has a primary Atlanta affiliation and a target without dues.
Steps
[ { "do": "Transfer the Atlanta row on a future date and inspect both rows and the lifecycle event.", "expect": "The original ends the preceding day; the successor begins on the selected date as primary and retains lineage, with a transfer event.", "provenance": "test", "source": [ "services-membership:modules/memberships/tests/integration/services/affiliations.integration.spec.ts#transfers to a chapter that sells no dues: the old row ends the day before, the new one continues it as primary", "services-membership:tests/acceptance/affiliations/MBR-ACC-0265.acceptance.ts#MBR-ACC-0265: Scenario 6 without dues: Jo moves from Atlanta to San Francisco from a future date, the old row ends the day before, the new row inherits her primary flag, and rosters read correctly on both sides of the date" ] } ]
Expected
The original ends the preceding day; the successor begins on the selected date as primary and retains lineage, with a transfer event.
Data
Dated affiliations, merge cases, identity-bound memberships and officer grants required by the selected operation.
Bound to
Source
services-membership:modules/memberships/tests/integration/services/affiliations.integration.spec.ts#transfers to a chapter that sells no dues: the old row ends the day before, the new one continues it as primary
02 Reject direct transfers requiring duesfailureapinegativetest
Proves
BR-CAP-MBR-MEM-008-02
Preconditions
San Francisco charges dues for Jo’s selected package.
Steps
[ { "do": "Request a direct transfer into San Francisco.", "expect": "The refusal identifies the component-change amendment and leaves the original affiliation intact.", "provenance": "test", "source": [ "services-membership:tests/e2e/s06-midterm-transfer.e2e.spec.ts#refuses the console’s transfer 409 requires_amendment, naming the component_change amendment", "services-membership:modules/memberships/tests/integration/services/affiliations.integration.spec.ts#refuses to transfer to a chapter that sells dues for the package (requires_amendment)" ] } ]
Expected
The refusal identifies the component-change amendment and leaves the original affiliation intact.
Data
Dated affiliations, merge cases, identity-bound memberships and officer grants required by the selected operation.
Bound to
Source
services-membership:tests/e2e/s06-midterm-transfer.e2e.spec.ts#refuses the console’s transfer 409 requires_amendment, naming the component_change amendment
03 Read affiliations and rosters across the transfer dateboundaryapitest
Proves
BR-CAP-MBR-MEM-008-03
Preconditions
Jo has completed a dated transfer from Atlanta to San Francisco and retains Savannah.
Steps
[ { "do": "Inspect dated affiliation views and unit rosters before and after the effective date.", "expect": "Atlanta is replaced by San Francisco on the transfer date; Savannah and its ancestor coverage remain.", "provenance": "test", "source": [ "services-membership:tests/e2e/s06-midterm-transfer.e2e.spec.ts#answers Atlanta and Savannah as of 2026-10-15, San Francisco and Savannah as of 2027-02-01, the primary moving", "services-membership:tests/e2e/s06-midterm-transfer.e2e.spec.ts#takes Jo out of Atlanta’s roster from 2027-01-01 and into the Pacific Zone’s, keeping them in the Southeast Zone’s through Savannah" ] } ]
Expected
Atlanta is replaced by San Francisco on the transfer date; Savannah and its ancestor coverage remain.
Data
Dated affiliations, merge cases, identity-bound memberships and officer grants required by the selected operation.
Bound to
Source
services-membership:tests/e2e/s06-midterm-transfer.e2e.spec.ts#answers Atlanta and Savannah as of 2026-10-15, San Francisco and Savannah as of 2027-02-01, the primary moving
04 Account for each affiliation during a unit mergetransitionapitest
Proves
BR-CAP-MBR-MEM-008-04
Preconditions
Savannah holds begun, future, duplicate and already closed affiliation cases.
Steps
[ { "do": "Merge into Atlanta and inspect action counts, resulting rows and lifecycle events.", "expect": "Begun ties transfer, future ties repoint, duplicates end and closed ties remain; the counts and lifecycle records describe the actions.", "provenance": "test", "source": [ "services-membership:modules/memberships/tests/integration/services/affiliations-unit-merge.integration.spec.ts#answers what it did: one moved, one ended on the survivor, one left closed", "services-membership:modules/memberships/tests/integration/services/affiliations-unit-merge.integration.spec.ts#ends Pat’s Savannah affiliation the day before and continues it in Atlanta as primary", "services-membership:modules/memberships/tests/integration/services/affiliations-unit-merge.integration.spec.ts#keeps Jo’s Atlanta affiliation as it was and ends her Savannah one, with no new row", "services-membership:modules/memberships/tests/integration/services/affiliations-unit-merge.integration.spec.ts#leaves Lee’s Savannah affiliation, closed in August, as it was", "services-membership:modules/memberships/tests/unit/unit-merge.spec.ts#re-points an affiliation that begins on or after the merge’s date", "services-membership:tests/acceptance/affiliations/MBR-ACC-0277.acceptance.ts#MBR-ACC-0277: Savannah Chapter is merged into Atlanta: Pat's row is transferred, Kim's not-yet-begun row is re-pointed, Jo's duplicate is ended without carrying her primary flag, closed rows and a section's rows are left, and Savannah can be deactivated but never deleted" ] } ]
Expected
Begun ties transfer, future ties repoint, duplicates end and closed ties remain; the counts and lifecycle records describe the actions.
Data
Dated affiliations, merge cases, identity-bound memberships and officer grants required by the selected operation.
Bound to
Source
services-membership:modules/memberships/tests/integration/services/affiliations-unit-merge.integration.spec.ts#answers what it did: one moved, one ended on the survivor, one left closed
05 Refuse an incompatible merge without writingvalidationapinegativeproposed
Proves
BR-CAP-MBR-MEM-008-05
Preconditions
The merge would require a different survivor type or introduce a new minimum-count violation.
Steps
[ { "do": "Attempt the incompatible merge and inspect the reported rules and retained rows.", "expect": "The merge reports affected memberships and rules without changing units or affiliations.", "provenance": "proposed", "source": "services-membership:modules/memberships/services/affiliations/unit-merge.ts:decideMergedTerm" } ]
Expected
The merge reports affected memberships and rules without changing units or affiliations.
Data
Dated affiliations, merge cases, identity-bound memberships and officer grants required by the selected operation.
Source
services-membership:modules/memberships/services/affiliations/unit-merge.ts:decideMergedTerm
06 Move identity-bound holdings or report collisionsinvariantapiproposed
Proves
BR-CAP-MBR-MEM-008-06
Preconditions
Kim has a merged-unit identity and another owner already holds the surviving identity in the same program.
Steps
[ { "do": "Merge the identity unit for Kim, then attempt a merge with a duplicate surviving holding.", "expect": "Kim’s identity changes at the next version; a duplicate surviving holding causes a refusal without changes.", "provenance": "proposed", "source": "services-membership:modules/memberships/services/affiliations/unit-merge.ts:decideIdentityBound" } ]
Expected
Kim’s identity changes at the next version; a duplicate surviving holding causes a refusal without changes.
Data
Dated affiliations, merge cases, identity-bound memberships and officer grants required by the selected operation.
Source
services-membership:modules/memberships/services/affiliations/unit-merge.ts:decideIdentityBound
07 Preserve a unit referenced by historical affiliationsinvariantapinegativetest
Proves
BR-CAP-MBR-MEM-008-07 INV-DOM-MBR-MEM-003-08
Preconditions
Savannah has been merged but affiliation history still names it.
Steps
[ { "do": "Request deletion of the referenced merged unit.", "expect": "Deletion is rejected because affiliation rows still reference the unit.", "provenance": "test", "source": [ "services-membership:tests/e2e/s13-unit-merge.e2e.spec.ts#refuses to delete Savannah while affiliations name it (unit_has_affiliations)" ] } ]
Expected
Deletion is rejected because affiliation rows still reference the unit.
Data
Dated affiliations, merge cases, identity-bound memberships and officer grants required by the selected operation.
Bound to
Source
services-membership:tests/e2e/s13-unit-merge.e2e.spec.ts#refuses to delete Savannah while affiliations name it (unit_has_affiliations)
08 Expose moved members to surviving-unit officersinteractionapitest
Proves
BR-CAP-MBR-MEM-008-08
Preconditions
Alex’s officer grant reaches Atlanta while Pat initially belongs only to Savannah.
Steps
[ { "do": "Read Pat with Alex’s grant before and after the unit merge.", "expect": "Pat is outside Alex’s scope before the merge and readable through Atlanta afterward.", "provenance": "test", "source": [ "services-membership:tests/e2e/s13-unit-merge.e2e.spec.ts#shows Alex Jo and not Pat before the merge", "services-membership:tests/e2e/s13-unit-merge.e2e.spec.ts#shows Alex Pat now, with Pat’s Atlanta affiliation in scope" ] } ]
Expected
Pat is outside Alex’s scope before the merge and readable through Atlanta afterward.
Data
Dated affiliations, merge cases, identity-bound memberships and officer grants required by the selected operation.
Bound to
Source
services-membership:tests/e2e/s13-unit-merge.e2e.spec.ts#shows Alex Jo and not Pat before the merge
09 Use a new tree without changing affiliation identityinteractionapitest
Proves
BR-CAP-MBR-MEM-008-12
Preconditions
Atlanta has a membership affiliation and is moved from the Eastern Region to the Pacific Zone.
Steps
[ { "do": "Inspect Jo’s affiliation identity and current rosters, then query ancestry before the move.", "expect": "The affiliation keeps its id, version and unit; current ancestry reaches the West, while historical ancestry still reaches the East.", "provenance": "test", "source": [ "services-membership:tests/e2e/s09-restructuring.e2e.spec.ts#rewrites no affiliation: Jo’s row is the same row, version and unit", "services-membership:tests/e2e/s09-restructuring.e2e.spec.ts#shows Jo under the Western Region and the Pacific Zone today, and no longer under the Eastern Region", "services-membership:tests/e2e/s09-restructuring.e2e.spec.ts#still holds Atlanta among the Eastern Region’s descendants as of the period end" ] } ]
Expected
The affiliation keeps its id, version and unit; current ancestry reaches the West, while historical ancestry still reaches the East.
Data
Dated affiliations, merge cases, identity-bound memberships and officer grants required by the selected operation.
Bound to
Source
services-membership:tests/e2e/s09-restructuring.e2e.spec.ts#rewrites no affiliation: Jo’s row is the same row, version and unit
10 Protect transfer lineage when ending its predecessorinteractionapiproposed
Proves
BR-CAP-MBR-MEM-007-08 BR-CAP-MBR-MEM-008-01
Preconditions
An affiliation has a successor created by transfer.
Steps
[ { "do": "Attempt to withdraw the predecessor, then end it on a day it held.", "expect": "Withdrawal is refused naming the successor; an allowed end preserves the lineage.", "provenance": "proposed", "source": [ "services-membership:modules/memberships/tests/integration/services/affiliation-withdrawal-continued.integration.spec.ts#refuses to withdraw the continued row, naming the affiliation that continues it, and keeps the row", "services-membership:modules/memberships/tests/integration/services/affiliations.integration.spec.ts#transfers to a chapter that sells no dues: the old row ends the day before, the new one continues it as primary" ] } ]
Expected
Withdrawal is refused naming the successor; an allowed end preserves the lineage.
Data
An isolated workspace with the specified membership, package, chapter and partner-port fixtures.
Source
services-membership:modules/memberships/tests/integration/services/affiliation-withdrawal-continued.integration.spec.ts#refuses to withdraw the continued row, naming the affiliation that continues it, and keeps the row,services-membership:modules/memberships/tests/integration/services/affiliations.integration.spec.ts#transfers to a chapter that sells no dues: the old row ends the day before, the new one continues it as primary
11 Preserve coverage when a paid chapter move needs amendmentinteractionapiproposed
Proves
BR-CAP-MBR-MEM-008-02 BR-CAP-MBR-MEM-009-06
Preconditions
A member has a chapter affiliation and the target chapter charges dues.
Steps
[ { "do": "Try the direct transfer and checkout preparation for an immediate chapter change.", "expect": "Both identify the amendment requirement and leave the existing period and chapter rows unchanged.", "provenance": "proposed", "source": [ "services-membership:tests/e2e/s06-midterm-transfer.e2e.spec.ts#refuses the console’s transfer 409 requires_amendment, naming the component_change amendment", "services-membership:modules/commerce-participant/tests/unit/eligibility.spec.ts#refuses an immediate upgrade as requires_amendment, naming prepare_change" ] } ]
Expected
Both identify the amendment requirement and leave the existing period and chapter rows unchanged.
Data
An isolated workspace with the specified membership, package, chapter and partner-port fixtures.
Source
services-membership:tests/e2e/s06-midterm-transfer.e2e.spec.ts#refuses the console’s transfer 409 requires_amendment, naming the component_change amendment,services-membership:modules/commerce-participant/tests/unit/eligibility.spec.ts#refuses an immediate upgrade as requires_amendment, naming prepare_change
12 Change officer visibility through the surviving unitinteractionapiproposed
Proves
BR-CAP-MBR-MEM-008-08 BR-CAP-MBR-MEM-015-04
Preconditions
The surviving chapter officer cannot read a source-chapter member.
Steps
[ { "do": "Merge the source chapter into the survivor, then read the moved member and list both chapters.", "expect": "The surviving officer can read the moved member and the current survivor roster includes that member.", "provenance": "proposed", "source": [ "services-membership:tests/e2e/s13-unit-merge.e2e.spec.ts#shows Alex Jo and not Pat before the merge", "services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#reads Jo for the Atlanta officer, the Savannah affiliation marked out of scope" ] } ]
Expected
The surviving officer can read the moved member and the current survivor roster includes that member.
Data
An isolated workspace with the specified membership, package, chapter and partner-port fixtures.
Source
services-membership:tests/e2e/s13-unit-merge.e2e.spec.ts#shows Alex Jo and not Pat before the merge,services-membership:modules/memberships/tests/integration/services/unit-scope.integration.spec.ts#reads Jo for the Atlanta officer, the Savannah affiliation marked out of scope

The Markdown files under specs/ in rhythmsoftware/rhythm-v2-docs are the canonical source of truth. This reader is a generated, read-only projection of them.