Hexalith.FrontComposer.Testing 4.7.4

There is a newer version of this package available.
See the version list below for details.
dotnet add package Hexalith.FrontComposer.Testing --version 4.7.4
                    
NuGet\Install-Package Hexalith.FrontComposer.Testing -Version 4.7.4
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Hexalith.FrontComposer.Testing" Version="4.7.4" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Hexalith.FrontComposer.Testing" Version="4.7.4" />
                    
Directory.Packages.props
<PackageReference Include="Hexalith.FrontComposer.Testing" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Hexalith.FrontComposer.Testing --version 4.7.4
                    
#r "nuget: Hexalith.FrontComposer.Testing, 4.7.4"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Hexalith.FrontComposer.Testing@4.7.4
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Hexalith.FrontComposer.Testing&version=4.7.4
                    
Install as a Cake Addin
#tool nuget:?package=Hexalith.FrontComposer.Testing&version=4.7.4
                    
Install as a Cake Tool

Hexalith.FrontComposer.Testing

Adopter-facing test utilities for rendering generated FrontComposer components with bUnit.

Commands support deterministic success, rejection, immediate timeout, and stall-at-Syncing. Each test host emits the same canonical ULID sequence from a fresh instance, with distinct message and correlation identifiers for every dispatch. Queries and pages accept per-request callbacks with last-write-wins configuration. TestAuthorizationEvaluator is registered as the exact evaluator exposed by the host and fails closed for unknown policies.

TestFaultEvidenceRecorder records bounded, redacted scenario evidence only; it does not inject transport behavior. Use AddFrontComposerTestHostAsync(...) for DuringHostSetup store initialization and pass its optional cancellation token when test setup is cancelable. The synchronous API rejects that mode instead of blocking on async work.

Use FrontComposerTestBase for inheritance-based tests, or call Services.AddFrontComposerTestHost(...) from a BunitContext for composition-based setup. Dispose the returned FrontComposerTestHostBuilder when composing directly so culture settings are restored. The package registers in-memory storage, deterministic tenant and user context, Shell services, command/query/page-loader fakes, loose JS interop defaults, and component assertion helpers without requiring a running app host.

The deterministic fakes are per test host instance. TestCommandService captures redacted dispatch evidence and lifecycle states, TestQueryService supports success and not-modified paths through SucceedWith<T>() and NotModifiedWith<T>(), and TestProjectionPageLoader supports configured pages plus not-modified evidence.

Evidence formatting redacts configured tenant/user values and token, secret, password, authorization, API-key, cookie, private-key, connection-string, JWT, tenant-payload, stack-trace, backend-metadata, email, phone, address, person, or full-name keyed values before truncation and assertion output. Redaction matches key names, not values, so keep personal data out of neutrally named test payload fields. Cyclic, unsupported, or throwing payloads produce a bounded <serialization-unavailable> marker without changing the configured command outcome; process-fatal exceptions still propagate. The package public surface is pinned by PublicAPI.Shipped.txt; update that baseline intentionally when adding adopter-facing APIs.

Deterministic UX assertions

Set FrontComposerTestOptions.TimeProvider to a TestTimeProvider. Its UTC clock, monotonic timestamp, one-shot timers, periodic timers, Change, and disposal advance synchronously without sleeping. Timer callbacks run outside the clock lock and use their creation execution context. Advance the clock on the component dispatcher when a timer changes rendered state. It intentionally does not drain arbitrary asynchronous work; await the operation or renderer explicitly.

UxTiming exposes canonical default budgets, including 250 ms coalescing/post-accept retry, 2 s SlowQuery, 3 s recovery notice, 10 s degradation/fresh-row lifetime, 1 s status polls, 15 s projection polls, 30 s retry cap, and the 120 s polling ceiling. UxTimingAssertions.AssertBoundary checks N-1 ms and N ms from the operation start. The consumer suite compares these defaults with Shell options and internal constants; adopter overrides do not change the canonical defaults.

