Skip to content

Commit b14023a

Browse files
committed
feat: Add error handling tests for InMemoryTransport
1 parent fbdeb06 commit b14023a

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
@@ -69,10 +69,43 @@ describe("InMemoryTransport", () => {
6969
});
7070

7171
test("should throw error when sending after close", async () => {
72-
await clientTransport.close();
72+
const [client, server] = InMemoryTransport.createLinkedPair();
73+
let clientError: Error | undefined;
74+
let serverError: Error | undefined;
75+
76+
client.onerror = (err) => {
77+
clientError = err;
78+
};
79+
80+
server.onerror = (err) => {
81+
serverError = err;
82+
};
83+
84+
await client.close();
85+
86+
// Attempt to send message from client
7387
await expect(
74-
clientTransport.send({ jsonrpc: "2.0", method: "test", id: 1 }),
88+
client.send({
89+
jsonrpc: "2.0",
90+
method: "test",
91+
id: 1,
92+
}),
7593
).rejects.toThrow("Not connected");
94+
95+
// Attempt to send message from server
96+
await expect(
97+
server.send({
98+
jsonrpc: "2.0",
99+
method: "test",
100+
id: 2,
101+
}),
102+
).rejects.toThrow("Not connected");
103+
104+
// Verify that both sides received errors
105+
expect(clientError).toBeDefined();
106+
expect(clientError?.message).toBe("Not connected");
107+
expect(serverError).toBeDefined();
108+
expect(serverError?.message).toBe("Not connected");
76109
});
77110

78111
test("should queue messages sent before start", async () => {
@@ -91,4 +124,65 @@ describe("InMemoryTransport", () => {
91124
await serverTransport.start();
92125
expect(receivedMessage).toEqual(message);
93126
});
127+
128+
describe("error handling", () => {
129+
test("should trigger onerror when sending without connection", async () => {
130+
const transport = new InMemoryTransport();
131+
let error: Error | undefined;
132+
133+
transport.onerror = (err) => {
134+
error = err;
135+
};
136+
137+
await expect(
138+
transport.send({
139+
jsonrpc: "2.0",
140+
method: "test",
141+
id: 1,
142+
}),
143+
).rejects.toThrow("Not connected");
144+
145+
expect(error).toBeDefined();
146+
expect(error?.message).toBe("Not connected");
147+
});
148+
149+
test("should trigger onerror when sending after close", async () => {
150+
const [client, server] = InMemoryTransport.createLinkedPair();
151+
let clientError: Error | undefined;
152+
let serverError: Error | undefined;
153+
154+
client.onerror = (err) => {
155+
clientError = err;
156+
};
157+
158+
server.onerror = (err) => {
159+
serverError = err;
160+
};
161+
162+
await client.close();
163+
164+
// Attempt to send message from client
165+
await expect(
166+
client.send({
167+
jsonrpc: "2.0",
168+
method: "test",
169+
id: 1,
170+
}),
171+
).rejects.toThrow("Not connected");
172+
173+
// Attempt to send message from server
174+
await expect(
175+
server.send({
176+
jsonrpc: "2.0",
177+
method: "test",
178+
id: 2,
179+
}),
180+
).rejects.toThrow("Not connected");
181+
182+
// Verify that both sides received errors
183+
expect(clientError?.message).toBe("Not connected");
184+
expect(serverError).toBeDefined();
185+
expect(serverError?.message).toBe("Not connected");
186+
});
187+
});
94188
});

src/inMemory.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,9 @@ export class InMemoryTransport implements Transport {
4444

4545
async send(message: JSONRPCMessage): Promise<void> {
4646
if (!this._otherTransport) {
47-
throw new Error("Not connected");
47+
const error = new Error("Not connected");
48+
this.onerror?.(error);
49+
throw error;
4850
}
4951

5052
if (this._otherTransport.onmessage) {

0 commit comments

Comments
 (0)