Skip to content

Commit 121d142

Browse files
committed
Add a few more edge case tests
1 parent 4cdc188 commit 121d142

File tree

7 files changed

+306
-50
lines changed

7 files changed

+306
-50
lines changed

.github/workflows/defer-with-apollo-server-tests.yml

Lines changed: 0 additions & 37 deletions
This file was deleted.

.github/workflows/defer-with-router-tests.yml

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,3 +42,31 @@ jobs:
4242
DEFER_WITH_ROUTER_TESTS: true
4343
run: |
4444
./gradlew --no-daemon --console plain -p tests :defer:allTests
45+
defer-with-apollo-server-tests:
46+
runs-on: ubuntu-latest
47+
if: github.repository == 'apollographql/apollo-kotlin'
48+
steps:
49+
- name: Checkout project
50+
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 #v4.1.7
51+
52+
- name: Install and run graph
53+
working-directory: tests/defer/apollo-server/
54+
run: |
55+
npm install --legacy-peer-deps
56+
npx patch-package
57+
APOLLO_PORT=4000 npm start &
58+
59+
- name: Setup Java
60+
uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9 #v4.2.1
61+
with:
62+
distribution: 'temurin'
63+
java-version: 17
64+
65+
- name: Setup Gradle
66+
uses: gradle/actions/setup-gradle@dbbdc275be76ac10734476cc723d82dfe7ec6eda #v3.4.2
67+
68+
- name: Run Apollo Kotlin @defer tests
69+
env:
70+
DEFER_WITH_APOLLO_SERVER_TESTS: true
71+
run: |
72+
./gradlew --no-daemon --console plain -p tests :defer:allTests

tests/defer/build.gradle.kts

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,14 @@ fun configureApollo(generateKotlinModels: Boolean) {
5050
}
5151
}
5252

