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'); }); });