Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 30 additions & 1 deletion lib/chat/__tests__/setupConversation.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,16 +21,22 @@ vi.mock("@/lib/messages/filterMessageContentForMemories", () => ({
default: vi.fn((msg: unknown) => msg),
}));

vi.mock("@/lib/supabase/rooms/selectRoom", () => ({
default: vi.fn(),
}));

import { generateUUID } from "@/lib/uuid/generateUUID";
import { createNewRoom } from "@/lib/chat/createNewRoom";
import insertMemories from "@/lib/supabase/memories/insertMemories";
import filterMessageContentForMemories from "@/lib/messages/filterMessageContentForMemories";
import selectRoom from "@/lib/supabase/rooms/selectRoom";
import { setupConversation } from "../setupConversation";

const mockGenerateUUID = vi.mocked(generateUUID);
const mockCreateNewRoom = vi.mocked(createNewRoom);
const mockInsertMemories = vi.mocked(insertMemories);
const mockFilterMessageContentForMemories = vi.mocked(filterMessageContentForMemories);
const mockSelectRoom = vi.mocked(selectRoom);

/**
* Helper to create a UIMessage for testing.
Expand All @@ -53,6 +59,8 @@ describe("setupConversation", () => {
mockGenerateUUID.mockReturnValue("generated-uuid");
mockCreateNewRoom.mockResolvedValue(undefined);
mockInsertMemories.mockResolvedValue(null);
// By default, selectRoom returns an existing room when roomId is provided
mockSelectRoom.mockResolvedValue({ id: "existing-room-id" } as never);
});

describe("room creation", () => {
Expand All @@ -72,7 +80,8 @@ describe("setupConversation", () => {
});
});

it("does NOT create a room when roomId is provided", async () => {
it("does NOT create a room when roomId is provided and room exists", async () => {
mockSelectRoom.mockResolvedValue({ id: "existing-room-id" } as never);
const promptMessage = createUIMessage("Hello");

await setupConversation({
Expand All @@ -81,9 +90,29 @@ describe("setupConversation", () => {
promptMessage,
});

expect(mockSelectRoom).toHaveBeenCalledWith("existing-room-id");
expect(mockCreateNewRoom).not.toHaveBeenCalled();
});

it("creates a room when roomId is provided but room does NOT exist", async () => {
mockSelectRoom.mockResolvedValue(null);
const promptMessage = createUIMessage("Hello");

await setupConversation({
accountId: "account-123",
roomId: "non-existent-room-id",
promptMessage,
});

expect(mockSelectRoom).toHaveBeenCalledWith("non-existent-room-id");
expect(mockCreateNewRoom).toHaveBeenCalledWith({
accountId: "account-123",
roomId: "non-existent-room-id",
artistId: undefined,
lastMessage: promptMessage,
});
});

it("passes artistId to createNewRoom when provided", async () => {
const promptMessage = createUIMessage("Hello");

Expand Down
15 changes: 13 additions & 2 deletions lib/chat/setupConversation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { UIMessage } from "ai";
import { generateUUID } from "@/lib/uuid/generateUUID";
import { createNewRoom } from "@/lib/chat/createNewRoom";
import insertMemories from "@/lib/supabase/memories/insertMemories";
import selectRoom from "@/lib/supabase/rooms/selectRoom";
import filterMessageContentForMemories from "@/lib/messages/filterMessageContentForMemories";

interface SetupConversationParams {
Expand Down Expand Up @@ -44,8 +45,18 @@ export async function setupConversation({
const finalRoomId = roomId || generateUUID();
const finalMemoryId = memoryId || generateUUID();

// Create room if roomId was not provided
if (!roomId) {
// Create room if needed:
// - If no roomId was provided, create a new room
// - If roomId was provided but doesn't exist, create it (prevents FK constraint errors)
let shouldCreateRoom = !roomId;
if (roomId) {
const existingRoom = await selectRoom(roomId);
if (!existingRoom) {
shouldCreateRoom = true;
}
}

if (shouldCreateRoom) {
await createNewRoom({
accountId,
roomId: finalRoomId,
Expand Down
Loading