import {ComponentFixture, fakeAsync, flush, TestBed, tick} from '@angular/core/testing'; import {MeasurementsUltrasoundComponent} from './measurements-ultrasound.component'; import {Subject} from 'rxjs'; import {MatIconTestingModule} from '@angular/material/icon/testing'; import {ScanningObservationTable} from '@nspop/gm-web-facade-api'; import {JsonTransformerUtil} from '../../../utils/json-transformer.util'; import {ObservationService} from '../../api/observation.service'; import {HttpClientTestingModule} from '@angular/common/http/testing'; describe('MeasurementsScansComponent', () => { let component: MeasurementsUltrasoundComponent; let fixture: ComponentFixture; let observationService: ObservationService; let ultraSoundObservationTableSubjectStub: Subject; beforeEach(async () => { ultraSoundObservationTableSubjectStub = new Subject(); observationService = { ultrasoundObservationTable$: ultraSoundObservationTableSubjectStub.asObservable() } as any; await TestBed.configureTestingModule({ declarations: [ MeasurementsUltrasoundComponent ], imports: [MatIconTestingModule, HttpClientTestingModule], providers: [ {provide: ObservationService, useValue: observationService}, ] }) .compileComponents(); }); beforeEach(() => { fixture = TestBed.createComponent(MeasurementsUltrasoundComponent); component = fixture.componentInstance; fixture.detectChanges(); }); it('should create', () => { expect(component).toBeTruthy(); }); it('only registers changes if model has structural changes', () => { const onChange = jasmine.createSpy('onChange'); component.writeValue({episodeOfCareIdentifier: '2'} as any); component.registerOnChange(onChange); component.writeValue({episodeOfCareIdentifier: '2'} as any); expect(onChange).not.toHaveBeenCalled(); component.writeValue({episodeOfCareIdentifier: '1'} as any); expect(onChange).toHaveBeenCalled(); }); it('updates inner value when ngModel is updated on the outside', () => { component.writeValue({episodeOfCareIdentifier: '1'} as any); expect(component.value?.asDataCard).toEqual({episodeOfCareIdentifier: '1'} as any); }); it('merges observations correctly into rows', fakeAsync(() => { ultraSoundObservationTableSubjectStub.next(JsonTransformerUtil.transformDates(JSON.parse('{\n' + // actual example of response from server ' "mother":{\n' + ' "rows":[\n' + ' {\n' + ' "activityId":"3",\n' + ' "date":"2021-01-20T14:28:02.187Z",\n' + ' "gestationAge":"22+4",\n' + ' "amnioticFluid":{\n' + ' "value":42,\n' + ' "unit":"cm"\n' + ' },\n' + ' "flow":"??",\n' + ' "cervix":{\n' + ' "value":10,\n' + ' "unit":"cm"\n' + ' },\n' + ' "dvp":{\n' + ' "value":11,\n' + ' "unit":"ml"\n' + ' },\n' + ' "conclusion":"Her en en konklusion"\n' + ' },\n' + ' {\n' + ' "activityId":"7",\n' + ' "date":"2021-01-20T14:28:02.187Z",\n' + ' "gestationAge":"24+4",\n' + ' "amnioticFluid":{\n' + ' "value":42,\n' + ' "unit":"cm"\n' + ' },\n' + ' "flow":"??",\n' + ' "cervix":{\n' + ' "value":7,\n' + ' "unit":"cm"\n' + ' },\n' + ' "dvp":{\n' + ' "value":9,\n' + ' "unit":"ml"\n' + ' },\n' + ' "conclusion":"Her en en konklusion"\n' + ' }\n' + ' ]\n' + ' },\n' + ' "fetuses":[\n' + ' {\n' + ' "name":"Foster 1",\n' + ' "id":"Foster 1",\n' + ' "rows":[\n' + ' {\n' + ' "activityId":"3",\n' + ' "date":"2021-01-20T14:28:02.187Z",\n' + ' "gestationAge":"22+4",\n' + ' "ulWeight":{\n' + ' "value":1800,\n' + ' "unit":"g"\n' + ' },\n' + ' "weightDeviation":{\n' + ' "value":10,\n' + ' "unit":"%"\n' + ' },\n' + ' "fetusPresentation":"H",\n' + ' "weeksIntoPregnancy":22.57\n' + ' },\n' + ' {\n' + ' "activityId":"7",\n' + ' "date":"2021-01-20T14:28:02.187Z",\n' + ' "gestationAge":"24+4",\n' + ' "ulWeight":{\n' + ' "value":1400,\n' + ' "unit":"g"\n' + ' },\n' + ' "weightDeviation":{\n' + ' "value":10,\n' + ' "unit":"%"\n' + ' },\n' + ' "fetusPresentation":"H",\n' + ' "weeksIntoPregnancy":22.57\n' + ' }\n' + ' ]\n' + ' },\n' + ' {\n' + ' "name":"Foster 2",\n' + ' "id":"Foster 2",\n' + ' "rows":[\n' + ' {\n' + ' "activityId":"7",\n' + ' "date":"2021-01-20T14:28:02.187Z",\n' + ' "gestationAge":"24+4",\n' + ' "ulWeight":{\n' + ' "value":1500,\n' + ' "unit":"g"\n' + ' },\n' + ' "weightDeviation":{\n' + ' "value":7,\n' + ' "unit":"%"\n' + ' },\n' + ' "fetusPresentation":"H",\n' + ' "weeksIntoPregnancy":22.57\n' + ' }\n' + ' ]\n' + ' }\n' + ' ]\n' + ' }'))); component.ngOnInit(); flush(); expect(component.rows.length).toBe(2); expect(component.rows[0].activityId).toEqual('3'); expect(component.rows[0].gestationAge).toEqual('22+4'); expect(component.rows[0].dvp).toEqual('11 ml'); expect(component.rows[0].cervix).toEqual('10 cm'); expect(component.rows[0].flow).toEqual('??'); expect(component.rows[0].amnioticFluid).toEqual('42 cm'); expect(component.rows[0].fetusPresentation).toEqual('H'); expect(component.rows[0].weightDeviation).toEqual('10 %'); expect(component.rows[0].ulWeight).toEqual('1800 g'); expect(component.rows[1].activityId).toEqual('7'); expect(component.rows[1].gestationAge).toEqual('24+4'); expect(component.rows[1].dvp).toEqual('9 ml'); expect(component.rows[1].cervix).toEqual('7 cm'); expect(component.rows[1].flow).toEqual('??'); expect(component.rows[1].amnioticFluid).toEqual('42 cm'); expect(component.rows[1].fetusPresentation).toEqual('H, H'); expect(component.rows[1].weightDeviation).toEqual('10 %, 7 %'); expect(component.rows[1].ulWeight).toEqual('1400 g, 1500 g'); })); it('handles no observations', fakeAsync(() => { ultraSoundObservationTableSubjectStub.next({ mother: {rows: []}, fetuses: [ {id: '1', name: 'Foster 1', rows: []}, {id: '2', name: 'Foster 2', rows: []} ]} as any ); component.ngOnInit(); tick(); expect(component.rows.length).toBe(0); })); it('handles missing measurements', fakeAsync(() => { const now = new Date(); ultraSoundObservationTableSubjectStub.next({ mother: {}, fetuses: [ {id: '1', name: 'Foster 1', rows: [{gestationAge: '11+4', date: now, activityId: '1', ulWeight: {value: 1400, unit: 'g'}}]}, {id: '2', name: 'Foster 2', rows: []}, {id: '3', name: 'Foster 3'} ]} as any ); component.ngOnInit(); flush(); expect(component.rows.length).toBe(1); expect(component.rows[0].activityId).toEqual('1'); expect(component.rows[0].gestationAge).toEqual('11+4'); expect(component.rows[0].date?.getTime()).toEqual(now.getTime()); expect(component.rows[0].dvp).toEqual('-'); expect(component.rows[0].cervix).toEqual('-'); expect(component.rows[0].flow).toEqual('-'); expect(component.rows[0].amnioticFluid).toEqual('-'); expect(component.rows[0].fetusPresentation).toEqual('-'); expect(component.rows[0].weightDeviation).toEqual('-'); expect(component.rows[0].ulWeight).toEqual('1400 g'); })); it('adds save listener on init', () => { const listeners: any[] = []; component.saveListeners = listeners; component.ngOnInit(); expect(listeners.length).toBe(1); }); it('removes save listener on destroy', () => { const f = () => undefined; const listeners: any[] = ['1', f]; component.saveListeners = listeners; component.ngOnInit(); expect(listeners.length).toBe(3); component.ngOnDestroy(); expect(listeners.length).toBe(2); expect(listeners).toContain(f); expect(listeners).toContain('1'); }); });