Skip to content

ATS-MBR-STR-018Maintain configuration with consistent change safeguards: Capability Test Specification

Markdown

ATS-MBR-STR-018

Maintain configuration with consistent change safeguards: Capability Test Specification

Markdown
  • DocumentProposed

KindAcceptance test setProduct areaMembershipModuleOrganizational Structure, Membership Configuration and TermsRevision2

Read atservices-membership 5994c270react-console baf6dae3

Coverage

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

Test Scenarios

15 scenarios proving CAP-MBR-STR-018; 8 bound to an existing test.

01 Readable identities are derived or validatedvalidationapinegativetest
Proves
BR-CAP-MBR-STR-018-01 AS-JNY-MBR-STR-004-01
Preconditions
An isolated Membership-licensed workspace contains the relevant records, with caller permissions selected for the case.
Steps
Compare creation by name, explicit reference, whitespace-bearing reference and reserved reference.
Expected
Allowed references are retained and invalid identities leave no record.
Data
The FAA example records or equivalent records prepared within the isolated workspace.
Bound to
services-membership:tests/acceptance/configuration/MBR-ACC-0081.acceptance.ts#MBR-ACC-0081: Readable ids are made from names, names keep their accents and length, and the longest id the grammar allows is accepted
services-membership:tests/acceptance/configuration/MBR-ACC-0082.acceptance.ts#MBR-ACC-0082: Ids an administrator types are validated, never repaired: spaces, reserved words, a name that yields nothing, a taken id and an id changed on update are all refused with nothing written
Source
services-membership:tests/acceptance/configuration/MBR-ACC-0081.acceptance.ts#MBR-ACC-0081: Readable ids are made from names, names keep their accents and length, and the longest id the grammar allows is accepted
02 Existing identity cannot be silently replacedinvariantapinegativetest
Proves
BR-CAP-MBR-STR-018-02
Preconditions
An isolated Membership-licensed workspace contains the relevant records, with caller permissions selected for the case.
Steps
Submit a different body identity and separately create a duplicate of an existing record.
Expected
Both attempts fail without altering the original record.
Data
The FAA example records or equivalent records prepared within the isolated workspace.
Bound to
services-membership:tests/acceptance/configuration/MBR-ACC-0082.acceptance.ts#MBR-ACC-0082: Ids an administrator types are validated, never repaired: spaces, reserved words, a name that yields nothing, a taken id and an id changed on update are all refused with nothing written
Source
services-membership:tests/acceptance/configuration/MBR-ACC-0082.acceptance.ts#MBR-ACC-0082: Ids an administrator types are validated, never repaired: spaces, reserved words, a name that yields nothing, a taken id and an id changed on update are all refused with nothing written
03 Versioned mutations reject missing and stale versionsconcurrencyapinegativetest
Proves
BR-CAP-MBR-STR-018-03
Preconditions
An isolated Membership-licensed workspace contains the relevant records, with caller permissions selected for the case.
Steps
Save at the current version, then use a stale version, omit the version and attempt stale deletion.
Expected
Only the current save succeeds and advances its version.
Data
The FAA example records or equivalent records prepared within the isolated workspace.
Bound to
services-membership:tests/acceptance/configuration/MBR-ACC-0083.acceptance.ts#MBR-ACC-0083: Every change and delete carries the version read: the version climbs by one per save, a stale save or delete is refused, and a missing version is refused before anything is read
services-membership:tests/acceptance/configuration/MBR-ACC-0084.acceptance.ts#MBR-ACC-0084: Two administrators edit the Regular package at the same time: the first save wins, the second is told to re-read, and the grants she re-sends get new ids
Source
services-membership:tests/acceptance/configuration/MBR-ACC-0083.acceptance.ts#MBR-ACC-0083: Every change and delete carries the version read: the version climbs by one per save, a stale save or delete is refused, and a missing version is refused before anything is read
04 Partial updates retain omitted contentruleapinegativetest
Proves
BR-CAP-MBR-STR-018-04
Preconditions
An isolated Membership-licensed workspace contains the relevant records, with caller permissions selected for the case.
Steps
Change one key, clear a nullable key, submit blank required text and an unknown key, and omit a child list.
Expected
Allowed fields change or clear; invalid input fails and omitted lists remain.
Data
The FAA example records or equivalent records prepared within the isolated workspace.
Bound to
services-membership:tests/acceptance/configuration/MBR-ACC-0085.acceptance.ts#MBR-ACC-0085: An update changes only the keys it names: null clears, an empty string is null, whitespace-only text is refused, unknown keys are refused, and an owned list is replaced only when sent
Source
services-membership:tests/acceptance/configuration/MBR-ACC-0085.acceptance.ts#MBR-ACC-0085: An update changes only the keys it names: null clears, an empty string is null, whitespace-only text is refused, unknown keys are refused, and an owned list is replaced only when sent
05 Dependent records prevent deletion until releasedtransitionapinegativetest
Proves
BR-CAP-MBR-STR-018-05
Preconditions
An isolated Membership-licensed workspace contains the relevant records, with caller permissions selected for the case.
Steps
Try deleting each configuration category while referenced, then remove its dependencies and retry.
Expected
Referenced records stay and free records are removed with owned rows.
Data
The FAA example records or equivalent records prepared within the isolated workspace.
Bound to
services-membership:tests/acceptance/configuration/MBR-ACC-0086.acceptance.ts#MBR-ACC-0086: Nothing that another record points at can be deleted: program, type, package, status reason and policy set are each refused while in use, then deleted with their owned rows once free
services-membership:tests/acceptance/configuration/MBR-ACC-0118.acceptance.ts#MBR-ACC-0118: References other applications hold: a billing template that drops members names a program and a terminated reason and blocks their deletion, while a Committees eligibility rule naming a type is invisible to Membership and the type can be deleted from under it
Source
services-membership:tests/acceptance/configuration/MBR-ACC-0086.acceptance.ts#MBR-ACC-0086: Nothing that another record points at can be deleted: program, type, package, status reason and policy set are each refused while in use, then deleted with their owned rows once free
06 Failed aggregates leave no partial statefailureapinegativetest
Proves
BR-CAP-MBR-STR-018-06
Preconditions
An isolated Membership-licensed workspace contains the relevant records, with caller permissions selected for the case.
Steps
Create a package with invalid grants and update an existing record with an invalid child list.
Expected
The failed create leaves no package and the failed update retains the previous aggregate.
Data
The FAA example records or equivalent records prepared within the isolated workspace.
Bound to
services-membership:tests/acceptance/configuration/MBR-ACC-0116.acceptance.ts#MBR-ACC-0116: A refused save in the middle of a series keeps the valid saves before it and loses nothing after it is corrected: the record never holds half a body, and a create that fails on its children leaves no record at all
Source
services-membership:tests/acceptance/configuration/MBR-ACC-0116.acceptance.ts#MBR-ACC-0116: A refused save in the middle of a series keeps the valid saves before it and loses nothing after it is corrected: the record never holds half a body, and a create that fails on its children leaves no record at all
07 Database refusals identify relevant fieldsvalidationapinegativetest
Proves
BR-CAP-MBR-STR-018-07
Preconditions
An isolated Membership-licensed workspace contains the relevant records, with caller permissions selected for the case.
Steps
Submit a classification under a missing program and a package renewing into itself.
Expected
Responses identify the invalid program and renewal fields instead of returning an unexpected error.
Data
The FAA example records or equivalent records prepared within the isolated workspace.
Bound to
services-membership:tests/e2e/database-refusals.e2e.spec.ts#mistakes only the database catches, through the API › DEF-MBR-0086: a configuration write a check, a foreign key or an integer column refuses › refuses a type of a program that does not exist 400 naming program_id
services-membership:tests/e2e/database-refusals.e2e.spec.ts#mistakes only the database catches, through the API › DEF-MBR-0086: a configuration write a check, a foreign key or an integer column refuses › refuses a package renewing into itself 400 naming renews_into_package_id
Source
services-membership:tests/e2e/database-refusals.e2e.spec.ts#mistakes only the database catches, through the API › DEF-MBR-0086: a configuration write a check, a foreign key or an integer column refuses › refuses a type of a program that does not exist 400 naming program_id
08 Workspace isolation applies to every mutationboundaryapinegativetest
Proves
BR-CAP-MBR-STR-018-09
Preconditions
An isolated Membership-licensed workspace contains the relevant records, with caller permissions selected for the case.
Steps
Read, update and delete a foreign workspace record identity under the caller’s own context.
Expected
All operations treat the foreign record as absent.
Data
The FAA example records or equivalent records prepared within the isolated workspace.
Bound to
services-membership:tests/acceptance/configuration/MBR-ACC-0089.acceptance.ts#MBR-ACC-0089: Two associations with identically named configuration never see each other: the same ids live in both workspaces and a cross-workspace read, update or delete answers not found
Source
services-membership:tests/acceptance/configuration/MBR-ACC-0089.acceptance.ts#MBR-ACC-0089: Two associations with identically named configuration never see each other: the same ids live in both workspaces and a cross-workspace read, update or delete answers not found
09 Configuration paging follows its own size contractboundaryapiproposed
Proves
BR-CAP-MBR-STR-018-08
Preconditions
An isolated workspace contains the records and current versions needed for the case.
Steps
Create enough records for continuation, omit page size, then request an oversized page and an activity-filtered package page with no matching first-page rows.
Expected
The omitted size selects 50, the oversized size caps at 500 and an empty filtered page can still continue.
Data
Separate fixture records for the accepted and refused operations.
Source
services-membership:modules/configuration/services/persistence/membership-packages.ts:listMembershipPackages
10 Program reference errors leave no saved aggregateinteractionapiproposed
Proves
BR-CAP-MBR-STR-009-02 BR-CAP-MBR-STR-018-06
Preconditions
An isolated workspace contains the records and current versions needed for the case.
Steps
Create a program with absent structural references and read its proposed identity.
Expected
The refusal identifies the missing references and no program remains.
Data
Separate fixture records for the accepted and refused operations.
Source
services-membership:modules/configuration/services/configuration/configuration-records.ts:programResource,services-membership:modules/configuration/services/configuration/configuration-records.ts:createConfiguration
11 Invalid flow-down preserves prior selectionsinteractionapiproposed
Proves
BR-CAP-MBR-STR-011-03 BR-CAP-MBR-STR-018-06
Preconditions
An isolated workspace contains the records and current versions needed for the case.
Steps
Update a valid type with enabled flow-down and an absent target alongside changed role selections.
Expected
The failed update preserves the prior type version and selected roles.
Data
Separate fixture records for the accepted and refused operations.
Source
services-membership:tests/e2e/database-refusals.e2e.spec.ts#mistakes only the database catches, through the API › DEF-MBR-0086: a configuration write a check, a foreign key or an integer column refuses › refuses flow-down enabled without a target type 400 naming flowdown_type_id, and writes no type,services-membership:modules/configuration/services/configuration/configuration-records.ts:createConfiguration
12 Failed package changes preserve owned listsinteractionapiproposed
Proves
BR-CAP-MBR-STR-012-05 BR-CAP-MBR-STR-018-06
Preconditions
An isolated workspace contains the records and current versions needed for the case.
Steps
Change a package to a mismatched classification while submitting new unit rules.
Expected
The refusal preserves the original package version and original unit-rule rows.
Data
Separate fixture records for the accepted and refused operations.
Source
services-membership:tests/e2e/database-refusals.e2e.spec.ts#mistakes only the database catches, through the API › DEF-MBR-0086: a configuration write a check, a foreign key or an integer column refuses › refuses a package of a type of another program 400 naming membership_type_id, and writes no package nor unit rule,services-membership:modules/configuration/services/configuration/configuration-records.ts:createConfiguration
13 Stale policy saves preserve the accepted casesinteractionapiproposed
Proves
BR-CAP-MBR-STR-014-01 BR-CAP-MBR-STR-018-03
Preconditions
An isolated workspace contains the records and current versions needed for the case.
Steps
Read a policy set twice, save one replacement and submit a different list using the earlier version.
Expected
The stale request fails and retains the first replacement’s content and allocated case identities.
Data
Separate fixture records for the accepted and refused operations.
Source
services-membership:modules/configuration/services/configuration/configuration-records.ts:policySetResource,services-membership:modules/configuration/services/persistence/configuration-store.ts:configurationStore
14 Reason references distinguish retirement from removalinteractionapiproposed
Proves
BR-CAP-MBR-STR-017-01 BR-CAP-MBR-STR-018-05
Preconditions
An isolated workspace contains the records and current versions needed for the case.
Steps
Prepare a reason used by a term, retire it through a versioned save and try deleting it.
Expected
Retirement saves without rewriting the term and the retained reference prevents deletion.
Data
Separate fixture records for the accepted and refused operations.
Source
services-membership:modules/configuration/services/configuration/configuration-records.ts:statusReasonContent,services-membership:modules/configuration/services/persistence/configuration-store.ts:configurationStore
15 Workspace authority gates this capabilitypermissionapinegativeproposed
Proves
BR-CAP-MBR-STR-019-02
Preconditions
An isolated workspace contains the records and current versions needed for the case.
Steps
Exercise the capability’s exposed operations with its read-only and management callers, then repeat with application access removed, an unlicensed workspace and an unavailable workspace.
Expected
Each named operation requires its declared authority; admission failures occur before any record or calculated result is exposed.
Data
Separate fixture records for the accepted and refused operations.
Source
services-membership:tests/unit/route-authorization.spec.ts#route authorization: every Membership operation names its permission › requires membership.structure.read of every structure read and membership.structure.manage of every change,services-membership:modules/configuration/aws/api/configuration.routes.ts:configurationModuleRoutes,services-membership:tests/e2e/terms-api.e2e.spec.ts#the terms API, end to end in process › refuses a caller who holds no key in the tenant

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.