Skip to content

Commit 3caa750

Browse files
committed
refactor(tests): Update tests to use proper typing, coerce where necessary.
Signed-off-by: Drew Hoener <[email protected]>
1 parent 0073117 commit 3caa750

File tree

5 files changed

+45
-39
lines changed

5 files changed

+45
-39
lines changed

test/examples/fibonacci.example.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
11
import { describe, it, expect } from "vitest";
22
import * as ROSLIB from "../../src/RosLib.js";
33

4+
interface FibonacciGoal {
5+
order: number;
6+
}
7+
interface FibonacciResult {
8+
sequence: number[];
9+
}
10+
411
// Noetic is the only version of ROS 1 we support, so we skip based on distro name
512
// instead of adding extra plumbing for ROS_VERSION.
613
describe.skipIf(process.env["ROS_DISTRO"] !== "noetic")(
@@ -18,7 +25,11 @@ describe.skipIf(process.env["ROS_DISTRO"] !== "noetic")(
1825
* ----------------
1926
*/
2027

21-
const fibonacciClient = new ROSLIB.ActionClient({
28+
const fibonacciClient = new ROSLIB.ActionClient<
29+
FibonacciGoal,
30+
FibonacciResult,
31+
FibonacciResult
32+
>({
2233
ros: ros,
2334
serverName: "/fibonacci",
2435
actionName: "actionlib_tutorials/FibonacciAction",

test/examples/topic-listener.example.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,19 @@ const messages = ["1", "2", "3", "4"].map(format);
1212

1313
describe("Topics Example", function () {
1414
function createAndStreamTopic(topicName: string) {
15-
const topic = ros.Topic({
15+
const topic = ros.Topic<{ data: string }>({
1616
name: topicName,
1717
messageType: "std_msgs/String",
1818
});
1919
let idx = 0;
2020

2121
function emit() {
2222
setTimeout(function () {
23-
topic.publish(messages[idx++]);
23+
const msg = messages[idx++];
24+
if (!msg) {
25+
return;
26+
}
27+
topic.publish(msg);
2428
if (idx < messages.length) {
2529
emit();
2630
} else {

test/ros.test.ts

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import type {
88
} from "../src/core/transport/Transport.js";
99
import { WebSocketTransportFactory } from "../src/core/transport/WebSocketTransportFactory.js";
1010
import Ros from "../src/core/Ros.js";
11-
import type { RosbridgeMessage } from "../src/types/protocol.js";
11+
import type { BridgeProtoOp } from "../src/types/protocol.js";
1212

1313
describe("Ros", function () {
1414
let mockRosUrl: string;
@@ -19,7 +19,7 @@ describe("Ros", function () {
1919
open: ((event: TransportEvent) => void)[];
2020
close: ((event: TransportEvent) => void)[];
2121
error: ((event: TransportEvent) => void)[];
22-
message: ((event: RosbridgeMessage) => void)[];
22+
message: ((event: BridgeProtoOp) => void)[];
2323
};
2424

2525
const publishMockTransportEvent = (event: string, value: unknown) => {
@@ -51,7 +51,7 @@ describe("Ros", function () {
5151
break;
5252
case "message":
5353
mockTransportListeners.message.forEach((listener) => {
54-
listener(value as RosbridgeMessage);
54+
listener(value as BridgeProtoOp);
5555
});
5656
break;
5757
}
@@ -64,7 +64,7 @@ describe("Ros", function () {
6464
open: new Array<(event: TransportEvent) => void>(),
6565
close: new Array<(event: TransportEvent) => void>(),
6666
error: new Array<(event: TransportEvent) => void>(),
67-
message: new Array<(event: RosbridgeMessage) => void>(),
67+
message: new Array<(event: BridgeProtoOp) => void>(),
6868
};
6969

7070
mockTransport = {
@@ -229,7 +229,10 @@ describe("Ros", function () {
229229
publishMockTransportEvent("open", new Event("open"));
230230

231231
const rosOnceSpy = vi.spyOn(ros, "once");
232-
ros.callOnConnection({ op: "test" });
232+
233+
// Coerce this message to be a valid bridge operation (it's not)
234+
// Needs to be cast because type checking will catch it otherwise
235+
ros.callOnConnection({ op: "test" } as unknown as BridgeProtoOp);
233236

234237
expect(rosOnceSpy).not.toHaveBeenCalled();
235238
expect(mockTransport.send).toHaveBeenCalledWith({ op: "test" });
@@ -242,7 +245,10 @@ describe("Ros", function () {
242245

243246
// When disconnected, the message is queued to send
244247
const rosOnceSpy = vi.spyOn(ros, "once");
245-
ros.callOnConnection({ op: "test" });
248+
249+
// Coerce this message to be a valid bridge operation (it's not)
250+
// Needs to be cast because type checking will catch it otherwise
251+
ros.callOnConnection({ op: "test" } as unknown as BridgeProtoOp);
246252

247253
expect(rosOnceSpy).toHaveBeenCalledWith("open", expect.any(Function));
248254
expect(mockTransport.send).not.toHaveBeenCalled();

test/service.test.ts

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,7 @@ describe("Service", () => {
3737
expect(ros.listenerCount(server.name)).toEqual(0);
3838
});
3939
it("Successfully advertises a service with a synchronous return", async () => {
40-
const server = new Service<
41-
undefined,
42-
{ success: boolean; message: string }
43-
>({
40+
const server = new Service<never, { success: boolean; message: string }>({
4441
ros,
4542
serviceType: "std_srvs/Trigger",
4643
name: "/test_service",
@@ -71,10 +68,7 @@ describe("Service", () => {
7168
});
7269

7370
it("Handles re-advertisement gracefully without throwing errors", async () => {
74-
const server = new Service<
75-
undefined,
76-
{ success: boolean; message: string }
77-
>({
71+
const server = new Service<never, { success: boolean; message: string }>({
7872
ros,
7973
serviceType: "std_srvs/Trigger",
8074
name: "/test_readvertise",
@@ -106,10 +100,7 @@ describe("Service", () => {
106100
});
107101

108102
it("Handles multiple unadvertise calls gracefully", async () => {
109-
const server = new Service<
110-
undefined,
111-
{ success: boolean; message: string }
112-
>({
103+
const server = new Service<never, { success: boolean; message: string }>({
113104
ros,
114105
serviceType: "std_srvs/Trigger",
115106
name: "/test_multiple_unadvertise",
@@ -164,10 +155,7 @@ describe("Service", () => {
164155
});
165156

166157
it("Ensures operations are serialized through queue", async () => {
167-
const server = new Service<
168-
undefined,
169-
{ success: boolean; message: string }
170-
>({
158+
const server = new Service<never, { success: boolean; message: string }>({
171159
ros,
172160
serviceType: "std_srvs/Trigger",
173161
name: "/test_queue",

test/transport.test.ts

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,13 @@ import type { MockedObject } from "vitest";
44
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
55
import type { AbstractTransport } from "../src/core/transport/Transport.js";
66
import { WebSocketTransportFactory } from "../src/core/transport/WebSocketTransportFactory.js";
7-
import type {
8-
RosbridgeMessage,
9-
RosbridgePngMessage,
10-
} from "../src/types/protocol.js";
117
import CBOR from "cbor-js";
128
import * as fastpng from "fast-png";
139
import * as bson from "bson";
1410
import * as ws from "ws";
1511
import { NativeWebSocketTransport } from "../src/core/transport/NativeWebSocketTransport.js";
1612
import { WsWebSocketTransport } from "../src/core/transport/WsWebSocketTransport.js";
13+
import type { BridgeProtoOp } from "../src/types/protocol.js";
1714

1815
vi.mock("fast-png");
1916

@@ -55,9 +52,9 @@ describe("Transport", () => {
5552
});
5653

5754
it("should handle RosbridgeMessage", () => {
58-
const message: RosbridgeMessage = {
55+
const message = {
5956
op: "test",
60-
};
57+
} as unknown as BridgeProtoOp;
6158

6259
const messageEvent: Partial<MessageEvent> = {
6360
type: "message",
@@ -202,12 +199,12 @@ describe("Transport", () => {
202199

203200
// Obviously these are not real PNG encoded messages.
204201
// But they're good enough for mocking responses in our tests.
205-
const successMessage: RosbridgePngMessage = {
202+
const successMessage = {
206203
op: "png",
207204
data: Buffer.from("success").toString("base64"),
208205
};
209206

210-
const failureMessage: RosbridgePngMessage = {
207+
const failureMessage = {
211208
op: "png",
212209
data: Buffer.from("failure").toString("base64"),
213210
};
@@ -370,7 +367,7 @@ describe("Transport", () => {
370367
it("should send messages as JSON", () => {
371368
const transport = new NativeWebSocketTransport(mockSocket);
372369

373-
transport.send({ op: "test" });
370+
transport.send({ op: "test" } as unknown as BridgeProtoOp);
374371

375372
expect(mockSocket.send).toHaveBeenCalledWith(
376373
JSON.stringify({ op: "test" }),
@@ -482,9 +479,9 @@ describe("Transport", () => {
482479

483480
transport.on("message", messageListener);
484481

485-
const message: RosbridgeMessage = {
482+
const message = {
486483
op: "test",
487-
};
484+
} as unknown as BridgeProtoOp;
488485

489486
const messageEvent: Partial<MessageEvent> = {
490487
type: "message",
@@ -515,7 +512,7 @@ describe("Transport", () => {
515512
it("should send messages as JSON", () => {
516513
const transport = new WsWebSocketTransport(mockSocket);
517514

518-
transport.send({ op: "test" });
515+
transport.send({ op: "test" } as unknown as BridgeProtoOp);
519516

520517
expect(mockSocket.send).toHaveBeenCalledWith(
521518
JSON.stringify({ op: "test" }),
@@ -627,9 +624,9 @@ describe("Transport", () => {
627624

628625
transport.on("message", messageListener);
629626

630-
const message: RosbridgeMessage = {
627+
const message = {
631628
op: "test",
632-
};
629+
} as unknown as BridgeProtoOp;
633630

634631
const messageEvent: ws.MessageEvent = {
635632
type: "message",

0 commit comments

Comments
 (0)