30 lines
1.4 KiB
TypeScript
30 lines
1.4 KiB
TypeScript
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')
|
|
})
|
|
})
|