datasurvey/src/main/webapp/app/login/login.component.tmpSpec.ts

158 lines
4.5 KiB
TypeScript

jest.mock('@angular/router');
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 { of, throwError } from 'rxjs';
import { AccountService } from 'app/core/auth/account.service';
import { LoginService } from './login.service';
import { LoginComponent } from './login.component';
import { SocialAuthService } from 'angularx-social-login';
describe('Component Tests', () => {
describe('LoginComponent', () => {
let comp: LoginComponent;
let fixture: ComponentFixture<LoginComponent>;
let mockRouter: Router;
let mockAccountService: AccountService;
let mockLoginService: LoginService;
beforeEach(
waitForAsync(() => {
TestBed.configureTestingModule({
declarations: [LoginComponent],
providers: [
FormBuilder,
AccountService,
Router,
{
provide: LoginService,
useValue: {
login: jest.fn(() => of({})),
},
},
],
})
.overrideTemplate(LoginComponent, '')
.compileComponents();
})
);
beforeEach(() => {
fixture = TestBed.createComponent(LoginComponent);
comp = fixture.componentInstance;
mockRouter = TestBed.inject(Router);
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();
});
});
});
});