Files
devolucion_proveedores/apps/web/src/app/app.spec.ts
T
georgeandClaude Sonnet 5.5 287b187c14 Aplicación web de Devolución a Proveedores para SAP Business One
Reemplaza al addon .NET Framework (SolucionLibros). Genera Devoluciones de mercancías
enlazadas a sus Entradas por compra a partir de un listado pegado desde Excel.

- libs/shared (@dp/shared): modelos y lógica de dominio pura (FIFO, consolidación por
  proveedor, parseo del portapapeles), portada del addon.
- apps/api (NestJS): cliente del Service Layer con cola por sesión, login con la sesión de
  SAP, metadatos (UDT/UDF/UDO) y botón Reconstruir, catálogos, planificaciones (pegar,
  procesar, reprocesar, marcar líneas, crear Devoluciones, cerrar), listado paginado con
  filtros y descarga de PDF de la Guía de despacho desde BES. Sirve también la web
  compilada, con HTTPS opcional.
- apps/web (Angular): login, Configuración → Metadatos y Planificaciones (listado,
  nueva, detalle).
- deploy/windows y scripts/publicar.mjs: despliegue como servicio de Windows con WinSW.

Verificado contra el Service Layer de SQL Server. Sin probar aún: SAP HANA y la
instalación del servicio en Windows (ver CLAUDE.md, sección "Sin verificar").

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-13 08:09:07 -05:00

77 lines
3.0 KiB
TypeScript

import { TestBed } from '@angular/core/testing';
import { provideHttpClient } from '@angular/common/http';
import { HttpTestingController, provideHttpClientTesting } from '@angular/common/http/testing';
import { provideRouter, Router } from '@angular/router';
import { App } from './app';
import { routes } from './app.routes';
import { MetadataService } from './core/metadata.service';
const tick = () => new Promise((r) => setTimeout(r));
describe('App', () => {
let http: HttpTestingController;
let router: Router;
beforeEach(async () => {
localStorage.clear();
await TestBed.configureTestingModule({
imports: [App],
providers: [provideRouter(routes), provideHttpClient(), provideHttpClientTesting()],
}).compileComponents();
http = TestBed.inject(HttpTestingController);
router = TestBed.inject(Router);
});
it('sin sesión redirige al login', async () => {
TestBed.createComponent(App);
const navegacion = router.navigateByUrl('/planificaciones');
await tick();
http.expectOne('/api/auth/me').flush({ message: 'Debe iniciar sesión.' }, { status: 401, statusText: 'Unauthorized' });
await navegacion;
expect(router.url).toBe('/login');
});
it('con sesión y metadatos incompletos lleva a Configuración', async () => {
TestBed.createComponent(App);
const navegacion = router.navigateByUrl('/planificaciones');
await tick();
http.expectOne('/api/auth/me').flush({ userName: 'manager', companyDb: 'TEST', version: '1000' });
await tick();
http.expectOne('/api/metadata/status').flush({ completo: false, elementos: [] });
await navegacion;
expect(router.url).toBe('/configuracion/metadatos');
});
it('con la verificación de metadatos desactivada entra sin consultarla', async () => {
TestBed.inject(MetadataService).fijarVerificacionAlIngresar(false);
TestBed.createComponent(App);
const navegacion = router.navigateByUrl('/planificaciones');
await tick();
http.expectOne('/api/auth/me').flush({ userName: 'manager', companyDb: 'TEST', version: '1000' });
await navegacion;
http.expectNone('/api/metadata/status');
expect(router.url).toBe('/planificaciones');
});
it('desactivada pero con un estado ya conocido incompleto, igual lleva a Configuración', async () => {
const metadata = TestBed.inject(MetadataService);
metadata.fijarVerificacionAlIngresar(false);
metadata.estado.set({ completo: false, elementos: [] });
TestBed.createComponent(App);
const navegacion = router.navigateByUrl('/planificaciones');
await tick();
http.expectOne('/api/auth/me').flush({ userName: 'manager', companyDb: 'TEST', version: '1000' });
await navegacion;
expect(router.url).toBe('/configuracion/metadatos');
});
it('la elección del login se recuerda en el navegador', () => {
const metadata = TestBed.inject(MetadataService);
expect(metadata.verificarAlIngresar()).toBe(true);
metadata.fijarVerificacionAlIngresar(false);
expect(localStorage.getItem('dp.verificarMetadatos')).toBe('false');
});
});