import { test, expect } from 'vitest';
import { DatabaseSync } from 'node:sqlite';
import { mkdtempSync, rmSync } from 'node:fs';
import { tmpdir } from 'node:os';
import { join } from 'node:path';
import { Repository, HouseService, type SqlPort } from '../src/repository';
function port(db: DatabaseSync): SqlPort {
  return { exec: async sql => { db.exec(sql); },
    run: async (sql, ...values) => { db.prepare(sql).run(...values); },
    all: async <T>(sql: string, ...values: (string | number)[]) => db.prepare(sql).all(...values) as T[] };
}
test('same SQL repository retains confirmed data across reopen', async () => {
  const directory = mkdtempSync(join(tmpdir(), 'house_learning_'));
  const file = join(directory, 'data.sqlite');
  let db = new DatabaseSync(file);
  try {
    let repo = new Repository(port(db)); await repo.migrate();
    const service = new HouseService(repo, () => 'h1');
    await service.create(' Home ');
    await expect(service.create('  ')).rejects.toThrow('Name required');
    db.close(); db = new DatabaseSync(file); repo = new Repository(port(db));
    await repo.migrate(); expect(await repo.all()).toEqual([{ id: 'h1', name: 'Home' }]);
  } finally { db.close(); rmSync(directory, { recursive: true }); }
});
