Skip to content

Commit e2fe1c3

Browse files
committed
test: cover metadata parser and manager pack composables
1 parent 690e0e3 commit e2fe1c3

3 files changed

Lines changed: 697 additions & 0 deletions

File tree

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
import { beforeEach, describe, expect, it, vi } from 'vitest'
2+
3+
import { getFromWebmFile } from '@/scripts/metadata/ebml'
4+
import { getGltfBinaryMetadata } from '@/scripts/metadata/gltf'
5+
import { getFromIsobmffFile } from '@/scripts/metadata/isobmff'
6+
import { getDataFromJSON } from '@/scripts/metadata/json'
7+
import { getMp3Metadata } from '@/scripts/metadata/mp3'
8+
import { getOggMetadata } from '@/scripts/metadata/ogg'
9+
import { getWorkflowDataFromFile } from '@/scripts/metadata/parser'
10+
import { getSvgMetadata } from '@/scripts/metadata/svg'
11+
import {
12+
getAvifMetadata,
13+
getFlacMetadata,
14+
getLatentMetadata,
15+
getPngMetadata,
16+
getWebpMetadata
17+
} from '@/scripts/pnginfo'
18+
19+
vi.mock('@/scripts/metadata/ebml', () => ({ getFromWebmFile: vi.fn() }))
20+
vi.mock('@/scripts/metadata/gltf', () => ({ getGltfBinaryMetadata: vi.fn() }))
21+
vi.mock('@/scripts/metadata/isobmff', () => ({ getFromIsobmffFile: vi.fn() }))
22+
vi.mock('@/scripts/metadata/json', () => ({ getDataFromJSON: vi.fn() }))
23+
vi.mock('@/scripts/metadata/mp3', () => ({ getMp3Metadata: vi.fn() }))
24+
vi.mock('@/scripts/metadata/ogg', () => ({ getOggMetadata: vi.fn() }))
25+
vi.mock('@/scripts/metadata/svg', () => ({ getSvgMetadata: vi.fn() }))
26+
vi.mock('@/scripts/pnginfo', () => ({
27+
getAvifMetadata: vi.fn(),
28+
getFlacMetadata: vi.fn(),
29+
getLatentMetadata: vi.fn(),
30+
getPngMetadata: vi.fn(),
31+
getWebpMetadata: vi.fn()
32+
}))
33+
34+
function file(type: string, name = 'file') {
35+
return new File(['data'], name, { type })
36+
}
37+
38+
beforeEach(() => {
39+
vi.clearAllMocks()
40+
})
41+
42+
describe('getWorkflowDataFromFile', () => {
43+
it('routes png/avif/mp3/ogg/webm to their parsers and returns the result', async () => {
44+
vi.mocked(getPngMetadata).mockResolvedValue({ a: 1 } as never)
45+
expect(await getWorkflowDataFromFile(file('image/png'))).toEqual({ a: 1 })
46+
expect(getPngMetadata).toHaveBeenCalled()
47+
48+
await getWorkflowDataFromFile(file('image/avif'))
49+
expect(getAvifMetadata).toHaveBeenCalled()
50+
51+
await getWorkflowDataFromFile(file('audio/mpeg'))
52+
expect(getMp3Metadata).toHaveBeenCalled()
53+
54+
await getWorkflowDataFromFile(file('audio/ogg'))
55+
expect(getOggMetadata).toHaveBeenCalled()
56+
57+
await getWorkflowDataFromFile(file('video/webm'))
58+
expect(getFromWebmFile).toHaveBeenCalled()
59+
})
60+
61+
it('extracts workflow/prompt from webp, preferring lowercase keys', async () => {
62+
vi.mocked(getWebpMetadata).mockResolvedValue({
63+
workflow: 'wf',
64+
prompt: 'pr'
65+
} as never)
66+
expect(await getWorkflowDataFromFile(file('image/webp'))).toEqual({
67+
workflow: 'wf',
68+
prompt: 'pr'
69+
})
70+
})
71+
72+
it('falls back to capitalized webp keys when lowercase are absent', async () => {
73+
vi.mocked(getWebpMetadata).mockResolvedValue({
74+
Workflow: 'WF',
75+
Prompt: 'PR'
76+
} as never)
77+
expect(await getWorkflowDataFromFile(file('image/webp'))).toEqual({
78+
workflow: 'WF',
79+
prompt: 'PR'
80+
})
81+
})
82+
83+
it('handles both flac mime types and extracts workflow/prompt', async () => {
84+
vi.mocked(getFlacMetadata).mockResolvedValue({ workflow: 'w' } as never)
85+
expect(await getWorkflowDataFromFile(file('audio/flac'))).toEqual({
86+
workflow: 'w',
87+
prompt: undefined
88+
})
89+
expect(await getWorkflowDataFromFile(file('audio/x-flac'))).toEqual({
90+
workflow: 'w',
91+
prompt: undefined
92+
})
93+
})
94+
95+
it('falls back to capitalized flac keys when lowercase are absent', async () => {
96+
vi.mocked(getFlacMetadata).mockResolvedValue({
97+
Workflow: 'WF',
98+
Prompt: 'PR'
99+
} as never)
100+
expect(await getWorkflowDataFromFile(file('audio/flac'))).toEqual({
101+
workflow: 'WF',
102+
prompt: 'PR'
103+
})
104+
})
105+
106+
it('routes isobmff by mime type and by file extension', async () => {
107+
await getWorkflowDataFromFile(file('video/mp4'))
108+
await getWorkflowDataFromFile(file('video/quicktime'))
109+
await getWorkflowDataFromFile(file('video/x-m4v'))
110+
await getWorkflowDataFromFile(file('', 'clip.mp4'))
111+
await getWorkflowDataFromFile(file('', 'clip.mov'))
112+
await getWorkflowDataFromFile(file('', 'clip.m4v'))
113+
expect(getFromIsobmffFile).toHaveBeenCalledTimes(6)
114+
})
115+
116+
it('routes svg and gltf by mime type or extension', async () => {
117+
await getWorkflowDataFromFile(file('image/svg+xml'))
118+
await getWorkflowDataFromFile(file('', 'icon.svg'))
119+
expect(getSvgMetadata).toHaveBeenCalledTimes(2)
120+
121+
await getWorkflowDataFromFile(file('model/gltf-binary'))
122+
await getWorkflowDataFromFile(file('', 'model.glb'))
123+
expect(getGltfBinaryMetadata).toHaveBeenCalledTimes(2)
124+
})
125+
126+
it('routes latent/safetensors and json by extension or mime type', async () => {
127+
await getWorkflowDataFromFile(file('', 'x.latent'))
128+
await getWorkflowDataFromFile(file('', 'x.safetensors'))
129+
expect(getLatentMetadata).toHaveBeenCalledTimes(2)
130+
131+
await getWorkflowDataFromFile(file('application/json'))
132+
await getWorkflowDataFromFile(file('', 'x.json'))
133+
expect(getDataFromJSON).toHaveBeenCalledTimes(2)
134+
})
135+
136+
it('returns undefined for an unrecognized file', async () => {
137+
expect(
138+
await getWorkflowDataFromFile(file('application/zip', 'a.zip'))
139+
).toBe(undefined)
140+
})
141+
})

0 commit comments

Comments
 (0)