Skip to content

Commit fe41836

Browse files
authored
fix: print client schema with select directives (#2232)
1 parent b696681 commit fe41836

File tree

4 files changed

+89
-32
lines changed

4 files changed

+89
-32
lines changed

composition/src/schema-building/utils.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -453,7 +453,7 @@ export function getClientPersistedDirectiveNodes<T extends NodeData>(nodeData: T
453453
);
454454
continue;
455455
}
456-
// Only include @deprecated and @semanticNonNull in the client schema.
456+
// Only include @deprecated, @oneOf, and @semanticNonNull in the client schema.
457457
if (!PERSISTED_CLIENT_DIRECTIVES.has(directiveName)) {
458458
continue;
459459
}

composition/tests/v1/directives/authorization-directives.test.ts

Lines changed: 48 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
MAX_OR_SCOPES,
66
orScopesLimitError,
77
parse,
8+
QUERY,
89
ROUTER_COMPATIBILITY_VERSION_ONE,
910
Subgraph,
1011
} from '../../../src';
@@ -525,20 +526,23 @@ describe('Authorization directives tests', () => {
525526
});
526527
});
527528

528-
describe('Federation Tests', () => {
529+
describe('Federation tests', () => {
529530
test('that @authenticated is persisted in the federated schema', () => {
530-
const result = federateSubgraphsSuccess([faa, fab], ROUTER_COMPATIBILITY_VERSION_ONE);
531-
expect(result.fieldConfigurations).toStrictEqual([
531+
const { fieldConfigurations, federatedGraphClientSchema, federatedGraphSchema } = federateSubgraphsSuccess(
532+
[faa, fab],
533+
ROUTER_COMPATIBILITY_VERSION_ONE,
534+
);
535+
expect(fieldConfigurations).toStrictEqual([
532536
{
533537
argumentNames: [],
534538
fieldName: 'object',
535-
typeName: 'Query',
539+
typeName: QUERY,
536540
requiresAuthentication: true,
537541
requiredScopes: [],
538542
requiredScopesByOR: [],
539543
},
540544
]);
541-
expect(schemaToSortedNormalizedString(result.federatedGraphSchema)).toBe(
545+
expect(schemaToSortedNormalizedString(federatedGraphSchema)).toBe(
542546
normalizeString(
543547
versionTwoRouterDefinitions +
544548
`
@@ -556,21 +560,40 @@ describe('Authorization directives tests', () => {
556560
`,
557561
),
558562
);
563+
expect(schemaToSortedNormalizedString(federatedGraphClientSchema)).toBe(
564+
normalizeString(
565+
schemaQueryDefinition +
566+
`
567+
type Object {
568+
age: Int!
569+
id: ID!
570+
name: String!
571+
}
572+
573+
type Query {
574+
object: Object!
575+
}
576+
`,
577+
),
578+
);
559579
});
560580

561581
test('that @requiresScopes is persisted in the federated schema', () => {
562-
const result = federateSubgraphsSuccess([fab, fac], ROUTER_COMPATIBILITY_VERSION_ONE);
563-
expect(result.fieldConfigurations).toStrictEqual([
582+
const { fieldConfigurations, federatedGraphClientSchema, federatedGraphSchema } = federateSubgraphsSuccess(
583+
[fab, fac],
584+
ROUTER_COMPATIBILITY_VERSION_ONE,
585+
);
586+
expect(fieldConfigurations).toStrictEqual([
564587
{
565588
argumentNames: [],
566589
fieldName: 'object',
567-
typeName: 'Query',
590+
typeName: QUERY,
568591
requiresAuthentication: false,
569592
requiredScopes: [['b']],
570593
requiredScopesByOR: [['b']],
571594
},
572595
]);
573-
expect(schemaToSortedNormalizedString(result.federatedGraphSchema)).toBe(
596+
expect(schemaToSortedNormalizedString(federatedGraphSchema)).toBe(
574597
normalizeString(
575598
versionTwoRouterDefinitions +
576599
`
@@ -588,6 +611,22 @@ describe('Authorization directives tests', () => {
588611
`,
589612
),
590613
);
614+
expect(schemaToSortedNormalizedString(federatedGraphClientSchema)).toBe(
615+
normalizeString(
616+
schemaQueryDefinition +
617+
`
618+
type Object {
619+
age: Int!
620+
id: ID!
621+
name: String!
622+
}
623+
624+
type Query {
625+
object: Object!
626+
}
627+
`,
628+
),
629+
);
591630
});
592631

593632
test('that authorization directives generate the correct router configuration', () => {

controlplane/src/core/composition/composer.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,13 @@ import {
1313
} from '@wundergraph/composition';
1414
import {
1515
buildRouterConfig,
16+
ComposedSubgraph as IComposedSubgraph,
1617
ComposedSubgraphGRPC,
1718
ComposedSubgraphPlugin,
18-
ComposedSubgraph as IComposedSubgraph,
1919
SubgraphKind,
2020
} from '@wundergraph/cosmo-shared';
2121
import { FastifyBaseLogger } from 'fastify';
22-
import { DocumentNode, GraphQLSchema, parse, printSchema } from 'graphql';
22+
import { DocumentNode, GraphQLSchema, parse } from 'graphql';
2323
import {
2424
FeatureFlagRouterExecutionConfig,
2525
FeatureFlagRouterExecutionConfigs,
@@ -220,7 +220,7 @@ export function mapResultToComposedGraph(
220220
namespace: federatedGraph.namespace,
221221
namespaceId: federatedGraph.namespaceId,
222222
composedSchema: result.success ? printSchemaWithDirectives(result.federatedGraphSchema) : undefined,
223-
federatedClientSchema: result.success ? printSchema(result.federatedGraphClientSchema) : undefined,
223+
federatedClientSchema: result.success ? printSchemaWithDirectives(result.federatedGraphClientSchema) : undefined,
224224
shouldIncludeClientSchema: result.success ? result.shouldIncludeClientSchema : false,
225225
errors: result.success ? [] : result.errors,
226226
subgraphs: subgraphDTOsToComposedSubgraphs(federatedGraph.organizationId, subgraphs, result),

controlplane/test/contracts.test.ts

Lines changed: 37 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import {
2222
SetupTest,
2323
} from './test-util.js';
2424

25+
const schemaDefinition = `schema {\n query: Query\n}\n\n`
2526
let dbname = '';
2627

2728
vi.mock('../src/core/clickhouse/index.js', () => {
@@ -1037,7 +1038,7 @@ describe('Contract tests', () => {
10371038
namespace: DEFAULT_NAMESPACE,
10381039
});
10391040
expect(sdlResponse.response?.code).toEqual(EnumStatusCode.OK);
1040-
expect(sdlResponse.clientSchema).toEqual(`type Query {
1041+
expect(sdlResponse.clientSchema).toEqual(schemaDefinition + `type Query {
10411042
hello: String!
10421043
}`);
10431044

@@ -1052,10 +1053,7 @@ describe('Contract tests', () => {
10521053
namespace: DEFAULT_NAMESPACE,
10531054
});
10541055
expect(sdlResponse2.response?.code).toEqual(EnumStatusCode.OK);
1055-
expect(sdlResponse2.clientSchema).toEqual(`type Query {
1056-
hello: String!
1057-
hi: String!
1058-
}`);
1056+
expect(sdlResponse2.clientSchema).toEqual(schemaDefinition + `type Query {\n hello: String!\n hi: String!\n}`);
10591057

10601058
await server.close();
10611059
});
@@ -1095,7 +1093,7 @@ describe('Contract tests', () => {
10951093
namespace: DEFAULT_NAMESPACE,
10961094
});
10971095
expect(sdlResponse.response?.code).toEqual(EnumStatusCode.OK);
1098-
expect(sdlResponse.clientSchema).toEqual(`type Query {\n hi: String!\n}`);
1096+
expect(sdlResponse.clientSchema).toEqual(schemaDefinition + `type Query {\n hi: String!\n}`);
10991097

11001098
await client.publishFederatedSubgraph({
11011099
name: subgraphName,
@@ -1108,7 +1106,7 @@ describe('Contract tests', () => {
11081106
namespace: DEFAULT_NAMESPACE,
11091107
});
11101108
expect(sdlResponse2.response?.code).toEqual(EnumStatusCode.OK);
1111-
expect(sdlResponse2.clientSchema).toEqual(`type Query {\n hi: String!\n}`);
1109+
expect(sdlResponse2.clientSchema).toEqual(schemaDefinition + `type Query {\n hi: String!\n}`);
11121110

11131111
await server.close();
11141112
});
@@ -1158,7 +1156,7 @@ describe('Contract tests', () => {
11581156
namespace: DEFAULT_NAMESPACE,
11591157
});
11601158
expect(sdlResponse.response?.code).toEqual(EnumStatusCode.OK);
1161-
expect(sdlResponse.clientSchema).toEqual(`type Query {
1159+
expect(sdlResponse.clientSchema).toEqual(schemaDefinition + `type Query {
11621160
hello: String!
11631161
test: String!
11641162
}`);
@@ -1173,7 +1171,7 @@ describe('Contract tests', () => {
11731171
namespace: DEFAULT_NAMESPACE,
11741172
});
11751173
expect(sdlResponse2.response?.code).toEqual(EnumStatusCode.OK);
1176-
expect(sdlResponse2.clientSchema).toEqual(`type Query {
1174+
expect(sdlResponse2.clientSchema).toEqual(schemaDefinition + `type Query {
11771175
hello: String!
11781176
}`);
11791177

@@ -1225,7 +1223,7 @@ describe('Contract tests', () => {
12251223
namespace: DEFAULT_NAMESPACE,
12261224
});
12271225
expect(sdlResponse.response?.code).toEqual(EnumStatusCode.OK);
1228-
expect(sdlResponse.clientSchema).toEqual(`type Query {\n hi: String!\n}`);
1226+
expect(sdlResponse.clientSchema).toEqual(schemaDefinition + `type Query {\n hi: String!\n}`);
12291227

12301228
await client.deleteFederatedSubgraph({
12311229
subgraphName: subgraph2Name,
@@ -1237,7 +1235,7 @@ describe('Contract tests', () => {
12371235
namespace: DEFAULT_NAMESPACE,
12381236
});
12391237
expect(sdlResponse2.response?.code).toEqual(EnumStatusCode.OK);
1240-
expect(sdlResponse2.clientSchema).toEqual(`type Query {\n hi: String!\n}`);
1238+
expect(sdlResponse2.clientSchema).toEqual(schemaDefinition + `type Query {\n hi: String!\n}`);
12411239

12421240
await server.close();
12431241
});
@@ -1291,7 +1289,7 @@ describe('Contract tests', () => {
12911289
namespace: DEFAULT_NAMESPACE,
12921290
});
12931291
expect(sdlResponse.response?.code).toEqual(EnumStatusCode.OK);
1294-
expect(sdlResponse.clientSchema).toEqual(`type Query {
1292+
expect(sdlResponse.clientSchema).toEqual(schemaDefinition + `type Query {
12951293
hello: String!
12961294
test: String!
12971295
}`);
@@ -1307,7 +1305,7 @@ describe('Contract tests', () => {
13071305
namespace: DEFAULT_NAMESPACE,
13081306
});
13091307
expect(sdlResponse2.response?.code).toEqual(EnumStatusCode.OK);
1310-
expect(sdlResponse2.clientSchema).toEqual(`type Query {
1308+
expect(sdlResponse2.clientSchema).toEqual(schemaDefinition + `type Query {
13111309
hello: String!
13121310
}`);
13131311

@@ -1351,7 +1349,7 @@ describe('Contract tests', () => {
13511349
namespace: DEFAULT_NAMESPACE,
13521350
});
13531351
expect(sdlResponse.response?.code).toEqual(EnumStatusCode.OK);
1354-
expect(sdlResponse.clientSchema).toEqual(`type Query {
1352+
expect(sdlResponse.clientSchema).toEqual(schemaDefinition + `type Query {
13551353
hello: String!
13561354
test: String!
13571355
}`);
@@ -1368,7 +1366,7 @@ describe('Contract tests', () => {
13681366
namespace: DEFAULT_NAMESPACE,
13691367
});
13701368
expect(sdlResponse2.response?.code).toEqual(EnumStatusCode.OK);
1371-
expect(sdlResponse2.clientSchema).toEqual(`type Query {
1369+
expect(sdlResponse2.clientSchema).toEqual(schemaDefinition + `type Query {
13721370
hello: String!
13731371
}`);
13741372

@@ -1431,7 +1429,7 @@ describe('Contract tests', () => {
14311429
namespace: DEFAULT_NAMESPACE,
14321430
});
14331431
expect(sdlResponse.response?.code).toEqual(EnumStatusCode.OK);
1434-
expect(sdlResponse.clientSchema).toEqual(`type Query {
1432+
expect(sdlResponse.clientSchema).toEqual(schemaDefinition + `type Query {
14351433
hello: String!
14361434
test: String!
14371435
}`);
@@ -1448,9 +1446,7 @@ describe('Contract tests', () => {
14481446
namespace: DEFAULT_NAMESPACE,
14491447
});
14501448
expect(sdlResponse2.response?.code).toEqual(EnumStatusCode.OK);
1451-
expect(sdlResponse2.clientSchema).toEqual(`type Query {
1452-
hello: String!
1453-
}`);
1449+
expect(sdlResponse2.clientSchema).toEqual(schemaDefinition + `type Query {\n hello: String!\n}`);
14541450

14551451
await server.close();
14561452
});
@@ -1737,6 +1733,11 @@ describe('Contract tests', () => {
17371733
);
17381734
expect(normalizeString(executionConfig.engineConfig!.graphqlClientSchema!)).toBe(
17391735
normalizeString(`
1736+
schema {
1737+
query: Query
1738+
mutation: Mutation
1739+
}
1740+
17401741
type Query {
17411742
user(id: ID!): User!
17421743
product(sku: ID!): User!
@@ -1792,6 +1793,7 @@ describe('Contract tests', () => {
17921793
query: Query
17931794
mutation: Mutation
17941795
}
1796+
17951797
directive @tag(name: String!) repeatable on ARGUMENT_DEFINITION | ENUM | ENUM_VALUE | FIELD_DEFINITION | INPUT_FIELD_DEFINITION | INPUT_OBJECT | INTERFACE | OBJECT | SCALAR | UNION
17961798
directive @inaccessible on ARGUMENT_DEFINITION | ENUM | ENUM_VALUE | FIELD_DEFINITION | INPUT_FIELD_DEFINITION | INPUT_OBJECT | INTERFACE | OBJECT | SCALAR | UNION
17971799
@@ -1836,6 +1838,11 @@ describe('Contract tests', () => {
18361838
);
18371839
expect(normalizeString(newExecutionConfig.engineConfig!.graphqlClientSchema!)).toBe(
18381840
normalizeString(`
1841+
schema {
1842+
query: Query
1843+
mutation: Mutation
1844+
}
1845+
18391846
type Query {
18401847
user(id: ID!): User!
18411848
product(sku: ID!): User!
@@ -1988,6 +1995,11 @@ describe('Contract tests', () => {
19881995
);
19891996
expect(normalizeString(executionConfig.engineConfig!.graphqlClientSchema!)).toBe(
19901997
normalizeString(`
1998+
schema {
1999+
query: Query
2000+
mutation: Mutation
2001+
}
2002+
19912003
type Query {
19922004
internalUser(id: ID!): InternalUser!
19932005
internalProduct(sku: ID!): InternalProduct!
@@ -2041,6 +2053,7 @@ describe('Contract tests', () => {
20412053
query: Query
20422054
mutation: Mutation
20432055
}
2056+
20442057
directive @authenticated on ENUM | FIELD_DEFINITION | INTERFACE | OBJECT | SCALAR
20452058
directive @inaccessible on ARGUMENT_DEFINITION | ENUM | ENUM_VALUE | FIELD_DEFINITION | INPUT_FIELD_DEFINITION | INPUT_OBJECT | INTERFACE | OBJECT | SCALAR | UNION
20462059
directive @requiresScopes(scopes: [[openfed__Scope!]!]!) on ENUM | FIELD_DEFINITION | INTERFACE | OBJECT | SCALAR
@@ -2088,6 +2101,11 @@ describe('Contract tests', () => {
20882101
);
20892102
expect(normalizeString(newExecutionConfig.engineConfig!.graphqlClientSchema!)).toBe(
20902103
normalizeString(`
2104+
schema {
2105+
query: Query
2106+
mutation: Mutation
2107+
}
2108+
20912109
type Query {
20922110
internalUser(id: ID!): InternalUser!
20932111
internalProduct(sku: ID!): InternalProduct!

0 commit comments

Comments
 (0)