-
Notifications
You must be signed in to change notification settings - Fork 2.7k
/
Copy pathwebSocketLink.ts
137 lines (121 loc) · 3.7 KB
/
webSocketLink.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
import { SubscriptionClient } from "subscriptions-transport-ws";
import { ExecutionResult } from "graphql";
import gql from "graphql-tag";
import { Observable } from "../../../utilities";
import { execute } from "../../core";
import { WebSocketLink } from "..";
import { itAsync } from "../../../testing";
const query = gql`
query SampleQuery {
stub {
id
}
}
`;
const mutation = gql`
mutation SampleMutation {
stub {
id
}
}
`;
const subscription = gql`
subscription SampleSubscription {
stub {
id
}
}
`;
describe("WebSocketLink", () => {
it("constructs", () => {
const client: any = {};
client.__proto__ = SubscriptionClient.prototype;
expect(() => new WebSocketLink(client)).not.toThrow();
});
// TODO some sort of dependency injection
// it('should pass the correct initialization parameters to the Subscription Client', () => {
// });
itAsync(
"should call request on the client for a query",
(resolve, reject) => {
const result = { data: { data: "result" } };
const client: any = {};
const observable = Observable.of(result);
client.__proto__ = SubscriptionClient.prototype;
client.request = jest.fn();
client.request.mockReturnValueOnce(observable);
const link = new WebSocketLink(client);
const obs = execute(link, { query });
expect(obs).toEqual(observable);
obs.subscribe((data) => {
expect(data).toEqual(result);
expect(client.request).toHaveBeenCalledTimes(1);
resolve();
});
}
);
itAsync(
"should call query on the client for a mutation",
(resolve, reject) => {
const result = { data: { data: "result" } };
const client: any = {};
const observable = Observable.of(result);
client.__proto__ = SubscriptionClient.prototype;
client.request = jest.fn();
client.request.mockReturnValueOnce(observable);
const link = new WebSocketLink(client);
const obs = execute(link, { query: mutation });
expect(obs).toEqual(observable);
obs.subscribe((data) => {
expect(data).toEqual(result);
expect(client.request).toHaveBeenCalledTimes(1);
resolve();
});
}
);
itAsync(
"should call request on the subscriptions client for subscription",
(resolve, reject) => {
const result = { data: { data: "result" } };
const client: any = {};
const observable = Observable.of(result);
client.__proto__ = SubscriptionClient.prototype;
client.request = jest.fn();
client.request.mockReturnValueOnce(observable);
const link = new WebSocketLink(client);
const obs = execute(link, { query: subscription });
expect(obs).toEqual(observable);
obs.subscribe((data) => {
expect(data).toEqual(result);
expect(client.request).toHaveBeenCalledTimes(1);
resolve();
});
}
);
itAsync(
"should call next with multiple results for subscription",
(resolve, reject) => {
const results = [
{ data: { data: "result1" } },
{ data: { data: "result2" } },
];
const client: any = {};
client.__proto__ = SubscriptionClient.prototype;
client.request = jest.fn(() => {
const copy = [...results];
return new Observable<ExecutionResult>((observer) => {
observer.next(copy[0]);
observer.next(copy[1]);
});
});
const link = new WebSocketLink(client);
execute(link, { query: subscription }).subscribe((data) => {
expect(client.request).toHaveBeenCalledTimes(1);
expect(data).toEqual(results.shift());
if (results.length === 0) {
resolve();
}
});
}
);
});