53+
apollo {
54+
service("noTypename-$extra") {
55+
packageName.set("defer.notypename")
56+
srcDir("src/commonMain/graphql/noTypename")
57+
addTypename.set("ifPolymorphic")
58+
}
59+
}
60+
5361
configureApollo(true)
5462
if (System.getProperty("idea.sync.active") == null) {
5563
registerJavaCodegenTestTask()
@@ -67,19 +75,15 @@ fun com.apollographql.apollo.gradle.api.Service.configureConnection(generateKotl
6775
}
6876

6977
tasks.withType(AbstractTestTask::class.java) {
70-
// Run the defer with Router tests only from a specific CI job
78+
// Run the defer with Router and defer with Apollo Server tests only from a specific CI job
7179
val runDeferWithRouterTests = System.getenv("DEFER_WITH_ROUTER_TESTS").toBoolean()
72-
if (runDeferWithRouterTests) {
73-
filter.setIncludePatterns("test.DeferWithRouterTest")
74-
} else {
75-
filter.setExcludePatterns("test.DeferWithRouterTest")
76-
}
77-
78-
// Run the defer with Apollo Server tests only from a specific CI job
7980
val runDeferWithApolloServerTests = System.getenv("DEFER_WITH_APOLLO_SERVER_TESTS").toBoolean()
80-
if (runDeferWithApolloServerTests) {
81-
filter.setIncludePatterns("test.DeferWithApolloServerTest")
82-
} else {
83-
filter.setExcludePatterns("test.DeferWithApolloServerTest")
84-
}
81+
filter.setIncludePatterns(*buildList {
82+
if (runDeferWithRouterTests) add("test.DeferWithRouterTest")
83+
if (runDeferWithApolloServerTests) add("test.DeferWithApolloServerTest")
84+
}.toTypedArray())
85+
filter.setExcludePatterns(*buildList {
86+
if (!runDeferWithRouterTests) add("test.DeferWithRouterTest")
87+
if (!runDeferWithApolloServerTests) add("test.DeferWithApolloServerTest")
88+
}.toTypedArray())
8589
}

tests/defer/src/commonMain/graphql/base/operation.graphql

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,3 +168,46 @@ query HandlesNonNullableErrorsThrownOutsideDeferredFragmentsQuery {
168168
fragment ComputerIdField on Computer {
169169
id
170170
}
171+
172+
query OverlappingQuery {
173+
computer(id: "Computer1") {
174+
id
175+
... on Computer @defer(label: "a") {
176+
id
177+
... on Computer @defer(label: "b") {
178+
id
179+
cpu
180+
year
181+
}
182+
}
183+
}
184+
}
185+
186+
query Overlapping2Query {
187+
computer(id: "Computer1") {
188+
id
189+
... on Computer @defer(label: "a") {
190+
id
191+
}
192+
... on Computer @defer(label: "b") {
193+
id
194+
cpu
195+
year
196+
}
197+
}
198+
}
199+
200+
query SubPathQuery {
201+
computer(id: "Computer1") {
202+
id
203+
}
204+
... on Query @defer(label: "a") {
205+
MyFragment: __typename
206+
computer(id: "Computer1") {
207+
id
208+
screen {
209+
isColor
210+
}
211+
}
212+
}
213+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
query SkippingEmptyFragmentQuery {
2+
computer(id: "Computer1") {
3+
... on Computer @defer(label: "a") {
4+
... on Computer @defer(label: "b") {
5+
... on Computer @defer(label: "c") {
6+
id
7+
}
8+
}
9+
}
10+
}
11+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
type Query {
2+
computers: [Computer!]!
3+
computer(id: ID!): Computer
4+
}
5+
6+
type Mutation {
7+
computers: [Computer!]!
8+
}
9+
10+
type Subscription {
11+
count(to: Int!): Counter!
12+
}
13+
14+
type Counter {
15+
value: Int!
16+
valueTimesTwo: Int!
17+
}
18+
19+
type Computer {
20+
id: ID!
21+
cpu: String!
22+
year: Int!
23+
screen: Screen!
24+
errorField: String
25+
nonNullErrorField: String!
26+
}
27+
28+
type Screen {
29+
resolution: String!
30+
isColor: Boolean!
31+
}

tests/defer/src/commonTest/kotlin/test/DeferWithApolloServerTest.kt

Lines changed: 176 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,17 @@ import defer.DoesNotDisableDeferWithNullIfArgumentQuery
1414
import defer.HandlesErrorsThrownInDeferredFragmentsQuery
1515
import defer.HandlesNonNullableErrorsThrownInDeferredFragmentsQuery
1616
import defer.HandlesNonNullableErrorsThrownOutsideDeferredFragmentsQuery
17+
import defer.Overlapping2Query
18+
import defer.OverlappingQuery
19+
import defer.SubPathQuery
1720
import defer.WithFragmentSpreadsMutation
1821
import defer.WithFragmentSpreadsQuery
1922
import defer.WithInlineFragmentsQuery
2023
import defer.fragment.ComputerErrorField
2124
import defer.fragment.ComputerFields
2225
import defer.fragment.FragmentOnQuery
2326
import defer.fragment.ScreenFields
27+
import defer.notypename.SkippingEmptyFragmentQuery
2428
import kotlinx.coroutines.flow.toList
2529
import kotlin.test.Test
2630
import kotlin.test.assertEquals
@@ -357,4 +361,176 @@ class DeferWithApolloServerTest {
357361
val actualResponseList = apolloClient.query(query).toFlow().toList()
358362
assertResponseListEquals(expectedDataList, actualResponseList)
359363
}
364+
365+
@Test
366+
fun overlapping() = runTest(before = { setUp() }, after = { tearDown() }) {
367+
// Expected payloads:
368+
// {"data":{"computer":{"__typename":"Computer","id":"Computer1"}},"pending":[{"id":"0","path":["computer"],"label":"b"}],"hasNext":true}
369+
// {"hasNext":false,"incremental":[{"data":{"cpu":"386","year":1993},"id":"0"}],"completed":[{"id":"0"}]}
370+
val query = OverlappingQuery()
371+
val uuid = uuid4()
372+
373+
val expectedDataList = listOf(
374+
ApolloResponse.Builder(
375+
query,
376+
uuid,
377+
).data(
378+
OverlappingQuery.Data(
379+
OverlappingQuery.Computer(
380+
"Computer", "Computer1", OverlappingQuery.OnComputer(
381+
"Computer", "Computer1", null,
382+
)
383+
)
384+
)
385+
)
386+
.build(),
387+
388+
ApolloResponse.Builder(
389+
query,
390+
uuid,
391+
).data(
392+
OverlappingQuery.Data(
393+
OverlappingQuery.Computer(
394+
"Computer", "Computer1", OverlappingQuery.OnComputer(
395+
"Computer", "Computer1", OverlappingQuery.OnComputer1("Computer1", "386", 1993)
396+
)
397+
)
398+
)
399+
)
400+
.build()
401+
)
402+
val actualResponseList = apolloClient.query(query).toFlow().toList()
403+
assertResponseListEquals(expectedDataList, actualResponseList)
404+
}
405+
406+
@Test
407+
fun overlapping2() = runTest(before = { setUp() }, after = { tearDown() }) {
408+
// Expected payloads:
409+
// {"data":{"computer":{"__typename":"Computer","id":"Computer1"}},"pending":[{"id":"0","path":["computer"],"label":"b"}],"hasNext":true}
410+
// {"hasNext":false,"incremental":[{"data":{"cpu":"386","year":1993},"id":"0"}],"completed":[{"id":"0"}]}
411+
val query = Overlapping2Query()
412+
val uuid = uuid4()
413+
414+
val expectedDataList = listOf(
415+
ApolloResponse.Builder(
416+
query,
417+
uuid,
418+
).data(
419+
Overlapping2Query.Data(
420+
Overlapping2Query.Computer(
421+
"Computer", "Computer1", Overlapping2Query.OnComputerDeferA("Computer1"
422+
), null
423+
)
424+
)
425+
)
426+
.build(),
427+
ApolloResponse.Builder(
428+
query,
429+
uuid,
430+
).data(
431+
Overlapping2Query.Data(
432+
Overlapping2Query.Computer(
433+
"Computer", "Computer1", Overlapping2Query.OnComputerDeferA("Computer1"
434+
), Overlapping2Query.OnComputerDeferB(
435+
"Computer1", "386", 1993
436+
)
437+
)
438+
)
439+
)
440+
.build()
441+
)
442+
val actualResponseList = apolloClient.query(query).toFlow().toList()
443+
assertResponseListEquals(expectedDataList, actualResponseList)
444+
}
445+
446+
@Test
447+
fun subPath() = runTest(before = { setUp() }, after = { tearDown() }) {
448+
// Expected payloads:
449+
// {"data":{"__typename":"Query","computer":{"id":"Computer1"}},"pending":[{"id":"0","path":[],"label":"a"}],"hasNext":true}
450+
// {"hasNext":false,"incremental":[{"data":{"screen":{"isColor":false}},"id":"0","subPath":["computer"]},{"data":{"MyFragment":"Query"},"id":"0"}],"completed":[{"id":"0"}]}
451+
val query = SubPathQuery()
452+
val uuid = uuid4()
453+
454+
val expectedDataList = listOf(
455+
ApolloResponse.Builder(
456+
query,
457+
uuid,
458+
).data(
459+
SubPathQuery.Data(
460+
"Query", SubPathQuery.Computer(
461+
"Computer1"
462+
), null
463+
)
464+
)
465+
.build(),
466+
ApolloResponse.Builder(
467+
query,
468+
uuid,
469+
).data(
470+
SubPathQuery.Data(
471+
"Query", SubPathQuery.Computer(
472+
"Computer1"
473+
), SubPathQuery.OnQuery(
474+
"Query", SubPathQuery.Computer1(
475+
"Computer1",
476+
SubPathQuery.Screen(false
477+
)
478+
)
479+
)
480+
)
481+
)
482+
.build()
483+
)
484+
val actualResponseList = apolloClient.query(query).toFlow().toList()
485+
assertResponseListEquals(expectedDataList, actualResponseList)
486+
}
487+
488+
@Test
489+
fun skippingEmptyFragment() = runTest(before = { setUp() }, after = { tearDown() }) {
490+
// Expected payloads:
491+
// {"data":{"computer":{}},"pending":[{"id":"0","path":["computer"],"label":"c"}],"hasNext":true}
492+
// {"hasNext":false,"incremental":[{"data":{"id":"Computer1"},"id":"0"}],"completed":[{"id":"0"}]}
493+
val query = SkippingEmptyFragmentQuery()
494+
val uuid = uuid4()
495+
496+
val expectedDataList = listOf(
497+
ApolloResponse.Builder(
498+
query,
499+
uuid,
500+
).data(
501+
SkippingEmptyFragmentQuery.Data(
502+
SkippingEmptyFragmentQuery.Computer(
503+
SkippingEmptyFragmentQuery.OnComputer(
504+
SkippingEmptyFragmentQuery.OnComputer1(
505+
null
506+
)
507+
)
508+
)
509+
)
510+
)
511+
.build(),
512+
513+
ApolloResponse.Builder(
514+
query,
515+
uuid,
516+
).data(
517+
SkippingEmptyFragmentQuery.Data(
518+
SkippingEmptyFragmentQuery.Computer(
519+
SkippingEmptyFragmentQuery.OnComputer(
520+
SkippingEmptyFragmentQuery.OnComputer1(
521+
SkippingEmptyFragmentQuery.OnComputer2(
522+
"Computer1"
523+
)
524+
)
525+
)
526+
)
527+
)
528+
)
529+
.build()
530+
)
531+
val actualResponseList = apolloClient.query(query).toFlow().toList()
532+
assertResponseListEquals(expectedDataList, actualResponseList)
533+
}
534+
535+
360536
}

0 commit comments

Comments
 (0)