2026-10-16 11:07:38 -05:00
|
|
|
import { describe, expect, it } from 'vitest';
|
|
|
|
|
import { SL_RESOURCE_MAP, SL_RESOURCES } from './sl-resources.js';
|
|
|
|
|
|
|
|
|
|
describe('recursos del Service Layer', () => {
|
|
|
|
|
it('no incluye jamás EmployeesInfo (tiene U_WEB_PASS)', () => {
|
|
|
|
|
expect(SL_RESOURCE_MAP.has('EmployeesInfo')).toBe(false);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('los nombres no se repiten', () => {
|
|
|
|
|
expect(new Set(SL_RESOURCES.map((r) => r.name)).size).toBe(SL_RESOURCES.length);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('las series de un documento se piden con una acción de solo consulta, para cualquier sesión', () => {
|
|
|
|
|
const r = SL_RESOURCE_MAP.get('SeriesService_GetDocumentSeries')!;
|
|
|
|
|
expect(r.methods).toEqual(['POST']);
|
|
|
|
|
expect(r.write).toBeNull();
|
|
|
|
|
expect(r.read).toBeNull();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('dimensiones, proyectos y cuentas son catálogos de solo lectura', () => {
|
2026-10-16 11:57:42 -05:00
|
|
|
for (const name of ['FactoringIndicators', 'DistributionRules', 'Projects', 'ChartOfAccounts', 'AdditionalExpenses', 'ItemGroups', 'BusinessPartnerGroups']) {
|
2026-10-16 11:07:38 -05:00
|
|
|
const r = SL_RESOURCE_MAP.get(name)!;
|
|
|
|
|
expect(r.methods, name).toEqual(['GET']);
|
|
|
|
|
expect(r.read, name).toBeNull();
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('las cuatro pantallas de facturación de venta comparten Invoices con los permisos de todas', () => {
|
|
|
|
|
const r = SL_RESOURCE_MAP.get('Invoices')!;
|
|
|
|
|
for (const p of ['/ventas/facturas', '/ventas/boletas', '/ventas/facturas-reserva', '/ventas/boletas-reserva']) {
|
|
|
|
|
expect(r.read as string[], p).toContain(p);
|
|
|
|
|
expect(r.write as string[], p).toContain(p);
|
|
|
|
|
}
|
|
|
|
|
});
|
2026-10-16 13:23:27 -05:00
|
|
|
|
|
|
|
|
it('los pagos recibidos y efectuados se crean y se anulan (Cancel), pero no se modifican', () => {
|
|
|
|
|
for (const [name, path] of [['IncomingPayments', '/bancos/pagos-recibidos'], ['VendorPayments', '/bancos/pagos-efectuados']] as const) {
|
|
|
|
|
const r = SL_RESOURCE_MAP.get(name)!;
|
|
|
|
|
expect(r.methods, name).toEqual(['GET', 'POST']);
|
|
|
|
|
expect(r.actions, name).toEqual(['Cancel']);
|
|
|
|
|
expect(r.write, name).toBe(path);
|
|
|
|
|
expect(r.read, name).toEqual([path]);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('solo los pagos tienen acciones sobre un registro', () => {
|
|
|
|
|
expect(SL_RESOURCES.filter((r) => r.actions?.length).map((r) => r.name)).toEqual(['IncomingPayments', 'VendorPayments']);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('las facturas y notas de crédito se pueden consultar desde la pantalla de pagos, sin poder modificarlas', () => {
|
|
|
|
|
for (const [name, pay] of [['Invoices', '/bancos/pagos-recibidos'], ['CreditNotes', '/bancos/pagos-recibidos'], ['PurchaseInvoices', '/bancos/pagos-efectuados'], ['PurchaseCreditNotes', '/bancos/pagos-efectuados']] as const) {
|
|
|
|
|
const r = SL_RESOURCE_MAP.get(name)!;
|
|
|
|
|
expect(r.read as string[], name).toContain(pay);
|
|
|
|
|
expect(r.write as string | string[], name).not.toContain(pay);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('el pago de clientes no lee las facturas de proveedores ni al revés', () => {
|
|
|
|
|
expect(SL_RESOURCE_MAP.get('PurchaseInvoices')!.read as string[]).not.toContain('/bancos/pagos-recibidos');
|
|
|
|
|
expect(SL_RESOURCE_MAP.get('Invoices')!.read as string[]).not.toContain('/bancos/pagos-efectuados');
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('los bancos son un catálogo de solo lectura', () => {
|
|
|
|
|
expect(SL_RESOURCE_MAP.get('Banks')!.methods).toEqual(['GET']);
|
|
|
|
|
});
|
2026-10-16 11:07:38 -05:00
|
|
|
});
|