Canonical matrix Adopter helper
AM-01..31 UxAnnouncementCatalog.Expected resolves Shell resource copy by row and culture; operation and state identities remain separate from copy. AM-26 requires a supported heading resource key; AM-30 accepts variant: "offline"; AM-18/19 accept variant: "single".
AM sequence and silence AssertSequence checks exact order/count/copy/channel/operation/state; an empty expected list asserts silence. AssertDistinctChannels rejects duplicate speech for one event and conflicting lifecycle terminal outcomes for one operation, including Confirmed/IdempotentConfirmed. Diagnostics omit observed text and opaque identifiers.
AM coalescing and cancellation AssertCoalescingBoundary advances 249/250 ms after the last eligible change. AssertImmediateCancellation checks the decisive event immediately and again after the pending window. Include all observed events, including stale-result and silent-expiry drift.
AM channel ownership AssertChannel checks role/name, live attributes, atomic palette ownership, and focus-only summary/heading. role="status" supplies implicit polite/atomic semantics unless explicit attributes override them; focused summaries/headings must omit both live and atomic attributes. Supply the measured speech-owner count and inherited result-count count; the helper cannot discover browser nodes.
VR-01/02 and preservation UxValidationAssertions.AssertLinkedSummary compares measured summary text/count separately from its accessible label, checks invalid-only links in complete declared order, verifies declared group membership/name/description against measured relationships, and compares control/error targets with prior-render identities. Visible labels may appear inside richer accessible names; that comparison ignores case and collapses whitespace while declared visible-label identity remains exact. A valid field must have an empty ErrorId; an error target stays stable when present in both observations, allowing first-error insertion and removal after correction. AssertInputPreserved compares useful values without printing them.
SS-01..49 and VR-05 UxStateAssertions.AssertState checks canonical state names, subject terminality, and required caller-measured UxSurfaceFacts for tabs/panels, failure/no-success truth, polling and non-live/focus behavior; command states retain machine identity, including IdempotentConfirmed and DegradedExhausted. AssertBlockedSubmit also checks did-not-run copy, one event, retained focus, and no dispatch/queue. Ordinary silent states SS-31/33/36/39/40/43/44/45/46/47, including the SS-46/47 restored-focus rows, accept explicit aria-live="off" for roles other than alert/alertdialog, including overriding implicit status/log speech where the row permits that role; focus-only summaries/headings SS-05/06/28/37/38 still require absent live/atomic attributes. SS-19/21 require measured FailureVisible = false; did-not-run rows SS-25/36/37/38 require no dispatch, queue or lifecycle entry (null or Idle).
OF-01..04 and FM-04/05/11 UxFocusAssertions.CaptureOrigin captures the direct element handle before activation plus optional contract locator. AssertRestored uses reference identity, connected/enabled/visible status, and route-h1 or form-heading fallback.
AE-05 and FM geometry AssertUnobscured checks full target and painted focus bounds against every viewport/scrollport and all app-owned occluders. Supply computed focus paint bounds, including pseudo-elements, outline and shadows; a target rectangle alone cannot prove focus-indicator visibility. Occluders must include all painted overflowing descendants, even when their wrapper has zero size. Zero-size occluders paint nothing and are ignored; negative dimensions fail.
AE-01..09 TestAccessibilityEvidenceRecorder uses the configured clock, bounded record retention, and the shared redactor. Pass an AccessibilityEvidenceContext with positive surface/state inventory ordinals and a typed UxTheme. Its sealed AccessibilityMeasurements schema retains dimension-specific setup and observed loss, clipping, overlap, truncation, forced-color cue survival, animation suppression, silent expiry, keyboard/axe outcomes and geometry without arbitrary text. Missing measurements for the recorded row fail explicitly; failed measurements remain recordable. ViewportWidth is the effective CSS layout width after zoom; AE-01/02 require 0 < ViewportWidth <= 320, and AE-02 also requires ZoomPercent >= 400. A Passed AE-06 ratio must meet the shared 3:1 floor; callers still assess the applicable 4.5:1 text requirement. A packet measured under another row's setup or theme (for example AE-07 without forced colors), or marked Passed despite a failed outcome or failing AE-04/AE-05 geometry, is rejected. UxAccessibilityAssertions.AssertTargetSize checks 24×24 CSS px or one evidenced exception.

Measurement and accessibility snapshots are caller-supplied, so these APIs require no browser library or TypeScript distribution. Measure the computed accessibility tree of the focusable control: Fluent UI v5 host attributes such as aria-invalid or aria-describedby do not reach the shadow input, so reading them from a bUnit host element is not browser evidence. Resolve roles and accessible names first; data-testid is a supplementary evidence locator. AssertChannel, AssertLinkedSummary, AssertState and AssertTargetSize failures name failed checks without printing measured values. Recorder missing-fact, ordinal, setup and contradicted-outcome failures name required or failed facts; non-finite and context failures describe the failed contract. Sequence diagnostics show the mismatch index, catalog row/channel labels, differing member names and counts, omitting observed copy and opaque identifiers. AssertUnobscured includes bounded, redacted measured geometry in its failure message; other helpers, including the AssertBlockedSubmit focus and AM-20 count checks, describe the failed contract. Keep the full observation sequence instead of pre-filtering unexpected messages.

For target-size exceptions, record target ordinals, exactly one UxTargetSizeExceptionKind, its UxTargetSizeRationale, the keyboard key path, neighboring bounds for Spacing ([] is a measured empty inventory; null is unmeasured and fails AssertTargetSize and Passed AE-04 packets), or a separate conforming equivalent-control ordinal and bounds for Equivalent. The fixed schema excludes credentials, AX names, tenant payloads, backend metadata, stack traces, and personal text. Do not encode identifiers in numeric measurement fields. Increase MaxDiagnosticPayloadCharacters when a complete structured measurement packet is needed; truncation remains explicit.

These helpers record automated evidence only. They do not replace required manual assistive-technology/device evidence or close OI-16, G-4, FLUENT-APP-1, or Product approval.

Product Compatible and additional computed target framework versions.
.NET net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
4.7.6 269 11/4/2026
4.7.5 495 11/1/2026
4.7.4 313 10/31/2026
4.7.3 119 10/31/2026
4.7.2 229 10/30/2026
4.7.1 469 10/27/2026
4.7.0 1,107 10/18/2026
4.6.0 1,053 10/5/2026
4.5.0 1,042 9/19/2026
4.4.0 691 9/7/2026
4.3.0 272 9/5/2026
4.2.0 192 8/30/2026
4.1.1 712 8/6/2026
4.1.0 107 8/6/2026
4.0.1 423 7/16/2026
4.0.0 96 7/15/2026
3.2.2 124 7/14/2026
3.2.1 99 7/14/2026
3.2.0 93 7/14/2026
3.1.1 93 7/14/2026
Loading failed