branch:
get-messages-endpoint.test.ts
4569 bytesRaw
import { env, exports } from "cloudflare:workers";
import { describe, it, expect } from "vitest";
import type { UIMessage as ChatMessage } from "ai";
import { connectChatWS } from "./test-utils";
import { getAgentByName } from "agents";
describe("GET /get-messages endpoint", () => {
it("returns empty array for a new agent with no messages", async () => {
const room = crypto.randomUUID();
// First, establish a WebSocket to create the DO instance
const { ws } = await connectChatWS(`/agents/test-chat-agent/${room}`);
await new Promise((r) => setTimeout(r, 50));
ws.close(1000);
const res = await exports.default.fetch(
`http://example.com/agents/test-chat-agent/${room}/get-messages`
);
expect(res.status).toBe(200);
const messages = (await res.json()) as ChatMessage[];
expect(messages).toEqual([]);
});
it("returns persisted messages in chronological order", async () => {
const room = crypto.randomUUID();
const { ws } = await connectChatWS(`/agents/test-chat-agent/${room}`);
await new Promise((r) => setTimeout(r, 50));
const agentStub = await getAgentByName(env.TestChatAgent, room);
const messages: ChatMessage[] = [
{
id: "msg-get-1",
role: "user",
parts: [{ type: "text", text: "First" }]
},
{
id: "msg-get-2",
role: "assistant",
parts: [{ type: "text", text: "Second" }]
},
{
id: "msg-get-3",
role: "user",
parts: [{ type: "text", text: "Third" }]
}
];
await agentStub.persistMessages(messages);
ws.close(1000);
const res = await exports.default.fetch(
`http://example.com/agents/test-chat-agent/${room}/get-messages`
);
expect(res.status).toBe(200);
const returned = (await res.json()) as ChatMessage[];
expect(returned.length).toBe(3);
expect(returned.map((m) => m.id)).toEqual([
"msg-get-1",
"msg-get-2",
"msg-get-3"
]);
});
it("returns 404 for non-existent routes", async () => {
const res = await exports.default.fetch(
"http://example.com/agents/test-chat-agent/foo/bar"
);
// The worker returns 404 for unknown routes
expect(res.status).toBe(404);
});
});
describe("onRequest override patterns", () => {
it("/get-messages works when user overrides onRequest and calls super", async () => {
const room = crypto.randomUUID();
const { ws } = await connectChatWS(`/agents/agent-with-super-call/${room}`);
await new Promise((r) => setTimeout(r, 50));
const agentStub = await getAgentByName(env.AgentWithSuperCall, room);
const messages: ChatMessage[] = [
{ id: "test-1", role: "user", parts: [{ type: "text", text: "Hello" }] }
];
await agentStub.persistMessages(messages);
ws.close(1000);
const res = await exports.default.fetch(
`http://example.com/agents/agent-with-super-call/${room}/get-messages`
);
expect(res.status).toBe(200);
const returned = (await res.json()) as ChatMessage[];
expect(returned.length).toBe(1);
expect(returned[0].id).toBe("test-1");
});
it("/get-messages works when user overrides onRequest WITHOUT calling super", async () => {
const room = crypto.randomUUID();
const { ws } = await connectChatWS(
`/agents/agent-without-super-call/${room}`
);
await new Promise((r) => setTimeout(r, 50));
const agentStub = await getAgentByName(env.AgentWithoutSuperCall, room);
const messages: ChatMessage[] = [
{
id: "test-no-super-1",
role: "user",
parts: [{ type: "text", text: "Hello" }]
}
];
await agentStub.persistMessages(messages);
ws.close(1000);
const res = await exports.default.fetch(
`http://example.com/agents/agent-without-super-call/${room}/get-messages`
);
expect(res.status).toBe(200);
const returned = (await res.json()) as ChatMessage[];
expect(returned.length).toBe(1);
expect(returned[0].id).toBe("test-no-super-1");
});
it("non-get-messages routes still delegate to user onRequest override", async () => {
const room = crypto.randomUUID();
const { ws } = await connectChatWS(
`/agents/agent-without-super-call/${room}`
);
await new Promise((r) => setTimeout(r, 50));
ws.close(1000);
const res = await exports.default.fetch(
`http://example.com/agents/agent-without-super-call/${room}/other-route`
);
expect(res.status).toBe(200);
expect(await res.text()).toBe("custom only");
});
});