48 lines
2.7 KiB
JavaScript
48 lines
2.7 KiB
JavaScript
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(); }
|
|
});
|