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>
77 lines
3.0 KiB
TypeScript
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');
|
|
});
|
|
});
|