import UI_ROUTER from '@uirouter/angularjs';
import { mock } from 'angular';
import $ from 'jquery';
import type { INavigationPage } from './PageNavigationState';
import { PAGE_NAVIGATOR_COMPONENT } from './pageNavigator.component';
import { ScrollToService } from '../../utils/scrollTo/scrollTo.service';
describe('Component: Page Navigator', () => {
let $compile: ng.ICompileService, $scope: ng.IScope, $timeout: ng.ITimeoutService, elem: JQuery;
beforeEach(mock.module(PAGE_NAVIGATOR_COMPONENT, UI_ROUTER));
beforeEach(
mock.inject((_$compile_: ng.ICompileService, $rootScope: ng.IScope, _$timeout_: ng.ITimeoutService) => {
$compile = _$compile_;
$scope = $rootScope.$new();
$timeout = _$timeout_;
}),
);
const initialize = (pages: INavigationPage[]) => {
$scope['pages'] = pages;
let dom = `
`;
pages.forEach((_p, index) => {
dom += `
`;
});
dom += `
`;
elem = $compile(dom)($scope);
$scope.$digest();
};
describe('initialization', () => {
it('renders all pages when no visible flag is set', () => {
const pages = [
{ key: '1', label: 'Page 1' },
{ key: '2', label: 'Page 2' },
];
initialize(pages);
expect(elem.find('h4').length).toBe(2);
expect(elem.find('h4:eq(0)').text()).toContain('Page 1');
expect(elem.find('h4:eq(1)').text()).toContain('Page 2');
});
it('renders pages conditionally based on visible flag', () => {
const pages = [
{ key: '1', label: 'Page 1', visible: true },
{ key: '2', label: 'Page 2', visible: false },
];
initialize(pages);
expect(elem.find('h4').length).toBe(1);
expect(elem.find('h4:eq(0)').text()).toContain('Page 1');
pages[1].visible = true;
$scope.$digest();
expect(elem.find('h4').length).toBe(2);
});
});
describe('navigation', () => {
beforeEach(() => {
$.fx.off = true;
spyOn(ScrollToService, 'scrollTo');
});
it('scrolls to selected page and adds a highlighted class, removing from previously highlighted ones', () => {
const pages = [
{ key: '1', label: 'Page 1' },
{ key: '2', label: 'Page 2' },
];
initialize(pages);
$scope.$digest();
const navigator: JQuery = elem.find('.page-navigation');
navigator.find('a:eq(1)').click();
expect(elem.find('[data-page-id=2]').hasClass('highlighted')).toBe(true);
$timeout.flush();
expect(ScrollToService.scrollTo).toHaveBeenCalledWith('[data-page-id=2]', '.container', 0);
navigator.find('a:eq(0)').click();
expect(elem.find('[data-page-id=1]').hasClass('highlighted')).toBe(true);
expect(elem.find('[data-page-id=2]').hasClass('highlighted')).toBe(false);
});
});
});