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

const TEST_DB = "test-vector.db";

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

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

  it("should create database file", () => {
    const db = createTestDb(TEST_DB);
    db.close();
    expect(fs.existsSync(TEST_DB)).toBe(true);
  });

  it("should initialize items table with correct schema", () => {
    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 itemsSchema = db.prepare("PRAGMA table_info(items)").all();
    
    expect(itemsSchema.length).toBe(5);
    expect(itemsSchema[0].name).toBe("id");
    expect(itemsSchema[1].name).toBe("content");
    expect(itemsSchema[2].name).toBe("path");
    expect(itemsSchema[3].name).toBe("created_at");
    expect(itemsSchema[4].name).toBe("updated_at");

    db.close();
  });

  it("should insert item into items table", () => {
    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 items = db.prepare("SELECT * FROM items").all();
    expect(items.length).toBe(1);
    expect(items[0].content).toBe("test content");
    expect(items[0].path).toBe("/test/path");
    expect(items[0].created_at).not.toBeNull();
    expect(items[0].updated_at).not.toBeNull();

    db.close();
  });

  it("should retrieve items from database", () => {
    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("item 1", "/path/1");
    stmt.run("item 2", "/path/2");
    stmt.run("item 3", "/path/3");

    // 取得
    const items = db.prepare("SELECT * FROM items").all();
    expect(items.length).toBe(3);
    expect(items[0].content).toBe("item 1");
    expect(items[1].content).toBe("item 2");
    expect(items[2].content).toBe("item 3");

    db.close();
  });

  it("should handle datetime defaults", () => {
    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();
  });
});