feat: refs #7936 enhance getTotal fn & add unit tests
gitea/salix-front/pipeline/pr-dev This commit looks good
Details
gitea/salix-front/pipeline/pr-dev This commit looks good
Details
This commit is contained in:
parent
928affc127
commit
d916b47f4c
|
@ -1,10 +1,11 @@
|
||||||
import { toCurrency } from 'src/filters';
|
import { toCurrency } from 'src/filters';
|
||||||
|
|
||||||
export function getTotal(rows, key, opts = {}) {
|
export function getTotal(rows, key, opts = {}) {
|
||||||
const { currency, cb, decimalPlaces } = opts;
|
const { currency, cb, decimalPlaces, int } = opts;
|
||||||
const total = rows.reduce((acc, row) => acc + +(cb ? cb(row) : row[key] || 0), 0);
|
const total = rows.reduce((acc, row) => acc + +(cb ? cb(row) : row[key] || 0), 0);
|
||||||
|
const decimals = int ? 0 : decimalPlaces ?? 2;
|
||||||
|
|
||||||
return currency
|
return currency
|
||||||
? toCurrency(total, currency == 'default' ? undefined : currency)
|
? toCurrency(total, currency == 'default' ? undefined : currency)
|
||||||
: parseFloat(total).toFixed(decimalPlaces ?? 2);
|
: parseFloat(total).toFixed(decimals);
|
||||||
}
|
}
|
||||||
|
|
|
@ -154,7 +154,7 @@ const formatOpt = (row, { model, options }, prop) => {
|
||||||
{{ getTotal(rows, 'net') }}
|
{{ getTotal(rows, 'net') }}
|
||||||
</QTd>
|
</QTd>
|
||||||
<QTd>
|
<QTd>
|
||||||
{{ getTotal(rows, 'stems') }}
|
{{ getTotal(rows, 'stems', { int: true }) }}
|
||||||
</QTd>
|
</QTd>
|
||||||
<QTd />
|
<QTd />
|
||||||
</QTr>
|
</QTr>
|
||||||
|
|
|
@ -0,0 +1,55 @@
|
||||||
|
import { vi, describe, expect, it } from 'vitest';
|
||||||
|
import { getTotal } from 'src/composables/getTotal';
|
||||||
|
|
||||||
|
vi.mock('src/filters', () => ({
|
||||||
|
toCurrency: vi.fn((value, currency) => `${currency} ${value.toFixed(2)}`),
|
||||||
|
}));
|
||||||
|
|
||||||
|
describe('getTotal()', () => {
|
||||||
|
const rows = [
|
||||||
|
{ amount: 10.5, tax: 2.1 },
|
||||||
|
{ amount: 20.75, tax: 3.25 },
|
||||||
|
{ amount: 30.25, tax: 4.75 },
|
||||||
|
];
|
||||||
|
|
||||||
|
it('should calculate the total for a given key', () => {
|
||||||
|
const total = getTotal(rows, 'amount');
|
||||||
|
expect(total).toBe('61.50');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should calculate the total with a callback function', () => {
|
||||||
|
const total = getTotal(rows, null, { cb: (row) => row.amount + row.tax });
|
||||||
|
expect(total).toBe('71.60');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should format the total as currency', () => {
|
||||||
|
const total = getTotal(rows, 'amount', { currency: 'USD' });
|
||||||
|
expect(total).toBe('USD 61.50');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should format the total as currency with default currency', () => {
|
||||||
|
const total = getTotal(rows, 'amount', { currency: 'default' });
|
||||||
|
expect(total).toBe('undefined 61.50');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should calculate the total with integer formatting', () => {
|
||||||
|
const total = getTotal(rows, 'amount', { int: true });
|
||||||
|
expect(total).toBe('62');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should calculate the total with custom decimal places', () => {
|
||||||
|
const total = getTotal(rows, 'amount', { decimalPlaces: 1 });
|
||||||
|
expect(total).toBe('61.5');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle rows with missing keys', () => {
|
||||||
|
const rowsWithMissingKeys = [{ amount: 10.5 }, { amount: 20.75 }, {}];
|
||||||
|
const total = getTotal(rowsWithMissingKeys, 'amount');
|
||||||
|
expect(total).toBe('31.25');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle empty rows', () => {
|
||||||
|
const total = getTotal([], 'amount');
|
||||||
|
expect(total).toBe('0.00');
|
||||||
|
});
|
||||||
|
});
|
|
@ -1,34 +0,0 @@
|
||||||
import { vi, describe, expect, it, beforeAll } from 'vitest';
|
|
||||||
import { createWrapper, axios } from 'app/test/vitest/helper';
|
|
||||||
import InvoiceInIntrastat from 'src/pages/InvoiceIn/Card/InvoiceInIntrastat.vue';
|
|
||||||
|
|
||||||
describe('InvoiceInIntrastat', () => {
|
|
||||||
let vm;
|
|
||||||
|
|
||||||
beforeAll(() => {
|
|
||||||
vm = createWrapper(InvoiceInIntrastat, {
|
|
||||||
global: {
|
|
||||||
stubs: ['vnPaginate'],
|
|
||||||
mocks: {
|
|
||||||
fetch: vi.fn(),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}).vm;
|
|
||||||
vi.spyOn(axios, 'get').mockResolvedValue({ data: [{}] });
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('getTotal()', () => {
|
|
||||||
it('should correctly handle the sum', () => {
|
|
||||||
const invoceInIntrastat = [
|
|
||||||
{ amount: 10, stems: 162 },
|
|
||||||
{ amount: 20, stems: 21 },
|
|
||||||
];
|
|
||||||
|
|
||||||
const totalAmount = vm.getTotal(invoceInIntrastat, 'amount');
|
|
||||||
const totalStems = vm.getTotal(invoceInIntrastat, 'stems');
|
|
||||||
|
|
||||||
expect(totalAmount).toBe(10 + 20);
|
|
||||||
expect(totalStems).toBe(162 + 21);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -1,38 +0,0 @@
|
||||||
import { vi, describe, expect, it, beforeAll } from 'vitest';
|
|
||||||
import { createWrapper } 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('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);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
Loading…
Reference in New Issue