@apollo/gateway 2.4.5 → 2.4.7
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/dist/__generated__/graphqlTypes.d.ts +19 -1
- package/dist/__generated__/graphqlTypes.d.ts.map +1 -1
- package/dist/__generated__/graphqlTypes.js +1 -0
- package/dist/__generated__/graphqlTypes.js.map +1 -1
- package/dist/executeQueryPlan.js +1 -1
- package/dist/executeQueryPlan.js.map +1 -1
- package/package.json +4 -4
- package/src/__generated__/graphqlTypes.ts +33 -2
- package/src/executeQueryPlan.ts +1 -1
- package/src/__mocks__/tsconfig.json +0 -7
- package/src/__tests__/.gitkeep +0 -0
- package/src/__tests__/CucumberREADME.md +0 -96
- package/src/__tests__/build-query-plan.feature +0 -1471
- package/src/__tests__/buildQueryPlan.test.ts +0 -1225
- package/src/__tests__/executeQueryPlan.conditions.test.ts +0 -1488
- package/src/__tests__/executeQueryPlan.introspection.test.ts +0 -140
- package/src/__tests__/executeQueryPlan.test.ts +0 -6140
- package/src/__tests__/execution-utils.ts +0 -124
- package/src/__tests__/gateway/__snapshots__/opentelemetry.test.ts.snap +0 -195
- package/src/__tests__/gateway/buildService.test.ts +0 -249
- package/src/__tests__/gateway/endToEnd.test.ts +0 -486
- package/src/__tests__/gateway/executor.test.ts +0 -96
- package/src/__tests__/gateway/extensions.test.ts +0 -37
- package/src/__tests__/gateway/lifecycle-hooks.test.ts +0 -239
- package/src/__tests__/gateway/opentelemetry.test.ts +0 -123
- package/src/__tests__/gateway/queryPlanCache.test.ts +0 -231
- package/src/__tests__/gateway/queryPlannerConfig.test.ts +0 -101
- package/src/__tests__/gateway/reporting.test.ts +0 -616
- package/src/__tests__/gateway/supergraphSdl.test.ts +0 -396
- package/src/__tests__/gateway/testUtils.ts +0 -89
- package/src/__tests__/integration/abstract-types.test.ts +0 -1861
- package/src/__tests__/integration/aliases.test.ts +0 -180
- package/src/__tests__/integration/boolean.test.ts +0 -279
- package/src/__tests__/integration/complex-key.test.ts +0 -197
- package/src/__tests__/integration/configuration.test.ts +0 -404
- package/src/__tests__/integration/custom-directives.test.ts +0 -174
- package/src/__tests__/integration/execution-style.test.ts +0 -35
- package/src/__tests__/integration/fragments.test.ts +0 -237
- package/src/__tests__/integration/list-key.test.ts +0 -128
- package/src/__tests__/integration/logger.test.ts +0 -122
- package/src/__tests__/integration/managed.test.ts +0 -319
- package/src/__tests__/integration/merge-arrays.test.ts +0 -34
- package/src/__tests__/integration/multiple-key.test.ts +0 -327
- package/src/__tests__/integration/mutations.test.ts +0 -287
- package/src/__tests__/integration/networkRequests.test.ts +0 -542
- package/src/__tests__/integration/nockMocks.ts +0 -157
- package/src/__tests__/integration/provides.test.ts +0 -77
- package/src/__tests__/integration/requires.test.ts +0 -359
- package/src/__tests__/integration/scope.test.ts +0 -557
- package/src/__tests__/integration/single-service.test.ts +0 -119
- package/src/__tests__/integration/unions.test.ts +0 -79
- package/src/__tests__/integration/value-types.test.ts +0 -382
- package/src/__tests__/integration/variables.test.ts +0 -120
- package/src/__tests__/nockAssertions.ts +0 -20
- package/src/__tests__/queryPlanCucumber.test.ts +0 -55
- package/src/__tests__/resultShaping.test.ts +0 -605
- package/src/__tests__/testSetup.ts +0 -1
- package/src/__tests__/tsconfig.json +0 -8
- package/src/core/__tests__/core.test.ts +0 -412
- package/src/datasources/__tests__/LocalGraphQLDataSource.test.ts +0 -51
- package/src/datasources/__tests__/RemoteGraphQLDataSource.test.ts +0 -574
- package/src/schema-helper/__tests__/addExtensions.test.ts +0 -70
- package/src/supergraphManagers/IntrospectAndCompose/__tests__/IntrospectAndCompose.test.ts +0 -364
- package/src/supergraphManagers/IntrospectAndCompose/__tests__/loadServicesFromRemoteEndpoint.test.ts +0 -40
- package/src/supergraphManagers/UplinkSupergraphManager/__tests__/UplinkSupergraphManager.test.ts +0 -65
- package/src/supergraphManagers/UplinkSupergraphManager/__tests__/loadSupergraphSdlFromStorage.test.ts +0 -511
- package/src/utilities/__tests__/deepMerge.test.ts +0 -77
|
@@ -1,237 +0,0 @@
|
|
|
1
|
-
import { disableFragmentWarnings } from 'graphql-tag';
|
|
2
|
-
import { execute } from '../execution-utils';
|
|
3
|
-
|
|
4
|
-
beforeAll(() => {
|
|
5
|
-
disableFragmentWarnings();
|
|
6
|
-
});
|
|
7
|
-
it('supports inline fragments (one level)', async () => {
|
|
8
|
-
const query = `#graphql
|
|
9
|
-
query GetUser {
|
|
10
|
-
me {
|
|
11
|
-
... on User {
|
|
12
|
-
username
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
`;
|
|
17
|
-
|
|
18
|
-
const { data, queryPlan } = await execute({
|
|
19
|
-
query,
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
expect(data).toEqual({
|
|
23
|
-
me: {
|
|
24
|
-
username: '@ada',
|
|
25
|
-
},
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
expect(queryPlan).toCallService('accounts');
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
it('supports inline fragments (multi level)', async () => {
|
|
32
|
-
const query = `#graphql
|
|
33
|
-
query GetUser {
|
|
34
|
-
me {
|
|
35
|
-
... on User {
|
|
36
|
-
username
|
|
37
|
-
reviews {
|
|
38
|
-
... on Review {
|
|
39
|
-
body
|
|
40
|
-
product {
|
|
41
|
-
... on Product {
|
|
42
|
-
... on Book {
|
|
43
|
-
title
|
|
44
|
-
}
|
|
45
|
-
... on Furniture {
|
|
46
|
-
name
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
`;
|
|
56
|
-
|
|
57
|
-
const { data, queryPlan } = await execute({
|
|
58
|
-
query,
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
expect(data).toEqual({
|
|
62
|
-
me: {
|
|
63
|
-
username: '@ada',
|
|
64
|
-
reviews: [
|
|
65
|
-
{ body: 'Love it!', product: { name: 'Table' } },
|
|
66
|
-
{ body: 'Too expensive.', product: { name: 'Couch' } },
|
|
67
|
-
{ body: 'A classic.', product: { title: 'Design Patterns' } },
|
|
68
|
-
],
|
|
69
|
-
},
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
expect(queryPlan).toCallService('accounts');
|
|
73
|
-
expect(queryPlan).toCallService('reviews');
|
|
74
|
-
expect(queryPlan).toCallService('product');
|
|
75
|
-
expect(queryPlan).toCallService('books');
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
it('supports named fragments (one level)', async () => {
|
|
79
|
-
const query = `#graphql
|
|
80
|
-
query GetUser {
|
|
81
|
-
me {
|
|
82
|
-
...userDetails
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
fragment userDetails on User {
|
|
87
|
-
username
|
|
88
|
-
}
|
|
89
|
-
`;
|
|
90
|
-
|
|
91
|
-
const { data, queryPlan } = await execute({
|
|
92
|
-
query,
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
expect(data).toEqual({
|
|
96
|
-
me: {
|
|
97
|
-
username: '@ada',
|
|
98
|
-
},
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
expect(queryPlan).toCallService('accounts');
|
|
102
|
-
});
|
|
103
|
-
|
|
104
|
-
it('supports multiple named fragments (one level, mixed ordering)', async () => {
|
|
105
|
-
const query = `#graphql
|
|
106
|
-
fragment userInfo on User {
|
|
107
|
-
name {
|
|
108
|
-
first
|
|
109
|
-
last
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
query GetUser {
|
|
113
|
-
me {
|
|
114
|
-
...userDetails
|
|
115
|
-
...userInfo
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
fragment userDetails on User {
|
|
120
|
-
username
|
|
121
|
-
}
|
|
122
|
-
`;
|
|
123
|
-
|
|
124
|
-
const { data, queryPlan } = await execute({
|
|
125
|
-
query,
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
expect(data).toEqual({
|
|
129
|
-
me: {
|
|
130
|
-
username: '@ada',
|
|
131
|
-
name: {
|
|
132
|
-
first: 'Ada',
|
|
133
|
-
last: 'Lovelace',
|
|
134
|
-
}
|
|
135
|
-
},
|
|
136
|
-
});
|
|
137
|
-
|
|
138
|
-
expect(queryPlan).toCallService('accounts');
|
|
139
|
-
});
|
|
140
|
-
|
|
141
|
-
it('supports multiple named fragments (multi level, mixed ordering)', async () => {
|
|
142
|
-
const query = `#graphql
|
|
143
|
-
fragment reviewDetails on Review {
|
|
144
|
-
body
|
|
145
|
-
}
|
|
146
|
-
query GetUser {
|
|
147
|
-
me {
|
|
148
|
-
...userDetails
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
fragment userDetails on User {
|
|
153
|
-
username
|
|
154
|
-
reviews {
|
|
155
|
-
...reviewDetails
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
`;
|
|
159
|
-
|
|
160
|
-
const { data, queryPlan } = await execute({
|
|
161
|
-
query,
|
|
162
|
-
});
|
|
163
|
-
|
|
164
|
-
expect(data).toEqual({
|
|
165
|
-
me: {
|
|
166
|
-
reviews: [
|
|
167
|
-
{ body: 'Love it!' },
|
|
168
|
-
{ body: 'Too expensive.' },
|
|
169
|
-
{ body: 'A classic.' },
|
|
170
|
-
],
|
|
171
|
-
username: '@ada',
|
|
172
|
-
},
|
|
173
|
-
});
|
|
174
|
-
|
|
175
|
-
expect(queryPlan).toCallService('accounts');
|
|
176
|
-
});
|
|
177
|
-
|
|
178
|
-
it('supports variables within fragments', async () => {
|
|
179
|
-
const query = `#graphql
|
|
180
|
-
query GetUser($format: Boolean) {
|
|
181
|
-
me {
|
|
182
|
-
...userDetails
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
fragment userDetails on User {
|
|
187
|
-
username
|
|
188
|
-
reviews {
|
|
189
|
-
body(format: $format)
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
`;
|
|
193
|
-
|
|
194
|
-
const format = true;
|
|
195
|
-
const { data, queryPlan } = await execute({
|
|
196
|
-
query,
|
|
197
|
-
variables: { format },
|
|
198
|
-
});
|
|
199
|
-
|
|
200
|
-
expect(data).toEqual({
|
|
201
|
-
me: {
|
|
202
|
-
username: '@ada',
|
|
203
|
-
reviews: [
|
|
204
|
-
{ body: 'Love it!' },
|
|
205
|
-
{ body: 'Too expensive.' },
|
|
206
|
-
{ body: 'A classic.' },
|
|
207
|
-
],
|
|
208
|
-
},
|
|
209
|
-
});
|
|
210
|
-
|
|
211
|
-
expect(queryPlan).toCallService('accounts');
|
|
212
|
-
expect(queryPlan).toCallService('reviews');
|
|
213
|
-
});
|
|
214
|
-
|
|
215
|
-
it('supports root fragments', async () => {
|
|
216
|
-
const query = `#graphql
|
|
217
|
-
query GetUser {
|
|
218
|
-
... on Query {
|
|
219
|
-
me {
|
|
220
|
-
username
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
`;
|
|
225
|
-
|
|
226
|
-
const { data, queryPlan } = await execute({
|
|
227
|
-
query,
|
|
228
|
-
});
|
|
229
|
-
|
|
230
|
-
expect(data).toEqual({
|
|
231
|
-
me: {
|
|
232
|
-
username: '@ada',
|
|
233
|
-
},
|
|
234
|
-
});
|
|
235
|
-
|
|
236
|
-
expect(queryPlan).toCallService('accounts');
|
|
237
|
-
});
|
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
import gql from 'graphql-tag';
|
|
2
|
-
import { execute, ServiceDefinitionModule } from '../execution-utils';
|
|
3
|
-
import { astSerializer, queryPlanSerializer } from 'apollo-federation-integration-testsuite';
|
|
4
|
-
|
|
5
|
-
expect.addSnapshotSerializer(astSerializer);
|
|
6
|
-
expect.addSnapshotSerializer(queryPlanSerializer);
|
|
7
|
-
|
|
8
|
-
const users = [
|
|
9
|
-
{ id: ['1', '1'], name: 'Trevor', __typename: 'User' },
|
|
10
|
-
{ id: ['2', '2'], name: 'James Baxley', __typename: 'User' },
|
|
11
|
-
];
|
|
12
|
-
|
|
13
|
-
const reviews = [
|
|
14
|
-
{ id: '1', authorId: ['1', '1'], body: 'Good', __typename: 'Review' },
|
|
15
|
-
{ id: '2', authorId: ['2', '2'], body: 'Bad', __typename: 'Review' },
|
|
16
|
-
];
|
|
17
|
-
|
|
18
|
-
const reviewService: ServiceDefinitionModule = {
|
|
19
|
-
name: 'review',
|
|
20
|
-
typeDefs: gql`
|
|
21
|
-
type Query {
|
|
22
|
-
reviews: [Review!]!
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
type Review {
|
|
26
|
-
id: ID!
|
|
27
|
-
author: User!
|
|
28
|
-
body: String!
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
extend type User @key(fields: "id") {
|
|
32
|
-
id: [ID!]! @external
|
|
33
|
-
}
|
|
34
|
-
`,
|
|
35
|
-
resolvers: {
|
|
36
|
-
Query: {
|
|
37
|
-
reviews() {
|
|
38
|
-
return reviews;
|
|
39
|
-
},
|
|
40
|
-
},
|
|
41
|
-
Review: {
|
|
42
|
-
author(review) {
|
|
43
|
-
return {
|
|
44
|
-
id: review.authorId,
|
|
45
|
-
};
|
|
46
|
-
},
|
|
47
|
-
},
|
|
48
|
-
},
|
|
49
|
-
};
|
|
50
|
-
|
|
51
|
-
const listsAreEqual = <T>(as: T[], bs: T[]) =>
|
|
52
|
-
as.length === bs.length && as.every((_, i) => bs[i] === as[i]);
|
|
53
|
-
|
|
54
|
-
const userService: ServiceDefinitionModule = {
|
|
55
|
-
name: 'user',
|
|
56
|
-
typeDefs: gql`
|
|
57
|
-
type User @key(fields: "id") {
|
|
58
|
-
id: [ID!]!
|
|
59
|
-
name: String!
|
|
60
|
-
}
|
|
61
|
-
`,
|
|
62
|
-
resolvers: {
|
|
63
|
-
User: {
|
|
64
|
-
__resolveReference(reference) {
|
|
65
|
-
return users.find(user => listsAreEqual(user.id, reference.id));
|
|
66
|
-
},
|
|
67
|
-
},
|
|
68
|
-
},
|
|
69
|
-
};
|
|
70
|
-
|
|
71
|
-
it('fetches data correctly list type @key fields', async () => {
|
|
72
|
-
const query = `#graphql
|
|
73
|
-
query Reviews {
|
|
74
|
-
reviews {
|
|
75
|
-
body
|
|
76
|
-
author {
|
|
77
|
-
name
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
`;
|
|
82
|
-
|
|
83
|
-
const { data, queryPlan } = await execute(
|
|
84
|
-
{
|
|
85
|
-
query,
|
|
86
|
-
},
|
|
87
|
-
[userService, reviewService],
|
|
88
|
-
);
|
|
89
|
-
|
|
90
|
-
expect(data).toEqual({
|
|
91
|
-
reviews: [
|
|
92
|
-
{ body: 'Good', author: { name: 'Trevor' } },
|
|
93
|
-
{ body: 'Bad', author: { name: 'James Baxley' } },
|
|
94
|
-
],
|
|
95
|
-
});
|
|
96
|
-
expect(queryPlan).toMatchInlineSnapshot(`
|
|
97
|
-
QueryPlan {
|
|
98
|
-
Sequence {
|
|
99
|
-
Fetch(service: "review") {
|
|
100
|
-
{
|
|
101
|
-
reviews {
|
|
102
|
-
body
|
|
103
|
-
author {
|
|
104
|
-
__typename
|
|
105
|
-
id
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
},
|
|
110
|
-
Flatten(path: "reviews.@.author") {
|
|
111
|
-
Fetch(service: "user") {
|
|
112
|
-
{
|
|
113
|
-
... on User {
|
|
114
|
-
__typename
|
|
115
|
-
id
|
|
116
|
-
}
|
|
117
|
-
} =>
|
|
118
|
-
{
|
|
119
|
-
... on User {
|
|
120
|
-
name
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
},
|
|
124
|
-
},
|
|
125
|
-
},
|
|
126
|
-
}
|
|
127
|
-
`);
|
|
128
|
-
});
|
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
import { ApolloGateway } from '../..';
|
|
2
|
-
import type { Logger } from '@apollo/utils.logger';
|
|
3
|
-
import { PassThrough } from "stream";
|
|
4
|
-
|
|
5
|
-
import * as winston from "winston";
|
|
6
|
-
import WinstonTransport from 'winston-transport';
|
|
7
|
-
import * as bunyan from "bunyan";
|
|
8
|
-
import * as loglevel from "loglevel";
|
|
9
|
-
import * as log4js from "log4js";
|
|
10
|
-
|
|
11
|
-
const LOWEST_LOG_LEVEL = "debug";
|
|
12
|
-
|
|
13
|
-
const KNOWN_DEBUG_MESSAGE = "Gateway successfully initialized (but not yet loaded)";
|
|
14
|
-
|
|
15
|
-
async function triggerKnownDebugMessage(logger: Logger) {
|
|
16
|
-
// Trigger a known error.
|
|
17
|
-
// This is a bit brittle since it merely leverages a known debug log
|
|
18
|
-
// message outside of the constructor, but it seemed worth testing
|
|
19
|
-
// the compatibility with `ApolloGateway` itself rather than generically.
|
|
20
|
-
// The error does not matter, so it is caught and ignored.
|
|
21
|
-
await new ApolloGateway({ logger }).load().catch(_e => undefined);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
describe("logger", () => {
|
|
25
|
-
it("works with 'winston'", async () => {
|
|
26
|
-
const sink = jest.fn();
|
|
27
|
-
const transport = new class extends WinstonTransport {
|
|
28
|
-
constructor() {
|
|
29
|
-
super({
|
|
30
|
-
format: winston.format.json(),
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
log(info: any) {
|
|
35
|
-
sink(info);
|
|
36
|
-
}
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
const logger = winston.createLogger({ level: 'debug' }).add(transport);
|
|
40
|
-
|
|
41
|
-
await triggerKnownDebugMessage(logger);
|
|
42
|
-
|
|
43
|
-
expect(sink).toHaveBeenCalledWith(expect.objectContaining({
|
|
44
|
-
level: LOWEST_LOG_LEVEL,
|
|
45
|
-
message: KNOWN_DEBUG_MESSAGE,
|
|
46
|
-
}));
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
it("works with 'bunyan'", async () => {
|
|
50
|
-
const sink = jest.fn();
|
|
51
|
-
|
|
52
|
-
// Bunyan uses streams for its logging implementations.
|
|
53
|
-
const writable = new PassThrough();
|
|
54
|
-
writable.on("data", data => sink(JSON.parse(data.toString())));
|
|
55
|
-
|
|
56
|
-
const logger = bunyan.createLogger({
|
|
57
|
-
name: "test-logger-bunyan",
|
|
58
|
-
streams: [{
|
|
59
|
-
level: LOWEST_LOG_LEVEL,
|
|
60
|
-
stream: writable,
|
|
61
|
-
}]
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
await triggerKnownDebugMessage(logger);
|
|
65
|
-
|
|
66
|
-
expect(sink).toHaveBeenCalledWith(expect.objectContaining({
|
|
67
|
-
level: bunyan.DEBUG,
|
|
68
|
-
msg: KNOWN_DEBUG_MESSAGE,
|
|
69
|
-
}));
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
it("works with 'loglevel'", async () => {
|
|
73
|
-
const sink = jest.fn();
|
|
74
|
-
|
|
75
|
-
const logger = loglevel.getLogger("test-logger-loglevel")
|
|
76
|
-
logger.methodFactory = (_methodName, level): loglevel.LoggingMethod =>
|
|
77
|
-
(message) => sink({ level, message });
|
|
78
|
-
|
|
79
|
-
// The `setLevel` method must be called after overwriting `methodFactory`.
|
|
80
|
-
// This is an intentional API design pattern of the loglevel package:
|
|
81
|
-
// https://www.npmjs.com/package/loglevel#writing-plugins
|
|
82
|
-
logger.setLevel(loglevel.levels.DEBUG);
|
|
83
|
-
|
|
84
|
-
await triggerKnownDebugMessage(logger);
|
|
85
|
-
|
|
86
|
-
expect(sink).toHaveBeenCalledWith({
|
|
87
|
-
level: loglevel.levels.DEBUG,
|
|
88
|
-
message: KNOWN_DEBUG_MESSAGE,
|
|
89
|
-
});
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
it("works with 'log4js'", async () => {
|
|
93
|
-
const sink = jest.fn();
|
|
94
|
-
|
|
95
|
-
log4js.configure({
|
|
96
|
-
appenders: {
|
|
97
|
-
custom: {
|
|
98
|
-
type: {
|
|
99
|
-
configure: () =>
|
|
100
|
-
(loggingEvent: log4js.LoggingEvent) => sink(loggingEvent)
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
},
|
|
104
|
-
categories: {
|
|
105
|
-
default: {
|
|
106
|
-
appenders: ['custom'],
|
|
107
|
-
level: LOWEST_LOG_LEVEL,
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
const logger = log4js.getLogger();
|
|
113
|
-
logger.level = LOWEST_LOG_LEVEL;
|
|
114
|
-
|
|
115
|
-
await triggerKnownDebugMessage(logger);
|
|
116
|
-
|
|
117
|
-
expect(sink).toHaveBeenCalledWith(expect.objectContaining({
|
|
118
|
-
level: log4js.levels.DEBUG,
|
|
119
|
-
data: [KNOWN_DEBUG_MESSAGE],
|
|
120
|
-
}));
|
|
121
|
-
});
|
|
122
|
-
});
|