import { beforeEach, describe, expect, it, vi } from 'vitest'; import * as PDFFunctions from '../../../shared/PDF-functions'; import FormatTyp from '../../../shared/enums/common.enum'; import { TRodzajFaktury } from '../../../shared/consts/const'; import { Zamowienie } from '../../types/fa1.types'; import { generateZamowienie } from './Zamowienie'; import { ZamowienieKorekta } from '../../enums/invoice.enums'; vi.mock('../../../shared/PDF-functions', () => ({ createHeader: vi.fn(), createLabelTextArray: vi.fn(), formatText: vi.fn(), getContentTable: vi.fn(), getTable: vi.fn(), })); describe(generateZamowienie.name, () => { beforeEach(() => { vi.clearAllMocks(); }); describe('when orderData is undefined', () => { it('should return an empty array', () => { const result = generateZamowienie( undefined, ZamowienieKorekta.BeforeCorrection, '100', TRodzajFaktury.ZAL, 'PLN' ); expect(result).toEqual([]); }); }); describe('when orderData is defined', () => { const mockOrderData: Zamowienie = { ZamowienieWiersz: [ { NrWierszaZam: { _text: '1' }, P_7Z: { _text: 'Towar 1' }, P_9AZ: { _text: '100' }, P_8BZ: { _text: '2' }, }, ], WartoscZamowienia: { _text: '200' }, } as any; beforeEach(() => { vi.mocked(PDFFunctions.getTable).mockReturnValue([ { NrWierszaZam: { _text: '1' }, P_7Z: { _text: 'Towar 1' }, P_9AZ: { _text: '100' }, P_8BZ: { _text: '2' }, }, ] as any); vi.mocked(PDFFunctions.getContentTable).mockReturnValue({ content: { table: {} } as any, fieldsWithValue: ['P_11'], }); vi.mocked(PDFFunctions.createHeader).mockReturnValue('Header' as any); vi.mocked(PDFFunctions.formatText).mockReturnValue('200 PLN' as any); }); it('should call getTable with ZamowienieWiersz', () => { generateZamowienie(mockOrderData, ZamowienieKorekta.BeforeCorrection, '100', TRodzajFaktury.ZAL, 'PLN'); expect(PDFFunctions.getTable).toHaveBeenCalledWith(mockOrderData.ZamowienieWiersz); }); it('should fill NrWierszaZam if it is empty', () => { const dataWithEmptyNr = { ...mockOrderData, ZamowienieWiersz: [ { NrWierszaZam: { _text: '' }, P_7Z: { _text: 'Towar 1' }, }, ], } as any; vi.mocked(PDFFunctions.getTable).mockReturnValue([ { NrWierszaZam: { _text: '' }, P_7Z: { _text: 'Towar 1' }, }, ] as any); generateZamowienie( dataWithEmptyNr, ZamowienieKorekta.BeforeCorrection, '100', TRodzajFaktury.ZAL, 'PLN' ); const tableCall = vi.mocked(PDFFunctions.getTable).mock.results[0].value; expect(tableCall[0].NrWierszaZam._text).toBe('1'); }); describe('price formatting', () => { it('should use FormatTyp.CurrencyAbs for BeforeCorrection', () => { vi.mocked(PDFFunctions.getContentTable).mockReturnValue({ content: { table: {} } as any, fieldsWithValue: ['field1', 'field2', 'field3'], }); generateZamowienie( mockOrderData, ZamowienieKorekta.BeforeCorrection, '100', TRodzajFaktury.ZAL, 'PLN' ); const calls = vi.mocked(PDFFunctions.getContentTable).mock.calls; const header = calls[0][0]; const cenaNetto = header.find((h: any) => h.name === 'P_9AZ'); expect(cenaNetto?.format).toBe(FormatTyp.CurrencyAbs); }); it('should use FormatTyp.Currency when not BeforeCorrection', () => { vi.mocked(PDFFunctions.getContentTable).mockReturnValue({ content: { table: {} } as any, fieldsWithValue: ['field1', 'field2', 'field3'], }); generateZamowienie( mockOrderData, ZamowienieKorekta.AfterCorrection, '100', TRodzajFaktury.KOR_ZAL, 'PLN' ); const calls = vi.mocked(PDFFunctions.getContentTable).mock.calls; const header = calls[0][0]; const cenaNetto = header.find((h: any) => h.name === 'P_9AZ'); expect(cenaNetto?.format).toBe(FormatTyp.Currency); }); }); describe('table generation', () => { it('should generate one table when fieldsWithValue.length <= 8', () => { vi.mocked(PDFFunctions.getContentTable).mockReturnValue({ content: { table: {} } as any, fieldsWithValue: ['field1', 'field2', 'field3'], }); const result = generateZamowienie( mockOrderData, ZamowienieKorekta.BeforeCorrection, '100', TRodzajFaktury.ZAL, 'PLN' ); expect(PDFFunctions.getContentTable).toHaveBeenCalledTimes(1); expect(result[0]).toBeDefined(); }); it('should generate two tables when fieldsWithValue.length > 8', () => { vi.mocked(PDFFunctions.getContentTable) .mockReturnValueOnce({ content: null, fieldsWithValue: Array(9).fill('field'), }) .mockReturnValueOnce({ content: { table: {} } as any, fieldsWithValue: ['field1', 'field2'], }) .mockReturnValueOnce({ content: { table: {} } as any, fieldsWithValue: ['field3', 'field4'], }); generateZamowienie( mockOrderData, ZamowienieKorekta.BeforeCorrection, '100', TRodzajFaktury.ZAL, 'PLN' ); expect(PDFFunctions.getContentTable).toHaveBeenCalledTimes(1); }); }); describe('payment amount description', () => { it('should add description for advance invoice (ZAL) when p_15 > 0', () => { vi.mocked(PDFFunctions.createLabelTextArray).mockReturnValue(['Label', 'Value'] as any); const result = generateZamowienie( mockOrderData, ZamowienieKorekta.BeforeCorrection, '100', TRodzajFaktury.ZAL, 'PLN' ); expect(PDFFunctions.createLabelTextArray).toHaveBeenCalledWith([ { value: 'Otrzymana kwota zapłaty (zaliczki): ', formatTyp: FormatTyp.LabelGreater }, { value: '100', formatTyp: FormatTyp.CurrencyGreater }, ]); }); it('should not add description for ZAL invoice when p_15 = 0', () => { vi.mocked(PDFFunctions.createLabelTextArray).mockClear(); generateZamowienie(mockOrderData, ZamowienieKorekta.BeforeCorrection, '0', TRodzajFaktury.ZAL, 'PLN'); expect(PDFFunctions.createLabelTextArray).not.toHaveBeenCalled(); }); it('should add description for advance correction (KOR_ZAL) when not BeforeCorrection', () => { vi.mocked(PDFFunctions.createLabelTextArray).mockReturnValue(['Label', 'Value'] as any); generateZamowienie( mockOrderData, ZamowienieKorekta.AfterCorrection, '150', TRodzajFaktury.KOR_ZAL, 'PLN' ); expect(PDFFunctions.createLabelTextArray).toHaveBeenCalledWith([ { value: 'Kwota należności ogółem: ', formatTyp: FormatTyp.LabelGreater }, { value: '150', formatTyp: FormatTyp.CurrencyGreater }, ]); }); }); describe('price text', () => { it('should display "netto" when P_11 is in fieldsWithValue', () => { vi.mocked(PDFFunctions.getContentTable).mockReturnValue({ content: { table: {} } as any, fieldsWithValue: ['P_11', 'P_7Z'], }); const result = generateZamowienie( mockOrderData, ZamowienieKorekta.BeforeCorrection, '100', TRodzajFaktury.ZAL, 'EUR' ); const stack = (result[0] as any).stack; expect(stack[1]).toContain('netto'); expect(stack[1]).toContain('EUR'); }); it('should display "brutto" when P_11 is not in fieldsWithValue', () => { vi.mocked(PDFFunctions.getContentTable).mockReturnValue({ content: { table: {} } as any, fieldsWithValue: ['P_7Z', 'P_9AZ'], }); const result = generateZamowienie( mockOrderData, ZamowienieKorekta.BeforeCorrection, '100', TRodzajFaktury.ZAL, 'USD' ); const stack = (result[0] as any).stack; expect(stack[1]).toContain('brutto'); expect(stack[1]).toContain('USD'); }); }); it('should call createHeader with correct parameter', () => { generateZamowienie(mockOrderData, ZamowienieKorekta.BeforeCorrection, '100', TRodzajFaktury.ZAL, 'PLN'); expect(PDFFunctions.createHeader).toHaveBeenCalledWith(ZamowienieKorekta.BeforeCorrection); }); it('should format order value', () => { generateZamowienie(mockOrderData, ZamowienieKorekta.BeforeCorrection, '100', TRodzajFaktury.ZAL, 'PLN'); expect(PDFFunctions.formatText).toHaveBeenCalledWith('200', FormatTyp.Currency); }); }); });