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', () => { for (const name of ['FactoringIndicators', 'DistributionRules', 'Projects', 'AccountSegmentations', 'AdditionalExpenses', 'ItemGroups', 'BusinessPartnerGroups']) { 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); } }); 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 y los asientos tienen acciones sobre un registro', () => { expect(SL_RESOURCES.filter((r) => r.actions?.length).map((r) => r.name)).toEqual(['IncomingPayments', 'VendorPayments', 'JournalEntries']); }); 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']); expect(SL_RESOURCE_MAP.get('CreditCards')!.methods).toEqual(['GET']); }); it('el plan de cuentas se lee desde cualquier sesión y solo se modifica desde Finanzas', () => { const r = SL_RESOURCE_MAP.get('ChartOfAccounts')!; expect(r.read).toBeNull(); expect(r.write).toBe('/finanzas/plan-de-cuentas'); }); it('los asientos se crean y se cancelan, no se modifican', () => { const r = SL_RESOURCE_MAP.get('JournalEntries')!; expect(r.methods).toEqual(['GET', 'POST']); expect(r.actions).toEqual(['Cancel']); expect(r.write).toBe('/finanzas/asientos'); }); it('el tipo de cambio es una acción de solo consulta y las formas de envío y de pago son catálogos', () => { const rate = SL_RESOURCE_MAP.get('SBOBobService_GetCurrencyRate')!; expect(rate.methods).toEqual(['POST']); expect(rate.write).toBeNull(); for (const name of ['ShippingTypes', 'WizardPaymentMethods']) expect(SL_RESOURCE_MAP.get(name)!.methods, name).toEqual(['GET']); }); it('los lotes se consultan y se modifican, pero no se crean desde aquí (nacen en los documentos)', () => { const r = SL_RESOURCE_MAP.get('BatchNumberDetails')!; expect(r.key).toBe('number'); expect(r.methods).toEqual(['GET', 'PATCH']); expect(r.write).toBe('/inventario/lotes'); }); it('los usuarios de SAP solo entregan los campos que necesita el solicitante', () => { const r = SL_RESOURCE_MAP.get('Users')!; expect(r.methods).toEqual(['GET']); expect(r.selectOnly).toEqual(['UserCode', 'UserName', 'eMail', 'Department', 'Branch']); expect(r.selectOnly).not.toContain('UserPassword'); }); });