import test from "node:test"; import assert from "node:assert/strict"; import Database from "better-sqlite3"; import {initializeSchema, runMigrations} from "../src/db/schema.js"; import {createChatStatements} from "../src/db/chatRepository.js"; import {titleFromFirstMessage} from "../public/js/chatTitle.js"; import {createWebSearchToggle} from "../public/js/webSearch.js"; test("first messages produce short subject titles at word boundaries", () => { assert.equal(titleFromFirstMessage("Can you help me plan a weekend trip to Lucerne? I prefer trains."), "Plan a weekend trip to Lucerne"); assert.equal(titleFromFirstMessage("What are the best hiking routes near Zurich?"), "Best hiking routes near Zurich"); const title = titleFromFirstMessage("Please explain the differences between local browser storage and server-side sessions for returning visitors"); assert.ok(title.length <= 68); assert.ok(!title.endsWith("-")); assert.equal(titleFromFirstMessage(" "), "New chat"); }); test("web search preference survives a fresh toggle", () => { const values = new Map(); const storage = {getItem: key => values.get(key), setItem: (key, value) => values.set(key, value)}; const button = () => ({attributes: {}, setAttribute(key, value) { this.attributes[key] = value; }, addEventListener(_event, listener) { this.click = listener; }}); const first = button(); assert.equal(createWebSearchToggle(first, storage).enabled, true); first.click(); const second = button(); assert.equal(createWebSearchToggle(second, storage).enabled, false); assert.equal(second.attributes["aria-pressed"], "false"); second.click(); assert.equal(createWebSearchToggle(button(), storage).enabled, true); }); test("chat list query returns a bounded latest message preview and activity time", () => { const db = new Database(":memory:"); try { initializeSchema(db); runMigrations(db); db.prepare("INSERT INTO chat_sessions (username, title) VALUES (?, ?)").run("owner", "Trip plans"); const chatId = db.prepare("SELECT id FROM chat_sessions").get().id; db.prepare("INSERT INTO chat_messages (chat_id, role, content) VALUES (?, ?, ?)").run(chatId, "user", "First question"); db.prepare("INSERT INTO chat_messages (chat_id, role, content) VALUES (?, ?, ?)").run(chatId, "bot", "x".repeat(250)); const statements = createChatStatements(db); const chat = statements.listChatSessions.get("owner"); assert.equal(chat.last_message_preview, "x".repeat(180)); assert.ok(chat.updated_at); assert.equal(statements.searchChats.get("%Trip%", "owner", "%Trip%").last_message_preview, "x".repeat(180)); } finally { db.close(); } });