@chidchanun/bcp 0.2.13 → 0.2.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,10 +1,10 @@
1
1
  # BCP Framework
2
2
 
3
- BCP Framework is a React full-stack framework for file-based routing, SSR, SPA navigation, server data loading, API routes, authentication, authorization, SQL databases, background jobs, scheduling, workflow orchestration, transactional events, realtime delivery, observability, uploads, storage and standalone Node.js deployment.
3
+ BCP Framework is a React full-stack framework for file-based routing, SSR, SPA navigation, server data loading, API routes, authentication, authorization, SQL databases, background jobs, scheduling, workflow orchestration, transactional events, realtime delivery, framework-native testing, observability, uploads, storage and standalone Node.js deployment.
4
4
 
5
- > **Development target:** `0.2.13Realtime Platform`
5
+ > **Development target:** `0.2.14Testing Platform`
6
6
  >
7
- > `0.2.13` remains unreleased until local validation, RC checks, tagging and npm publication complete.
7
+ > `0.2.14` remains unreleased until local validation, RC checks, tagging and npm publication complete.
8
8
 
9
9
  ## Current platform
10
10
 
@@ -25,6 +25,7 @@ BCP Framework is a React full-stack framework for file-based routing, SSR, SPA n
25
25
  | Workflows | Sequential/parallel steps, retries, persisted delays, compensation and run leases |
26
26
  | Events | Transactional outbox, SQL persistence, dispatcher leases, retries, event bus and durable queue handoff |
27
27
  | Realtime | Channels/rooms, presence, broker delivery, WebSocket adapter contract, SSE and heartbeat |
28
+ | Testing | Request/route/auth/database/middleware/jobs/workflow/outbox/realtime/SSE test harnesses |
28
29
  | Observability | Structured logs, metrics, Prometheus output and health/readiness checks |
29
30
  | Uploads & storage | Multipart streaming, Local/S3-compatible storage and signed URLs |
30
31
  | Caching | Response cache and revalidation primitives |
@@ -73,6 +74,7 @@ import { createJobQueue } from "bcp/jobs";
73
74
  import { createWorkflow } from "bcp/workflow";
74
75
  import { createTransactionalOutbox } from "bcp/events";
75
76
  import { createRealtime } from "bcp/realtime";
77
+ import { createTestApp } from "bcp/testing";
76
78
  import { createMetricsRegistry } from "bcp/observability";
77
79
  ```
78
80
 
@@ -165,10 +167,6 @@ Read more: [Transactional Outbox & Events](docs/transactional-outbox-events.md)
165
167
 
166
168
  ## Realtime Platform — 0.2.13
167
169
 
168
- `0.2.13` adds the server-only `bcp/realtime` public entrypoint.
169
-
170
- Create a hub:
171
-
172
170
  ```ts
