-
-
Notifications
You must be signed in to change notification settings - Fork 796
/
fragments.test.ts
108 lines (99 loc) · 2.31 KB
/
fragments.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
import { GraphQLSchema, graphql } from 'graphql';
import { delegateToSchema } from '@graphql-tools/delegate';
import { IResolvers } from '@graphql-tools/utils';
import { stitchSchemas } from '../src/stitchSchemas';
import {
propertySchema,
bookingSchema,
sampleData,
Property,
} from './fixtures/schemas';
function findPropertyByLocationName(
properties: Record<string, Property>,
name: string,
): Property | undefined {
for (const key of Object.keys(properties)) {
const property = properties[key];
if (property.location.name === name) {
return property;
}
}
}
const COORDINATES_QUERY = `
query BookingCoordinates($bookingId: ID!) {
bookingById (id: $bookingId) {
property {
location {
coordinates
}
}
}
}
`;
const proxyResolvers: IResolvers = {
Booking: {
property: {
selectionSet: '{ propertyId }',
resolve(booking, _args, context, info) {
return delegateToSchema({
schema: propertySchema,
operation: 'query',
fieldName: 'propertyById',
args: { id: booking.propertyId },
context,
info,
});
},
},
},
Location: {
coordinates: {
selectionSet: '{ name }',
resolve: (location) => {
const name = location.name;
return findPropertyByLocationName(sampleData.Property, name).location
.coordinates;
},
},
},
};
const proxyTypeDefs = `
extend type Booking {
property: Property!
}
extend type Location {
coordinates: String!
}
`;
describe('stitching', () => {
describe('delegateToSchema', () => {
let schema: GraphQLSchema;
beforeAll(() => {
schema = stitchSchemas({
subschemas: [bookingSchema, propertySchema],
typeDefs: proxyTypeDefs,
resolvers: proxyResolvers,
});
});
test('should add fragments for deep types', async () => {
const result = await graphql(
schema,
COORDINATES_QUERY,
{},
{},
{ bookingId: 'b1' },
);
expect(result).toEqual({
data: {
bookingById: {
property: {
location: {
coordinates: sampleData.Property.p1.location.coordinates,
},
},
},
},
});
});
});
});