✔ old business response is discarded when the active membership changes (3.208792ms)
✔ private calls carry business context but session discovery can detect another-tab switch (0.333458ms)
✔ failed write retains retry id, while an account switch clears it (5.361ms)
✔ portal requests are independent of staff context changes (0.764333ms)
✔ private image response is discarded across an account switch (0.340459ms)
✔ private image lease is revoked on context change and release is idempotent (0.921459ms)
✔ staff switch does not revoke a customer portal image (0.149667ms)
✔ upload retry identity includes bytes, not just endpoint (5.175916ms)
✔ opening another preview does not announce an account switch; login does (1.555042ms)
✔ private PDF arriving after a customer session switch is discarded before download (0.252875ms)
✔ private PDF uses business context and only downloads confirmed PDF responses (24.626084ms)
✔ customer CSV cannot download after an owner business switch (0.156084ms)
✔ customer CSV enforces type and downloads the safe filename with credentials and business scope (0.263708ms)
✔ Week and day navigation cross months, years and UK clocks without shifting dates (8.932167ms)
✔ Midnight endings are exclusive while all-day end dates are inclusive (0.084542ms)
✔ Repeated UK hour shows distinguishable summer and winter clock labels (38.267042ms)
✔ matching contacts never select identity; inactive records cannot be transfer choices (1.872292ms)
✔ confirmation uses the exact preview rather than later selection and preserves false acknowledgement (0.088208ms)
✔ export filter is encoded and completion rows contain only explicitly selected exact evidence (0.159167ms)
✔ fractional lines round half up in integer pence before subtotal and VAT (0.992583ms)
✔ percentage deposit rounds half up and leaves the exact remaining pence (0.49875ms)
✔ invalid deposit percentages and sub-penny deposits are rejected (0.853292ms)
✔ stage editing cannot silently drop or add a penny (0.309709ms)
✔ opening a saved job and inspecting read-only history leaves editable facts clean (1.781917ms)
✔ job status changes and exact reversion are detected (0.273458ms)
✔ job notes changes and exact reversion are detected (0.147958ms)
✔ job scheduled_date changes and exact reversion are detected (0.162667ms)
✔ private job metadata priority stays protected (0.173417ms)
✔ private job metadata next_action stays protected (0.102625ms)
✔ private job metadata next_action_date stays protected (0.107875ms)
✔ private job metadata last_contact_date stays protected (0.091625ms)
✔ private job metadata completed_date stays protected (0.129125ms)
✔ private job metadata postcode_group stays protected (0.173959ms)
✔ private job metadata archived stays protected (1.168958ms)
✔ private job metadata followup_excluded stays protected (0.060792ms)
✔ valid equivalent tag case, spacing and order are clean; duplicate or invalid tags stay dirty (0.100042ms)
✔ a confirmed save advances only the saved snapshot, including after reopening (2.778708ms)
✔ failed and stale save attempts do not advance a draft baseline (0.686292ms)
✔ successful in-flight save accepts only the submitted values and preserves later text (0.776834ms)
✔ quote values cover each line, VAT, both dates and customer notes (0.4725ms)
✔ opening or cancelling a time editor is clean; blank override differs from an explicit zero rate (0.282625ms)
✔ transfer selection, reason and confirmation matter; object property order does not (0.600208ms)
✔ file selections and photo sharing fields remain distinct from viewing a photo (0.105667ms)
✔ clean leave executes immediately without a pending confirmation (5.538542ms)
✔ Keep editing and Escape cancellation execute nothing and preserve the selected draft (0.26025ms)
✔ dirty leave has one owner and repeated requests retain the first intended destination (0.667041ms)
✔ clean repeated clicks and async discard cannot execute twice or start a background action (1.335417ms)
✔ a failed logout exposes its error without changing private draft values (0.488875ms)
✔ an identity reset cancels pending leave and ignores completion from its old context (0.510458ms)
✔ selection rejects unsafe names, empty and oversized files but accepts supported size boundaries (1.913708ms)
✔ real HEIC content is selected without a native browser decoder or a misleading preview (12.828042ms)
✔ HEIF header checks do not accept a renamed non-image or an AVIF brand (0.421542ms)
✔ photo rejection 413 preserves selected bytes and permits a corrected retry (1.081542ms)
✔ photo rejection 415 preserves selected bytes and permits a corrected retry (0.398125ms)
✔ photo rejection 422 preserves selected bytes and permits a corrected retry (0.419417ms)
✔ selection checks image signatures instead of trusting extensions or declared MIME (0.195ms)
✔ visitor sends without cookies; a successful result exposes no receipt or private references (0.540792ms)
✔ concurrent clicks coalesce into one logical request (0.1495ms)
✔ lost response retains exact payload/key; edits are blocked until the unchanged retry succeeds (0.23675ms)
✔ a stalled request times out and retries the identical logical enquiry (10.799958ms)
✔ ambiguous HTTP 408 retains the logical operation (0.25875ms)
✔ ambiguous HTTP 500 retains the logical operation (0.096042ms)
✔ ambiguous HTTP 503 retains the logical operation (0.078125ms)
✔ malformed success is uncertain and never produces a successful-looking enquiry (0.140208ms)
✔ validation error allows correction without discarding the selected files or date (0.115584ms)
✔ a deliberately separate matching-contact enquiry has a new operation identity (0.088417ms)
✔ public permission defaults to no projection and no rating (0.690458ms)
✔ approved statement retains exact customer text (0.072125ms)
✔ approval requires explicit boolean and nonempty exact fields (0.11125ms)
✔ projection bounds are enforced (0.065666ms)
✔ unconfirmed response does not produce a payload (0.080208ms)
✔ response keeps private answers separate from optional publication (0.095ms)
✔ all four ratings and recommendation require a deliberate valid choice (0.121917ms)
✔ publication uses the exact current approved preview hash and version (0.073208ms)
✔ the repeated autumn hour requires the selected actual offset (17.649708ms)
✔ spring clock gap and seasonally incorrect offsets are rejected (0.402958ms)
✔ London date and intervals remain the same on a computer in another timezone (0.98225ms)
✔ incomplete, reversed and zero-duration correction inputs are rejected before saving (0.864959ms)
✔ customer price starts blank and no private source details become a document line (0.171333ms)
✔ timer display permits long captures but never negative elapsed time (0.144917ms)
✔ quoted commas, multiline text, escaped quotes, CRLF and blank lines (0.800667ms)
✔ auto mapping and preview require explicit valid prices; no NaN/default repairs (0.473625ms)
✔ column mapping, row limits, reviewed price overrides and invalid costs (1.111042ms)
✔ reopened saved rows and reordered object fields are clean (0.521916ms)
✔ equivalent valid price and quantity spellings do not create unsaved changes (0.660167ms)
✔ every catalogue edit is protected and reverting to saved values is clean (0.505583ms)
✔ blank optional prices, zero and invalid numeric input remain distinct (0.3155ms)
✔ job selection, purchasing dates, notes and applied previous-price values are protected (0.265916ms)
✔ supplier reference edits, additions and removals are protected (0.291542ms)
✔ catalogue selection and CSV mapping or programmatic overrides are protected (0.261167ms)
✔ a persisted changed price becomes a clean reopened baseline (0.144417ms)
✔ comparison pairs render before then after without changing stored order (0.670875ms)
✔ reorder preserves identity and bounds (0.094583ms)
✔ public drafts and selected photos start with fresh public text (3.071292ms)
✔ response binds to displayed version and saved snapshot with deliberate confirmation (0.822291ms)
✔ expired quote cannot produce a response payload (0.068792ms)
✔ superseded quote cannot produce a response payload (0.496917ms)
✔ draft quote cannot produce a response payload (0.136ms)
✔ already accepted quote cannot produce a response payload (0.120125ms)
✔ declined quote cannot produce a response payload (0.085042ms)
✔ missing snapshot review is rejected (0.175459ms)
✔ PDF links remain private and scoped to exact document or stage (0.203292ms)
✔ a preview never requests private draft content without valid matching owner access (6.666959ms)
✔ draft preview loads once under exact owner access; valid checks do not replace its saved content (2.608959ms)
✔ owner context changes clear a loaded preview while customer context changes do not (0.907375ms)
✔ preview invalidates changed owner context slug (0.682709ms)
✔ preview invalidates changed owner context role (0.652625ms)
✔ preview invalidates changed owner context membership_id (0.877708ms)
✔ preview invalidates changed owner context csrf (1.955833ms)
✔ unavailable preview validation clears access and does not reload draft content (2.309209ms)
✔ logout during an initial draft load prevents its late response from exposing content (1.233291ms)
✔ preview deadline fails closed, coalesces checks and ignores late success (0.714458ms)
✔ closing a preview cancels listeners and ignores a pending load without reporting lost access (0.5365ms)
✔ feedback validation is request-only and valid checks never replace draft inputs (2.437917ms)
✔ contact, transfer and feedback changes revalidate without broadcasting codes or private answers (1.702875ms)
✔ feedback validation failure 401 clears only the request view (0.726875ms)
✔ feedback validation failure 404 clears only the request view (0.507ms)
✔ feedback validation failure 503 clears only the request view (0.470833ms)
✔ feedback checks coalesce, time out closed and cannot revive a view with a late result (0.501458ms)
✔ stopped feedback checks ignore a late rejection and release all timers and listeners (0.476541ms)
✔ portal 401 clears private context and image leases, rejects old work and preserves staff access (1.264209ms)
✔ public credential errors and another customer document 404 do not end a valid portal context (0.677167ms)
✔ focus, visibility and visible periodic checks preserve a valid context without resetting forms (0.657709ms)
✔ owner revoke, reissue, contact update and legacy rotation revalidate without blindly signing out (1.22675ms)
✔ another-tab access notice checks the active account and clears it only when validation fails (0.765667ms)
✔ customer identity changes clear old content even if the browser cookie now authenticates successfully (0.532333ms)
✔ business identity changes clear old content even if the browser cookie now authenticates successfully (0.448792ms)
✔ unreachable validation fails closed and overlapping focus checks coalesce (0.506083ms)
✔ validation deadline clears content and a late successful response cannot restore it (0.439167ms)
✔ stopping a watcher removes its deadline and ignores a late successful identity result (0.430458ms)
✔ apiImage clears current portal content on 401 but an old response cannot clear a newer session (0.391708ms)
✔ downloadPrivate clears current portal content on 401 but an old response cannot clear a newer session (0.367708ms)
✔ switching between week and month rules keeps valid explicit choices (1.697084ms)
✔ all-day conversion clears incompatible clock inputs (0.102458ms)
✔ single visit proposal retains original identity and requires fresh acknowledgement (0.070208ms)
✔ booking edits send booleans and exclude server and history fields (0.087458ms)
✔ suggested window is inclusive and bounded through DST (0.079791ms)
✔ month views include leap days and cross-year navigation (0.154333ms)
✔ range rejects reversed or over-62-day windows (0.1015ms)
✔ weekly windows and DST remain London calendar dates (0.056708ms)
✔ excluded placeholder can propose a reviewed single-date override without assuming a booking (0.105875ms)
✔ new request, edited filter, context change and unmount reject late success and failure (0.710583ms)
✔ drills use exact customer/resource IDs and one metric, never matching names or allocating money (0.175208ms)
✔ supporting row pages disclose full totals and do not lose the final partial page (0.201125ms)
✔ exports bind applied filters and exact snapshot, not draft input; time displays exact minutes (0.582708ms)
✔ service enquiry uses only the exact published business service and keeps its canonical title (0.465375ms)
✔ reordering is bounded, preserves identities and leaves the saved array untouched (0.358291ms)
✔ new page starts unpublished with independent editable content (2.939833ms)
✔ page and service routes resolve exactly and links retain the business prefix (0.223125ms)
✔ light and dark branding retain a contrasting button text colour (0.190708ms)
✔ ready reviews exclude closed, snoozed and ineligible history (0.399042ms)
✔ snooze expiry uses the server effective state (0.081834ms)
✔ only preparation writes a draft and only snooze writes its date (0.08875ms)
✔ review confirmation is not inferred from a filled draft (0.400917ms)
✔ tag input retains duplicates for server validation (0.398208ms)
✔ all established workspace labels remain reachable alongside new sections (0.075583ms)
ℹ tests 156
ℹ suites 0
ℹ pass 156
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 199.468666
