No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Pruebas de integración con Guardianes

18/20
Recursos

Aportes 1

Preguntas 0

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Ahora haremos pruebas de integración con las funcionalidades de guardianes, ya que probaremos la integración de los guardianes desde una ruta a otra

primero cambiamos un poco el comportamiento del auth guard

auth.guard.ts

canActivate(
    route: ActivatedRouteSnapshot,
    state: RouterStateSnapshot): Observable<boolean> {
    return this.authService.getUser()
    .pipe(
      map(user => {
        if(!user) {
          this.router.navigate(['/']);
          return false;
        }
        return true;
      })
    )

Ingresamos el guardian en la ruta de others component

app-routing.module.ts

import { AuthGuard } from './guards/auth.guard';

export const routes: Routes = [
  {
    path: 'others',
    canActivate: [AuthGuard],
    component: OthersComponent
  },
];

Ahora podemos hacer mockin de un usuario y probar si logra entrar o no con el guardian activo

app.integration.spec.ts

import { AuthService } from './services/auth.service';
import { generateOneUser } from './models/user.mock';

describe('App Integration test', () => {
  let authService: jasmine.SpyObj<AuthService>;

  beforeEach(async () => {
    const authServiceSpy = jasmine.createSpyObj('AuthService', ['getUser']);

    await TestBed.configureTestingModule({
      imports: [
        AppModule,
        RouterTestingModule.withRoutes(routes)
      ],
      providers: [
        { provide: AuthService, useValue: authServiceSpy }
      ],
      schemas: [NO_ERRORS_SCHEMA]
    }).compileComponents();
  });


it('should render OthersComponent when clicked with session', fakeAsync(() => {
    const productsMocks = generateManyProducts(10);

    productService.getAll.and.returnValue(asyncData(productsMocks));
    const userMock = generateOneUser();
    authService.getUser.and.returnValue(mockObservable(userMock));
    clickElement(fixture, 'others-link', true);
    tick(); // wait while nav...
    fixture.detectChanges(); // ngOnInit - OthersComponent
    tick();
    fixture.detectChanges(); // ngOnInit - OthersComponent

    expect(router.url).toEqual('/others');
    const element = query(fixture, 'app-others');

    expect(element).not.toBeNull();
    const text = getText(fixture, 'products-length');
    
    expect(text).toContain(productsMocks.length.toString());
  }));
  

  it('should render OthersComponent when clicked without session', fakeAsync(() => {
    authService.getUser.and.returnValue(mockObservable(null));
    clickElement(fixture, 'others-link', true);
    tick(); // wait while nav...
    
    fixture.detectChanges(); // ngOnInit - OthersComponent
    tick();

    fixture.detectChanges(); // ngOnInit - OthersComponent
    expect(router.url).toEqual('/');
  }));