---
id: TST-CRM-ENT-785
title: CRM console fixture checks
kind: browser-lifecycle
product_area: crm
module: entities
revision: 1
status: draft
source_sha:
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
repository: react-console
files:
  - e2e/mock/affiliations.mock.spec.ts
  - e2e/mock/change-record-type.mock.spec.ts
  - e2e/mock/contact-edit-type.mock.spec.ts
  - e2e/mock/organization-affiliation-roles.mock.spec.ts
  - e2e/mock/record-creation.mock.spec.ts
  - e2e/mock/relationship-types.mock.spec.ts
  - e2e/mock/config-leave-without-edits.mock.spec.ts
implements: []
environment: mock
implementation_state: implemented
latest_result: not-run
latest_run_at: null
latest_run_ref: null
conformance: not-verified
estimated_minutes: null
estimate_basis: >-
  No measured duration is available for this cohesive group; per-file allowances
  are not runtime estimates.
isolation: >-
  Each browser context uses fixture-provided records and handler state, so its
  resets belong to the mock test harness. Fixture identifiers may resemble real
  identities but do not authorize writes to a development workspace. The
  selected list excludes other applications, duplicate review and explorer
  interactions.
binding_scope: >-
  Bindings preserve the existing assertion contributions and exact source file.
  Composite scenarios still require every bound contribution and any unbound
  checks; consolidation does not certify conformance.
bindings: []
evidence:
  - 'react-console:e2e/mock/affiliations.mock.spec.ts'
  - 'react-console:e2e/mock/change-record-type.mock.spec.ts'
  - 'react-console:e2e/mock/contact-edit-type.mock.spec.ts'
  - 'react-console:e2e/mock/organization-affiliation-roles.mock.spec.ts'
  - 'react-console:e2e/mock/record-creation.mock.spec.ts'
  - 'react-console:e2e/mock/relationship-types.mock.spec.ts'
  - 'react-console:e2e/mock/config-leave-without-edits.mock.spec.ts'
source_observations:
  - provenance: test
    source: 'react-console:e2e/mock/affiliations.mock.spec.ts'
    declared_test_titles:
      - ' '
      - 'contact: one Organization Affiliations section'
      - >-
        lists the primary, the other current and the past affiliation together,
        primary first
      - 'the simple case: one employer and a Business Address linked to it'
      - >-
        contact addresses and phones show which rows are linked, through which
        affiliation
      - >-
        Change Source keeps the saved selection on open and defaults a new
        organization to its first record
      - Make Independent Copy keeps the value as the contact's own
      - >-
        Make Independent Copy on a row linked through an ended affiliation
        copies the organization's current value
      - >-
        the editor on an existing affiliation shows its type, roles, dates,
        primary and what it supplies
      - >-
        a new affiliation previews the rows its type's defaults will link, each
        deselectable
      - >-
        a new primary affiliation asks whether the person left the current
        primary one (D8)
      - >-
        Make Primary moves the flag in one save, and the old primary stays
        current
      - organization
      - the people list uses the affiliation row's vocabulary
      - configuration
      - >-
        Types & Categories offers Address Types, Phone Number Types and
        Affiliation Types
      - >-
        Affiliation Types: the list, the editor with its contact-information
        defaults, and a refused delete
      - a type created in Affiliation Types is offered by the affiliation editor
      - '${title}: Applies To, and a reorder that survives a reload'
    skipped_declarations: []
    dependency_summary: >-
      The console and browser render real components while fixture handlers
      supply remote responses.
  - provenance: test
    source: 'react-console:e2e/mock/change-record-type.mock.spec.ts'
    declared_test_titles:
      - Change Type on Contact 360
      - >-
        marks the current type, saves only typeId and the version, and the
        header shows the new type
      - Cancel changes nothing
      - Change Type on Organization 360
      - >-
        marks the current type, saves only typeId against the version, and the
        page shows the new type
      - >-
        the Organization Type card's Change Type opens the same dialog, and
        Cancel changes nothing
    skipped_declarations: []
    dependency_summary: >-
      The console and browser render real components while fixture handlers
      supply remote responses.
  - provenance: test
    source: 'react-console:e2e/mock/contact-edit-type.mock.spec.ts'
    declared_test_titles:
      - Edit Contact's Contact Type
      - >-
        shows the type the contact holds above the form, and a save never sends
        it
      - shows an inactive type the contact holds as inactive rather than empty
    skipped_declarations: []
    dependency_summary: >-
      The console and browser render real components while fixture handlers
      supply remote responses.
  - provenance: test
    source: 'react-console:e2e/mock/organization-affiliation-roles.mock.spec.ts'
    declared_test_titles:
      - Organization 360 affiliation roles
      - the role filter lists the tenant's roles in saved order
      - >-
        the Add Affiliation role picker offers the active roles in saved order
        and not the sample list
    skipped_declarations: []
    dependency_summary: >-
      The console and browser render real components while fixture handlers
      supply remote responses.
  - provenance: test
    source: 'react-console:e2e/mock/record-creation.mock.spec.ts'
    declared_test_titles:
      - the type chooser
      - a card selects without navigating; Continue opens that type's form
      - >-
        the keyboard: arrows move, Space selects, Enter on the selected card
        continues
      - Cancel in the pinned bar goes back to the list
      - >-
        Change Type comes back to the chooser with the chosen type still
        selected
      - >-
        a tenant with one active type still sees the chooser, with that type
        selected
      - 'the pinned bar at ${width} px: Cancel and Continue at the bottom right'
      - Create Contact
      - >-
        asks for the type, opens that type's form with the type above it and
        none in it, and saves the type
      - New Organization
      - >-
        asks for the type, renders the type's configured form, and saves onto
        the new organization's 360
      - >-
        Rhythm's built-in organization form has no Organization Type field
        either
    skipped_declarations: []
    dependency_summary: >-
      The console and browser render real components while fixture handlers
      supply remote responses.
  - provenance: test
    source: 'react-console:e2e/mock/relationship-types.mock.spec.ts'
    declared_test_titles:
      - Relationship Types list
      - >-
        lists each type as a sentence, with cardinality, dating and the owner
        use, and hides the retired one
      - >-
        retiring the owner type of Boat is refused in Platform's words, and a
        type can be retired and revived
      - 'removing a type that links name retires it instead, and says so'
      - New and edit
      - 'creates a type, then shows its shape read-only'
      - a bad definition lists every reason and saves nothing
    skipped_declarations: []
    dependency_summary: >-
      The console and browser render real components while fixture handlers
      supply remote responses.
  - provenance: test
    source: 'react-console:e2e/mock/config-leave-without-edits.mock.spec.ts'
    declared_test_titles:
      - Leaving an ordered configuration list
      - '${heading}: no prompt without an edit, a prompt after one'
    dependency_summary: >-
      The browser and hosted CRM components render against fixture-backed
      service responses.
