Newer
Older
TelosDB / test / mcp-handlers.test.js
@楽曲作りまくりおじさん 楽曲作りまくりおじさん 8 days ago 4 KB Add comprehensive test suite (35 tests) and update journal
import { afterEach, beforeEach, describe, expect, it } from "bun:test";
import { cleanupTestDb, clearTestEnv, createTestDb, setTestEnv } from "./setup.js";

const TEST_DB = "test-vector.db";

describe("MCP Handlers Module", () => {
  beforeEach(() => {
    setTestEnv();
    cleanupTestDb(TEST_DB);
  });

  afterEach(() => {
    cleanupTestDb(TEST_DB);
    clearTestEnv();
  });

  it("should validate embedding dimension correctly", () => {
    const testVectors = [
      { dim: 3, valid: true },
      { dim: 2, valid: false },
      { dim: 4, valid: false },
    ];

    const EMBEDDING_DIM = Number(process.env.VEC_DIM ?? 3);
    
    testVectors.forEach(({ dim, valid }) => {
      const vector = new Array(dim).fill(0.5);
      const isValid = vector.length === EMBEDDING_DIM;
      expect(isValid).toBe(valid);
    });
  });

  it("should handle search results with all required fields", () => {
    const db = createTestDb(TEST_DB);

    db.exec(`
      CREATE TABLE if not exists items (
        id INTEGER PRIMARY KEY,
        content TEXT,
        path TEXT,
        created_at TEXT DEFAULT (datetime('now')),
        updated_at TEXT DEFAULT (datetime('now'))
      );
    `);

    const stmt = db.prepare(`
      INSERT INTO items (content, path) VALUES (?, ?)
    `);
    stmt.run("test content", "/test/path");

    const results = db
      .prepare(`
        SELECT content, path, created_at, updated_at
        FROM items
        WHERE id = ?
      `)
      .all(1);

    expect(results.length).toBe(1);
    const result = results[0];
    expect(result.content).toBe("test content");
    expect(result.path).toBe("/test/path");
    expect(result.created_at).toBeTruthy();
    expect(result.updated_at).toBeTruthy();

    db.close();
  });

  it("should insert item and return id", () => {
    const db = createTestDb(TEST_DB);

    db.exec(`
      CREATE TABLE if not exists items (
        id INTEGER PRIMARY KEY,
        content TEXT,
        path TEXT,
        created_at TEXT DEFAULT (datetime('now')),
        updated_at TEXT DEFAULT (datetime('now'))
      );
      DELETE FROM items;
    `);

    const stmt = db.prepare(`
      INSERT INTO items (content, path) VALUES (?, ?)
    `);
    stmt.run("inserted content", "/inserted/path");

    const items = db.prepare("SELECT * FROM items").all();
    expect(items.length).toBe(1);
    expect(items[0].content).toBe("inserted content");
    expect(items[0].path).toBe("/inserted/path");

    db.close();
  });

  it("should perform similarity search", () => {
    const db = createTestDb(TEST_DB);

    db.exec(`
      CREATE TABLE if not exists items (
        id INTEGER PRIMARY KEY,
        content TEXT,
        path TEXT,
        created_at TEXT DEFAULT (datetime('now')),
        updated_at TEXT DEFAULT (datetime('now'))
      );
      DELETE FROM items;
    `);

    const stmt = db.prepare("INSERT INTO items (content) VALUES (?)");
    stmt.run("item 1");
    stmt.run("item 2");
    stmt.run("item 3");

    const items = db.prepare("SELECT * FROM items").all();
    expect(items.length).toBe(3);

    db.close();
  });

  it("should handle empty results gracefully", () => {
    const db = createTestDb(TEST_DB);

    db.exec(`
      CREATE TABLE if not exists items (
        id INTEGER PRIMARY KEY,
        content TEXT,
        path TEXT,
        created_at TEXT DEFAULT (datetime('now')),
        updated_at TEXT DEFAULT (datetime('now'))
      );
    `);

    const results = db
      .prepare("SELECT * FROM items WHERE content LIKE ?")
      .all("%nonexistent%");

    expect(results).toEqual([]);

    db.close();
  });

  it("should preserve timestamps across operations", () => {
    const db = createTestDb(TEST_DB);

    db.exec(`
      CREATE TABLE if not exists items (
        id INTEGER PRIMARY KEY,
        content TEXT,
        path TEXT,
        created_at TEXT DEFAULT (datetime('now')),
        updated_at TEXT DEFAULT (datetime('now'))
      );
    `);

    const stmt = db.prepare("INSERT INTO items (content) VALUES (?)");
    stmt.run("test");

    const items = db.prepare("SELECT created_at, updated_at FROM items").all();
    expect(items[0].created_at).toBeTruthy();
    expect(items[0].updated_at).toBeTruthy();
    expect(items[0].created_at).toMatch(/\d{4}-\d{2}-\d{2}/);

    db.close();
  });
});