1package graphql_test
2
3import (
4	"testing"
5
6	"github.com/dennwc/graphql"
7	"github.com/dennwc/graphql/gqlerrors"
8	"github.com/dennwc/graphql/testutil"
9)
10
11func TestValidate_PossibleFragmentSpreads_OfTheSameObject(t *testing.T) {
12	testutil.ExpectPassesRule(t, graphql.PossibleFragmentSpreadsRule, `
13      fragment objectWithinObject on Dog { ...dogFragment }
14      fragment dogFragment on Dog { barkVolume }
15    `)
16}
17func TestValidate_PossibleFragmentSpreads_OfTheSameObjectWithInlineFragment(t *testing.T) {
18	testutil.ExpectPassesRule(t, graphql.PossibleFragmentSpreadsRule, `
19      fragment objectWithinObjectAnon on Dog { ... on Dog { barkVolume } }
20    `)
21}
22func TestValidate_PossibleFragmentSpreads_ObjectIntoAnImplementedInterface(t *testing.T) {
23	testutil.ExpectPassesRule(t, graphql.PossibleFragmentSpreadsRule, `
24      fragment objectWithinInterface on Pet { ...dogFragment }
25      fragment dogFragment on Dog { barkVolume }
26    `)
27}
28func TestValidate_PossibleFragmentSpreads_ObjectIntoContainingUnion(t *testing.T) {
29	testutil.ExpectPassesRule(t, graphql.PossibleFragmentSpreadsRule, `
30      fragment objectWithinUnion on CatOrDog { ...dogFragment }
31      fragment dogFragment on Dog { barkVolume }
32    `)
33}
34
35func TestValidate_PossibleFragmentSpreads_UnionIntoContainedObject(t *testing.T) {
36	testutil.ExpectPassesRule(t, graphql.PossibleFragmentSpreadsRule, `
37      fragment unionWithinObject on Dog { ...catOrDogFragment }
38      fragment catOrDogFragment on CatOrDog { __typename }
39    `)
40}
41func TestValidate_PossibleFragmentSpreads_UnionIntoOverlappingInterface(t *testing.T) {
42	testutil.ExpectPassesRule(t, graphql.PossibleFragmentSpreadsRule, `
43      fragment unionWithinInterface on Pet { ...catOrDogFragment }
44      fragment catOrDogFragment on CatOrDog { __typename }
45    `)
46}
47func TestValidate_PossibleFragmentSpreads_UnionIntoOverlappingUnion(t *testing.T) {
48	testutil.ExpectPassesRule(t, graphql.PossibleFragmentSpreadsRule, `
49      fragment unionWithinUnion on DogOrHuman { ...catOrDogFragment }
50      fragment catOrDogFragment on CatOrDog { __typename }
51    `)
52}
53
54func TestValidate_PossibleFragmentSpreads_InterfaceIntoImplementedObject(t *testing.T) {
55	testutil.ExpectPassesRule(t, graphql.PossibleFragmentSpreadsRule, `
56      fragment interfaceWithinObject on Dog { ...petFragment }
57      fragment petFragment on Pet { name }
58    `)
59}
60func TestValidate_PossibleFragmentSpreads_InterfaceIntoOverlappingInterface(t *testing.T) {
61	testutil.ExpectPassesRule(t, graphql.PossibleFragmentSpreadsRule, `
62      fragment interfaceWithinInterface on Pet { ...beingFragment }
63      fragment beingFragment on Being { name }
64    `)
65}
66func TestValidate_PossibleFragmentSpreads_InterfaceIntoOverlappingInterfaceInInlineFragment(t *testing.T) {
67	testutil.ExpectPassesRule(t, graphql.PossibleFragmentSpreadsRule, `
68      fragment interfaceWithinInterface on Pet { ... on Being { name } }
69    `)
70}
71func TestValidate_PossibleFragmentSpreads_InterfaceIntoOverlappingUnion(t *testing.T) {
72	testutil.ExpectPassesRule(t, graphql.PossibleFragmentSpreadsRule, `
73      fragment interfaceWithinUnion on CatOrDog { ...petFragment }
74      fragment petFragment on Pet { name }
75    `)
76}
77func TestValidate_PossibleFragmentSpreads_DifferentObjectIntoObject(t *testing.T) {
78	testutil.ExpectFailsRule(t, graphql.PossibleFragmentSpreadsRule, `
79      fragment invalidObjectWithinObject on Cat { ...dogFragment }
80      fragment dogFragment on Dog { barkVolume }
81    `, []gqlerrors.FormattedError{
82		testutil.RuleError(`Fragment "dogFragment" cannot be spread here as objects of `+
83			`type "Cat" can never be of type "Dog".`, 2, 51),
84	})
85}
86func TestValidate_PossibleFragmentSpreads_DifferentObjectIntoObjectInInlineFragment(t *testing.T) {
87	testutil.ExpectFailsRule(t, graphql.PossibleFragmentSpreadsRule, `
88      fragment invalidObjectWithinObjectAnon on Cat {
89        ... on Dog { barkVolume }
90      }
91    `, []gqlerrors.FormattedError{
92		testutil.RuleError(`Fragment cannot be spread here as objects of `+
93			`type "Cat" can never be of type "Dog".`, 3, 9),
94	})
95}
96
97func TestValidate_PossibleFragmentSpreads_ObjectIntoNotImplementingInterface(t *testing.T) {
98	testutil.ExpectFailsRule(t, graphql.PossibleFragmentSpreadsRule, `
99      fragment invalidObjectWithinInterface on Pet { ...humanFragment }
100      fragment humanFragment on Human { pets { name } }
101    `, []gqlerrors.FormattedError{
102		testutil.RuleError(`Fragment "humanFragment" cannot be spread here as objects of `+
103			`type "Pet" can never be of type "Human".`, 2, 54),
104	})
105}
106func TestValidate_PossibleFragmentSpreads_ObjectIntoNotContainingUnion(t *testing.T) {
107	testutil.ExpectFailsRule(t, graphql.PossibleFragmentSpreadsRule, `
108      fragment invalidObjectWithinUnion on CatOrDog { ...humanFragment }
109      fragment humanFragment on Human { pets { name } }
110    `, []gqlerrors.FormattedError{
111		testutil.RuleError(`Fragment "humanFragment" cannot be spread here as objects of `+
112			`type "CatOrDog" can never be of type "Human".`, 2, 55),
113	})
114}
115
116func TestValidate_PossibleFragmentSpreads_UnionIntoNotContainedObject(t *testing.T) {
117	testutil.ExpectFailsRule(t, graphql.PossibleFragmentSpreadsRule, `
118      fragment invalidUnionWithinObject on Human { ...catOrDogFragment }
119      fragment catOrDogFragment on CatOrDog { __typename }
120    `, []gqlerrors.FormattedError{
121		testutil.RuleError(`Fragment "catOrDogFragment" cannot be spread here as objects of `+
122			`type "Human" can never be of type "CatOrDog".`, 2, 52),
123	})
124}
125func TestValidate_PossibleFragmentSpreads_UnionIntoNonOverlappingInterface(t *testing.T) {
126	testutil.ExpectFailsRule(t, graphql.PossibleFragmentSpreadsRule, `
127      fragment invalidUnionWithinInterface on Pet { ...humanOrAlienFragment }
128      fragment humanOrAlienFragment on HumanOrAlien { __typename }
129    `, []gqlerrors.FormattedError{
130		testutil.RuleError(`Fragment "humanOrAlienFragment" cannot be spread here as objects of `+
131			`type "Pet" can never be of type "HumanOrAlien".`, 2, 53),
132	})
133}
134func TestValidate_PossibleFragmentSpreads_UnionIntoNonOverlappingUnion(t *testing.T) {
135	testutil.ExpectFailsRule(t, graphql.PossibleFragmentSpreadsRule, `
136      fragment invalidUnionWithinUnion on CatOrDog { ...humanOrAlienFragment }
137      fragment humanOrAlienFragment on HumanOrAlien { __typename }
138    `, []gqlerrors.FormattedError{
139		testutil.RuleError(`Fragment "humanOrAlienFragment" cannot be spread here as objects of `+
140			`type "CatOrDog" can never be of type "HumanOrAlien".`, 2, 54),
141	})
142}
143
144func TestValidate_PossibleFragmentSpreads_InterfaceIntoNonImplementingObject(t *testing.T) {
145	testutil.ExpectFailsRule(t, graphql.PossibleFragmentSpreadsRule, `
146      fragment invalidInterfaceWithinObject on Cat { ...intelligentFragment }
147      fragment intelligentFragment on Intelligent { iq }
148    `, []gqlerrors.FormattedError{
149		testutil.RuleError(`Fragment "intelligentFragment" cannot be spread here as objects of `+
150			`type "Cat" can never be of type "Intelligent".`, 2, 54),
151	})
152}
153func TestValidate_PossibleFragmentSpreads_InterfaceIntoNonOverlappingInterface(t *testing.T) {
154	testutil.ExpectFailsRule(t, graphql.PossibleFragmentSpreadsRule, `
155      fragment invalidInterfaceWithinInterface on Pet {
156        ...intelligentFragment
157      }
158      fragment intelligentFragment on Intelligent { iq }
159    `, []gqlerrors.FormattedError{
160		testutil.RuleError(`Fragment "intelligentFragment" cannot be spread here as objects of `+
161			`type "Pet" can never be of type "Intelligent".`, 3, 9),
162	})
163}
164func TestValidate_PossibleFragmentSpreads_InterfaceIntoNonOverlappingInterfaceInInlineFragment(t *testing.T) {
165	testutil.ExpectFailsRule(t, graphql.PossibleFragmentSpreadsRule, `
166      fragment invalidInterfaceWithinInterfaceAnon on Pet {
167        ...on Intelligent { iq }
168      }
169    `, []gqlerrors.FormattedError{
170		testutil.RuleError(`Fragment cannot be spread here as objects of `+
171			`type "Pet" can never be of type "Intelligent".`, 3, 9),
172	})
173}
174func TestValidate_PossibleFragmentSpreads_InterfaceIntoNonOverlappingUnion(t *testing.T) {
175	testutil.ExpectFailsRule(t, graphql.PossibleFragmentSpreadsRule, `
176      fragment invalidInterfaceWithinUnion on HumanOrAlien { ...petFragment }
177      fragment petFragment on Pet { name }
178    `, []gqlerrors.FormattedError{
179		testutil.RuleError(`Fragment "petFragment" cannot be spread here as objects of `+
180			`type "HumanOrAlien" can never be of type "Pet".`, 2, 62),
181	})
182}
183