Skip to content

Commit 8720670

Browse files
committed
test(circular): add self reference test for object type fields
1 parent 1ffb79b commit 8720670

1 file changed

Lines changed: 73 additions & 4 deletions

File tree

tests/functional/circular-refs.ts

Lines changed: 73 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import "reflect-metadata";
2-
import { IntrospectionObjectType, TypeKind } from "graphql";
2+
import { IntrospectionObjectType, TypeKind, GraphQLObjectType, graphql } from "graphql";
33

4-
import { Query, ObjectType, Field } from "../../src";
4+
import { Query, ObjectType, Field, Resolver, buildSchema } from "../../src";
55
import { getMetadataStorage } from "../../src/metadata/getMetadataStorage";
66
import { getSchemaInfo } from "../helpers/getSchemaInfo";
77

@@ -19,14 +19,17 @@ describe("Circular references", () => {
1919
@Field(type => CircularRef2)
2020
ref2: any;
2121
}
22-
class Resolver {
22+
@Resolver()
23+
class SampleResolver {
2324
@Query()
2425
objectQuery(): SampleObject {
2526
return {} as any;
2627
}
2728
}
2829

29-
const { schemaIntrospection: { types } } = await getSchemaInfo({ resolvers: [Resolver] });
30+
const {
31+
schemaIntrospection: { types },
32+
} = await getSchemaInfo({ resolvers: [SampleResolver] });
3033
const circularRef1 = types.find(
3134
type => type.name === "CircularRef1",
3235
) as IntrospectionObjectType;
@@ -65,4 +68,70 @@ describe("Circular references", () => {
6568
jest.resetModules();
6669
}
6770
});
71+
72+
it("should allow to have self-reference fields in object type", async () => {
73+
@ObjectType()
74+
class SampleObject {
75+
@Field()
76+
stringField: string;
77+
78+
@Field(type => SampleObject, { nullable: true })
79+
selfReferenceField?: SampleObject;
80+
81+
@Field(type => [SampleObject])
82+
selfReferenceArrayField: SampleObject[];
83+
}
84+
@Resolver()
85+
class SampleResolver {
86+
@Query()
87+
objectQuery(): SampleObject {
88+
const obj: SampleObject = {
89+
stringField: "nestedStringField",
90+
selfReferenceArrayField: [],
91+
};
92+
obj.selfReferenceField = obj;
93+
return {
94+
stringField: "stringField",
95+
selfReferenceArrayField: [obj],
96+
selfReferenceField: obj,
97+
};
98+
}
99+
}
100+
101+
const schema = await buildSchema({
102+
resolvers: [SampleResolver],
103+
});
104+
expect(schema).toBeDefined();
105+
106+
const query = /* graphql */ `
107+
query {
108+
objectQuery {
109+
stringField
110+
selfReferenceField {
111+
stringField
112+
}
113+
selfReferenceArrayField {
114+
selfReferenceField {
115+
stringField
116+
}
117+
}
118+
}
119+
}
120+
`;
121+
const { data } = await graphql(schema, query);
122+
123+
expect(data!.objectQuery).toEqual({
124+
stringField: "stringField",
125+
selfReferenceField: {
126+
stringField: "nestedStringField",
127+
},
128+
selfReferenceArrayField: [
129+
{
130+
selfReferenceField: {
131+
stringField: "nestedStringField",
132+
},
133+
},
134+
],
135+
});
136+
});
68137
});

0 commit comments

Comments
 (0)