import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { saveCsv } from '@/shared/downloadCsv' describe('saveCsv', () => { beforeEach(() => vi.stubGlobal('URL', { createObjectURL: vi.fn(), revokeObjectURL: vi.fn() })) afterEach(() => { vi.restoreAllMocks(); vi.unstubAllGlobals() }) it('downloads the provided Blob with the requested file name and always revokes the URL', () => { const blob = new Blob(['id,status\n1,ACTIVE\n'], { type: 'text/csv;charset=UTF-8' }) const createObjectURL = vi.mocked(URL.createObjectURL).mockReturnValue('blob:overseas-master-data') const revokeObjectURL = vi.mocked(URL.revokeObjectURL) const click = vi.spyOn(HTMLAnchorElement.prototype, 'click').mockImplementation(() => undefined) saveCsv(blob, 'vehicles.csv') expect(createObjectURL).toHaveBeenCalledWith(blob) expect(click).toHaveBeenCalledOnce() expect(revokeObjectURL).toHaveBeenCalledWith('blob:overseas-master-data') }) it('revokes the Blob URL even when the browser click fails', () => { vi.mocked(URL.createObjectURL).mockReturnValue('blob:failed-download') const revokeObjectURL = vi.mocked(URL.revokeObjectURL) vi.spyOn(HTMLAnchorElement.prototype, 'click').mockImplementation(() => { throw new Error('browser blocked') }) expect(() => saveCsv(new Blob(['csv']), 'quotes.csv')).toThrow('browser blocked') expect(revokeObjectURL).toHaveBeenCalledWith('blob:failed-download') }) })