import { vi, describe, expect, it, beforeAll } from 'vitest';
import { createWrapper, axios } from 'app/test/vitest/helper';
import InvoiceInVat from 'src/pages/InvoiceIn/Card/InvoiceInVat.vue';

describe('InvoiceInVat', () => {
    let vm;

    beforeAll(() => {
        vm = createWrapper(InvoiceInVat, {
            global: {
                stubs: [],
                mocks: {
                    fetch: vi.fn(),
                },
            },
        }).vm;
    });

    describe('addExpense()', () => {
        beforeAll(() => {
            vi.spyOn(axios, 'post').mockResolvedValue({ data: [] });
            vi.spyOn(axios, 'get').mockResolvedValue({ data: [] });
            vi.spyOn(vm.quasar, 'notify');
        });

        it('should throw an error when the code property is undefined', async () => {
            await vm.addExpense();

            expect(vm.quasar.notify).toHaveBeenCalledWith(
                expect.objectContaining({
                    message: `The code can't be empty`,
                    type: 'negative',
                })
            );
        });

        it('should correctly handle expense addition', async () => {
            vm.newExpense = {
                code: 123,
                isWithheld: false,
                description: 'Descripción del gasto',
            };

            await vm.addExpense();
            expect(vm.quasar.notify).toHaveBeenCalledWith(
                expect.objectContaining({
                    message: 'Data saved',
                    type: 'positive',
                })
            );
        });
    });

    describe('taxRate()', () => {
        it('should correctly compute the tax rate', () => {
            const invoiceInTax = { taxableBase: 100, taxTypeSageFk: 1 };
            vm.sageTaxTypes = [
                { id: 1, rate: 10 },
                { id: 2, rate: 20 },
            ];
            const result = vm.taxRate(invoiceInTax);
            expect(result).toBe((10 / 100) * 100);
        });

        it('should return 0 if there is not tax rate', () => {
            const invoiceInTax = { taxableBase: 100, taxTypeSageFk: 1 };
            vm.sageTaxTypes = [];

            const result = vm.taxRate(invoiceInTax);
            expect(result).toBe(0);
        });
    });
});
