fusion-framework-mocking

v2026.09.24

Guides seeding deterministic Fusion Framework module state in tests — mockFramework, mockAppModules, and module-owned enableXMock helpers (msal, service-discovery, context, bookmark, feature-flag, analytics, telemetry, http, app) — while keeping each module's real configurator, provider, validation, and lifecycle. USE FOR: signing in a mock user, seeding context/bookmarks/feature-flags, faking HTTP/OpenAPI responses, choosing a mock boundary, adding a mock for a custom module. DO NOT USE FOR: configuring vitest.config.ts, rendering React components/hooks, or Vitest Browser Mode setup (use fusion-framework-testing); dev-server-time API mocking/proxying in dev-server.config.ts (use fusion-developer-app); backend/service-repo mocking.

GitHub
安装命令
npx skhub add equinor/fusion-framework-mocking
Markdown
SKILL.md

Fusion Framework Mocking

When to use

Use when a test needs deterministic Fusion Framework module state — a signed-in user, a current context, seeded feature flags/bookmarks, or faked HTTP responses — without a real Entra ID tenant, service registry, or backend.

Typical triggers:

  • "How do I mock useAccessToken / sign in a test user?"
  • "Seed a current context for this test"
  • "Fake this HTTP endpoint's response"
  • "Mock service discovery so the app doesn't hit the network"
  • "Add a mock for my own module"
  • "Test signed-out / login / logout behavior"
  • "Assert a middleware was called"

Implicit triggers:

  • A test imports mockFramework, mockAppModules, or any @equinor/fusion-framework-module-*/mock entry point
  • A test needs the app to boot without real credentials or a running backend
  • Writing or reviewing a *.mock.ts/mock-configurator file for a Fusion module

When not to use

  • Rendering a component/hook or configuring Vitest/Browser Mode — use fusion-framework-testing
  • dev-server.config.ts API mocking/proxying for local ffc app dev — that is dev-time only, unrelated to test-time module mocks; see fusion-developer-app
  • Asserting on one specific call (arguments, call count, reset) — that is the test runner's job (vi.spyOn, vi.fn); this skill only covers seeding module state
  • Backend/service-repo test doubles (different repo, different stack)

Required inputs

Mandatory

  • Which boundary needs faking: auth, service discovery, context, bookmarks, feature flags, HTTP, analytics, telemetry, app manifest, or a custom module
  • Test scope: parent framework (mockFramework), an app's own modules (mockAppModules), or a bespoke module graph (a module's own enable*Mock)

Conditional

  • Signed-in user details (name, username, specific token claims) when auth matters
  • Whether the test must stay fully offline (every expected request needs an answering middleware)
  • Whether an OpenAPI document already describes the API under test

Instructions

Step 1 — Understand the mocking design

Read references/framework-and-app-mocks.md for the design rules before writing a mock:

  • Only the client (the object doing network I/O) is substituted. Providers, configurators, schema validation, and module initialize all run for real — a test still catches wiring mistakes.
  • Mocks live beside the module they replace, at that module's own /mock entry point. @equinor/fusion-framework/mock only composes the built-in set; it contains no mock logic of its own.
  • There is no Fusion mocking API for individual calls. Mock clients are plain classes with ordinary methods — use vi.spyOn, bun:test's spyOn, or Node's t.mock.method directly.

Step 2 — Pick the right layer

Test scopeUseImport
Parent framework / portal-level modules togethermockFramework@equinor/fusion-framework/mock
An app's own modules (no React)mockAppModules@equinor/fusion-framework-app/mock
One module in a bespoke module graphthat module's enable*Mock@equinor/fusion-framework-module-*/mock
React hooks/components consuming app modulesrender helpers (out of scope here)see fusion-framework-testing
import { mockFramework } from '@equinor/fusion-framework/mock';

const fusion = await mockFramework((configurator) => {
  configurator.msal.setAccount({ name: 'Ada Lovelace' });
  configurator.context.setCurrentContext({ id: 'project-a', type: { id: 'ProjectMaster' }, value: {} });
  configurator.serviceDiscovery.addService({ key: 'catalog' });
});

mockFramework initializes every module FrameworkConfigurator declares (event, auth, http, serviceDiscovery, context, telemetry) with zero configuration — a default signed-in Test User and offline service resolution out of the box.

Step 3 — Seed the module the test needs

Use references/module-mocks.md for the full per-module table (auth, service discovery, context, bookmark, feature flag, analytics, telemetry, app manifest) with defaults, builder methods, and signed-out/token-exact recipes.

Step 4 — Fake HTTP responses

Use references/http-and-openapi-mocks.md to choose between a hand-written configurator.http.addMiddleware(...), createRouterMiddleware for several routes, or createOpenApiMockMiddleware (backed by @equinor/fusion-openapi-mock) for a whole OpenAPI document. An unmatched request always falls through to next(uri, init) and eventually the real network — a fully offline test must answer every request it expects.

Step 5 — Add a mock for a custom module (when needed)

Use references/custom-module-mocks.md when the module under test is not one of the built-ins — covers the client seam (setClient), builder-owned configuration, and exposing a configurator.<yourModule> accessor via FrameworkMockConfigurator's _pin/_getConfig.

Step 6 — Verify

  • The mocked boundary is the client only — configurator/provider/validation are real
  • Determinism: tokens and resolved services are identical across runs (no Date.now()-derived assertions without seeding)
  • Every expected HTTP request has an answering middleware, or the test intentionally allows fallthrough
  • Call-level assertions use the test runner's own spy tooling, not an invented Fusion API

Expected output

  • Test code that seeds Fusion module state through the correct /mock entry point
  • A stated choice of layer (mockFramework / mockAppModules / module enable*Mock) and why
  • HTTP faking strategy chosen (hand-written middleware, router, or OpenAPI) and its offline guarantees
  • Any custom-module mock wiring, if applicable

Safety & constraints

Never:

  • Invent a Fusion-specific mocking API for individual call assertions — that is the test runner's job
  • Treat an unsigned mock JWT (createMockToken/MSAL mock output) as valid outside a test
  • Replace a module's provider or configurator wholesale when only its client needs faking
  • Assume setResolveUnknownServices(false) is safe without declaring every service the framework itself resolves at start-up (e.g. context)

Always:

  • Prefer the smallest mock boundary that still exercises the behavior under test
  • Cite the real package/export used (e.g. enableContextMock from @equinor/fusion-framework-module-context/mock) rather than inventing one
  • Note when a test intentionally allows network fallthrough vs. when it must stay fully offline
发现
标签

此技能尚未发布标签。

版本
最新版本元数据

版本

v2026.09.24

发布时间

2026年9月24日

分类

未分类

许可证

MIT

源路径

skills/.experimental/fusion-framework-mocking

默认分支

main

最新提交

e8fd6cf

Tree SHA

758f088