89 lines
3.1 KiB
TypeScript
89 lines
3.1 KiB
TypeScript
import { describe, expect, it } from 'vitest'
|
|
import { ensureDefaultBackends } from '../storage-backends'
|
|
import { getActiveBackend } from '../storage/resolver'
|
|
import { putImage } from '../storage'
|
|
import { updateImageThumb, updateImageTranscode } from '../image-index'
|
|
import { createBackupJob, getBackupJob } from './jobs'
|
|
import { runFullExportJob } from './full-export'
|
|
import { previewFullRestore } from './full-restore'
|
|
|
|
describe('previewFullRestore', () => {
|
|
it('counts media records instead of HLS sidecar files', async () => {
|
|
ensureDefaultBackends()
|
|
const key = 'videos/2026/10/preview-count.mp4'
|
|
const thumbKey = 'videos/2026/10/preview-count.webp'
|
|
const hlsKey = 'videos/2026/10/preview-count/index.m3u8'
|
|
const segmentKey = 'videos/2026/10/preview-count/seg000.ts'
|
|
const hlsOnlyKey = 'videos/2026/10/preview-count-hls-only.mp4'
|
|
const hlsOnlyThumbKey = 'videos/2026/10/preview-count-hls-only.webp'
|
|
const hlsOnlyPlaylistKey = 'videos/2026/10/preview-count-hls-only/index.m3u8'
|
|
const hlsOnlySegmentKey = 'videos/2026/10/preview-count-hls-only/seg000.ts'
|
|
const meta = {
|
|
originalName: 'preview-count.mp4',
|
|
uploadedAt: '2026-10-18T00:00:00.000Z',
|
|
contentType: 'video/mp4',
|
|
size: 1,
|
|
userId: 1,
|
|
mediaType: 'video' as const
|
|
}
|
|
|
|
await putImage(key, new Uint8Array([1]), meta)
|
|
const backend = await getActiveBackend()
|
|
await backend.put(thumbKey, new Uint8Array([2]), meta)
|
|
await backend.put(
|
|
hlsKey,
|
|
new TextEncoder().encode('#EXTM3U\n#EXTINF:6,\nseg000.ts\n'),
|
|
meta
|
|
)
|
|
await backend.put(segmentKey, new Uint8Array([3]), meta)
|
|
updateImageThumb(key, thumbKey)
|
|
updateImageTranscode(key, { status: 'done', hlsKey, progress: 100 })
|
|
|
|
await putImage(hlsOnlyKey, new Uint8Array([4]), meta)
|
|
await backend.put(hlsOnlyThumbKey, new Uint8Array([5]), meta)
|
|
await backend.put(
|
|
hlsOnlyPlaylistKey,
|
|
new TextEncoder().encode('#EXTM3U\n#EXTINF:6,\nseg000.ts\n'),
|
|
meta
|
|
)
|
|
await backend.put(hlsOnlySegmentKey, new Uint8Array([6]), meta)
|
|
updateImageThumb(hlsOnlyKey, hlsOnlyThumbKey)
|
|
updateImageTranscode(hlsOnlyKey, {
|
|
status: 'done',
|
|
hlsKey: hlsOnlyPlaylistKey,
|
|
progress: 100,
|
|
sourceDeleted: true
|
|
})
|
|
|
|
const exportJob = createBackupJob({ type: 'full_export', message: 'test' })
|
|
await runFullExportJob(exportJob.id, 'test')
|
|
const archivePath = getBackupJob(exportJob.id)!.outputPath!
|
|
|
|
for (const fileKey of [
|
|
key,
|
|
thumbKey,
|
|
hlsKey,
|
|
segmentKey,
|
|
hlsOnlyThumbKey,
|
|
hlsOnlyPlaylistKey,
|
|
hlsOnlySegmentKey
|
|
]) {
|
|
await backend.delete(fileKey)
|
|
}
|
|
|
|
const preview = await previewFullRestore(archivePath)
|
|
expect(preview.imageCount).toBe(2)
|
|
expect(preview.newImages).toBe(2)
|
|
expect(preview.conflictingImages).toBe(0)
|
|
|
|
await backend.put(
|
|
hlsOnlyPlaylistKey,
|
|
new TextEncoder().encode('#EXTM3U\n#EXTINF:6,\nseg000.ts\n'),
|
|
meta
|
|
)
|
|
const conflictPreview = await previewFullRestore(archivePath)
|
|
expect(conflictPreview.newImages).toBe(1)
|
|
expect(conflictPreview.conflictingImages).toBe(1)
|
|
})
|
|
})
|