/
standaloneSpecific.test.ts
144 lines (124 loc) 路 3.65 KB
/
standaloneSpecific.test.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
import { describe, expect, it } from '@jest/globals';
import fetch from 'node-fetch';
import { ApolloServer } from '../..';
import { startStandaloneServer } from '../../standalone';
describe('Typings: TContext inference', () => {
it('correctly infers BaseContext when no `context` function is provided', async () => {
const server = new ApolloServer({
typeDefs: `type Query { foo: String}`,
});
// HTTPApolloServer<BaseContext>
await startStandaloneServer(server, { listen: { port: 0 } });
await server.stop();
});
// `context` function can provide a superset of the `TContext` inferred by or
// provided to the ApolloServer instance
it('infers BaseContext when no TContext is provided to ApolloServer, even if a `context` function is provided', async () => {
const server = new ApolloServer({
typeDefs: `type Query { foo: String}`,
});
// HTTPApolloServer<BaseContext>
await startStandaloneServer(server, {
async context() {
return { foo: 'bar' };
},
listen: { port: 0 },
});
await server.stop();
});
it('correctly infers `MyContext` when generic and `context` function are both provided', async () => {
interface MyContext {
foo: string;
}
const server = new ApolloServer<MyContext>({
typeDefs: `type Query { foo: String}`,
resolvers: {
Query: {
foo: (_, __, context) => {
return context.foo;
},
},
},
});
// HTTPApolloServer<MyContext>
await startStandaloneServer(server, {
async context() {
return { foo: 'bar' };
},
listen: { port: 0 },
});
await server.stop();
});
it('errors when `MyContext` is provided without a `context` function', async () => {
interface MyContext {
foo: string;
}
const server = new ApolloServer<MyContext>({
typeDefs: `type Query { foo: String}`,
resolvers: {
Query: {
foo: (_, __, context) => {
return context.foo;
},
},
},
});
// @ts-expect-error
await startStandaloneServer(server, { listen: { port: 0 } });
await server.stop();
});
it('errors when `MyContext` is provided without a compatible `context` function', async () => {
interface MyContext {
foo: string;
}
const server = new ApolloServer<MyContext>({
typeDefs: `type Query { foo: String}`,
resolvers: {
Query: {
foo: (_, __, context) => {
return context.foo;
},
},
},
});
// @ts-expect-error
await startStandaloneServer(server, {
async context() {
return { notFoo: 'oops' };
},
listen: { port: 0 },
});
await server.stop();
});
});
describe('Configuration', () => {
it('allows > 100KiB bodies to be sent (body-parser default)', async () => {
const server = new ApolloServer({
typeDefs: `type Query { hello: String }`,
resolvers: {
Query: {
hello: () => 'hello world!',
},
},
});
const { url } = await startStandaloneServer(server, {
listen: { port: 0 },
});
const excessivelyLargeBody = JSON.stringify({
query: `{hello}`,
variables: { foo: 'a'.repeat(102400) },
});
// 100kib limit = 102400 bytes
expect(Buffer.byteLength(excessivelyLargeBody)).toBeGreaterThan(102400);
const result = await fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: excessivelyLargeBody,
});
const { data } = await result.json();
expect(data.hello).toEqual('hello world!');
await server.stop();
});
});