Skip to content

ATS-PFM-TNL-006Preserve valid workspace lifecycle states: Capability Test Specification

Markdown

ATS-PFM-TNL-006

Preserve valid workspace lifecycle states: Capability Test Specification

Markdown
  • DocumentProposed

Planning

Proves capability
CAP-PFM-TNL-006

Design

Executed by
TST-PFM-TNL-052, TST-PFM-TNL-077, TST-PFM-TNL-096

KindAcceptance test setProduct areaPlatformModuleWorkspace Lifecycle Across ApplicationsRevision3

Read atservices-platform ad3f6a65services-crm a8d1364fservices-commerce c8b66a98services-committees 36129c24services-membership 5994c270services-submissions 64236c19services-websites 5fc6823cservices-marketing d071a159rhythm-v2-docs d318a948

Coverage

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

Test Scenarios

7 scenarios proving CAP-PFM-TNL-006; 6 bound to an existing test.

01 Client payloads cannot replace lifecycle factsinvariantapitest
Proves
BR-CAP-PFM-TNL-006-01
Preconditions
An active workspace is available for editing.
Steps
Replace and patch with a different lifecycle value.
Expected
The requests do not move the system-controlled state.
Data
Use the run-owned records and caller contexts created by the cited tests; use their provider and clock seams only where declared.
Bound to
services-platform:modules/tenants/tests/e2e/tenants.e2e.spec.js#answers 200 to a patch aimed at the lifecycle state, because the property is simply dropped
services-platform:modules/tenants/tests/e2e/tenants.e2e.spec.js#leaves the lifecycle state where the server put it after such a patch
services-platform:modules/tenants/tests/integration/services/persistence/tenants.integration.spec.js#ignores a lifecycle state a write input carries, rather than letting a client set the system axis
Source
services-platform:modules/tenants/tests/e2e/tenants.e2e.spec.js#answers 200 to a patch aimed at the lifecycle state, because the property is simply dropped
02 Transition policy rejects unsupported pathstransitionunitnegativetest
Proves
BR-CAP-PFM-TNL-006-02
Preconditions
The fixture includes every pair of lifecycle states.
Steps
Evaluate each proposed transition.
Expected
Permitted paths succeed and rejected paths identify the allowed successors.
Data
Use the run-owned records and caller contexts created by the cited tests; use their provider and clock seams only where declared.
Bound to
services-platform:modules/tenants/tests/unit/services/lifecycle/lifecycle-transitions.spec.js#refuses deletion_pending: a tenant still being built is not put up for deletion
services-platform:modules/tenants/tests/unit/services/lifecycle/lifecycle-transitions.spec.js#refuses deleting, so nothing can skip the waiting period by writing the state
services-platform:modules/tenants/tests/unit/services/lifecycle/lifecycle-transitions.spec.js#refuses active, and says so: a tenant being destroyed never comes back
services-platform:modules/tenants/tests/unit/services/lifecycle/lifecycle-transitions.spec.js#allows loading, which is an implementation tenant opening its initial data import
Source
services-platform:modules/tenants/tests/unit/services/lifecycle/lifecycle-transitions.spec.js#refuses deletion_pending: a tenant still being built is not put up for deletion
03 State repetition is idempotentinvariantunittest
Proves
BR-CAP-PFM-TNL-006-03
Preconditions
Each lifecycle state is represented.
Steps
Assert a transition to the same state.
Expected
The assertion succeeds without a lifecycle change.
Data
Use the run-owned records and caller contexts created by the cited tests; use their provider and clock seams only where declared.
Bound to
services-platform:modules/tenants/tests/unit/services/lifecycle/lifecycle-transitions.spec.js#allows provisioning to provisioning, so a repeated step changes nothing and refuses nothing
services-platform:modules/tenants/tests/unit/services/lifecycle/lifecycle-transitions.spec.js#allows deleting to deleting, so a retried purge step is idempotent
Source
services-platform:modules/tenants/tests/unit/services/lifecycle/lifecycle-transitions.spec.js#allows provisioning to provisioning, so a repeated step changes nothing and refuses nothing
04 Deletion status cannot be re-enabled directlyinvariantapinegativetest
Proves
BR-CAP-PFM-TNL-006-04
Preconditions
A workspace is deletion pending.
Steps
Attempt to set its status live.
Expected
The database rejects the cross-axis inconsistency.
Data
Use the run-owned records and caller contexts created by the cited tests; use their provider and clock seams only where declared.
Bound to
services-platform:modules/tenants/tests/integration/services/persistence/tenants.integration.spec.js#refuses a status change the lifecycle forbids, by the rule the database holds
Source
services-platform:modules/tenants/tests/integration/services/persistence/tenants.integration.spec.js#refuses a status change the lifecycle forbids, by the rule the database holds
05 Staff authority controls disablingpermissionapinegativetest
Proves
BR-CAP-PFM-TNL-006-05
Preconditions
Customer-admin and staff callers target the same workspace.
Steps
Attempt the disabling action with each caller.
Expected
Customer authority is refused and authorized staff can change status.
Data
Use the run-owned records and caller contexts created by the cited tests; use their provider and clock seams only where declared.
Bound to
services-platform:modules/tenants/tests/e2e/tenant-deletion-requests.e2e.spec.js#may not disable it, because cutting an association off is a staff act
Source
services-platform:modules/tenants/tests/e2e/tenant-deletion-requests.e2e.spec.js#may not disable it, because cutting an association off is a staff act
06 Production rejects disposable markingboundaryapinegativetest
Proves
BR-CAP-PFM-TNL-006-07
Preconditions
Production policy applies to the fixtures.
Steps
Create and update with disposable marking.
Expected
Both attempts are refused.
Data
Use the run-owned records and caller contexts created by the cited tests; use their provider and clock seams only where declared.
Bound to
services-platform:modules/tenants/tests/integration/services/persistence/tenants.integration.spec.js#refuses a disposable tenant in Production, where no such tenant exists
services-platform:modules/tenants/tests/integration/services/persistence/tenants.integration.spec.js#refuses an update that makes an existing tenant disposable in Production
Source
services-platform:modules/tenants/tests/integration/services/persistence/tenants.integration.spec.js#refuses a disposable tenant in Production, where no such tenant exists
07 Cancellation restores lifecycle without restoring availabilityinteractionapinegativeproposed
Proves
BR-CAP-PFM-TNL-006-04
Preconditions
A disabled workspace has a reversible deletion request.
Steps
Cancel its request, read the two status axes and make an ordinary customer request.
Expected
The request remains as cancelled history; lifecycle returns to active, business status remains disabled and ordinary access remains unavailable.
Data
Create a separate run-owned workspace for each decision branch and an unaffected comparison workspace. Use a controlled clock, paused task or injected fault at the boundary named in the scenario.
Source
rhythm-v2-docs:specs/platform/tenant-lifecycle/planning/capabilities/CAP-PFM-TNL-006-keep-every-workspace-s-lifecycle-state-truthful.md; rhythm-v2-docs:specs/platform/tenant-lifecycle/planning/capabilities/CAP-PFM-TNL-014-hold-release-or-call-off-a-deletion-before-destruction.md; rhythm-v2-docs:specs/platform/tenant-lifecycle/planning/capabilities/CAP-PFM-TNL-005-keep-people-and-background-work-out-of-a-workspace-that-is.md; rhythm-v2-docs:specs/platform/tenant-lifecycle/planning/capabilities/CAP-PFM-TNL-013-ask-for-a-workspace-to-be-deleted-after-a-waiting-period.md

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.