Files
huangserva--3dcellforge/test/server-utils.test.mjs
T
2026-07-13 13:15:38 +08:00

248 lines
10 KiB
JavaScript

import { describe, it } from 'node:test'
import assert from 'node:assert/strict'
import { assertLocalDiagnosticsRequest, parseDataUrl, sanitizeFileName } from '../server/http-utils.mjs'
import { getModelExtension, shouldAttachTripoAuth, validateModelBuffer } from '../server/model-store.mjs'
import { findFirstValue, findModelUrl, isSuccessStatus } from '../server/object-utils.mjs'
import { buildFalInput, decodeFalTaskId, encodeFalTaskId, findFalModelFile, normalizeFalModelId, normalizeFalStatus } from '../server/providers/fal.mjs'
import { decodeRodinTaskId, encodeRodinTaskId, findRodinDownloadItem, normalizeRodinStatus } from '../server/providers/rodin.mjs'
import { extractJsonObject, normalizeVisionInsight } from '../server/providers/vision.mjs'
import { compactCustomCellsForStorage, persistCustomCells } from '../src/domain/cellPersistence.js'
describe('server utility functions', () => {
it('sanitizes uploaded filenames without losing readable words', () => {
assert.equal(sanitizeFileName('../plant cell ✨.png'), 'plant cell .png')
assert.equal(sanitizeFileName(''), 'asset-reference.png')
})
it('parses supported image data URLs and rejects tiny payloads', () => {
const dataUrl = `data:image/png;base64,${Buffer.alloc(1024).toString('base64')}`
const image = parseDataUrl(dataUrl)
assert.equal(image.mime, 'image/png')
assert.equal(image.ext, 'png')
assert.equal(image.buffer.length, 1024)
assert.throws(() => parseDataUrl('data:text/plain;base64,abc'), /Only PNG, JPEG, or WebP/)
assert.throws(() => parseDataUrl(`data:image/png;base64,${Buffer.alloc(8).toString('base64')}`), /too small/)
})
it('restricts diagnostics logs to local callers and localhost pages', () => {
assert.doesNotThrow(() => assertLocalDiagnosticsRequest({
socket: { remoteAddress: '127.0.0.1' },
headers: { origin: 'http://127.0.0.1:5174' },
}))
assert.doesNotThrow(() => assertLocalDiagnosticsRequest({
socket: { remoteAddress: '::ffff:127.0.0.1' },
headers: { referer: 'http://localhost:5174/logs' },
}))
assert.throws(
() => assertLocalDiagnosticsRequest({
socket: { remoteAddress: '192.168.1.8' },
headers: {},
}),
/only available from this machine/,
)
assert.throws(
() => assertLocalDiagnosticsRequest({
socket: { remoteAddress: '127.0.0.1' },
headers: { origin: 'https://example.com' },
}),
/only available to localhost pages/,
)
})
it('detects model extensions and validates GLB headers', () => {
assert.equal(getModelExtension('https://example.com/model.glb?download=1'), 'glb')
assert.equal(getModelExtension('scene.gltf'), 'gltf')
assert.throws(() => getModelExtension('model.obj'), /Only GLB/)
assert.doesNotThrow(() => validateModelBuffer(Buffer.concat([Buffer.from('glTF'), Buffer.alloc(28)]), 'glb'))
assert.throws(() => validateModelBuffer(Buffer.concat([Buffer.from('nope'), Buffer.alloc(28)]), 'glb'), /GLB files/)
})
it('does not attach Tripo auth to arbitrary model URLs', () => {
assert.equal(shouldAttachTripoAuth('https://example.com/model.glb'), false)
assert.equal(shouldAttachTripoAuth('http://127.0.0.1:8787/model.glb'), false)
})
it('finds nested task ids and preferred model URLs', () => {
const payload = {
data: {
task: { task_id: 'task-123' },
assets: [
{ url: 'https://example.com/preview.png' },
{ result: 'https://example.com/model.obj' },
{ result: 'https://example.com/model.glb?x=1' },
],
},
}
assert.equal(findFirstValue(payload, ['task_id']), 'task-123')
assert.equal(findModelUrl(payload), 'https://example.com/model.glb?x=1')
assert.equal(findModelUrl({ result: 'https://example.com/model.obj' }), '')
assert.equal(isSuccessStatus('finished'), true)
assert.equal(isSuccessStatus('running'), false)
})
it('normalizes model vision output for asset intelligence', () => {
const parsed = extractJsonObject('```json\n{"objectName":"Red Supercar","categoryId":"car","confidence":92,"tags":["Vehicle","Gloss"]}\n```')
const insight = normalizeVisionInsight(parsed, { provider: 'openai', model: 'test-model' })
assert.equal(insight.objectName, 'Red Supercar')
assert.equal(insight.categoryId, 'road')
assert.equal(insight.categoryLabel, 'Performance Vehicle')
assert.equal(insight.confidence, 0.92)
assert.deepEqual(insight.tags, ['vehicle', 'gloss'])
})
it('normalizes Rodin task ids, statuses, and downloads', () => {
const task = { taskUuid: 'task-uuid-1', subscriptionKey: 'subscription-key-1' }
const encoded = encodeRodinTaskId(task)
assert.deepEqual(decodeRodinTaskId(encoded), task)
assert.deepEqual(decodeRodinTaskId('legacy-task-id'), { taskUuid: 'legacy-task-id', subscriptionKey: 'legacy-task-id' })
assert.equal(normalizeRodinStatus(['Done', 'Done']), 'success')
assert.equal(normalizeRodinStatus(['Waiting']), 'queued')
assert.equal(normalizeRodinStatus(['Generating']), 'running')
assert.equal(normalizeRodinStatus(['Done', 'Failed']), 'failed')
assert.deepEqual(
findRodinDownloadItem({
list: [
{ name: 'preview.webp', url: 'https://example.com/preview.webp' },
{ name: 'model.glb', url: 'https://cdn.example.com/signed-download' },
],
}),
{ name: 'model.glb', url: 'https://cdn.example.com/signed-download' },
)
})
it('normalizes Fal model ids, task ids, inputs, statuses, and model files', () => {
const task = { modelId: 'tripo3d/tripo/v2.5/image-to-3d', requestId: 'fal-request-1' }
const encoded = encodeFalTaskId(task)
assert.deepEqual(decodeFalTaskId(encoded), task)
assert.equal(normalizeFalModelId('tripo3d/tripo/v2.5/image-to-3d'), 'tripo3d/tripo/v2.5/image-to-3d')
assert.equal(normalizeFalModelId('fal-ai/tripo3d/v2.5/image-to-3d'), 'fal-ai/hunyuan3d/v2')
assert.equal(normalizeFalStatus('IN_QUEUE'), 'queued')
assert.equal(normalizeFalStatus('IN_PROGRESS'), 'running')
assert.equal(normalizeFalStatus('COMPLETED'), 'success')
assert.equal(normalizeFalStatus('ERROR'), 'failed')
assert.deepEqual(
buildFalInput('fal-ai/hunyuan3d/v2', 'https://cdn.example.com/input.png', { seed: 12 }),
{ input_image_url: 'https://cdn.example.com/input.png', seed: 12 },
)
assert.deepEqual(
buildFalInput('fal-ai/hyper3d/rodin', 'https://cdn.example.com/input.png', { prompt: 'a detailed cell', seed: 7 }),
{
geometry_file_format: 'glb',
input_image_urls: ['https://cdn.example.com/input.png'],
material: 'PBR',
prompt: 'a detailed cell',
quality: 'medium',
seed: 7,
tier: 'Regular',
},
)
assert.deepEqual(
findFalModelFile({
base_model: { url: 'https://cdn.example.com/base.glb' },
pbr_model: { url: 'https://cdn.example.com/file', content_type: 'model/gltf-binary' },
}),
{ url: 'https://cdn.example.com/file', ext: 'glb' },
)
})
it('compacts generated custom cells without dropping pending retry images first', () => {
const generated = {
id: 'custom-ready',
imageUrl: 'data:image/webp;base64,large',
thumbnailUrl: 'data:image/webp;base64,thumb',
generation: { status: 'success', modelUrl: '/api/3d/local-model/task.glb', rawModelUrl: 'https://signed.example.com/model.glb', message: 'ready' },
}
const pending = {
id: 'custom-pending',
imageUrl: 'data:image/webp;base64,source',
generation: { status: 'failed', modelUrl: '', rawModelUrl: '', message: 'retry possible' },
}
assert.deepEqual(
compactCustomCellsForStorage([generated, pending], 'generated-previews').map((cell) => cell.imageUrl),
['', pending.imageUrl],
)
assert.equal(compactCustomCellsForStorage([generated, pending], 'generated-previews')[0].thumbnailUrl, generated.thumbnailUrl)
assert.deepEqual(
compactCustomCellsForStorage([generated, pending], 'minimal').map((cell) => ({
imageUrl: cell.imageUrl,
thumbnailUrl: cell.thumbnailUrl,
rawModelUrl: cell.generation.rawModelUrl,
})),
[
{ imageUrl: '', thumbnailUrl: generated.thumbnailUrl, rawModelUrl: '' },
{ imageUrl: '', thumbnailUrl: undefined, rawModelUrl: '' },
],
)
})
it('falls back to compact custom-cell storage when localStorage quota fails', () => {
const writes = []
global.window = {
localStorage: {
setItem(key, value) {
writes.push({ key, value: JSON.parse(value) })
if (writes.length === 1) throw new Error('quota exceeded')
},
},
}
try {
const result = persistCustomCells([
{
id: 'custom-ready',
imageUrl: 'data:image/webp;base64,large',
thumbnailUrl: 'data:image/webp;base64,thumb',
generation: { status: 'success', modelUrl: '/api/3d/local-model/task.glb', rawModelUrl: 'https://signed.example.com/model.glb', message: 'ready' },
},
])
assert.equal(result.stored, true)
assert.equal(result.compacted, true)
assert.equal(result.cells[0].imageUrl, '')
assert.equal(result.cells[0].thumbnailUrl, 'data:image/webp;base64,thumb')
assert.equal(result.cells[0].generation.modelUrl, '/api/3d/local-model/task.glb')
assert.equal(writes.length, 2)
} finally {
delete global.window
}
})
it('keeps compacted custom-cell array identity when storage remains unavailable', () => {
global.window = {
localStorage: {
setItem() {
throw new Error('storage unavailable')
},
},
}
try {
const compacted = [
{
id: 'custom-ready',
imageUrl: '',
previewDropped: true,
generation: { status: 'success', modelUrl: '/api/3d/local-model/task.glb', rawModelUrl: '', message: 'ready' },
},
]
const result = persistCustomCells(compacted)
assert.equal(result.stored, false)
assert.equal(result.compacted, true)
assert.equal(result.cells, compacted)
} finally {
delete global.window
}
})
})