igniteui-angular-sovn
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
480 lines (383 loc) • 18.2 kB
text/typescript
import { TestBed, fakeAsync, tick } from '@angular/core/testing';
import { GridWithUndefinedDataComponent } from '../../test-utils/grid-samples.spec';
import { PagingComponent, RemotePagingComponent } from '../../test-utils/grid-base-components.spec';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { configureTestSuite } from '../../test-utils/configure-suite';
import { wait } from '../../test-utils/ui-interactions.spec';
import { IgxNumberFilteringOperand } from '../../data-operations/filtering-condition';
import { GridFunctions, PAGER_CLASS } from '../../test-utils/grid-functions.spec';
import { ControlsFunction, BUTTON_DISABLED_CLASS } from '../../test-utils/controls-functions.spec';
const verifyGridPager = (fix, rowsCount, firstCellValue, pagerText, buttonsVisibility) => {
const grid = fix.componentInstance.grid;
expect(grid.getCellByColumn(0, 'ID').value).toMatch(firstCellValue);
expect(grid.rowList.length).toEqual(rowsCount, 'Invalid number of rows initialized');
if (pagerText != null) {
expect(grid.nativeElement.querySelector(PAGER_CLASS)).toBeDefined();
expect(grid.nativeElement.querySelectorAll('igx-select').length).toEqual(1);
expect(grid.nativeElement.querySelector('.igx-page-nav__text').textContent).toMatch(pagerText);
}
if (buttonsVisibility != null && buttonsVisibility.length === 4) {
const pagingButtons = GridFunctions.getPagingButtons(grid.nativeElement);
expect(pagingButtons.length).toEqual(4);
expect(pagingButtons[0].className.includes(BUTTON_DISABLED_CLASS)).toBe(buttonsVisibility[0]);
expect(pagingButtons[1].className.includes(BUTTON_DISABLED_CLASS)).toBe(buttonsVisibility[1]);
expect(pagingButtons[2].className.includes(BUTTON_DISABLED_CLASS)).toBe(buttonsVisibility[2]);
expect(pagingButtons[3].className.includes(BUTTON_DISABLED_CLASS)).toBe(buttonsVisibility[3]);
}
};
describe('IgxGrid - Grid Paging #grid', () => {
configureTestSuite((() => {
return TestBed.configureTestingModule({
imports: [NoopAnimationsModule, PagingComponent,
GridWithUndefinedDataComponent,
RemotePagingComponent]
});
}));
let fix;
let grid;
let paginator;
describe('General', () => {
beforeEach(fakeAsync(() => {
fix = TestBed.createComponent(PagingComponent);
fix.detectChanges();
grid = fix.componentInstance.grid;
paginator = grid.paginator;
}));
it('should paginate data UI', () => {
fix.detectChanges();
expect(paginator).toBeDefined();
verifyGridPager(fix, 3, '1', '1\xA0of\xA04', [true, true, false, false]);
// Go to next page
GridFunctions.navigateToNextPage(grid.nativeElement);
fix.detectChanges();
verifyGridPager(fix, 3, '4', '2\xA0of\xA04', [false, false, false, false]);
// Go to last page
GridFunctions.navigateToLastPage(grid.nativeElement);
fix.detectChanges();
verifyGridPager(fix, 1, '10', '4\xA0of\xA04', [false, false, true, true]);
// Go to previous page
GridFunctions.navigateToPrevPage(grid.nativeElement);
fix.detectChanges();
verifyGridPager(fix, 3, '7', '3\xA0of\xA04', [false, false, false, false]);
// Go to first page
GridFunctions.navigateToFirstPage(grid.nativeElement);
fix.detectChanges();
verifyGridPager(fix, 3, '1', '1\xA0of\xA04', [true, true, false, false]);
});
it('should paginate data API', () => {
fix.detectChanges();
// Goto page 3 through API and listen for event
spyOn(paginator.pagingDone, 'emit');
paginator.paginate(2);
fix.detectChanges();
expect(paginator.pagingDone.emit).toHaveBeenCalled();
verifyGridPager(fix, 3, '7', '3\xA0of\xA04', []);
// Go to next page
paginator.nextPage();
fix.detectChanges();
expect(paginator.pagingDone.emit).toHaveBeenCalledTimes(2);
expect(paginator.isLastPage).toBe(true);
verifyGridPager(fix, 1, '10', '4\xA0of\xA04', []);
// Go to next page when last page is selected
paginator.nextPage();
fix.detectChanges();
expect(paginator.isLastPage).toBe(true);
expect(paginator.pagingDone.emit).toHaveBeenCalledTimes(2);
verifyGridPager(fix, 1, '10', '4\xA0of\xA04', []);
// Go to previous page
paginator.previousPage();
fix.detectChanges();
expect(paginator.pagingDone.emit).toHaveBeenCalledTimes(3);
verifyGridPager(fix, 3, '7', '3\xA0of\xA04', []);
expect(paginator.isLastPage).toBe(false);
expect(paginator.isFirstPage).toBe(false);
// Go to first page
paginator.paginate(0);
fix.detectChanges();
expect(paginator.pagingDone.emit).toHaveBeenCalledTimes(4);
verifyGridPager(fix, 3, '1', '1\xA0of\xA04', []);
expect(paginator.isFirstPage).toBe(true);
// Go to previous page when first page is selected
paginator.previousPage();
fix.detectChanges();
expect(paginator.pagingDone.emit).toHaveBeenCalledTimes(4);
verifyGridPager(fix, 3, '1', '1\xA0of\xA04', []);
expect(paginator.isFirstPage).toBe(true);
// Go to negative page number
paginator.paginate(-3);
fix.detectChanges();
expect(paginator.pagingDone.emit).toHaveBeenCalledTimes(4);
verifyGridPager(fix, 3, '1', '1\xA0of\xA04', []);
});
it('should be able to set totalRecords', () => {
paginator.perPage = 5;
fix.detectChanges();
expect(paginator).toBeDefined();
expect(paginator.perPage).toEqual(5, 'Invalid page size');
expect(grid.totalRecords).toBe(10);
verifyGridPager(fix, 5, '1', '1\xA0of\xA02', []);
grid.totalRecords = 4;
fix.detectChanges();
expect(paginator.perPage).toEqual(5, 'Invalid page size');
expect(grid.totalRecords).toBe(4);
verifyGridPager(fix, 4, '1', '1\xA0of\xA01', []);
});
it('change paging settings UI', () => {
fix.detectChanges();
expect(paginator).toBeDefined();
expect(paginator.perPage).toEqual(3, 'Invalid page size');
verifyGridPager(fix, 3, '1', '1\xA0of\xA04', []);
// Change page size
GridFunctions.clickOnPageSelectElement(fix);
fix.detectChanges();
ControlsFunction.clickDropDownItem(fix, 2);
expect(paginator).toBeDefined();
expect(paginator.perPage).toEqual(10, 'Invalid page size');
verifyGridPager(fix, 10, '1', '1\xA0of\xA01', []);
});
it('change paging settings API', () => {
fix.detectChanges();
// Change page size
paginator.perPage = 2;
fix.detectChanges();
expect(paginator).toBeDefined();
expect(paginator.perPage).toEqual(2, 'Invalid page size');
verifyGridPager(fix, 2, '1', '1\xA0of\xA05', []);
// Turn off paging
fix.componentInstance.paging = false;
fix.detectChanges();
expect(grid.paginator).not.toBeDefined();
verifyGridPager(fix, 10, '1', null, []);
expect(GridFunctions.getGridPaginator(grid)).toBeNull();
expect(grid.nativeElement.querySelectorAll('.igx-paginator > select').length).toEqual(0);
});
it('change paging pages per page API', (async () => {
fix.detectChanges();
grid.height = '300px';
paginator.perPage = 2;
await wait();
fix.detectChanges();
paginator.page = 1;
await wait();
fix.detectChanges();
expect(grid.paginator).toBeDefined();
expect(paginator.perPage).toEqual(2, 'Invalid page size');
verifyGridPager(fix, 2, '3', '2\xA0of\xA05', []);
// Change page size to be 5
paginator.perPage = 5;
await wait();
fix.detectChanges();
grid.notifyChanges(true);
fix.detectChanges();
let vScrollBar = grid.verticalScrollContainer.getScroll();
verifyGridPager(fix, 5, '1', '1\xA0of\xA02', [true, true, false, false]);
expect(vScrollBar.scrollHeight).toBeGreaterThanOrEqual(250);
expect(vScrollBar.scrollHeight).toBeLessThanOrEqual(255);
// Change page size to be 33
paginator.perPage = 33;
await wait();
fix.detectChanges();
vScrollBar = grid.verticalScrollContainer.getScroll();
// pagingDone should be emitted only if we have a change in the page number
verifyGridPager(fix, 5, '1', '1\xA0of\xA01', [true, true, true, true]);
expect(vScrollBar.scrollHeight).toBeGreaterThanOrEqual(500);
expect(vScrollBar.scrollHeight).toBeLessThanOrEqual(510);
// Change page size to be negative
paginator.perPage = -7;
await wait();
fix.detectChanges();
verifyGridPager(fix, 5, '1', '1\xA0of\xA01', [true, true, true, true]);
expect(vScrollBar.scrollHeight).toBeGreaterThanOrEqual(500);
expect(vScrollBar.scrollHeight).toBeLessThanOrEqual(510);
}));
it('activate/deactivate paging', () => {
let paginatorEl = GridFunctions.getGridPaginator(grid);
expect(paginatorEl).toBeDefined();
fix.componentInstance.paging = !fix.componentInstance.paging;
fix.detectChanges();
paginatorEl = GridFunctions.getGridPaginator(grid);
expect(paginatorEl).toBeNull();
fix.componentInstance.paging = !fix.componentInstance.paging;
fix.detectChanges();
paginatorEl = GridFunctions.getGridPaginator(grid);
expect(paginatorEl).not.toBeNull();
});
it('should change not leave prev page data after scorlling', (async () => {
fix.componentInstance.perPage = 5;
fix.componentInstance.data = fix.componentInstance.data.slice(0, 7);
grid.height = '300px';
fix.detectChanges();
fix.componentInstance.scrollTop(25);
fix.detectChanges();
await wait(100);
grid.paginator.paginate(1);
fix.detectChanges();
await wait(100);
grid.paginator.paginate(0);
fix.detectChanges();
await wait(100);
expect(grid.rowList.first._data).toEqual(grid.data[0]);
}));
it('should work correct with filtering', () => {
grid.getColumnByName('ID').filterable = true;
fix.detectChanges();
// Filter column
grid.filter('ID', 1, IgxNumberFilteringOperand.instance().condition('greaterThan'));
fix.detectChanges();
verifyGridPager(fix, 3, '2', '1\xA0of\xA03', [true, true, false, false]);
// Filter column
grid.filter('ID', 1, IgxNumberFilteringOperand.instance().condition('equals'));
fix.detectChanges();
verifyGridPager(fix, 1, '1', '1\xA0of\xA01', [true, true, true, true]);
// Reset filters
grid.clearFilter('ID');
fix.detectChanges();
verifyGridPager(fix, 3, '1', '1\xA0of\xA04', [true, true, false, false]);
});
it('should work correct with crud operations', () => {
grid.primaryKey = 'ID';
fix.detectChanges();
// Delete first row
grid.deleteRow(1);
fix.detectChanges();
verifyGridPager(fix, 3, '2', '1\xA0of\xA03', [true, true, false, false]);
expect(paginator.totalPages).toBe(3);
// Delete all rows on first page
grid.deleteRow(2);
grid.deleteRow(3);
grid.deleteRow(4);
fix.detectChanges();
verifyGridPager(fix, 3, '5', '1\xA0of\xA02', []);
expect(paginator.totalPages).toBe(2);
// Delete all rows on first page
grid.deleteRow(5);
grid.deleteRow(6);
grid.deleteRow(7);
fix.detectChanges();
verifyGridPager(fix, 3, '8', '1\xA0of\xA01', [true, true, true, true]);
expect(paginator.totalPages).toBe(1);
// Add new row
grid.addRow({ ID: 1, Name: 'Test Name', JobTitle: 'Test Job Title' });
fix.detectChanges();
verifyGridPager(fix, 3, '8', '1\xA0of\xA02', [true, true, false, false]);
expect(paginator.totalPages).toBe(2);
paginator.nextPage();
fix.detectChanges();
verifyGridPager(fix, 1, '1', '2\xA0of\xA02', []);
// Add new rows on second page
grid.addRow({ ID: 2, Name: 'Test Name', JobTitle: 'Test Job Title' });
grid.addRow({ ID: 3, Name: 'Test Name', JobTitle: 'Test Job Title' });
grid.addRow({ ID: 4, Name: 'Test Name', JobTitle: 'Test Job Title' });
fix.detectChanges();
verifyGridPager(fix, 3, '1', '2\xA0of\xA03', [false, false, false, false]);
expect(paginator.totalPages).toBe(3);
// Go to last page and delete the row
paginator.nextPage();
fix.detectChanges();
grid.deleteRow(4);
fix.detectChanges();
verifyGridPager(fix, 3, '1', '2\xA0of\xA02', [false, false, true, true]);
});
it('should not throw when initialized in a grid with % height', () => {
fix.componentInstance.paging = true;
expect(() => {
fix.detectChanges();
}).not.toThrow();
});
it('"paginate" method should paginate correctly', () => {
const page = (index: number) => paginator.paginate(index);
let desiredPageIndex = 2;
page(2);
fix.detectChanges();
expect(paginator.page).toBe(desiredPageIndex);
// non-existent page, should not paginate
page(-2);
fix.detectChanges();
expect(paginator.page).toBe(desiredPageIndex);
// non-existent page, should not paginate
page(666);
fix.detectChanges();
expect(paginator.page).toBe(desiredPageIndex);
// first page
desiredPageIndex = 0;
page(desiredPageIndex);
fix.detectChanges();
expect(paginator.page).toBe(desiredPageIndex);
// last page
desiredPageIndex = paginator.totalPages - 1;
page(desiredPageIndex);
fix.detectChanges();
expect(paginator.page).toBe(desiredPageIndex);
// last page + 1, should not paginate
page(paginator.totalPages);
fix.detectChanges();
expect(paginator.page).toBe(desiredPageIndex);
});
it('"page" property should paginate correctly', () => {
const page = (index: number) => paginator.page = index;
let desiredPageIndex = 2;
page(2);
fix.detectChanges();
expect(paginator.page).toBe(desiredPageIndex);
// non-existent page, should not paginate
page(-2);
fix.detectChanges();
expect(paginator.page).toBe(desiredPageIndex);
// non-existent page, should not paginate
page(666);
fix.detectChanges();
expect(paginator.page).toBe(desiredPageIndex);
// first page
desiredPageIndex = 0;
page(desiredPageIndex);
fix.detectChanges();
expect(paginator.page).toBe(desiredPageIndex);
// last page
desiredPageIndex = grid.paginator.totalPages - 1;
page(desiredPageIndex);
fix.detectChanges();
expect(paginator.page).toBe(desiredPageIndex);
// last page + 1, should not paginate
page(paginator.totalPages);
fix.detectChanges();
expect(paginator.page).toBe(desiredPageIndex);
});
});
it('should not throw error when data is undefined', fakeAsync(() => {
let errorMessage = '';
fix = TestBed.createComponent(GridWithUndefinedDataComponent);
try {
fix.detectChanges();
} catch (ex) {
errorMessage = ex.message;
}
expect(errorMessage).toBe('');
grid = fix.componentInstance.grid;
expect(grid.rowList.length).toBe(0);
tick(16);
fix.detectChanges();
expect(grid.rowList.length).toBe(5);
}));
it('paginator should show the exact number of pages when "totalRecords" is not set and "pagingMode" is remote', fakeAsync(() => {
fix = TestBed.createComponent(RemotePagingComponent);
fix.detectChanges();
tick();
grid = fix.componentInstance.grid;
expect(grid.paginator.totalPages).toBe(4);
}));
it('should get correct rowIndex in remote paging', fakeAsync(() => {
fix = TestBed.createComponent(RemotePagingComponent);
fix.detectChanges();
tick();
grid = fix.componentInstance.grid;
expect(grid.paginator.totalPages).toBe(4);
const page = (index: number) => grid.page = index;
const desiredPageIndex = 2;
page(2);
fix.detectChanges();
tick();
expect(grid.page).toBe(desiredPageIndex);
expect(grid.getRowByIndex(0).cells[1].value).toBe('Debra Morton')
expect(grid.getRowByIndex(0).viewIndex).toBe(6);
}));
});