Newer
Older
/**
* 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.
*/
import { TestBed, waitForAsync, ComponentFixture } from '@angular/core/testing';
import { HttpClientTestingModule } from '@angular/common/http/testing';
import { RouterTestingModule } from '@angular/router/testing';
import { provideMockStore, MockStore } from '@ngrx/store/testing';
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';
import { Instance, WebpageFamily, Webpage } from '../metamodel/models';
import { UserProfile } from '../auth/user-profile.model';
import * as datasetFamilyActions from '../metamodel/actions/dataset-family.actions';
import * as datasetActions from '../metamodel/actions/dataset.actions';
import * as datasetGroupActions from 'src/app/metamodel/actions/dataset-group.actions';
import * as webpageFamilyActions from 'src/app/metamodel/actions/webpage-family.actions';
import * as webpageActions from 'src/app/metamodel/actions/webpage.actions';
describe('[Instance] InstanceComponent', () => {
@Component({ selector: 'app-instance-navbar', template: '' })
class NavbarStubComponent {
@Input() isAuthenticated: boolean;
@Input() userProfile: UserProfile = null;
@Input() authenticationEnabled: boolean;
@Input() apiUrl: string;
@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({
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);
document.body.innerHTML =
'<title id="title">Default title</title>' +
'<link id="favicon" href="">';
}));
it('should create the component', () => {
expect(component).toBeDefined();
});
it('should execute ngOnInit lifecycle', (done) => {
const instance: Instance = {
name: 'myInstance',
label: 'My Instance',
scientific_manager: 'M. Dupont',
instrument: 'Multiple',
wavelength_domain: 'Visible',
portal_logo: 'logo.png',
design_color: 'green',
design_background_color: 'darker green',
design_logo: '/path/to/logo',
design_favicon: '/path/to/favicon',
navbar_background_color: '#F8F9FA',
navbar_border_bottom_color: '#DEE2E6',
navbar_color_href: '#000000',
navbar_font_family: 'Roboto, sans-serif',
navbar_sign_in_btn_color: '#28A745',
navbar_user_btn_color: '#7AC29A',
footer_background_color: '#F8F9FA',
footer_border_top_color: '#DEE2E6',
footer_text_color: '#000000',
family_border_color: '#DFDFDF',
family_header_background_color: '#F7F7F7',
family_title_color: '#007BFF',
family_title_bold: false,
family_background_color: '#FFFFFF',
progress_bar_subtitle: 'Select a dataset, add criteria, select output columns and display the result.',
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',
progress_bar_circle_icon_color: '#CCCCCC',
progress_bar_circle_icon_active_color: '#FFFFFF',
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',
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',
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',
nb_dataset_families: 1,
nb_datasets: 2
};
label: 'Home',
title: 'Home',
display: 10,
icon: 'fas fa-home',
content: '<p>Hello</p>',
const spy = jest.spyOn(store, 'dispatch');
component.ngOnInit();
Promise.resolve(null).then(function() {
expect(spy).toHaveBeenCalledWith(datasetFamilyActions.loadDatasetFamilyList());
expect(spy).toHaveBeenCalledWith(datasetActions.loadDatasetList());
expect(spy).toHaveBeenCalledWith(datasetGroupActions.loadDatasetGroupList());
expect(spy).toHaveBeenCalledWith(webpageFamilyActions.loadWebpageFamilyList());
expect(spy).toHaveBeenCalledWith(webpageActions.loadWebpageList());
expect(component.favIcon.href).toEqual('http://localhost/undefined/instance/myInstance/file-explorer/path/to/favicon');
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);
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);
});
});