mirror of
https://github.com/hellodigua/ChatLab.git
synced 2026-10-25 17:54:34 +08:00
feat(demo): reduce example sessions
This commit is contained in:
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'
|
||||
|
||||
@@ -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 () => {
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in new issue
Block a user