import {ComponentFixture, fakeAsync, TestBed, tick} from '@angular/core/testing'; import { ActivitiesComponent } from './activities.component'; import {ActivitiesService} from './activities.service'; import {of} from 'rxjs'; import {LocalizationPipe} from './localize'; import {BrowserModule} from '@angular/platform-browser'; import {BrowserAnimationsModule} from '@angular/platform-browser/animations'; import {ActivityModalComponent} from './activity-modal/activity-modal.component'; import {EditPlanModalComponent} from './edit-plan-modal/edit-plan-modal.component'; import {DataFieldComponent} from './data-field/data-field.component'; import {FormsModule, ReactiveFormsModule} from '@angular/forms'; import {WeekNumberPipe} from '../pipes/week-number.pipe'; import {ModalComponent} from '../modals/modal/modal.component'; import {MatIcon, MatIconModule} from '@angular/material/icon'; import {Component, Input} from '@angular/core'; import {DirtyGuard} from '../confirm-navigation-if-dirty.framework'; import {HttpClientTestingModule} from '@angular/common/http/testing'; import {CarePlanService} from '../api/care-plan.service'; import {ActivatedRoute} from '@angular/router'; import {AngularMaterialModule} from '../modules/angular-material.module'; @Component({ // tslint:disable-next-line:component-selector selector: 'mat-icon', template: '' }) class MockMatIconComponent { @Input() svgIcon: any; @Input() fontSet: any; @Input() fontIcon: any; } @Component({ selector: 'app-general-information-bar', template: '' }) class MockGeneralInfoBarComponent { // tslint:disable-next-line:no-input-rename @Input('fixed-at') fixedAt = 0; } @Component({ selector: 'app-measurements-modal', template: '' }) class MockMeasurementsModalComponent { // tslint:disable-next-line:no-input-rename @Input('fixed-at') fixedAt = 0; } describe('ActivitiesComponent', () => { let component: ActivitiesComponent; let fixture: ComponentFixture; let activatedRouteStub: ActivatedRoute; let activitiesServiceStub: ActivitiesService; let carePlanServiceStub: CarePlanService; beforeEach(async () => { activatedRouteStub = { queryParamMap: of({has: () => false}) } as any; carePlanServiceStub = {carePlan$: of(undefined)} as any; activitiesServiceStub = { get: of([...Array(20).keys()].map((index) => ({id: index}))), openActivityModalEvent$: of(undefined), openNoteModalEvent$: of(undefined), openMeasurementsModalEvent$: of(undefined), emitOpenActivityModalEvent: () => of(undefined), selectedDataCard$: of(undefined), futureActivities$: of([ {id: '1', status: 'expected'}, {id: '2', status: 'expected'}, {id: '3', status: 'expected'}, ]), pastActivities$: of(undefined) } as any; await TestBed.configureTestingModule({ declarations: [ ActivitiesComponent, LocalizationPipe, ActivityModalComponent, EditPlanModalComponent, DataFieldComponent, WeekNumberPipe, ModalComponent, MockGeneralInfoBarComponent, MockMeasurementsModalComponent, ], providers: [ {provide: ActivitiesService, useValue: activitiesServiceStub}, {provide: DirtyGuard, useValue: {canDeactivate: () => true}}, {provide: CarePlanService, useValue: carePlanServiceStub}, {provide: ActivatedRoute, useValue: activatedRouteStub} ], imports: [ ReactiveFormsModule, BrowserAnimationsModule, BrowserModule, FormsModule, AngularMaterialModule, HttpClientTestingModule, ] }) .overrideModule(MatIconModule, { remove: { declarations: [MatIcon], exports: [MatIcon] }, add: { declarations: [MockMatIconComponent], exports: [MockMatIconComponent] } }) .compileComponents(); }); beforeEach(() => { fixture = TestBed.createComponent(ActivitiesComponent); component = fixture.componentInstance; fixture.detectChanges(); }); it('should create', () => { expect(component).toBeTruthy(); }); it('should scroll into view', () => { component.onScroll(); }); it('should add an undefined activity', () => { const spy = spyOn(activitiesServiceStub, 'emitOpenActivityModalEvent').and.callThrough(); component.addActivity(); expect(spy).toHaveBeenCalledWith(undefined); }); it('should scroll future activities into view', fakeAsync(() => { // assuming that env is set and ready fixture.detectChanges(); component.upcomingActivities = { nativeElement: { getBoundingClientRect: () => ({ top: 0 }), } }; const spy = spyOn(window, 'scrollTo').and.callThrough(); component.scrollToActivities(); tick(500); fixture.detectChanges(); expect(spy).toHaveBeenCalled(); })); });