153 lines
4.3 KiB
TypeScript
153 lines
4.3 KiB
TypeScript
|
jest.mock('app/core/auth/account.service');
|
||
|
jest.mock('app/login/login.service');
|
||
|
|
||
|
import { ElementRef } from '@angular/core';
|
||
|
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
|
||
|
import { FormBuilder } from '@angular/forms';
|
||
|
import { Router, Navigation } from '@angular/router';
|
||
|
import { RouterTestingModule } from '@angular/router/testing';
|
||
|
import { of, throwError } from 'rxjs';
|
||
|
|
||
|
import { AccountService } from 'app/core/auth/account.service';
|
||
|
|
||
|
import { LoginService } from './login.service';
|
||
|
import LoginComponent from './login.component';
|
||
|
|
||
|
describe('LoginComponent', () => {
|
||
|
let comp: LoginComponent;
|
||
|
let fixture: ComponentFixture<LoginComponent>;
|
||
|
let mockRouter: Router;
|
||
|
let mockAccountService: AccountService;
|
||
|
let mockLoginService: LoginService;
|
||
|
|
||
|
beforeEach(waitForAsync(() => {
|
||
|
TestBed.configureTestingModule({
|
||
|
imports: [RouterTestingModule.withRoutes([]), LoginComponent],
|
||
|
providers: [
|
||
|
FormBuilder,
|
||
|
AccountService,
|
||
|
{
|
||
|
provide: LoginService,
|
||
|
useValue: {
|
||
|
login: jest.fn(() => of({})),
|
||
|
},
|
||
|
},
|
||
|
],
|
||
|
})
|
||
|
.overrideTemplate(LoginComponent, '')
|
||
|
.compileComponents();
|
||
|
}));
|
||
|
|
||
|
beforeEach(() => {
|
||
|
fixture = TestBed.createComponent(LoginComponent);
|
||
|
comp = fixture.componentInstance;
|
||
|
mockRouter = TestBed.inject(Router);
|
||
|
jest.spyOn(mockRouter, 'navigate').mockImplementation(() => Promise.resolve(true));
|
||
|
mockLoginService = TestBed.inject(LoginService);
|
||
|
mockAccountService = TestBed.inject(AccountService);
|
||
|
});
|
||
|
|
||
|
describe('ngOnInit', () => {
|
||
|
it('Should call accountService.identity on Init', () => {
|
||
|
// GIVEN
|
||
|
mockAccountService.identity = jest.fn(() => of(null));
|
||
|
mockAccountService.getAuthenticationState = jest.fn(() => of(null));
|
||
|
|
||
|
// WHEN
|
||
|
comp.ngOnInit();
|
||
|
|
||
|
// THEN
|
||
|
expect(mockAccountService.identity).toHaveBeenCalled();
|
||
|
});
|
||
|
|
||
|
it('Should call accountService.isAuthenticated on Init', () => {
|
||
|
// GIVEN
|
||
|
mockAccountService.identity = jest.fn(() => of(null));
|
||
|
|
||
|
// WHEN
|
||
|
comp.ngOnInit();
|
||
|
|
||
|
// THEN
|
||
|
expect(mockAccountService.isAuthenticated).toHaveBeenCalled();
|
||
|
});
|
||
|
|
||
|
it('should navigate to home page on Init if authenticated=true', () => {
|
||
|
// GIVEN
|
||
|
mockAccountService.identity = jest.fn(() => of(null));
|
||
|
mockAccountService.getAuthenticationState = jest.fn(() => of(null));
|
||
|
mockAccountService.isAuthenticated = () => true;
|
||
|
|
||
|
// WHEN
|
||
|
comp.ngOnInit();
|
||
|
|
||
|
// THEN
|
||
|
expect(mockRouter.navigate).toHaveBeenCalledWith(['']);
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe('ngAfterViewInit', () => {
|
||
|
it('shoult set focus to username input after the view has been initialized', () => {
|
||
|
// GIVEN
|
||
|
const node = {
|
||
|
focus: jest.fn(),
|
||
|
};
|
||
|
comp.username = new ElementRef(node);
|
||
|
|
||
|
// WHEN
|
||
|
comp.ngAfterViewInit();
|
||
|
|
||
|
// THEN
|
||
|
expect(node.focus).toHaveBeenCalled();
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe('login', () => {
|
||
|
it('should authenticate the user and navigate to home page', () => {
|
||
|
// GIVEN
|
||
|
const credentials = {
|
||
|
username: 'admin',
|
||
|
password: 'admin',
|
||
|
rememberMe: true,
|
||
|
};
|
||
|
|
||
|
comp.loginForm.patchValue({
|
||
|
username: 'admin',
|
||
|
password: 'admin',
|
||
|
rememberMe: true,
|
||
|
});
|
||
|
|
||
|
// WHEN
|
||
|
comp.login();
|
||
|
|
||
|
// THEN
|
||
|
expect(comp.authenticationError).toEqual(false);
|
||
|
expect(mockLoginService.login).toHaveBeenCalledWith(credentials);
|
||
|
expect(mockRouter.navigate).toHaveBeenCalledWith(['']);
|
||
|
});
|
||
|
|
||
|
it('should authenticate the user but not navigate to home page if authentication process is already routing to cached url from localstorage', () => {
|
||
|
// GIVEN
|
||
|
jest.spyOn(mockRouter, 'getCurrentNavigation').mockReturnValue({} as Navigation);
|
||
|
|
||
|
// WHEN
|
||
|
comp.login();
|
||
|
|
||
|
// THEN
|
||
|
expect(comp.authenticationError).toEqual(false);
|
||
|
expect(mockRouter.navigate).not.toHaveBeenCalled();
|
||
|
});
|
||
|
|
||
|
it('should stay on login form and show error message on login error', () => {
|
||
|
// GIVEN
|
||
|
mockLoginService.login = jest.fn(() => throwError({}));
|
||
|
|
||
|
// WHEN
|
||
|
comp.login();
|
||
|
|
||
|
// THEN
|
||
|
expect(comp.authenticationError).toEqual(true);
|
||
|
expect(mockRouter.navigate).not.toHaveBeenCalled();
|
||
|
});
|
||
|
});
|
||
|
});
|