Files
Toolbox/dev_test_scripts/unit/test_kaleidoscope_db.js
yangxiangyuan 876a3b8768 feat(thought-lab): 新增万花筒与闵可夫斯基画板两个思想实验室
新增两个独立思想实验室:
1. 万花筒模拟器:支持可调参数物理万花筒效果,配置方案SQLite持久化
2. 闵可夫斯基画板:支持世界线绘制、洛伦兹变换、光锥因果判定
同时添加自动绑定实验室后端的逻辑,以及配套的单元测试与前端页面
2026-08-06 17:41:43 +08:00

75 lines
3.5 KiB
JavaScript

// 单元测试:kaleidoscope lab 后端(sqlite 方案 CRUD + 路由)
// 运行:node dev_test_scripts/unit/test_kaleidoscope_db.js
// 说明:直接调用 db.js 验证 CRUD;再挂载 express 验证路由层(无上游守卫,仅测路由本身)
const path = require('path')
const http = require('http')
const express = require(path.join(process.cwd(), 'node_modules', 'express'))
const db = require(path.join(process.cwd(), 'src', 'server', 'thought_lab', 'labs', 'kaleidoscope', 'db.js'))
const kaleido = require(path.join(process.cwd(), 'src', 'server', 'thought_lab', 'labs', 'kaleidoscope', 'index.js'))
let fail = 0
const check = (name, cond, extra) => {
console.log(`${cond ? 'PASS' : 'FAIL'} - ${name}${extra ? ' | ' + extra : ''}`)
if (!cond) fail++
}
// ---- 1) db 层 CRUD ----
const created = db.createScheme({ name: '测试方案A', params: { segments: 8, mirror: true }, seed: 42 })
check('create 返回 id 与北京时间戳', !!created.id && /\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/.test(created.created_at), JSON.stringify(created.created_at))
const updated = db.updateScheme(created.id, { name: '测试方案A改', params: { segments: 12 }, seed: 43 })
check('update 生效', updated && updated.name === '测试方案A改' && updated.params.segments === 12)
const listed = db.listSchemes()
check('list 包含新建方案', listed.some(s => s.id === created.id))
const got = db.getScheme(created.id)
check('get 单条一致', got && got.seed === 43)
// ---- 2) 路由层 ----
const app = express()
app.use(express.json())
kaleido.bindRoutes(app)
const server = app.listen(0, async () => {
const port = server.address().port
const req = (method, p, body) => new Promise((resolve, reject) => {
const data = body ? JSON.stringify(body) : null
const r = http.request({ host: '127.0.0.1', port, path: p, method, headers: data ? { 'Content-Type': 'application/json' } : {} }, res => {
let b = ''
res.on('data', c => { b += c })
res.on('end', () => resolve({ status: res.statusCode, body: b }))
})
r.on('error', reject)
if (data) r.write(data)
r.end()
})
try {
const m = await req('GET', '/api/thought_lab/kaleidoscope/meta')
check('meta 返回 ui_mode', m.status === 200 && JSON.parse(m.body).ui_mode === 'debug', m.body)
const c = await req('POST', '/api/thought_lab/kaleidoscope/schemes', { name: '路由方案', params: { tube: 0.5 }, seed: 7 })
const cj = JSON.parse(c.body)
check('POST 创建成功', c.status === 200 && cj.ok && cj.scheme.id > 0)
const bad = await req('POST', '/api/thought_lab/kaleidoscope/schemes', { name: '', params: {} })
check('空名称 400', bad.status === 400)
const u = await req('PUT', `/api/thought_lab/kaleidoscope/schemes/${cj.scheme.id}`, { name: '路由方案2', params: { tube: 0.6 }, seed: 8 })
check('PUT 更新成功', u.status === 200 && JSON.parse(u.body).scheme.name === '路由方案2')
const l = await req('GET', '/api/thought_lab/kaleidoscope/schemes')
check('GET 列表包含路由方案', JSON.parse(l.body).schemes.some(s => s.id === cj.scheme.id))
const d = await req('DELETE', `/api/thought_lab/kaleidoscope/schemes/${cj.scheme.id}`)
check('DELETE 成功', d.status === 200)
} catch (e) {
fail++
console.log('FAIL - 请求异常 |', e.message)
}
// 清理本测试创建的 db 记录
try { db.deleteScheme(created.id) } catch {}
server.close()
console.log(fail === 0 ? 'ALL PASS' : `${fail} FAILED`)
process.exit(fail === 0 ? 0 : 1)
})