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