Skip to content

Commit 60310e9

Browse files
HoberMinfelixweinberger
authored andcommitted
feat: Add error handling tests for InMemoryTransport
1 parent 6ae4a57 commit 60310e9

File tree

2 files changed

+99
-3
lines changed

2 files changed

+99
-3
lines changed

src/inMemory.test.ts

Lines changed: 96 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,10 +96,43 @@ describe("InMemoryTransport", () => {
9696
});
9797

9898
test("should throw error when sending after close", async () => {
99-
await clientTransport.close();
99+
const [client, server] = InMemoryTransport.createLinkedPair();
100+
let clientError: Error | undefined;
101+
let serverError: Error | undefined;
102+
103+
client.onerror = (err) => {
104+
clientError = err;
105+
};
106+
107+
server.onerror = (err) => {
108+
serverError = err;
109+
};
110+
111+
await client.close();
112+
113+
// Attempt to send message from client
100114
await expect(
101-
clientTransport.send({ jsonrpc: "2.0", method: "test", id: 1 }),
115+
client.send({
116+
jsonrpc: "2.0",
117+
method: "test",
118+
id: 1,
119+
}),
102120
).rejects.toThrow("Not connected");
121+
122+
// Attempt to send message from server
123+
await expect(
124+
server.send({
125+
jsonrpc: "2.0",
126+
method: "test",
127+
id: 2,
128+
}),
129+
).rejects.toThrow("Not connected");
130+
131+
// Verify that both sides received errors
132+
expect(clientError).toBeDefined();
133+
expect(clientError?.message).toBe("Not connected");
134+
expect(serverError).toBeDefined();
135+
expect(serverError?.message).toBe("Not connected");
103136
});
104137

105138
test("should queue messages sent before start", async () => {
@@ -118,4 +151,65 @@ describe("InMemoryTransport", () => {
118151
await serverTransport.start();
119152
expect(receivedMessage).toEqual(message);
120153
});
154+
155+
describe("error handling", () => {
156+
test("should trigger onerror when sending without connection", async () => {
157+
const transport = new InMemoryTransport();
158+
let error: Error | undefined;
159+
160+
transport.onerror = (err) => {
161+
error = err;
162+
};
163+
164+
await expect(
165+
transport.send({
166+
jsonrpc: "2.0",
167+
method: "test",
168+
id: 1,
169+
}),
170+
).rejects.toThrow("Not connected");
171+
172+
expect(error).toBeDefined();
173+
expect(error?.message).toBe("Not connected");
174+
});
175+
176+
test("should trigger onerror when sending after close", async () => {
177+
const [client, server] = InMemoryTransport.createLinkedPair();
178+
let clientError: Error | undefined;
179+
let serverError: Error | undefined;
180+
181+
client.onerror = (err) => {
182+
clientError = err;
183+
};
184+
185+
server.onerror = (err) => {
186+
serverError = err;
187+
};
188+
189+
await client.close();
190+
191+
// Attempt to send message from client
192+
await expect(
193+
client.send({
194+
jsonrpc: "2.0",
195+
method: "test",
196+
id: 1,
197+
}),
198+
).rejects.toThrow("Not connected");
199+
200+
// Attempt to send message from server
201+
await expect(
202+
server.send({
203+
jsonrpc: "2.0",
204+
method: "test",
205+
id: 2,
206+
}),
207+
).rejects.toThrow("Not connected");
208+
209+
// Verify that both sides received errors
210+
expect(clientError?.message).toBe("Not connected");
211+
expect(serverError).toBeDefined();
212+
expect(serverError?.message).toBe("Not connected");
213+
});
214+
});
121215
});

src/inMemory.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,9 @@ export class InMemoryTransport implements Transport {
5151
*/
5252
async send(message: JSONRPCMessage, options?: { relatedRequestId?: RequestId, authInfo?: AuthInfo }): Promise<void> {
5353
if (!this._otherTransport) {
54-
throw new Error("Not connected");
54+
const error = new Error("Not connected");
55+
this.onerror?.(error);
56+
throw error;
5557
}
5658

5759
if (this._otherTransport.onmessage) {

0 commit comments

Comments
 (0)