876a3b8768
新增两个独立思想实验室: 1. 万花筒模拟器:支持可调参数物理万花筒效果,配置方案SQLite持久化 2. 闵可夫斯基画板:支持世界线绘制、洛伦兹变换、光锥因果判定 同时添加自动绑定实验室后端的逻辑,以及配套的单元测试与前端页面
75 lines
3.5 KiB
JavaScript
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)
|
|
})
|