173
171
  import {
174
172
  createRealtime,
@@ -178,7 +176,7 @@ export const realtime =
178
176
  createRealtime();
179
177
  ```
180
178
 
181
- ### Channels / rooms
179
+ Join a channel and broadcast:
182
180
 
183
181
  ```ts
184
182
  const connection =
@@ -197,135 +195,179 @@ await realtime.broadcast(
197
195
  );
198
196
  ```
199
197
 
200
- Rooms are represented by channel names. Connections receive broadcasts only for channels they joined.
198
+ BCP intentionally does not install a WebSocket server library. Applications adapt `ws`, uWebSockets.js or another transport to `RealtimeSocket`. SSE is built in through Web `Response`.
199
+
200
+ Read more: [Realtime Platform](docs/realtime-platform.md)
201
+
202
+ ## Testing Platform — 0.2.14
201
203
 
202
- ### Presence
204
+ `0.2.14` adds the server-only `bcp/testing` entrypoint. It is test-runner neutral and does not add Jest or Vitest as framework dependencies.
205
+
206
+ ### Request and route tests
203
207
 
204
208
  ```ts
205
- await connection.join(
206
- "project:7",
207
- {
208
- presence: {
209
- status: "online",
209
+ import {
210
+ createRouteTestHandler,
211
+ createTestApp,
212
+ expectResponse,
213
+ } from "bcp/testing";
214
+
215
+ const handler =
216
+ createRouteTestHandler({
217
+ GET() {
218
+ return {
219
+ ok: true,
220
+ };
210
221
  },
211
- }
212
- );
213
-
214
- const members =
215
- await realtime.members(
216
- "project:7"
217
- );
218
- ```
222
+ });
219
223
 
220
- The built-in memory presence store is process-local. Multi-instance deployments should provide a shared `RealtimePresenceStore`.
224
+ const app =
225
+ createTestApp({
226
+ handler,
227
+ });
221
228
 
222
- ### Authentication and private channels
229
+ const response =
230
+ await app.get(
231
+ "/api/health"
232
+ );
223
233
 
224
- ```ts
225
- const realtime =
226
- createRealtime({
227
- authenticate:
228
- async ({ request }) =>
229
- request
230
- ? loadRealtimeUser(
231
- request
232
- )
233
- : null,
234
-
235
- getUserId:
236
- user => user.id,
237
-
238
- authorizeChannel:
239
- ({ connection, channel }) =>
240
- !channel.startsWith(
241
- "private:"
242
- ) ||
243
- Boolean(
244
- connection.user
245
- ),
234
+ await expectResponse(response)
235
+ .status(200)
236
+ .json({
237
+ ok: true,
246
238
  });
247
239
  ```
248
240
 
249
- ### WebSocket provider contract
241
+ `createTestApp()` keeps an in-memory cookie jar, supports default headers and can send JSON bodies directly.
250
242
 
251
- BCP intentionally does not install `ws`, Socket.IO or another WebSocket server dependency.
243
+ ### Authentication tests
252
244
 
253
- Adapt the selected server/provider to `RealtimeSocket`, then attach it:
245
+ Create a real signed BCP session token instead of a fake test-only user header:
254
246
 
255
247
  ```ts
256
- const connection =
257
- await realtime.attachSocket(
258
- socketAdapter,
248
+ import {
249
+ createTestAuthSession,
250
+ } from "bcp/testing";
251
+
252
+ const session =
253
+ await createTestAuthSession(
259
254
  {
260
- request,
255
+ id: 42,
256
+ role: "admin",
257
+ },
258
+ {
259
+ secret:
260
+ process.env.BCP_SESSION_SECRET,
261
+ store:
262
+ authSessionStore,
261
263
  }
262
264
  );
263
- ```
264
265
 
265
- The JSON socket protocol supports `join`, `leave`, `event` and `ping` messages.
266
+ app.setCookie(
267
+ session.cookieName,
268
+ session.token
269
+ );
270
+ ```
266
271
 
267
- ### Server-Sent Events
272
+ When `store` is provided, the matching server-side auth session record is inserted as well.
268
273
 
269
- SSE is built in through Web `Response`:
274
+ ### Rollback database tests
270
275
 
271
276
  ```ts
272
- export function GET(
273
- request: Request
274
- ) {
275
- return realtime.sse(
276
- "workflow:42",
277
- {
278
- signal:
279
- request.signal,
280
- }
281
- );
282
- }
277
+ import {
278
+ withTestTransaction,
279
+ } from "bcp/testing";
280
+
281
+ await withTestTransaction(
282
+ db,
283
+ async tx => {
284
+ await tx.execute(
285
+ "INSERT INTO users ..."
286
+ );
287
+
288
+ // assertions run here
289
+ }
290
+ );
283
291
  ```
284
292
 
285
- ### Cross-instance delivery
293
+ The callback uses the real BCP transaction and is deliberately rolled back after the test callback succeeds.
286
294
 
287
- `RealtimeBroker` is the provider-neutral pub/sub boundary. The built-in memory broker supports same-process hubs; production applications can implement shared Redis/NATS/etc. brokers without changing hub APIs.
295
+ ### Infrastructure harnesses
288
296
 
289
- ```text
290
- Browser A -> App A ----\
291
- Shared Broker
292
- Browser B -> App B ----/
293
- | |
294
- +---- Shared Presence Store
297
+ ```ts
298
+ import {
299
+ createJobTestHarness,
300
+ createOutboxTestHarness,
301
+ createRealtimeTestHarness,
302
+ createWorkflowTestHarness,
303
+ } from "bcp/testing";
295
304
  ```
296
305
 
297
- ### Heartbeat
306
+ These harnesses use the real platform contracts rather than separate mock implementations.
307
+
308
+ Background jobs:
298
309
 
299
310
  ```ts
300
- const heartbeat =
301
- realtime.startHeartbeat({
302
- intervalMs: 20_000,
303
- });
311
+ const jobTest =
312
+ createJobTestHarness(
313
+ jobs
314
+ );
315
+
316
+ await jobTest.drain();
304
317
 
305
- // shutdown
306
- await heartbeat.stop();
307
- await realtime.close();
318
+ await jobTest.expectCount(
319
+ 1,
320
+ {
321
+ name: "email.welcome",
322
+ state: "succeeded",
323
+ }
324
+ );
308
325
  ```
309
326
 
310
- `realtime.ping` / `realtime.pong` and `sweepStale()` provide connection liveness cleanup.
327
+ Realtime:
311
328
 
312
- ### Jobs / workflows / events integration
329
+ ```ts
330
+ const realtimeTest =
331
+ createRealtimeTestHarness(
332
+ realtime
333
+ );
313
334
 
314
- Realtime is the transient delivery edge for durable backend state:
335
+ const {
336
+ socket,
337
+ connection,
338
+ } =
339
+ await realtimeTest.connect();
340
+
341
+ await connection.join(
342
+ "orders:42"
343
+ );
315
344
 
316
- ```ts
317
345
  await realtime.broadcast(
318
- `jobs:${job.id}`,
319
- "job.progress",
346
+ "orders:42",
347
+ "order.updated",
320
348
  {
321
- progress: 60,
349
+ status: "paid",
322
350
  }
323
351
  );
352
+
353
+ realtimeTest.expectEvent(
354
+ socket,
355
+ "order.updated",
356
+ "orders:42"
357
+ );
324
358
  ```
325
359
 
326
- Important business facts should remain in database/outbox/jobs/workflows. Realtime delivery is transient, so reconnecting clients should refetch durable state/history when catch-up is required.
360
+ Other testing primitives include:
327
361
 
328
- Read more: [Realtime Platform](docs/realtime-platform.md)
362
+ ```text
363
+ createFakeClock()
364
+ createSequenceIdFactory()
365
+ runTestMiddleware()
366
+ createRealtimeTestSocket()
367
+ readSseEvents()
368
+ ```
369
+
370
+ Read more: [Testing Platform](docs/testing-platform.md)
329
371
 
330
372
  ## Public entrypoints
331
373
 
@@ -342,6 +384,7 @@ bcp/jobs
342
384
  bcp/workflow
343
385
  bcp/events
344
386
  bcp/realtime
387
+ bcp/testing
345
388
  bcp/observability
346
389
  bcp/server
347
390
  bcp/server-only
@@ -397,6 +440,8 @@ Browser / API / Realtime clients
397
440
  outbox jobs |
398
441
  \__________|_________/
399
442
  durable state
443
+
444
+ Testing Platform exercises these server contracts without becoming part of browser runtime.
400
445
  ```
401
446
 
402
447
  ## Packaging
@@ -424,7 +469,7 @@ docs/api-manifest.json
424
469
 
425
470
  ## Release validation
426
471
 
427
- Before publishing `0.2.13`:
472
+ Before publishing `0.2.14`:
428
473
 
429
474
  ```bash
430
475
  npm run typecheck
@@ -435,7 +480,7 @@ npm run test:package
435
480
  npm run rc:check
436
481
  ```
437
482
 
438
- `0.2.13` adds unit and prepared-package smoke coverage for broker broadcasts, channel membership, presence, authentication/channel authorization, socket protocol, heartbeat cleanup, SSE streaming, public runtime compilation and browser boundary enforcement.
483
+ `0.2.14` adds unit and prepared-package smoke coverage for request/route handling, cookies, signed auth sessions, rollback transactions, middleware execution, jobs, workflows, outbox delivery, realtime sockets, SSE parsing, public runtime compilation and browser boundary enforcement.
439
484
 
440
485
  Do not tag or publish until the exact final release commit passes the full RC sequence.
441
486
 
@@ -463,12 +508,13 @@ Do not tag or publish until the exact final release commit passes the full RC se
463
508
  | `0.2.11` | Workflow Orchestration |
464
509
  | `0.2.12` | Transactional Outbox & Events |
465
510
  | `0.2.13` | Realtime Platform |
511
+ | `0.2.14` | Testing Platform |
466
512
 
467
513
  ## Roadmap
468
514
 
469
- `0.2.13` establishes provider-neutral live delivery on top of the durable database/outbox/jobs/workflow stack.
515
+ `0.2.14` establishes framework-native testing for the current BCP application/runtime stack without coupling the framework to a specific test runner.
470
516
 
471
- The next logical milestone is **`0.2.14Testing Platform`**, focused on framework-native request/route/auth/database/jobs/workflow/realtime testing utilities and application test harnesses.
517
+ The next logical milestone is **`0.2.15Plugin & Module Platform`**, focused on reusable framework modules, lifecycle hooks, configuration extension, package metadata and plugin discovery/registration while keeping the current public entrypoints stable.
472
518
 
473
519
  Native desktop/mobile compilation remains later roadmap work.
474
520
 
package/docs/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  The `docs/` directory is the documentation source of truth for BCP Framework and is organized for **`bcp-docs-web`**.
4
4
 
5
- > **Documentation target:** BCP Framework `0.2.13Realtime Platform`
5
+ > **Documentation target:** BCP Framework `0.2.14Testing Platform`
6
6
  >
7
7
  > **Release state:** unreleased development target until RC validation, tagging and npm publication complete.
8
8
 
@@ -39,56 +39,64 @@ Framework source and tests remain authoritative for runtime behavior.
39
39
  | `0.2.11` | Workflow Orchestration |
40
40
  | `0.2.12` | Transactional Outbox & Events |
41
41
  | `0.2.13` | Realtime Platform |
42
+ | `0.2.14` | Testing Platform |
42
43
 
43
- ## 0.2.13Realtime Platform
44
+ ## 0.2.14Testing Platform
44
45
 
45
- `0.2.13` adds the server-only `bcp/realtime` public entrypoint.
46
+ `0.2.14` adds the server-only `bcp/testing` public entrypoint.
46
47
 
47
48
  Primary APIs:
48
49
 
49
50
  ```ts
50
51
  import {
51
- createMemoryRealtimeBroker,
52
- createMemoryRealtimePresenceStore,
53
- createRealtime,
54
- createRealtimeSseResponse,
55
- } from "bcp/realtime";
52
+ createFakeClock,
53
+ createJobTestHarness,
54
+ createOutboxTestHarness,
55
+ createRealtimeTestHarness,
56
+ createRealtimeTestSocket,
57
+ createRouteTestHandler,
58
+ createSequenceIdFactory,
59
+ createTestApp,
60
+ createTestAuthSession,
61
+ createWorkflowTestHarness,
62
+ expectResponse,
63
+ readSseEvents,
64
+ runTestMiddleware,
65
+ withTestTransaction,
66
+ } from "bcp/testing";
56
67
  ```
57
68
 
58
- Runtime model:
69
+ Testing model:
59
70
 
60
71
  ```text
61
- client connection
62
- |
63
- v
64
- RealtimeHub
65
- |
66
- +-- channels / rooms
67
- +-- auth / channel authorization
68
- +-- presence
69
- +-- heartbeat
70
- |
71
- +-- RealtimeBroker
72
- | -> cross-hub delivery
73
- |
74
- +-- RealtimeSocket
75
- | -> WebSocket provider adapter
76
- |
77
- +-- SSE Response
72
+ node:test / Vitest / Jest / other runner
73
+ |
74
+ v
75
+ bcp/testing
76
+ |
77
+ +----------+-----------+
78
+ | | |
79
+ Request Database Infrastructure
80
+ Route rollback jobs/workflow
81
+ Response tx outbox/realtime
82
+ Auth SSE/socket
83
+ Middleware
78
84
  ```
79
85
 
80
- The memory broker/presence store are process-local. Multi-instance deployments should provide shared implementations.
86
+ The helpers use existing BCP runtime contracts rather than defining a parallel mock framework. Signed auth sessions use the production session token implementation; middleware tests execute the real onion pipeline; job/workflow/outbox/realtime harnesses wrap their actual platform APIs.
87
+
88
+ BCP does not add a Jest or Vitest dependency.
81
89
 
82
90
  New/updated sources:
83
91
 
84
92
  | Source | Purpose |
85
93
  | --- | --- |
86
- | `realtime-platform.md` | Channels, presence, WebSocket adapter, SSE, heartbeat and broker model |
87
- | `api-reference.md` | `bcp/realtime` public APIs |
88
- | `platform-manifest.json` | Realtime capability flags and public entrypoint |
89
- | `api-manifest.json` | `bcp/realtime` source/guide ownership |
90
- | `docs-web-manifest.json` | Realtime docs navigation and `0.2.13` release route |
91
- | `releases/0.2.13.md` | Realtime Platform release notes |
94
+ | `testing-platform.md` | Request, auth, database, middleware, jobs, workflow, outbox, realtime and SSE testing |
95
+ | `api-reference.md` | `bcp/testing` public APIs |
96
+ | `platform-manifest.json` | Testing capability flags and public entrypoint |
97
+ | `api-manifest.json` | `bcp/testing` source/guide ownership |
98
+ | `docs-web-manifest.json` | Testing docs navigation and `0.2.14` release route |
99
+ | `releases/0.2.14.md` | Testing Platform release notes |
92
100
 
93
101
  ## Update rule
94
102
 
@@ -114,8 +122,9 @@ When framework behavior or public surface changes:
114
122
  | `/docs/workflow-orchestration` | `workflow-orchestration.md` |
115
123
  | `/docs/transactional-outbox-events` | `transactional-outbox-events.md` |
116
124
  | `/docs/realtime-platform` | `realtime-platform.md` |
125
+ | `/docs/testing-platform` | `testing-platform.md` |
117
126
  | `/docs/api-reference` | `api-reference.md` |
118
- | `/releases/0.2.13` | `releases/0.2.13.md` |
127
+ | `/releases/0.2.14` | `releases/0.2.14.md` |
119
128
 
120
129
  Every route/source pair is validated by unit tests.
121
130
 
@@ -134,6 +143,7 @@ bcp/jobs
134
143
  bcp/workflow
135
144
  bcp/events
136
145
  bcp/realtime
146
+ bcp/testing
137
147
  bcp/observability
138
148
  bcp/server
139
149
  bcp/server-only
@@ -144,7 +154,7 @@ The API-manifest entrypoint set must match the platform public-entrypoint set ex
144
154
 
145
155
  ## Release validation
146
156
 
147
- Before publishing `0.2.13`:
157
+ Before publishing `0.2.14`:
148
158
 
149
159
  ```bash
150
160
  npm run typecheck
@@ -155,6 +165,6 @@ npm run test:package
155
165
  npm run rc:check
156
166
  ```
157
167
 
158
- Realtime validation covers broker broadcasts, presence, authentication/channel authorization, socket protocol, heartbeat cleanup, SSE streaming, server-only boundaries, compiled `realtime.mjs` package execution and docs/platform/API parity.
168
+ Testing Platform validation covers request/route behavior, cookie persistence, signed auth sessions, rollback transactions, middleware execution, deterministic clocks/IDs, job/workflow/outbox/realtime harnesses, SSE parsing, server-only boundaries, compiled `testing.mjs` execution and docs/platform/API parity.
159
169
 
160
170
  The final release tag must point to the exact commit that passed the complete RC sequence.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "framework": "bcp",
4
- "version": "0.2.13",
4
+ "version": "0.2.14",
5
5
  "releaseState": "unreleased",
6
6
  "coverage": "public-entrypoints",
7
7
  "entrypoints": [
@@ -11,7 +11,7 @@
11
11
  "environment": "universal",
12
12
  "route": "/docs/api-reference#bcp",
13
13
  "summary": "React application APIs for routing, links, forms, loader/guard data, islands, metadata and route error handling.",
14
- "guides": ["/docs/routing", "/docs/server-data-loaders", "/docs/route-guards", "/docs/form-actions"]
14
+ "guides": ["/docs/routing", "/docs/server-data-loaders", "/docs/route-guards", "/docs/form-actions", "/docs/testing-platform"]
15
15
  },
16
16
  {
17
17
  "package": "bcp/island",
@@ -59,7 +59,7 @@
59
59
  "environment": "server",
60
60
  "route": "/docs/api-reference#bcp-database",
61
61
  "summary": "Provider-neutral MySQL, PostgreSQL and SQLite query, transaction, lifecycle and migration primitives.",
62
- "guides": ["/docs/database", "/docs/database-migrations", "/docs/transactional-outbox-events"]
62
+ "guides": ["/docs/database", "/docs/database-migrations", "/docs/transactional-outbox-events", "/docs/testing-platform"]
63
63
  },
64
64
  {
65
65
  "package": "bcp/auth",
@@ -67,7 +67,7 @@
67
67
  "environment": "server",
68
68
  "route": "/docs/api-reference#bcp-auth",
69
69
  "summary": "Authentication Platform v2 plus permission checks, authorization policies and auth/guest/role/permission route guards.",
70
- "guides": ["/docs/authentication", "/docs/auth-session-store", "/docs/auth-route-guards", "/docs/authorization-security", "/docs/session-auth"]
70
+ "guides": ["/docs/authentication", "/docs/auth-session-store", "/docs/auth-route-guards", "/docs/authorization-security", "/docs/session-auth", "/docs/testing-platform"]
71
71
  },
72
72
  {
73
73
  "package": "bcp/jobs",
@@ -75,7 +75,7 @@
75
75
  "environment": "server",
76
76
  "route": "/docs/api-reference#bcp-jobs",
77
77
  "summary": "Background queues and schedules with visibility leases, heartbeats, stale recovery, DLQ maintenance and Redis-compatible durable adapters.",
78
- "guides": ["/docs/background-jobs", "/docs/job-scheduling", "/docs/durable-jobs", "/docs/transactional-outbox-events", "/docs/realtime-platform", "/docs/observability"]
78
+ "guides": ["/docs/background-jobs", "/docs/job-scheduling", "/docs/durable-jobs", "/docs/transactional-outbox-events", "/docs/realtime-platform", "/docs/testing-platform", "/docs/observability"]
79
79
  },
80
80
  {
81
81
  "package": "bcp/workflow",
@@ -83,7 +83,7 @@
83
83
  "environment": "server",
84
84
  "route": "/docs/api-reference#bcp-workflow",
85
85
  "summary": "Persistent workflow orchestration with sequential and parallel steps, retries, delays, compensation, run leases and optional durable queue execution.",
86
- "guides": ["/docs/workflow-orchestration", "/docs/durable-jobs", "/docs/realtime-platform", "/docs/observability"]
86
+ "guides": ["/docs/workflow-orchestration", "/docs/durable-jobs", "/docs/realtime-platform", "/docs/testing-platform", "/docs/observability"]
87
87
  },
88
88
  {
89
89
  "package": "bcp/events",
@@ -91,7 +91,7 @@
91
91
  "environment": "server",
92
92
  "route": "/docs/api-reference#bcp-events",
93
93
  "summary": "Transactional outbox and event delivery APIs with SQL persistence, dispatcher leases, retries, stale recovery, queue handoff and in-process event bus delivery.",
94
- "guides": ["/docs/transactional-outbox-events", "/docs/database", "/docs/durable-jobs", "/docs/realtime-platform", "/docs/observability"]
94
+ "guides": ["/docs/transactional-outbox-events", "/docs/database", "/docs/durable-jobs", "/docs/realtime-platform", "/docs/testing-platform", "/docs/observability"]
95
95
  },
96
96
  {
97
97
  "package": "bcp/realtime",
@@ -99,7 +99,15 @@
99
99
  "environment": "server",
100
100
  "route": "/docs/api-reference#bcp-realtime",
101
101
  "summary": "Realtime channels, cross-hub broker delivery, presence, channel authorization, WebSocket adapter integration, heartbeat handling and built-in Server-Sent Events responses.",
102
- "guides": ["/docs/realtime-platform", "/docs/authentication", "/docs/observability"]
102
+ "guides": ["/docs/realtime-platform", "/docs/authentication", "/docs/testing-platform", "/docs/observability"]
103
+ },
104
+ {
105
+ "package": "bcp/testing",
106
+ "source": "packages/client/src/testing.ts",
107
+ "environment": "server",
108
+ "route": "/docs/api-reference#bcp-testing",
109
+ "summary": "Framework-native testing utilities for Request/Response handlers, signed auth sessions, rollback transactions, middleware, jobs, workflows, outbox delivery, realtime sockets and SSE.",
110
+ "guides": ["/docs/testing-platform", "/docs/authentication", "/docs/database", "/docs/durable-jobs", "/docs/workflow-orchestration", "/docs/transactional-outbox-events", "/docs/realtime-platform"]
103
111
  },
104
112
  {
105
113
  "package": "bcp/observability",
@@ -115,7 +123,7 @@
115
123
  "environment": "server",
116
124
  "route": "/docs/api-reference#bcp-server",
117
125
  "summary": "Request context, cookies, CSRF/same-origin protection, logging, production hardening, upload, storage, response and session APIs.",
118
- "guides": ["/docs/server-request-apis", "/docs/authorization-security", "/docs/file-upload", "/docs/storage", "/docs/storage-ecosystem", "/docs/production-hardening"]
126
+ "guides": ["/docs/server-request-apis", "/docs/authorization-security", "/docs/file-upload", "/docs/storage", "/docs/storage-ecosystem", "/docs/production-hardening", "/docs/testing-platform"]
119
127
  },
120
128
  {
121
129
  "package": "bcp/server-only",
@@ -131,7 +139,7 @@
131
139
  "environment": "server",
132
140
  "route": "/docs/api-reference#bcp-middleware",
133
141
  "summary": "Middleware System v2 request/response pipeline types and helpers.",
134
- "guides": ["/docs/middleware"]
142
+ "guides": ["/docs/middleware", "/docs/testing-platform"]
135
143
  }
136
144
  ]
137
145
  }