feat(demo): reduce example sessions

This commit is contained in:
digua committed 2026-07-26 12:12:47 +08:00
1 parent 1f0528ebd0
commit 964221537f
4 files changed
+31 -77

No files matched your search

@@ -40,11 +40,10 @@ describe('importDemoSessions', () => {
const sourceLatest = sourceTimestamp('2000-12-10', '22:30:00')
const documents = [
createDemoDocument('group', [sourceTimestamp('2000-02-01', '09:00:00'), sourceLatest]),
createDemoDocument('private-a', [sourceTimestamp('2000-02-01', '08:30:00')]),
createDemoDocument('private-b', [sourceTimestamp('2000-06-01', '10:00:00')]),
createDemoDocument('private-c', [sourceTimestamp('2000-12-09', '21:00:00')]),
createDemoDocument('private-wukong', [sourceTimestamp('2000-06-01', '10:00:00')]),
]
let downloadIndex = 0
const requestedUrls: string[] = []
const imported: Array<{ name: string; document: any }> = []
const progress: DemoImportProgress[] = []
const now = new Date('2026-07-25T04:00:00.000Z')
@@ -53,8 +52,9 @@ describe('importDemoSessions', () => {
locale: 'cn',
tempPrefix: 'demo-service-test-',
targetTimeZone: 'America/Los_Angeles',
fetchImpl: async function (this: unknown) {
fetchImpl: async function (this: unknown, input) {
assert.equal(this, globalThis)
requestedUrls.push(String(input))
return new Response(documents[downloadIndex++], { status: 200 })
},
now: () => now,
@@ -73,25 +73,19 @@ describe('importDemoSessions', () => {
assert.deepEqual(result, {
success: true,
groupSessionId: 'session-1',
privateSessionIds: ['session-2', 'session-3', 'session-4'],
privateSessionIds: ['session-2'],
})
assert.equal(imported.length, 4)
assert.deepEqual(requestedUrls, [
'https://chatlab.fun/assets/demo/cn/demo-group.json',
'https://chatlab.fun/assets/demo/cn/demo-private-B-wukong.json',
])
assert.equal(imported.length, 2)
assert.equal(imported[0].document.messages[1].timestamp, latestTimestamp)
assert.equal(imported[1].document.messages[0].timestamp, sourceTimestamp('2000-02-01', '08:30:00') + offset)
assert.equal(imported[1].document.messages[0].timestamp, sourceTimestamp('2000-06-01', '10:00:00') + offset)
assert.ok(imported.every(({ document }) => document.chatlab.exportedAt === Math.floor(now.getTime() / 1000)))
assert.deepEqual(
progress.map(({ stage, current }) => `${stage}:${current}`),
[
'downloading:1',
'downloading:2',
'downloading:3',
'downloading:4',
'importing:1',
'importing:2',
'importing:3',
'importing:4',
'done:4',
]
['downloading:1', 'downloading:2', 'importing:1', 'importing:2', 'done:2']
)
assert.ok(imported.every(({ name }) => !fs.existsSync(name)))
})
@@ -100,12 +94,7 @@ describe('importDemoSessions', () => {
let importCount = 0
let downloadIndex = 0
const progress: DemoImportProgress[] = []
const responses = [
createDemoDocument('group', [sourceTimestamp('2000-12-10', '22:30:00')]),
'x'.repeat(128),
createDemoDocument('private-b', [sourceTimestamp('2000-12-09', '21:00:00')]),
createDemoDocument('private-c', [sourceTimestamp('2000-12-08', '21:00:00')]),
]
const responses = [createDemoDocument('group', [sourceTimestamp('2000-12-10', '22:30:00')]), 'x'.repeat(128)]
const result = await importDemoSessions({
locale: 'en',
@@ -131,9 +120,7 @@ describe('importDemoSessions', () => {
const rolledBackSessionIds: string[] = []
const documents = [
createDemoDocument('group', [sourceTimestamp('2000-12-10', '22:30:00')]),
createDemoDocument('private-a', [sourceTimestamp('2000-12-09', '21:00:00')]),
createDemoDocument('private-b', [sourceTimestamp('2000-12-08', '21:00:00')]),
createDemoDocument('private-c', [sourceTimestamp('2000-12-07', '21:00:00')]),
createDemoDocument('private-wukong', [sourceTimestamp('2000-12-08', '21:00:00')]),
]
const result = await importDemoSessions({
@@ -142,7 +129,7 @@ describe('importDemoSessions', () => {
fetchImpl: async () => new Response(documents[downloadIndex++], { status: 200 }),
importFile: async () => {
importCount += 1
if (importCount === 3) return { success: false, error: 'third import failed' }
if (importCount === 2) return { success: false, error: 'second import failed' }
return { success: true, sessionId: `session-${importCount}` }
},
deleteSession: async (sessionId) => {
@@ -151,7 +138,7 @@ describe('importDemoSessions', () => {
})
assert.equal(result.success, false)
assert.match(result.error ?? '', /third import failed/)
assert.deepEqual(rolledBackSessionIds, ['session-2', 'session-1'])
assert.match(result.error ?? '', /second import failed/)
assert.deepEqual(rolledBackSessionIds, ['session-1'])
})
})
@@ -5,12 +5,7 @@ import { appLogger } from '../logging/app-logger'
import { createChatLabTempDir, removeChatLabTempDir } from '../temp-workspace'
const DEMO_BASE_URL = 'https://chatlab.fun/assets/demo'
const DEMO_FILES = [
'demo-group.json',
'demo-private-A-cuilan.json',
'demo-private-B-wukong.json',
'demo-private-C-spider.json',
] as const
const DEMO_FILES = ['demo-group.json', 'demo-private-B-wukong.json'] as const
export interface DemoImportProgress {
stage: 'downloading' | 'importing' | 'done' | 'error'
+12 -35
View File
@@ -125,16 +125,14 @@ describe('BrowserImportAdapter', () => {
await assert.rejects(adapter.incrementalImport('session-one', createFile()), /not available in Web WASM/i)
})
it('downloads and imports the four localized demo files through the browser runtime', async () => {
it('downloads and imports the group and Wukong demo files through the browser runtime', async () => {
const requestedUrls: string[] = []
const importedFiles: string[] = []
const importedDocuments: any[] = []
const sourceLatest = demoTimestamp('2000-12-10', '22:30:00')
const documents = [
createDemoDocument('group', [demoTimestamp('2000-02-01', '09:00:00'), sourceLatest]),
createDemoDocument('private-a', [demoTimestamp('2000-02-01', '08:30:00')]),
createDemoDocument('private-b', [demoTimestamp('2000-06-01', '10:00:00')]),
createDemoDocument('private-c', [demoTimestamp('2000-12-09', '21:00:00')]),
createDemoDocument('private-wukong', [demoTimestamp('2000-06-01', '10:00:00')]),
]
const now = new Date('2026-07-25T04:00:00.000Z')
let downloadIndex = 0
@@ -170,40 +168,21 @@ describe('BrowserImportAdapter', () => {
const result = await adapter.importDemo('cn', (event) => progress.push(event.stage))
assert.deepEqual(requestedUrls, [
'/api/demo/cn/demo-group.json',
'/api/demo/cn/demo-private-A-cuilan.json',
'/api/demo/cn/demo-private-B-wukong.json',
'/api/demo/cn/demo-private-C-spider.json',
])
assert.deepEqual(importedFiles, [
'demo-group.json',
'demo-private-A-cuilan.json',
'demo-private-B-wukong.json',
'demo-private-C-spider.json',
])
assert.deepEqual(requestedUrls, ['/api/demo/cn/demo-group.json', '/api/demo/cn/demo-private-B-wukong.json'])
assert.deepEqual(importedFiles, ['demo-group.json', 'demo-private-B-wukong.json'])
const expectedLatest = new Date(now)
expectedLatest.setDate(expectedLatest.getDate() - 1)
expectedLatest.setHours(22, 30, 0, 0)
const latestTimestamp = Math.floor(expectedLatest.getTime() / 1000)
const offset = latestTimestamp - sourceLatest
assert.equal(importedDocuments[0].messages[1].timestamp, latestTimestamp)
assert.equal(importedDocuments[1].messages[0].timestamp, demoTimestamp('2000-02-01', '08:30:00') + offset)
assert.equal(importedDocuments[1].messages[0].timestamp, demoTimestamp('2000-06-01', '10:00:00') + offset)
assert.ok(importedDocuments.every((document) => document.chatlab.exportedAt === Math.floor(now.getTime() / 1000)))
assert.deepEqual(progress, [
'downloading',
'downloading',
'downloading',
'downloading',
'importing',
'importing',
'importing',
'importing',
])
assert.deepEqual(progress, ['downloading', 'downloading', 'importing', 'importing'])
assert.deepEqual(result, {
success: true,
groupSessionId: 'session-1',
privateSessionIds: ['session-2', 'session-3', 'session-4'],
privateSessionIds: ['session-2'],
})
})
@@ -272,13 +251,11 @@ describe('BrowserImportAdapter', () => {
it('deletes sessions created earlier in the batch when a later demo import fails', async () => {
const deletedSessionIds: string[] = []
const importError = new Error('third import failed')
const importError = new Error('second import failed')
let importCount = 0
const documents = [
createDemoDocument('group', [demoTimestamp('2000-12-10', '22:30:00')]),
createDemoDocument('private-a', [demoTimestamp('2000-12-09', '21:00:00')]),
createDemoDocument('private-b', [demoTimestamp('2000-12-08', '20:00:00')]),
createDemoDocument('private-c', [demoTimestamp('2000-12-07', '19:00:00')]),
createDemoDocument('private-wukong', [demoTimestamp('2000-12-08', '20:00:00')]),
]
let downloadIndex = 0
const rpc = {
@@ -288,7 +265,7 @@ describe('BrowserImportAdapter', () => {
): Promise<WebRuntimeTaskResult<T>> {
if (type === 'import.start') {
importCount += 1
if (importCount === 3) throw importError
if (importCount === 2) throw importError
return {
sessionId: `session-${importCount}`,
formatId: 'chatlab',
@@ -314,8 +291,8 @@ describe('BrowserImportAdapter', () => {
const result = await adapter.importDemo('en')
assert.equal(result.success, false)
assert.match(result.error ?? '', /third import failed/)
assert.deepEqual(deletedSessionIds, ['session-2', 'session-1'])
assert.match(result.error ?? '', /second import failed/)
assert.deepEqual(deletedSessionIds, ['session-1'])
})
it('forwards browser-safe format identifiers to the worker runtime', async () => {
+1 -6
View File
@@ -18,12 +18,7 @@ import type {
const DEMO_BASE_URL = '/api/demo'
const DEMO_DOWNLOAD_TIMEOUT_MS = 60_000
const DEMO_FILES = [
'demo-group.json',
'demo-private-A-cuilan.json',
'demo-private-B-wukong.json',
'demo-private-C-spider.json',
] as const
const DEMO_FILES = ['demo-group.json', 'demo-private-B-wukong.json'] as const
export class BrowserImportAdapter implements ImportAdapter {
private activeImport: AbortController | undefined