mirror of
https://github.com/insistence/RuoYi-Vue3-FastAPI.git
synced 2026-10-15 05:19:14 +00:00
* feat: 支持 v2 插件、原生扩展与签名发布 * fix: 修复测试 * feat: 增强宿主 SDK、运行观测与制品维护能力 * feat: 增强文件传输、配置观测与本地开发能力 * feat: 支持 SSE 实时事件流并完善开发脚手架 * feat: 完善长连接鉴权复核与关闭回收 * feat: 增强生命周期与任务关闭可靠性 * feat: 收紧健康检查契约并补齐前端与真实网络验收 * feat: 增加SDK溯源与离线更新工具并验证跨版本兼容 * feat: 增加持久化业务示例与受控 Python 交付 * feat: 增加统一运行诊断与多worker状态观测 * feat: 增加固定目标发布等待与自动验收 * fix: 修复多环境插件部署前缀与代理配置不一致 * fix: 修复测试
78 lines
2.7 KiB
JavaScript
78 lines
2.7 KiB
JavaScript
import assert from 'node:assert/strict'
|
|
import {
|
|
createMockPluginRequest,
|
|
createMockPluginStream,
|
|
} from '../../../ruoyi-fastapi-backend/plugins/examples/python/bundle_demo/web/dev/mockRequest.js'
|
|
|
|
const request = createMockPluginRequest({ getDelay: () => 0 })
|
|
const config = (path, options = {}) => ({
|
|
url: '/apps/bundle_demo/api/' + path,
|
|
method: 'get',
|
|
...options,
|
|
})
|
|
assert.equal((await request(config('summary'))).userName, '本地模拟用户')
|
|
assert.equal(
|
|
(await request(config('echo', { method: 'post', data: { message: 'test' } }))).message,
|
|
'test'
|
|
)
|
|
const form = new FormData()
|
|
form.append('file', new Blob(['test']), 'test.txt')
|
|
const events = []
|
|
const file = await request(
|
|
config('files/inspect', {
|
|
method: 'post',
|
|
data: form,
|
|
onUploadProgress: (event) => events.push(event),
|
|
})
|
|
)
|
|
assert.deepEqual(file, {
|
|
filename: 'test.txt',
|
|
size: 4,
|
|
sha256: '9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08',
|
|
})
|
|
assert.deepEqual(
|
|
events.map((event) => event.loaded),
|
|
[2, 4]
|
|
)
|
|
const report = await request(config('files/report'))
|
|
assert.match(await report.text(), /local-mock/)
|
|
await assert.rejects(request(config('unknown')), /未实现/)
|
|
await assert.rejects(request({ url: 'https://outside.test', method: 'get' }), /当前插件/)
|
|
const fail = createMockPluginRequest({ getDelay: () => 0, shouldFail: () => true })
|
|
await assert.rejects(fail(config('summary')), /模拟接口失败/)
|
|
const controller = new AbortController()
|
|
const slow = createMockPluginRequest({ getDelay: () => 5000 })
|
|
const pending = slow(config('summary', { signal: controller.signal }))
|
|
const rejected = assert.rejects(pending, /取消/)
|
|
controller.abort()
|
|
await rejected
|
|
await assert.rejects(slow(config('summary', { signal: controller.signal })), /取消/)
|
|
|
|
const streamController = new AbortController()
|
|
const stream = createMockPluginStream({ getDelay: () => 100 })
|
|
const streamConfig = config('events', {
|
|
params: { count: 3 },
|
|
lastEventId: '1',
|
|
signal: streamController.signal,
|
|
})
|
|
const received = []
|
|
for await (const event of stream(streamConfig)) received.push(event)
|
|
assert.deepEqual(
|
|
received.map((event) => event.id),
|
|
['2', '3']
|
|
)
|
|
assert.equal(JSON.parse(received[0].data).index, 2)
|
|
for (const invalid of [{ params: { count: 0 } }, { lastEventId: '1.0' }, { lastEventId: '001' }]) {
|
|
await assert.rejects(stream({ ...streamConfig, ...invalid }).next(), /参数无效/)
|
|
}
|
|
const interrupted = stream(streamConfig)
|
|
const next = interrupted.next()
|
|
const interruptedResult = assert.rejects(next, /取消/)
|
|
streamController.abort()
|
|
await interruptedResult
|
|
const failedStream = createMockPluginStream({ getDelay: () => 100, shouldFail: () => true })
|
|
await assert.rejects(
|
|
failedStream({ ...streamConfig, signal: new AbortController().signal }).next(),
|
|
/失败/
|
|
)
|