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();
});
});