import { describe, it, expect, beforeEach, vi } from 'vitest' import { createCategoryDownloadConfig } from './download' import type { CategoryWidgetData } from './types' const data: CategoryWidgetData = [ [ { name: 'a', value: 1 }, { name: 'b', value: 2 }, ], [{ name: 'a', value: 10 }], ] let csvText = '' beforeEach(() => { csvText = '' vi.spyOn(URL, 'createObjectURL').mockReturnValue('blob:mock') vi.spyOn(URL, 'revokeObjectURL').mockImplementation(() => undefined) const RealBlob = global.Blob vi.stubGlobal( 'Blob', class extends RealBlob { constructor(parts: BlobPart[], opts?: BlobPropertyBag) { csvText = typeof parts[0] === 'string' ? parts[0] : '' super(parts, opts) } }, ) }) describe('createCategoryDownloadConfig', () => { it('CSV-only by default', () => { expect( createCategoryDownloadConfig({ filename: 'c', getData: () => data }).map( (i) => i.id, ), ).toEqual(['csv']) }) it('CSV item carries the canonical icon and short label', () => { const item = createCategoryDownloadConfig({ filename: 'c', getData: () => data, }).find((i) => i.id === 'csv')! expect(item.label).toBe('CSV') expect(item.icon).toBeTruthy() }) it('prepends PNG when getCaptureEl is provided', () => { const items = createCategoryDownloadConfig({ filename: 'c', getData: () => data, getCaptureEl: () => document.createElement('div'), }) expect(items.map((i) => i.id)).toEqual(['png', 'csv']) }) it('CSV resolve emits series × items with default names', async () => { const items = createCategoryDownloadConfig({ filename: 'c', getData: () => data, }) const handle = await items.find((i) => i.id === 'csv')!.resolve() expect(handle.filename).toBe('c.csv') expect(csvText).toBe( 'series,name,value\nseries_1,a,1\nseries_1,b,2\nseries_2,a,10', ) }) it('CSV honours supplied seriesNames', async () => { const items = createCategoryDownloadConfig({ filename: 'c', getData: () => data, seriesNames: ['baseline', 'override'], }) await items.find((i) => i.id === 'csv')!.resolve() expect(csvText.split('\n')[1]).toBe('baseline,a,1') expect(csvText.split('\n')[3]).toBe('override,a,10') }) })