Newer
Older
TelosDB / test / integration.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-integration.db";

describe("Integration Tests", () => {
  beforeEach(() => {
    setTestEnv();
    cleanupTestDb(TEST_DB);
  });

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

  it("should complete full item lifecycle", () => {
    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 content = "This is a test document";
    const path = "/documents/test.txt";
    
    const stmt = db.prepare("INSERT INTO items (content, path) VALUES (?, ?)");
    stmt.run(content, path);
    
    let items = db.prepare("SELECT * FROM items").all();
    expect(items.length).toBe(1);
    expect(items[0].content).toBe(content);
    expect(items[0].path).toBe(path);
    const itemId = items[0].id;

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

    expect(results.length).toBe(1);
    expect(results[0].content).toBe(content);
    expect(results[0].path).toBe(path);
    expect(results[0].created_at).toBeTruthy();
    expect(results[0].updated_at).toBeTruthy();

    db.close();
  });

  it("should handle multiple items with different metadata", () => {
    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 testData = [
      { content: "apple", path: "/fruits/apple.txt" },
      { content: "banana", path: "/fruits/banana.txt" },
      { content: "orange", path: "/fruits/orange.txt" },
    ];

    const stmt = db.prepare("INSERT INTO items (content, path) VALUES (?, ?)");
    testData.forEach((data) => {
      stmt.run(data.content, data.path);
    });

    const allItems = db.prepare("SELECT * FROM items").all();
    expect(allItems.length).toBe(3);
    
    expect(allItems[0].path).toBe("/fruits/apple.txt");
    expect(allItems[1].path).toBe("/fruits/banana.txt");
    expect(allItems[2].path).toBe("/fruits/orange.txt");

    db.close();
  });

  it("should validate data integrity", () => {
    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 (?, ?)");
    for (let i = 1; i <= 5; i++) {
      stmt.run(`item ${i}`, `/path/${i}`);
    }

    const items = db.prepare("SELECT COUNT(*) as cnt FROM items").all()[0];
    expect(items.cnt).toBe(5);

    const timestampedItems = db.prepare(
      "SELECT id, content, created_at, updated_at FROM items"
    ).all();
    
    timestampedItems.forEach((item) => {
      expect(item.created_at).toBeTruthy();
      expect(item.updated_at).toBeTruthy();
    });

    db.close();
  });

  it("should handle concurrent-like 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'))
      );
      DELETE FROM items;
    `);

    const stmt = db.prepare("INSERT INTO items (content, path) VALUES (?, ?)");
    for (let i = 0; i < 10; i++) {
      stmt.run(`content ${i}`, `/path/${i}`);
    }

    const result = db.prepare("SELECT COUNT(*) as cnt FROM items").all()[0];
    expect(result.cnt).toBe(10);

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