product_intent: proposed
implementation_evidence: observed
narrative:
  status: enriched
retries: none
proves_controls: []
lifecycles:
  create: not-exercised
  change: not-exercised
  archive: not-applicable
  delete: not-exercised
  merge: not-applicable
  reconcile: not-exercised
lifecycle_gaps:
  - FND-CRM-ENT-091
  - FND-CRM-ENT-092
  - FND-CRM-ENT-094
  - FND-CRM-ENT-095
command: >-
  npx playwright test --config playwright.mock.config.ts --workers 1 --retries 0
  e2e/mock/affiliations.mock.spec.ts e2e/mock/change-record-type.mock.spec.ts
  e2e/mock/contact-edit-type.mock.spec.ts
  e2e/mock/organization-affiliation-roles.mock.spec.ts
  e2e/mock/record-creation.mock.spec.ts e2e/mock/relationship-types.mock.spec.ts
  e2e/mock/config-leave-without-edits.mock.spec.ts
---

# CRM console fixture checks

## Verification Boundary

The selected crm console fixture checks files cross the browser interaction boundary described below.

## What This Suite Proves

Fixture-backed browser tests render affiliations, role editors, type changes, record creation and unchanged configuration departure. They establish visible interactions against supplied data. They do not establish stored CRM results and have no new acceptance scenario binding. No control is claimed without an independently mapped refusal case.

## What It Does Not Prove

MSW responses cannot prove persistence, server permission refusal or reconciliation. A displayed created contact is a browser fixture outcome until a real backend stores and returns it. These checks must never be used to certify the real records lifecycle.

## Level and Rationale

Browser rendering is required to establish interactions and layout under the selected fixtures. Pure component functions cannot establish the displayed composition. The absence of a real backend limits the level’s claim to presentation; choosing a browser runner does not make these fixtures end-to-end record proof.

## Lifecycle Coverage

Create, change, delete and reconcile are not exercised against persisted CRM state. Their visible simulations do not cross that boundary. Archive is outside this selected fixture group; merge belongs to Data Quality. All applicable absent persisted lifecycles have findings, and live acceptance owns the real proof.

## Real Dependencies and Test Doubles

The browser and rendered console components are real; fixture handlers supply CRM records and remote answers. This boundary does not include a real CRM database or service authorizer. The environment is mock, and the empty proof bindings prevent a fixture-rendered value from becoming a persistence claim.

## Must Not Be Doubled

Keep the actual rendered components and browser interactions under test. Do not replace the editor’s state changes with precomputed screens. Fixture responses are explicitly allowed here, but they must stay identified as fixtures; no persisted record or server-side authority assertion may rely on them.

## Fixtures and Isolation

Each browser context uses fixture-provided records and handler state, so its resets belong to the mock test harness. Fixture identifiers may resemble real identities but do not authorize writes to a development workspace. The selected list excludes other applications, duplicate review and explorer interactions.

## Determinism and Retries

Fixture state is deterministic only within the harness setup documented by each file. The exact command disables retries and limits execution to one worker. A repeated fixture response cannot be reported as recovered backend persistence.

## How It Runs

Use the exact command in the frontmatter from the owning repository. The command selects this register’s browser boundary and limits worker count. Acceptance commands use run-marked development fixtures; fixture and controlled projects retain their distinct environments. The register remains not-run because this authoring pass produces no execution report.

## Coverage Gaps

The lifecycle findings linked above identify every applicable partial or absent lifecycle in this register. MSW responses cannot prove persistence, server permission refusal or reconciliation. A displayed created contact is a browser fixture outcome until a real backend stores and returns it. These checks must never be used to certify the real records lifecycle. Existing unbound files supply engineering observations; they do not silently implement additional capability or screen scenarios.
