import {TestComponentBuilder} from 'ng-forward/cjs/testing/test-component-builder'; import {Injectable, Provider, provide} from "ng-forward"; import {ComponentTestHelper, createClass} from './../../../../spec/component-test-helper'; import {ComponentFixture} from 'ng-forward/cjs/testing/test-component-builder'; import {providers} from 'ng-forward/cjs/testing/providers'; import {LoginBlockComponent} from './login-block.component'; import * as helpers from "./../../../../spec/helpers"; import {SessionService, AuthService, AuthController, AuthEvents} from "./../../../login"; const htmlTemplate: string = ''; describe("Components", () => { describe("Login Block Component", () => { let helper: ComponentTestHelper; let person: any = null; /** * Mock objects */ let authService: any = helpers.mocks.authService; let user = { person: person }; let sessionService: any = helpers.mocks.sessionWithCurrentUser(user); let state = jasmine.createSpyObj("$state", ["go"]); let scope = helpers.mocks.scopeWithEvents; let providers = [ new Provider('SessionService', { useValue: sessionService }), new Provider('$state', { useValue: state }), new Provider('AuthService', { useValue: authService }), new Provider('$scope', { useValue: scope }) ]; beforeEach( angular.mock.module("templates") ); beforeEach( (done: Function) => { let cls = createClass({ template: htmlTemplate, directives: [LoginBlockComponent], providers: providers, properties: {} }); helper = new ComponentTestHelper(cls, done); }); it("expect person to be null with no logged in user", () => { expect(helper.component.currentUser).toBeNull; }); it("expect person to be defined when user login", () => { // Executes the login method on the component doComponentLogin(); expect(helper.component.currentUser.person).toBe(person); }); it("expect person to be null when user logout", () => { // First do a login doComponentLogin(); // The logout the user doComponentLogout(); // Check if the current user was cleared expect(helper.component.currentUser).toBeNull; }); /** * Execute the logout method on the target component */ function doComponentLogout() { // Create a mock for the AuthService logout method spyOn(authService, "logout"); helper.component.logout(); expect(authService.logout).toHaveBeenCalled(); // After the component logout method execution, fire the // AuthService event simulateLogoutEvent(); } /** * Execute the login method on the target component */ function doComponentLogin() { // Create a mock for the AuthService login method spyOn(authService, "login"); helper.component.login(); expect(authService.login).toHaveBeenCalled(); // After the component login method execution, fire the // AuthService event simulateLoginEvent(); } /** * Simulate the AuthService loginSuccess event */ function simulateLoginEvent() { let successEvent: string = AuthEvents[AuthEvents.loginSuccess]; (helper.component.authService)[successEvent].next(user); } /** * Simulate the AuthService logoutSuccess event */ function simulateLogoutEvent() { let successEvent: string = AuthEvents[AuthEvents.logoutSuccess]; (helper.component.authService)[successEvent].next(user); } }); });