Skip to content

Commit c7af908

Browse files
committed
test: added tests for trace opts and document some types
1 parent 6f46788 commit c7af908

2 files changed

Lines changed: 139 additions & 4 deletions

File tree

src/tracing.ts

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,28 @@ import {
77
} from "./types/h3.ts";
88
import type { EventHandler, Middleware } from "./types/handler.ts";
99

10-
export type HandlerType = "middleware" | "route";
11-
10+
/**
11+
* Payload sent to the tracing channels.
12+
*/
1213
export interface H3THandlerTracePayload {
1314
event: H3Event;
14-
type: HandlerType;
15+
type: "middleware" | "route";
1516
}
1617

1718
type MaybeTracedMiddleware = Middleware & { __traced__?: boolean };
1819
type MaybeTracedEventHandler = EventHandler & { __traced__?: boolean };
1920

21+
/**
22+
* Options for the tracing plugin.
23+
*/
2024
export interface TracingPluginOptions {
25+
/**
26+
* Whether to trace middleware executions.
27+
*/
2128
traceMiddlewares?: boolean;
29+
/**
30+
* Whether to trace route executions.
31+
*/
2232
traceRoutes?: boolean;
2333
}
2434

test/tracing.test.ts

Lines changed: 126 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { tracingChannel } from "node:diagnostics_channel";
22
import { describeMatrix, type TestOptions } from "./_setup.ts";
3-
import { type H3THandlerTracePayload } from "../src/tracing.ts";
3+
import { H3 } from "../src/h3.ts";
4+
import { tracingPlugin, type H3THandlerTracePayload } from "../src/tracing.ts";
45

56
type TracingEvent = {
67
start?: { data: H3THandlerTracePayload };
@@ -352,6 +353,130 @@ describeMatrix(
352353
listener.cleanup();
353354
}
354355
});
356+
357+
it("traceMiddlewares: false disables middleware tracing", async () => {
358+
const listener = createTracingListener();
359+
360+
// Create a custom app with traceMiddlewares disabled
361+
const app = new H3({
362+
plugins: [tracingPlugin({ traceMiddlewares: false })],
363+
});
364+
365+
try {
366+
app.use((event) => {
367+
event.context.middleware1 = true;
368+
});
369+
370+
app.use((event) => {
371+
event.context.middleware2 = true;
372+
});
373+
374+
app.get("/test", () => "response");
375+
376+
const response = await app.request("/test");
377+
expect(response.status).toBe(200);
378+
379+
// Wait for tracing events to be processed
380+
await new Promise((resolve) => setTimeout(resolve, 10));
381+
382+
const middlewareEvents = listener.events.filter(
383+
(e) => e.asyncStart?.data.type === "middleware",
384+
);
385+
const routeEvents = listener.events.filter(
386+
(e) => e.asyncStart?.data.type === "route",
387+
);
388+
389+
// Middleware should NOT be traced
390+
expect(middlewareEvents.length).toBe(0);
391+
// Routes should still be traced
392+
expect(routeEvents.length).toBeGreaterThan(0);
393+
} finally {
394+
listener.cleanup();
395+
}
396+
});
397+
398+
it("traceRoutes: false disables route tracing", async () => {
399+
const listener = createTracingListener();
400+
401+
// Create a custom app with traceRoutes disabled
402+
const app = new H3({
403+
plugins: [tracingPlugin({ traceRoutes: false })],
404+
});
405+
406+
try {
407+
app.use((event) => {
408+
event.context.middleware1 = true;
409+
});
410+
411+
app.use((event) => {
412+
event.context.middleware2 = true;
413+
});
414+
415+
app.get("/test", () => "response");
416+
417+
const response = await app.request("/test");
418+
expect(response.status).toBe(200);
419+
420+
// Wait for tracing events to be processed
421+
await new Promise((resolve) => setTimeout(resolve, 10));
422+
423+
const middlewareEvents = listener.events.filter(
424+
(e) => e.asyncStart?.data.type === "middleware",
425+
);
426+
const routeEvents = listener.events.filter(
427+
(e) => e.asyncStart?.data.type === "route",
428+
);
429+
430+
// Middleware should still be traced
431+
expect(middlewareEvents.length).toBeGreaterThan(0);
432+
// Routes should NOT be traced
433+
expect(routeEvents.length).toBe(0);
434+
} finally {
435+
listener.cleanup();
436+
}
437+
});
438+
439+
it("both options false disables all tracing", async () => {
440+
const listener = createTracingListener();
441+
442+
// Create a custom app with both tracing options disabled
443+
const app = new H3({
444+
plugins: [
445+
tracingPlugin({ traceMiddlewares: false, traceRoutes: false }),
446+
],
447+
});
448+
449+
try {
450+
app.use((event) => {
451+
event.context.middleware1 = true;
452+
});
453+
454+
app.use((event) => {
455+
event.context.middleware2 = true;
456+
});
457+
458+
app.get("/test", () => "response");
459+
460+
const response = await app.request("/test");
461+
expect(response.status).toBe(200);
462+
463+
// Wait for tracing events to be processed
464+
await new Promise((resolve) => setTimeout(resolve, 10));
465+
466+
const middlewareEvents = listener.events.filter(
467+
(e) => e.asyncStart?.data.type === "middleware",
468+
);
469+
const routeEvents = listener.events.filter(
470+
(e) => e.asyncStart?.data.type === "route",
471+
);
472+
473+
// No tracing events should be emitted
474+
expect(middlewareEvents.length).toBe(0);
475+
expect(routeEvents.length).toBe(0);
476+
} finally {
477+
listener.cleanup();
478+
}
479+
});
355480
},
356481
testOpts,
357482
);

0 commit comments

Comments
 (0)