ALTER TABLE notes adds due_date TEXT + due_date_edited_by_user INTEGER. openDb takes <dbFile>.pre-v<N>.bak before running migrations (F6-L1 follow-up #4 — preserves recoverable state if migration fails). NoteRepository: updateAiResult accepts dueDate?, setDueDate + edited-flag CASE WHEN guard mirroring title/summary pattern. Note interface gains dueDate + dueDateEditedByUser fields. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
32 lines
1.1 KiB
TypeScript
32 lines
1.1 KiB
TypeScript
import { describe, it, expect } from 'vitest';
|
|
import Database from 'better-sqlite3';
|
|
import { runMigrations } from '@main/db/migrations/index.js';
|
|
|
|
describe('migrations', () => {
|
|
it('creates schema with intent + edited columns', () => {
|
|
const db = new Database(':memory:');
|
|
runMigrations(db);
|
|
const cols = db.prepare(`PRAGMA table_info(notes)`).all().map((r: any) => r.name);
|
|
expect(cols).toEqual(
|
|
expect.arrayContaining([
|
|
'id', 'raw_text', 'ai_title', 'ai_summary', 'ai_status', 'ai_error',
|
|
'ai_provider', 'ai_generated_at',
|
|
'title_edited_by_user', 'summary_edited_by_user',
|
|
'user_intent', 'intent_prompted_at',
|
|
'created_at', 'updated_at'
|
|
])
|
|
);
|
|
db.close();
|
|
});
|
|
|
|
it('is idempotent', () => {
|
|
const db = new Database(':memory:');
|
|
runMigrations(db);
|
|
const before = (db.prepare('PRAGMA user_version').get() as any).user_version;
|
|
runMigrations(db);
|
|
const after = (db.prepare('PRAGMA user_version').get() as any).user_version;
|
|
expect(after).toBe(before);
|
|
db.close();
|
|
});
|
|
});
|