import 'reflect-metadata'; import { Location, } from '@angular/common'; import { NavigationEnd, NavigationStart, Router, } from '@angular/router'; import { ScrollToTopOnRouteChangeService, } from './scroll-to-top-on-route-change.service'; import { Observable } from 'rxjs'; const initScrollToTopOnRouteChange = ( router?: Router, window?: Window, ) => { return new ScrollToTopOnRouteChangeService( router, window, ); }; describe('scrollToTopOnRouteChange', () => { test('Scrolls to top when going to a new url', () => { const nextUrl = '3'; const navStart = new NavigationStart(0, nextUrl); const navEnd = new NavigationEnd(0, nextUrl, nextUrl); const router = { events: Observable.create((observer) => { observer.next(navStart); observer.next(navEnd); }), } as Router; const location = {} as Location; location.subscribe = jest.fn(); const window = {} as Window; window.scrollTo = jest.fn(); const scrollToTopOnRouteChange = initScrollToTopOnRouteChange( router, window, ); scrollToTopOnRouteChange.routeTrail = [{ scroll: { x: 0, y: 0, }, url: '1', }, { scroll: { x: 0, y: 0, }, url: '2', }]; scrollToTopOnRouteChange.scrollToTopOnRouteChange(); expect(window.scrollTo).toHaveBeenCalledWith(0, 0); }); test('Scrolls to the previous y when going to the previous url', () => { jest.useFakeTimers(); const nextUrl = '10'; const navStart = new NavigationStart(0, nextUrl); const navEnd = new NavigationEnd(0, nextUrl, nextUrl); const router = { events: Observable.create((observer) => { observer.next(navStart); observer.next(navEnd); jest.runAllTimers(); }), } as Router; const location = {} as Location; location.subscribe = jest.fn(); const window = {} as Window; window.scrollTo = jest.fn(); const scrollToTopOnRouteChange = initScrollToTopOnRouteChange( router, window, ); scrollToTopOnRouteChange.routeTrail = [{ scroll: { x: 0, y: 0, }, url: '10', }, { scroll: { x: 0, y: 30, }, url: '20', }]; jest.runAllTimers(); scrollToTopOnRouteChange.scrollToTopOnRouteChange(); expect(window.scrollTo).toHaveBeenCalledWith(0, 30); }); });