Skip to content
Snippets Groups Projects
portal-home.component.spec.ts 4.74 KiB
Newer Older
  • Learn to ignore specific revisions
  • import { Component, Input } from '@angular/core';
    import { TestBed, waitForAsync, ComponentFixture  } from '@angular/core/testing';
    import { RouterTestingModule } from '@angular/router/testing';
    
    import { provideMockStore, MockStore } from '@ngrx/store/testing';
    
    import { of } from 'rxjs';
    
    import { PortalHomeComponent } from './portal-home.component';
    
    import { AppConfigService } from 'src/app/app-config.service';
    import { UserProfile } from 'src/app/auth/user-profile.model';
    import { Instance } from 'src/app/metamodel/models';
    import * as authActions from 'src/app/auth/auth.actions';
    
    describe('PortalHomeComponent', () => {
        @Component({ selector: 'app-navbar', template: '' })
        class NavbarStubComponent {
    
            @Input() links: { label: string, icon: string, routerLink: string }[];
    
            @Input() isAuthenticated: boolean;
            @Input() userProfile: UserProfile = null;
            @Input() baseHref: string;
            @Input() authenticationEnabled: boolean;
        }
    
        @Component({ selector: 'app-instance-card', template: '' })
        class InstanceCardStubComponent {
            @Input() instance: Instance;
        }
    
        let component: PortalHomeComponent;
        let fixture: ComponentFixture<PortalHomeComponent>;
        let store: MockStore;
    
        let appConfigServiceStub = new AppConfigService();
    
    
        beforeEach(waitForAsync(() => {
            TestBed.configureTestingModule({
    
                imports: [RouterTestingModule],
    
                declarations: [
                    PortalHomeComponent,
                    NavbarStubComponent,
                    InstanceCardStubComponent
                ],
                providers: [
                    provideMockStore({ }),
    
                    { provide: AppConfigService, useValue: appConfigServiceStub }
    
                ]
            }).compileComponents();
            fixture = TestBed.createComponent(PortalHomeComponent);
            component = fixture.componentInstance;
            store = TestBed.inject(MockStore);
    
    Tifenn Guillas's avatar
    Tifenn Guillas committed
            document.body.innerHTML = '<link id="favicon" href="">';
    
        it('should create the component', () => {
    
            expect(component).toBeDefined();
        });
    
    
        it('should execute ngOnInit lifecycle and add admin link if no authentication', () => {
            appConfigServiceStub.authenticationEnabled = false;
            component.ngOnInit();
            const expected = [
                { label: 'Home', icon: 'fas fa-home', routerLink: '/portal' },
                { label: 'Admin', icon: 'fas fa-tools', routerLink: '/admin' }
            ];
            expect(component.links).toEqual(expected);
    
    Tifenn Guillas's avatar
    Tifenn Guillas committed
            expect(component.favIcon.href).toEqual('http://localhost/favicon.ico');
    
        });
    
        it('should execute ngOnInit lifecycle and add admin link depending on user rights', () => {
            appConfigServiceStub.authenticationEnabled = true;
            appConfigServiceStub.adminRole = 'admin';
            component.userRoles = of([]);
            component.ngOnInit();
            expect(component.links).toEqual([{ label: 'Home', icon: 'fas fa-home', routerLink: '/portal' }]);
            component.userRoles = of(['admin']);
            component.ngOnInit();
            const expected = [
                { label: 'Home', icon: 'fas fa-home', routerLink: '/portal' },
                { label: 'Admin', icon: 'fas fa-tools', routerLink: '/admin' }
            ];
            expect(component.links).toEqual(expected);
    
        });
    
        it('#getBaseHref() should return base href config key value', () => {
            appConfigServiceStub.baseHref = '/my-project';
    
            expect(component.getBaseHref()).toBe('/my-project');
        });
    
    
        it('#authenticationEnabled() should return authentication enabled config key value', () => {
            appConfigServiceStub.authenticationEnabled = true;
    
            expect(component.getAuthenticationEnabled()).toBeTruthy();
        });
    
    
        it('#login() should dispatch login action', () => {
    
            const spy = jest.spyOn(store, 'dispatch');
            component.login();
            expect(spy).toHaveBeenCalledTimes(1);
            expect(spy).toHaveBeenCalledWith(authActions.login());
        });
    
    
        it('#logout() should dispatch logout action', () => {
    
            const spy = jest.spyOn(store, 'dispatch');
            component.logout();
            expect(spy).toHaveBeenCalledTimes(1);
            expect(spy).toHaveBeenCalledWith(authActions.logout());
        });
    
    
        it('#openEditProfile() should dispatch open edit profile action', () => {
    
            const spy = jest.spyOn(store, 'dispatch');
            component.openEditProfile();
            expect(spy).toHaveBeenCalledTimes(1);
            expect(spy).toHaveBeenCalledWith(authActions.openEditProfile());
        });
    
    Tifenn Guillas's avatar
    Tifenn Guillas committed
    
        it('should unsubscribe to user roles when component is destroyed', () => {
            component.userRolesSubscription = of().subscribe();
            const spy = jest.spyOn(component.userRolesSubscription, 'unsubscribe');
            component.ngOnDestroy();
            expect(spy).toHaveBeenCalledTimes(1);
        });