882ccdac12
- 新增 shared/utils/datetime.ts:13 个品牌页逐字重复的 formatDateTime 收敛为一处; 语义不同的 3 个变体(toLocaleString / 字符串切片 / 支持时间戳)保留不动 - 新增 shared/utils/upload-to-java.ts:10 个品牌页的上传循环收敛,api 依赖注入便于单测; 保留 uploadOss(品牌Tab)与 returnEmptyWhenUnavailable(跟价)两处行为差异 - 补 datetime / upload-to-java 单测 10 例 净减约 327 行;vue-tsc 构建与 690 个前端单测全通过
71 lines
2.5 KiB
TypeScript
71 lines
2.5 KiB
TypeScript
import { test } from 'node:test'
|
|
import assert from 'node:assert/strict'
|
|
import { uploadPathsToJava } from '../src/shared/utils/upload-to-java.ts'
|
|
import type { PywebviewApi } from '../src/shared/bridges/pywebview.ts'
|
|
|
|
function fakeApi(
|
|
upload: (
|
|
filePath: string,
|
|
relativePath?: string,
|
|
uploadOss?: boolean,
|
|
) => Promise<{ success: boolean; data?: never; error?: string; message?: string }>,
|
|
) {
|
|
return { upload_file_to_java: upload } as unknown as PywebviewApi
|
|
}
|
|
|
|
function okData(filePath: string) {
|
|
return { fileKey: `k:${filePath}`, originalFilename: filePath, localPath: '', size: 1 }
|
|
}
|
|
|
|
test('uploadPathsToJava 逐个上传并返回结果列表', async () => {
|
|
const calls: Array<[string, string | undefined, boolean | undefined]> = []
|
|
const api = fakeApi(async (filePath, relativePath, uploadOss) => {
|
|
calls.push([filePath, relativePath, uploadOss])
|
|
return { success: true, data: okData(filePath) as never }
|
|
})
|
|
|
|
const result = await uploadPathsToJava(api, ['/a.xlsx', { absolutePath: '/b.xlsx', relativePath: 'sub/b.xlsx' }])
|
|
|
|
assert.equal(result.length, 2)
|
|
assert.deepEqual(calls, [
|
|
['/a.xlsx', undefined, undefined],
|
|
['/b.xlsx', 'sub/b.xlsx', undefined],
|
|
])
|
|
})
|
|
|
|
test('uploadPathsToJava 透传 uploadOss 参数', async () => {
|
|
let seen: boolean | undefined
|
|
const api = fakeApi(async (filePath, _relativePath, uploadOss) => {
|
|
seen = uploadOss
|
|
return { success: true, data: okData(filePath) as never }
|
|
})
|
|
|
|
await uploadPathsToJava(api, ['/a.xlsx'], { uploadOss: true })
|
|
|
|
assert.equal(seen, true)
|
|
})
|
|
|
|
test('uploadPathsToJava 任一失败即整体抛错并带上桥返回的文案', async () => {
|
|
const api = fakeApi(async (filePath) =>
|
|
filePath === '/bad.xlsx'
|
|
? { success: false, error: '磁盘读取失败' }
|
|
: { success: true, data: okData(filePath) as never },
|
|
)
|
|
|
|
await assert.rejects(() => uploadPathsToJava(api, ['/ok.xlsx', '/bad.xlsx']), /磁盘读取失败/)
|
|
})
|
|
|
|
test('uploadPathsToJava 失败无文案时回落到「上传失败:路径」', async () => {
|
|
const api = fakeApi(async () => ({ success: false }))
|
|
|
|
await assert.rejects(() => uploadPathsToJava(api, ['/x.xlsx']), /上传失败:\/x\.xlsx/)
|
|
})
|
|
|
|
test('uploadPathsToJava 缺上传桥默认抛错', async () => {
|
|
await assert.rejects(() => uploadPathsToJava(undefined, ['/a.xlsx']), /未提供文件上传能力/)
|
|
})
|
|
|
|
test('uploadPathsToJava 缺上传桥时 returnEmptyWhenUnavailable 返回空数组', async () => {
|
|
assert.deepEqual(await uploadPathsToJava(undefined, ['/a.xlsx'], { returnEmptyWhenUnavailable: true }), [])
|
|
})
|