import { mock } from 'jest-mock-extended'; import type { IBinaryData, IExecuteFunctions, INodeExecutionData } from 'n8n-workflow'; import { type WorkSheet, utils as xlsxUtils, write as xlsxWrite } from 'xlsx'; import { convertJsonToSpreadsheetBinary } from '@utils/binary'; jest.mock('xlsx', () => ({ utils: { json_to_sheet: jest.fn(), }, write: jest.fn(), })); describe('convertJsonToSpreadsheetBinary', () => { const helpers = mock(); const executeFunctions = mock({ helpers }); const items = [ { json: { key1: 'value1', key2: 'value2' } }, { json: { key1: 'value3', key2: 'value4' } }, ] as INodeExecutionData[]; const mockSheet = mock(); const workBook = { SheetNames: ['Sheet'], Sheets: { Sheet: mockSheet, }, }; const mockBuffer = mock(); const mockBinaryData = mock({ id: 'binaryId' }); beforeEach(() => { jest.clearAllMocks(); (xlsxUtils.json_to_sheet as jest.Mock).mockReturnValue(mockSheet); (xlsxWrite as jest.Mock).mockReturnValue(mockBuffer); helpers.prepareBinaryData.mockResolvedValue(mockBinaryData); }); describe('for fileFormat xlsx', () => { it('should convert from JSON', async () => { const result = await convertJsonToSpreadsheetBinary.call(executeFunctions, items, 'xlsx', {}); expect(result).toEqual(mockBinaryData); expect(xlsxUtils.json_to_sheet).toHaveBeenCalledWith( items.map((item) => item.json), undefined, ); expect(xlsxWrite).toHaveBeenCalledWith(workBook, { bookType: 'xlsx', bookSST: false, type: 'buffer', }); expect(helpers.prepareBinaryData).toHaveBeenCalledWith(mockBuffer, 'spreadsheet.xlsx'); }); }); describe('for fileFormat csv', () => { it('should convert from JSON', async () => { const result = await convertJsonToSpreadsheetBinary.call(executeFunctions, items, 'csv', {}); expect(result).toEqual(mockBinaryData); expect(xlsxUtils.json_to_sheet).toHaveBeenCalledWith( items.map((item) => item.json), undefined, ); expect(xlsxWrite).toHaveBeenCalledWith(workBook, { bookType: 'csv', bookSST: false, type: 'buffer', }); expect(helpers.prepareBinaryData).toHaveBeenCalledWith(mockBuffer, 'spreadsheet.csv'); }); it('should handle custom delimiter', async () => { const result = await convertJsonToSpreadsheetBinary.call(executeFunctions, items, 'csv', { delimiter: ';', }); expect(result).toEqual(mockBinaryData); expect(xlsxUtils.json_to_sheet).toHaveBeenCalledWith( items.map((item) => item.json), undefined, ); expect(xlsxWrite).toHaveBeenCalledWith(workBook, { bookType: 'csv', bookSST: false, type: 'buffer', FS: ';', }); expect(helpers.prepareBinaryData).toHaveBeenCalledWith(mockBuffer, 'spreadsheet.csv'); }); }); });