101 lines
3.2 KiB
JavaScript
101 lines
3.2 KiB
JavaScript
/**
|
||
* 测试 memories_au (AFTER UPDATE) trigger 是否正常工作。
|
||
* 验证:更新记忆后,新关键词能被 FTS5 搜到。
|
||
*
|
||
* 用法:node scripts/test-fts-trigger.mjs
|
||
*/
|
||
|
||
import Database from 'better-sqlite3'
|
||
import path from 'path'
|
||
import { fileURLToPath } from 'url'
|
||
import fs from 'fs'
|
||
|
||
const __dirname = path.dirname(fileURLToPath(import.meta.url))
|
||
const dbPath = path.resolve(__dirname, '../data/jarvis.db')
|
||
|
||
if (!fs.existsSync(dbPath)) {
|
||
console.error('数据库不存在:', dbPath)
|
||
process.exit(1)
|
||
}
|
||
|
||
const db = new Database(dbPath)
|
||
db.pragma('journal_mode = WAL')
|
||
|
||
const TEST_MEM_ID = 'fact_fts_trigger_test_' + Date.now()
|
||
let passed = 0
|
||
let failed = 0
|
||
|
||
function check(label, value) {
|
||
if (value) {
|
||
console.log(` ✅ ${label}`)
|
||
passed++
|
||
} else {
|
||
console.log(` ❌ ${label}`)
|
||
failed++
|
||
}
|
||
}
|
||
|
||
console.log('\n── FTS5 Trigger 测试 ──\n')
|
||
|
||
// 1. 插入一条测试记忆
|
||
const ts = new Date().toISOString()
|
||
const insertResult = db.prepare(`
|
||
INSERT INTO memories (event_type, content, detail, title, mem_id, entities, concepts, tags, links, source_ref, timestamp)
|
||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
||
`).run('fact', '测试关键词_插入阶段_UNIQUE123', '详情内容_插入', '测试标题', TEST_MEM_ID, '[]', '[]', '[]', '[]', null, ts)
|
||
|
||
const newId = insertResult.lastInsertRowid
|
||
console.log(`[1] 插入记忆 id=${newId} mem_id=${TEST_MEM_ID}`)
|
||
|
||
// 2. 验证 INSERT trigger:能搜到插入阶段的关键词
|
||
const afterInsert = db.prepare(`
|
||
SELECT m.* FROM memories m
|
||
JOIN memories_fts ON memories_fts.rowid = m.id
|
||
WHERE memories_fts MATCH 'UNIQUE123'
|
||
LIMIT 5
|
||
`).all()
|
||
check('INSERT trigger:能搜到 UNIQUE123', afterInsert.some(r => r.id === newId))
|
||
|
||
// 3. 更新这条记忆,换成完全不同的关键词
|
||
db.prepare(`
|
||
UPDATE memories SET content = '测试关键词_更新阶段_UPDATED456', detail = '详情内容_更新', timestamp = ?
|
||
WHERE id = ?
|
||
`).run(new Date().toISOString(), newId)
|
||
console.log(`\n[2] 更新记忆 id=${newId},内容换成 UPDATED456`)
|
||
|
||
// 4. 验证 UPDATE trigger:能搜到新关键词
|
||
const afterUpdate_new = db.prepare(`
|
||
SELECT m.* FROM memories m
|
||
JOIN memories_fts ON memories_fts.rowid = m.id
|
||
WHERE memories_fts MATCH 'UPDATED456'
|
||
LIMIT 5
|
||
`).all()
|
||
check('UPDATE trigger:能搜到新关键词 UPDATED456', afterUpdate_new.some(r => r.id === newId))
|
||
|
||
// 5. 验证旧关键词不应该再被搜到(FTS 已删除旧条目)
|
||
const afterUpdate_old = db.prepare(`
|
||
SELECT m.* FROM memories m
|
||
JOIN memories_fts ON memories_fts.rowid = m.id
|
||
WHERE memories_fts MATCH 'UNIQUE123'
|
||
LIMIT 5
|
||
`).all()
|
||
check('UPDATE trigger:旧关键词 UNIQUE123 已从索引移除', !afterUpdate_old.some(r => r.id === newId))
|
||
|
||
// 6. 清理测试数据
|
||
db.prepare(`DELETE FROM memories WHERE id = ?`).run(newId)
|
||
console.log(`\n[3] 已清理测试数据`)
|
||
|
||
// 验证 DELETE trigger
|
||
const afterDelete = db.prepare(`
|
||
SELECT m.* FROM memories m
|
||
JOIN memories_fts ON memories_fts.rowid = m.id
|
||
WHERE memories_fts MATCH 'UPDATED456'
|
||
LIMIT 5
|
||
`).all()
|
||
check('DELETE trigger:删除后搜不到', !afterDelete.some(r => r.id === newId))
|
||
|
||
db.close()
|
||
|
||
console.log(`\n── 结果:${passed} 通过 / ${failed} 失败 ──\n`)
|
||
process.exit(failed > 0 ? 1 : 0)
|