Skip to content

ATS-PFM-MTD-010Make Custom Records Discoverable: Capability Test Specification

Markdown

ATS-PFM-MTD-010

Make Custom Records Discoverable: Capability Test Specification

Markdown
  • DocumentProposed

KindAcceptance test setProduct areaPlatformModuleMetadata and Organization-defined RecordsRevision2

Read atservices-platform ad3f6a65react-console baf6dae3

Coverage

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

Test Scenarios

7 scenarios proving CAP-PFM-MTD-010; 6 bound to an existing test.

01 Placement accepts available apps and valid groupsvalidationapinegativetest
Proves
BR-CAP-PFM-MTD-010-01
Preconditions
Local and foreign custom apps exist.
Steps
[ { "do": "Place objects in a built-in app, a local custom app, unknown and foreign apps and a blank group.", "provenance": "test", "source": "services-platform:modules/custom-objects/tests/integration/services/persistence/custom-objects.integration.spec.js#refuses an app that is neither an application nor a custom app, naming it, and writes nothing" } ]
Expected
Valid destinations succeed and unavailable apps or blank groups fail.
Data
Local and foreign custom apps exist.
Bound to
services-platform:modules/custom-objects/tests/integration/services/persistence/custom-objects.integration.spec.js#places objects in orders, meetings and eligibility, console apps the licensing keys do not carry
services-platform:modules/custom-objects/tests/integration/services/persistence/custom-objects.integration.spec.js#refuses an app that is neither an application nor a custom app, naming it, and writes nothing
services-platform:modules/custom-objects/tests/unit/placement-apps.spec.ts#are the console’s seventeen navigation apps, in its order
Source
services-platform:modules/custom-objects/tests/integration/services/persistence/custom-objects.integration.spec.js#refuses an app that is neither an application nor a custom app, naming it, and writes nothing
02 An object can work without app placementinteractionbrowsertest
Proves
BR-CAP-PFM-MTD-010-02
Preconditions
A valid object can be activated without placement or owner.
Steps
[ { "do": "Activate it and inspect a boat available only through contacts.", "provenance": "test", "source": "services-platform:modules/custom-objects/tests/integration/services/persistence/custom-objects.integration.spec.js#activates an object that has neither a placement nor an owner association type (B4: no activation rule for either)" } ]
Expected
Activation succeeds and related records remain accessible without a menu entry.
Data
A valid object can be activated without placement or owner.
Bound to
services-platform:modules/custom-objects/tests/integration/services/persistence/custom-objects.integration.spec.js#activates an object that has neither a placement nor an owner association type (B4: no activation rule for either)
react-console:acceptance/custom-objects/playwright/journeys/PLAT-M5-S13.spec.ts#PLAT-M5-S13: a boat placed only on contacts has no menu entry and is reached from the contact's page
Source
services-platform:modules/custom-objects/tests/integration/services/persistence/custom-objects.integration.spec.js#activates an object that has neither a placement nor an owner association type (B4: no activation rule for either)
03 Custom app definitions reject reserved identities and invalid valuesvalidationapinegativetest
Proves
BR-CAP-PFM-MTD-010-03
Preconditions
App creation and replacement are available.
Steps
[ { "do": "Submit reserved app keys, invalid labels, icons and order and a stale replacement.", "provenance": "test", "source": "services-platform:modules/custom-objects/tests/integration/services/persistence/custom-apps.integration.spec.js#refuses the key of a platform application, which a placement could not tell from it" } ]
Expected
Invalid requests fail while a valid app starts unarchived at its first version.
Data
App creation and replacement are available.
Bound to
services-platform:modules/custom-objects/tests/integration/services/persistence/custom-apps.integration.spec.js#refuses the key of a platform application, which a placement could not tell from it
services-platform:modules/custom-objects/tests/integration/services/persistence/custom-apps.integration.spec.js#refuses a console app’s key that is not a licensing key (meetings), as the key of a platform application
Source
services-platform:modules/custom-objects/tests/integration/services/persistence/custom-apps.integration.spec.js#refuses the key of a platform application, which a placement could not tell from it
04 Live placements prevent app archivalinteractionapinegativetest
Proves
BR-CAP-PFM-MTD-010-04 INV-DOM-PFM-MTD-004-07
Preconditions
Draft and active objects are placed in one app.
Steps
[ { "do": "Archive the app before and after moving or archiving its live objects.", "provenance": "test", "source": "services-platform:modules/custom-objects/tests/integration/services/persistence/custom-apps.integration.spec.js#refuses to archive an app while a draft and an active object are placed in it, naming both, and leaves the app unchanged" } ]
Expected
The initial refusal names dependencies and the later archival succeeds while archived objects can retain placement.
Data
Draft and active objects are placed in one app.
Bound to
services-platform:modules/custom-objects/tests/integration/services/persistence/custom-apps.integration.spec.js#refuses to archive an app while a draft and an active object are placed in it, naming both, and leaves the app unchanged
services-platform:modules/custom-objects/tests/integration/services/persistence/custom-apps.integration.spec.js#archives the app once its objects are moved elsewhere or archived; an archived object keeps its placement
services-platform:modules/custom-objects/tests/e2e/custom-apps.e2e.spec.js#answers 409 to archiving an app an active object is placed in, naming it, and the app stays listed with it (B3)
Source
services-platform:modules/custom-objects/tests/integration/services/persistence/custom-apps.integration.spec.js#refuses to archive an app while a draft and an active object are placed in it, naming both, and leaves the app unchanged
05 Archived apps reject new placement and editingtransitionapinegativetest
Proves
BR-CAP-PFM-MTD-010-05
Preconditions
A custom app is archived.
Steps
[ { "do": "Create or move a placement into it and replace its settings.", "provenance": "test", "source": "services-platform:modules/custom-objects/tests/integration/services/persistence/custom-objects.integration.spec.js#refuses a new placement in an archived custom app, and writes nothing" } ]
Expected
All three operations fail without writes.
Data
A custom app is archived.
Bound to
services-platform:modules/custom-objects/tests/integration/services/persistence/custom-objects.integration.spec.js#refuses a replacement that moves an object into an archived custom app, the row unchanged
Source
services-platform:modules/custom-objects/tests/integration/services/persistence/custom-objects.integration.spec.js#refuses a new placement in an archived custom app, and writes nothing
06 Navigation follows object-scoped reachpermissionapinegativetest
Proves
BR-CAP-PFM-MTD-010-08
Preconditions
Scoped roles, broad readers and a caller without record access exist.
Steps
[ { "do": "Request their custom navigation.", "provenance": "test", "source": "services-platform:modules/custom-objects/tests/e2e/custom-object-records.e2e.spec.js#answers a role scoped to custom_object:boat the boats alone" } ]
Expected
Scoped callers receive only reachable objects, broad readers exclude roles-only objects and the empty-access caller is refused.
Data
Scoped roles, broad readers and a caller without record access exist.
Bound to
services-platform:modules/custom-objects/tests/e2e/custom-object-records.e2e.spec.js#answers a role scoped to custom_object:boat the boats alone
services-platform:modules/custom-objects/tests/e2e/custom-object-records.e2e.spec.js#answers a role scoped to the roles-only object that object, which a customer-wide reader does not see
Source
services-platform:modules/custom-objects/tests/e2e/custom-object-records.e2e.spec.js#answers a role scoped to custom_object:boat the boats alone
07 Reach and lifecycle jointly select navigationinteractionapiproposed
Proves
BR-CAP-PFM-MTD-010-04 BR-CAP-PFM-MTD-010-08 BR-CAP-PFM-MTD-009-08 BR-CAP-PFM-MTD-011-02
Preconditions
A roles-only active object is placed in a custom app.
Steps
[ { "do": "Request navigation with broad and scoped grants, attempt app archival, archive the object and request navigation again.", "provenance": "proposed", "source": [ "services-platform:modules/custom-objects/tests/integration/services/persistence/custom-apps.integration.spec.js#refuses to archive an app while a draft and an active object are placed in it, naming both, and leaves the app unchanged", "services-platform:modules/custom-objects/tests/e2e/custom-object-records.e2e.spec.js#answers a role scoped to custom_object:boat the boats alone", "services-platform:modules/custom-objects/tests/integration/services/persistence/custom-objects.integration.spec.js#restores an archived object as a draft, keeping its object id", "services-platform:modules/custom-objects/tests/e2e/custom-object-records.e2e.spec.js#keeps a roles-only object from a customer-wide assignment, answering as if it were not there" ] } ]
Expected
Compare navigation and app archival responses under each configuration.
Data
A roles-only active object is placed in a custom app.
Source
services-platform:modules/custom-objects/tests/integration/services/persistence/custom-apps.integration.spec.js#refuses to archive an app while a draft and an active object are placed in it, naming both, and leaves the app unchanged,services-platform:modules/custom-objects/tests/e2e/custom-object-records.e2e.spec.js#answers a role scoped to custom_object:boat the boats alone,services-platform:modules/custom-objects/tests/integration/services/persistence/custom-objects.integration.spec.js#restores an archived object as a draft, keeping its object id,services-platform:modules/custom-objects/tests/e2e/custom-object-records.e2e.spec.js#keeps a roles-only object from a customer-wide assignment, answering as if it were not there

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.