Skip to content

Commit d1c5573

Browse files
committed
Add test for no emit on mid-stream complete
1 parent c1a32cc commit d1c5573

1 file changed

Lines changed: 123 additions & 0 deletions

File tree

src/core/__tests__/client.watchQuery/streamGraphQL17Alpha9.test.ts

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4611,3 +4611,126 @@ function createMockStreamMergeFn() {
46114611
return result;
46124612
});
46134613
}
4614+
4615+
test("does not emit when no data added when a `@stream` completes while a `@defer` boundary is still pending", async () => {
4616+
const query = gql`
4617+
query {
4618+
greeting {
4619+
message
4620+
... on Greeting @defer {
4621+
recipient {
4622+
name
4623+
}
4624+
}
4625+
}
4626+
friendList @stream(initialCount: 1) {
4627+
name
4628+
}
4629+
}
4630+
`;
4631+
4632+
const { httpLink, enqueueInitialChunk, enqueueSubsequentChunk } =
4633+
mockDeferStreamGraphQL17Alpha9();
4634+
const cache = new InMemoryCache();
4635+
4636+
const client = new ApolloClient({
4637+
cache,
4638+
link: httpLink,
4639+
incrementalHandler: new GraphQL17Alpha9Handler(),
4640+
});
4641+
4642+
const stream = new ObservableStream(
4643+
client.watchQuery({ query, fetchPolicy: "network-only" })
4644+
);
4645+
4646+
await expect(stream).toEmitTypedValue({
4647+
data: undefined,
4648+
dataState: "empty",
4649+
loading: true,
4650+
networkStatus: NetworkStatus.loading,
4651+
partial: true,
4652+
});
4653+
4654+
enqueueInitialChunk({
4655+
data: {
4656+
greeting: { __typename: "Greeting", message: "Hello world" },
4657+
friendList: [{ __typename: "Friend", name: "Luke" }],
4658+
},
4659+
pending: [
4660+
{ id: "0", path: ["greeting"] },
4661+
{ id: "1", path: ["friendList"] },
4662+
],
4663+
hasNext: true,
4664+
});
4665+
4666+
await expect(stream).toEmitTypedValue({
4667+
data: markAsStreaming({
4668+
greeting: { __typename: "Greeting", message: "Hello world" },
4669+
friendList: [{ __typename: "Friend", name: "Luke" }],
4670+
}),
4671+
dataState: "streaming",
4672+
loading: true,
4673+
networkStatus: NetworkStatus.streaming,
4674+
partial: true,
4675+
});
4676+
4677+
enqueueSubsequentChunk({
4678+
incremental: [{ id: "1", items: [{ __typename: "Friend", name: "Han" }] }],
4679+
hasNext: true,
4680+
} as any);
4681+
4682+
await expect(stream).toEmitTypedValue({
4683+
data: markAsStreaming({
4684+
greeting: { __typename: "Greeting", message: "Hello world" },
4685+
friendList: [
4686+
{ __typename: "Friend", name: "Luke" },
4687+
{ __typename: "Friend", name: "Han" },
4688+
],
4689+
}),
4690+
dataState: "streaming",
4691+
loading: true,
4692+
networkStatus: NetworkStatus.streaming,
4693+
partial: true,
4694+
});
4695+
4696+
enqueueSubsequentChunk({
4697+
completed: [{ id: "1" }],
4698+
hasNext: true,
4699+
});
4700+
4701+
await expect(stream).not.toEmitAnything();
4702+
4703+
enqueueSubsequentChunk({
4704+
incremental: [
4705+
{
4706+
id: "0",
4707+
data: {
4708+
__typename: "Greeting",
4709+
recipient: { __typename: "Person", name: "Alice" },
4710+
},
4711+
},
4712+
],
4713+
completed: [{ id: "0" }],
4714+
hasNext: false,
4715+
});
4716+
4717+
await expect(stream).toEmitTypedValue({
4718+
data: {
4719+
greeting: {
4720+
__typename: "Greeting",
4721+
message: "Hello world",
4722+
recipient: { __typename: "Person", name: "Alice" },
4723+
},
4724+
friendList: [
4725+
{ __typename: "Friend", name: "Luke" },
4726+
{ __typename: "Friend", name: "Han" },
4727+
],
4728+
},
4729+
dataState: "complete",
4730+
loading: false,
4731+
networkStatus: NetworkStatus.ready,
4732+
partial: false,
4733+
});
4734+
4735+
await expect(stream).not.toEmitAnything();
4736+
});

0 commit comments

Comments
 (0)