Skip to content

Commit 8a70ca2

Browse files
committed
test: coverage and cleanup unused type
1 parent 9ad8549 commit 8a70ca2

5 files changed

Lines changed: 31 additions & 51 deletions

File tree

src/__testUtils__/fakeDiagnosticsChannel.ts

Lines changed: 5 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ export type Listener = (message: unknown) => void;
1414
export class FakeChannel implements MinimalChannel {
1515
listeners: Array<Listener> = [];
1616

17+
/* c8 ignore next 3 */
1718
get [Symbol.toStringTag]() {
1819
return 'FakeChannel';
1920
}
@@ -55,7 +56,7 @@ export class FakeChannel implements MinimalChannel {
5556

5657
/**
5758
* Structurally-faithful `MinimalTracingChannel` implementation mirroring
58-
* Node's `TracingChannel.traceSync` / `tracePromise` lifecycle
59+
* Node's `TracingChannel.traceSync` lifecycle.
5960
*/
6061
export class FakeTracingChannel implements MinimalTracingChannel {
6162
start: FakeChannel = new FakeChannel();
@@ -64,6 +65,7 @@ export class FakeTracingChannel implements MinimalTracingChannel {
6465
asyncEnd: FakeChannel = new FakeChannel();
6566
error: FakeChannel = new FakeChannel();
6667

68+
/* c8 ignore next 3 */
6769
get [Symbol.toStringTag]() {
6870
return 'FakeTracingChannel';
6971
}
@@ -95,55 +97,18 @@ export class FakeTracingChannel implements MinimalTracingChannel {
9597
throw err;
9698
}
9799
// Node's real traceSync sets `ctx.result` before publishing `end`, so
98-
// subscribers can inspect `isPromise(ctx.result)` inside their `end`
99-
// handler to decide whether the operation is complete or async events
100-
// will follow. Match that semantic here.
100+
// subscribers can inspect `ctx.result` inside their `end` handler.
101101
(ctx as { result: unknown }).result = result;
102102
this.end.publish(ctx);
103103
return result;
104104
});
105105
}
106-
107-
tracePromise<T>(
108-
fn: (...args: Array<unknown>) => Promise<T>,
109-
ctx: object,
110-
thisArg?: unknown,
111-
...args: Array<unknown>
112-
): Promise<T> {
113-
return this.start.runStores(ctx, () => {
114-
let promise: Promise<T>;
115-
try {
116-
promise = fn.apply(thisArg as object, args);
117-
} catch (err) {
118-
(ctx as { error: unknown }).error = err;
119-
this.error.publish(ctx);
120-
this.end.publish(ctx);
121-
throw err;
122-
}
123-
this.end.publish(ctx);
124-
this.asyncStart.publish(ctx);
125-
return promise
126-
.then(
127-
(result) => {
128-
(ctx as { result: unknown }).result = result;
129-
return result;
130-
},
131-
(err: unknown) => {
132-
(ctx as { error: unknown }).error = err;
133-
this.error.publish(ctx);
134-
throw err;
135-
},
136-
)
137-
.finally(() => {
138-
this.asyncEnd.publish(ctx);
139-
});
140-
});
141-
}
142106
}
143107

144108
export class FakeDc implements MinimalDiagnosticsChannel {
145109
private cache = new Map<string, FakeTracingChannel>();
146110

111+
/* c8 ignore next 3 */
147112
get [Symbol.toStringTag]() {
148113
return 'FakeDc';
149114
}

src/__tests__/diagnostics-test.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,6 @@ function fakeTracingChannel(name: string): MinimalTracingChannel {
2929
asyncEnd: noop,
3030
error: noop,
3131
traceSync: <T>(fn: (...args: Array<unknown>) => T): T => fn(),
32-
tracePromise: <T>(
33-
fn: (...args: Array<unknown>) => Promise<T>,
34-
): Promise<T> => fn(),
3532
};
3633
return channel;
3734
}

src/diagnostics.ts

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,6 @@ export interface MinimalTracingChannel {
4949
thisArg?: unknown,
5050
...args: Array<unknown>
5151
) => T;
52-
53-
tracePromise: <T>(
54-
fn: (...args: Array<unknown>) => Promise<T>,
55-
ctx: object,
56-
thisArg?: unknown,
57-
...args: Array<unknown>
58-
) => Promise<T>;
5952
}
6053

6154
/**

src/execution/__tests__/resolve-diagnostics-test.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ const schema = buildSchema(`
2525
sync: String
2626
async: String
2727
fail: String
28+
asyncFail: String
2829
plain: String
2930
nested: Nested
3031
}
@@ -39,6 +40,7 @@ const rootValue = {
3940
fail: () => {
4041
throw new Error('boom');
4142
},
43+
asyncFail: () => Promise.reject(new Error('async-boom')),
4244
// no `plain` resolver, default property-access is used.
4345
plain: 'plain-value',
4446
nested: { leaf: 'leaf-value' },
@@ -98,6 +100,29 @@ describe('resolve diagnostics channel', () => {
98100
expect(kinds).to.deep.equal(['start', 'error', 'end']);
99101
});
100102

103+
it('emits full async lifecycle with error when a resolver rejects', async () => {
104+
active = collectEvents(resolveChannel);
105+
106+
await execute({
107+
schema,
108+
document: parse('{ asyncFail }'),
109+
rootValue,
110+
});
111+
112+
const kinds = active.events.map((e) => e.kind);
113+
expect(kinds).to.deep.equal([
114+
'start',
115+
'end',
116+
'asyncStart',
117+
'error',
118+
'asyncEnd',
119+
]);
120+
const errorEvent = active.events.find((e) => e.kind === 'error');
121+
expect((errorEvent?.ctx as { error?: Error }).error?.message).to.equal(
122+
'async-boom',
123+
);
124+
});
125+
101126
it('reports isTrivialResolver based on field.resolve presence', () => {
102127
const trivialSchema = new GraphQLSchema({
103128
query: new GraphQLObjectType({

src/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ export { enableDevMode, isDevModeEnabled } from './devMode.js';
3434

3535
// Register a `node:diagnostics_channel`-compatible module to enable
3636
// tracing channel emission from parse, validate, execute, subscribe,
37-
// and resolver lifecycles.
37+
// and resolver lifecycle events.
3838
export { enableDiagnosticsChannel } from './diagnostics.js';
3939
export type {
4040
MinimalChannel,

0 commit comments

Comments
 (0)