Skip to content
Snippets Groups Projects
instance.component.spec.ts 9.27 KiB
Newer Older
  • Learn to ignore specific revisions
  • /**
     * This file is part of Anis Client.
     *
     * @copyright Laboratoire d'Astrophysique de Marseille / CNRS
     *
     * For the full copyright and license information, please view the LICENSE
     * file that was distributed with this source code.
     */
    
    
    Tifenn Guillas's avatar
    Tifenn Guillas committed
    import { Component, Input } from '@angular/core';
    
    import { TestBed, waitForAsync, ComponentFixture  } from '@angular/core/testing';
    
    François Agneray's avatar
    François Agneray committed
    import { HttpClientTestingModule } from '@angular/common/http/testing';
    
    import { RouterTestingModule } from '@angular/router/testing';
    
    import { provideMockStore, MockStore } from '@ngrx/store/testing';
    
    Tifenn Guillas's avatar
    Tifenn Guillas committed
    import { of } from 'rxjs';
    
    
    import { InstanceComponent } from './instance.component';
    import { AppConfigService } from 'src/app/app-config.service';
    
    import { StyleService } from 'src/app/shared/services/style.service';
    
    import * as authActions from 'src/app/auth/auth.actions';
    
    François Agneray's avatar
    François Agneray committed
    import { Instance, WebpageFamily, Webpage } from '../metamodel/models';
    
    import { UserProfile } from '../auth/user-profile.model';
    
    Tifenn Guillas's avatar
    Tifenn Guillas committed
    import * as datasetFamilyActions from '../metamodel/actions/dataset-family.actions';
    import * as datasetActions from '../metamodel/actions/dataset.actions';
    
    François Agneray's avatar
    François Agneray committed
    import * as datasetGroupActions from 'src/app/metamodel/actions/dataset-group.actions';
    
    François Agneray's avatar
    François Agneray committed
    import * as webpageFamilyActions from 'src/app/metamodel/actions/webpage-family.actions';
    import * as webpageActions from 'src/app/metamodel/actions/webpage.actions';
    
    describe('[Instance] InstanceComponent', () => {
    
    François Agneray's avatar
    François Agneray committed
        @Component({ selector: 'app-instance-navbar', template: '' })
    
        class NavbarStubComponent {
            @Input() isAuthenticated: boolean;
            @Input() userProfile: UserProfile = null;
    
    François Agneray's avatar
    François Agneray committed
            @Input() userRoles: string[];
    
            @Input() authenticationEnabled: boolean;
            @Input() apiUrl: string;
    
    François Agneray's avatar
    François Agneray committed
            @Input() adminRoles: string[];
    
            @Input() instance: Instance;
    
    François Agneray's avatar
    François Agneray committed
            @Input() webpageFamilyList: WebpageFamily[] = null;
            @Input() webpageList: Webpage[] = null;
            @Input() firstWebpage: Webpage = null;
    
        }
    
        let component: InstanceComponent;
        let fixture: ComponentFixture<InstanceComponent>;
        let store: MockStore;
        let appConfigServiceStub = new AppConfigService();
    
        let styleServiceStub = new StyleService();
    
    
        beforeEach(waitForAsync(() => {
            TestBed.configureTestingModule({
    
    François Agneray's avatar
    François Agneray committed
                imports: [RouterTestingModule, HttpClientTestingModule],
    
                declarations: [
                    InstanceComponent,
                    NavbarStubComponent
                ],
                providers: [
                    provideMockStore({ }),
    
                    { provide: AppConfigService, useValue: appConfigServiceStub },
                    { provide: StyleService, useValue: styleServiceStub }
    
                ]
            }).compileComponents();
            fixture = TestBed.createComponent(InstanceComponent);
            component = fixture.componentInstance;
            store = TestBed.inject(MockStore);
    
    Tifenn Guillas's avatar
    Tifenn Guillas committed
            document.body.innerHTML =
                '<title id="title">Default title</title>' +
                '<link id="favicon" href="">';
    
        }));
    
        it('should create the component', () => {
            expect(component).toBeDefined();
        });
    
    
    Tifenn Guillas's avatar
    Tifenn Guillas committed
        it('should execute ngOnInit lifecycle', (done) => {
            const instance: Instance = {
                name: 'myInstance',
                label: 'My Instance',
    
    François Agneray's avatar
    François Agneray committed
                description: 'My Instance description',
    
    François Agneray's avatar
    François Agneray committed
                scientific_manager: 'M. Dupont',
                instrument: 'Multiple',
                wavelength_domain: 'Visible',
    
    François Agneray's avatar
    François Agneray committed
                display: 10,
    
    Tifenn Guillas's avatar
    Tifenn Guillas committed
                data_path: 'data/path',
    
    François Agneray's avatar
    François Agneray committed
                files_path: 'files',
                public: true,
    
    François Agneray's avatar
    François Agneray committed
                portal_logo: 'logo.png',
                design_color: 'green',
                design_background_color: 'darker green',
    
    François Agneray's avatar
    François Agneray committed
                design_logo: '/path/to/logo',
                design_favicon: '/path/to/favicon',
    
    François Agneray's avatar
    François Agneray committed
                navbar_background_color: '#F8F9FA',
                navbar_border_bottom_color: '#DEE2E6',
                navbar_color_href: '#000000',
    
    François Agneray's avatar
    François Agneray committed
                navbar_font_family: 'Roboto, sans-serif',
                navbar_sign_in_btn_color: '#28A745',
                navbar_user_btn_color: '#7AC29A',
    
    François Agneray's avatar
    François Agneray committed
                footer_background_color: '#F8F9FA',
                footer_border_top_color: '#DEE2E6',
                footer_text_color: '#000000',
    
                footer_logos: null,
    
                family_border_color: '#DFDFDF',
                family_header_background_color: '#F7F7F7',
                family_title_color: '#007BFF',
                family_title_bold: false,
    
                family_background_color: '#FFFFFF',
    
                family_color: '#212529',
    
                progress_bar_title: 'Dataset search',
    
    François Agneray's avatar
    François Agneray committed
                progress_bar_title_color: '#000000',
    
                progress_bar_subtitle: 'Select a dataset, add criteria, select output columns and display the result.',
    
    François Agneray's avatar
    François Agneray committed
                progress_bar_subtitle_color: '#6C757D',
    
                progress_bar_step_dataset_title: 'Dataset selection',
                progress_bar_step_criteria_title: 'Search criteria',
                progress_bar_step_output_title: 'Output columns',
                progress_bar_step_result_title: 'Result table',
    
                progress_bar_color: '#E9ECEF',
                progress_bar_active_color: '#7AC29A',
                progress_bar_circle_color: '#FFFFFF',
    
    François Agneray's avatar
    François Agneray committed
                progress_bar_circle_icon_color: '#CCCCCC',
                progress_bar_circle_icon_active_color: '#FFFFFF',
    
                progress_bar_text_color: '#91B2BF',
    
    François Agneray's avatar
    François Agneray committed
                result_header_background_color: '#E9ECEF',
                result_header_text_color: '#000000',
                result_header_btn_color: '#007BFF',
                result_header_btn_hover_color: '#0069D9',
                result_header_btn_text_color: '#FFFFFF',
    
    François Agneray's avatar
    François Agneray committed
                result_datatable_bordered: true,
                result_datatable_border_color: '#DEE2E6',
                result_datatable_header_background_color: '#FFFFFF',
                result_datatable_header_text_color: '#000000',
                result_datatable_rows_background_color: '#FFFFFF',
                result_datatable_rows_text_color: '#000000',
                result_datatable_sorted_color: '#C5C5C5',
                result_datatable_sorted_active_color: '#000000',
                result_datatable_link_color: '#007BFF',
                result_datatable_link_hover_color: '#0056B3',
                result_datatable_rows_selected_color: '#7AC29A',
    
                samp_enabled: true,
    
    François Agneray's avatar
    François Agneray committed
                back_to_portal: true,
    
    François Agneray's avatar
    François Agneray committed
                user_menu_enabled: true,
    
    François Agneray's avatar
    François Agneray committed
                search_by_criteria_allowed: true,
                search_by_criteria_label: 'Search',
                search_multiple_allowed: true,
                search_multiple_label: 'Search multiple',
                search_multiple_all_datasets_selected: false,
                documentation_allowed: true,
                documentation_label: 'Documentation',
    
    Tifenn Guillas's avatar
    Tifenn Guillas committed
                nb_dataset_families: 1,
                nb_datasets: 2
            };
    
    François Agneray's avatar
    François Agneray committed
    
            const webpage: Webpage = {
                id: 1,
    
    François Agneray's avatar
    François Agneray committed
                name: 'home',
    
    François Agneray's avatar
    François Agneray committed
                label: 'Home',
                title: 'Home',
                display: 10,
                icon: 'fas fa-home',
                content: '<p>Hello</p>',
    
    François Agneray's avatar
    François Agneray committed
                style_sheet: '',
    
    François Agneray's avatar
    François Agneray committed
                id_webpage_family: 1
            }
    
    
    Tifenn Guillas's avatar
    Tifenn Guillas committed
            component.instance = of(instance);
    
    François Agneray's avatar
    François Agneray committed
            component.firstWebpage = of(webpage);
    
    Tifenn Guillas's avatar
    Tifenn Guillas committed
            const spy = jest.spyOn(store, 'dispatch');
            component.ngOnInit();
            Promise.resolve(null).then(function() {
    
    François Agneray's avatar
    François Agneray committed
                expect(spy).toHaveBeenCalledTimes(5);
    
    Tifenn Guillas's avatar
    Tifenn Guillas committed
                expect(spy).toHaveBeenCalledWith(datasetFamilyActions.loadDatasetFamilyList());
                expect(spy).toHaveBeenCalledWith(datasetActions.loadDatasetList());
    
    François Agneray's avatar
    François Agneray committed
                expect(spy).toHaveBeenCalledWith(datasetGroupActions.loadDatasetGroupList());
    
    François Agneray's avatar
    François Agneray committed
                expect(spy).toHaveBeenCalledWith(webpageFamilyActions.loadWebpageFamilyList());
                expect(spy).toHaveBeenCalledWith(webpageActions.loadWebpageList());
    
    François Agneray's avatar
    François Agneray committed
                expect(component.favIcon.href).toEqual('http://localhost/undefined/instance/myInstance/file-explorer/path/to/favicon');
    
    Tifenn Guillas's avatar
    Tifenn Guillas committed
                done();
            });
        });
    
    
        it('#authenticationEnabled() should return authentication enabled config key value', () => {
            appConfigServiceStub.authenticationEnabled = true;
            expect(component.getAuthenticationEnabled()).toBeTruthy();
        });
    
        it('#getApiUrl() should return API URL', () => {
            appConfigServiceStub.apiUrl = 'http:test.com';
            expect(component.getApiUrl()).toEqual('http:test.com');
        });
    
        it('#login() should dispatch login action', () => {
            const spy = jest.spyOn(store, 'dispatch');
            component.login();
            expect(spy).toHaveBeenCalledTimes(1);
    
    François Agneray's avatar
    François Agneray committed
            expect(spy).toHaveBeenCalledWith(authActions.login({ redirectUri: window.location.toString() }));
    
        });
    
        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());
        });
    
        it('should unsubscribe to instance when component is destroyed', () => {
            component.instanceSubscription = of().subscribe();
            const spy = jest.spyOn(component.instanceSubscription, 'unsubscribe');
            component.ngOnDestroy();
            expect(spy).toHaveBeenCalledTimes(1);
        });
    });