igniteui-angular-sovn
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
1,142 lines (939 loc) • 67.5 kB
text/typescript
import { TestBed, fakeAsync, tick, waitForAsync } from '@angular/core/testing';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import {
IgxTreeGridExpandingComponent,
IgxTreeGridPrimaryForeignKeyComponent,
IgxTreeGridRowEditingComponent,
IgxTreeGridLoadOnDemandComponent,
IgxTreeGridLoadOnDemandHasChildrenComponent,
IgxTreeGridLoadOnDemandChildDataComponent,
IgxTreeGridCustomExpandersTemplateComponent
} from '../../test-utils/tree-grid-components.spec';
import { TreeGridFunctions } from '../../test-utils/tree-grid-functions.spec';
import { configureTestSuite } from '../../test-utils/configure-suite';
import { first } from 'rxjs/operators';
import { wait } from '../../test-utils/ui-interactions.spec';
import { GridFunctions } from '../../test-utils/grid-functions.spec';
import { GridSelectionMode } from '../common/enums';
import { IgxTreeGridComponent } from './tree-grid.component';
import { QueryList } from '@angular/core';
import { IgxTreeGridAPIService } from './tree-grid-api.service';
import { CellType } from '../public_api';
describe('IgxTreeGrid - Expanding / Collapsing #tGrid', () => {
configureTestSuite();
let fix;
let treeGrid: IgxTreeGridComponent;
beforeAll(waitForAsync(() => {
TestBed.configureTestingModule({
imports: [
NoopAnimationsModule,
IgxTreeGridExpandingComponent,
IgxTreeGridPrimaryForeignKeyComponent,
IgxTreeGridLoadOnDemandComponent,
IgxTreeGridLoadOnDemandHasChildrenComponent,
IgxTreeGridLoadOnDemandChildDataComponent,
IgxTreeGridCustomExpandersTemplateComponent,
IgxTreeGridRowEditingComponent
]
}).compileComponents();
}));
describe('Child Collection', () => {
beforeEach(() => {
fix = TestBed.createComponent(IgxTreeGridExpandingComponent);
fix.detectChanges();
treeGrid = fix.componentInstance.treeGrid;
});
it('check row expanding and collapsing are changing rows count (UI)', () => {
let rows = TreeGridFunctions.getAllRows(fix);
expect(rows.length).toBe(4);
const firstRow = rows[0];
const indicatorDiv = TreeGridFunctions.getExpansionIndicatorDiv(firstRow);
indicatorDiv.triggerEventHandler('click', new Event('click'));
fix.detectChanges();
rows = TreeGridFunctions.getAllRows(fix);
expect(rows.length).toBe(7);
indicatorDiv.triggerEventHandler('click', new Event('click'));
fix.detectChanges();
rows = TreeGridFunctions.getAllRows(fix);
expect(rows.length).toBe(4);
});
it('check row expanding and collapsing are changing rows count (API)', () => {
let rows = TreeGridFunctions.getAllRows(fix);
expect(rows.length).toBe(4);
treeGrid.toggleRow(treeGrid.gridAPI.get_row_by_index(0).key);
fix.detectChanges();
rows = TreeGridFunctions.getAllRows(fix);
expect(rows.length).toBe(7);
treeGrid.toggleRow(treeGrid.gridAPI.get_row_by_index(0).key);
fix.detectChanges();
rows = TreeGridFunctions.getAllRows(fix);
expect(rows.length).toBe(4);
});
it('check expand/collapse indicator changes (UI)', () => {
const rows = TreeGridFunctions.getAllRows(fix);
rows.forEach(row => {
TreeGridFunctions.verifyTreeRowHasCollapsedIcon(row);
});
for (let rowToToggle = 0; rowToToggle < rows.length; rowToToggle++) {
const indicatorDiv = TreeGridFunctions.getExpansionIndicatorDiv(rows[rowToToggle]);
indicatorDiv.triggerEventHandler('click', new Event('click'));
fix.detectChanges();
for (let rowToCheck = 0; rowToCheck < rows.length; rowToCheck++) {
if (rowToCheck === rowToToggle) {
TreeGridFunctions.verifyTreeRowHasExpandedIcon(rows[rowToCheck]);
} else {
TreeGridFunctions.verifyTreeRowHasCollapsedIcon(rows[rowToCheck]);
}
}
indicatorDiv.triggerEventHandler('click', new Event('click'));
fix.detectChanges();
}
rows.forEach(row => {
TreeGridFunctions.verifyTreeRowHasCollapsedIcon(row);
});
});
it('check expand/collapse indicator changes (API)', () => {
fix.detectChanges();
const rows = TreeGridFunctions.getAllRows(fix);
rows.forEach(row => {
TreeGridFunctions.verifyTreeRowHasCollapsedIcon(row);
});
for (let rowToToggle = 0; rowToToggle < rows.length; rowToToggle++) {
treeGrid.toggleRow(treeGrid.getRowByIndex(rowToToggle).key);
fix.detectChanges();
for (let rowToCheck = 0; rowToCheck < rows.length; rowToCheck++) {
if (rowToCheck === rowToToggle) {
TreeGridFunctions.verifyTreeRowHasExpandedIcon(rows[rowToCheck]);
} else {
TreeGridFunctions.verifyTreeRowHasCollapsedIcon(rows[rowToCheck]);
}
}
treeGrid.toggleRow(treeGrid.getRowByIndex(rowToToggle).key);
fix.detectChanges();
}
rows.forEach(row => {
TreeGridFunctions.verifyTreeRowHasCollapsedIcon(row);
});
fix.detectChanges();
});
it('check second level records are having the correct indentation (UI)', () => {
const rows = TreeGridFunctions.getAllRows(fix);
const indicatorDiv = TreeGridFunctions.getExpansionIndicatorDiv(rows[0]);
indicatorDiv.triggerEventHandler('click', new Event('click'));
fix.detectChanges();
TreeGridFunctions.verifyRowIndentationLevelByIndex(fix, 1, 1); // fix, rowIndex, expectedLevel
TreeGridFunctions.verifyRowIndentationLevelByIndex(fix, 2, 1);
TreeGridFunctions.verifyRowIndentationLevelByIndex(fix, 3, 1);
});
it('check second level records are having the correct indentation (API)', () => {
treeGrid.toggleRow(treeGrid.getRowByIndex(0).key);
fix.detectChanges();
TreeGridFunctions.verifyRowIndentationLevelByIndex(fix, 1, 1); // fix, rowIndex, expectedLevel
TreeGridFunctions.verifyRowIndentationLevelByIndex(fix, 2, 1);
TreeGridFunctions.verifyRowIndentationLevelByIndex(fix, 3, 1);
});
it('check third level records are having the correct indentation (UI)', () => {
// expand second level records
let rows = TreeGridFunctions.getAllRows(fix);
let indicatorDiv = TreeGridFunctions.getExpansionIndicatorDiv(rows[0]);
indicatorDiv.triggerEventHandler('click', new Event('click'));
fix.detectChanges();
// expand third level record
rows = TreeGridFunctions.getAllRows(fix);
indicatorDiv = TreeGridFunctions.getExpansionIndicatorDiv(rows[3]);
indicatorDiv.triggerEventHandler('click', new Event('click'));
fix.detectChanges();
// check third level records indentation
TreeGridFunctions.verifyRowIndentationLevelByIndex(fix, 4, 2); // fix, rowIndex, expectedLevel
TreeGridFunctions.verifyRowIndentationLevelByIndex(fix, 5, 2);
});
it('check third level records are having the correct indentation (API)', () => {
// expand second level records
treeGrid.toggleRow(treeGrid.getRowByIndex(0).key);
fix.detectChanges();
// expand third level record
treeGrid.toggleRow(treeGrid.getRowByIndex(3).key);
fix.detectChanges();
// check third level records indentation
TreeGridFunctions.verifyRowIndentationLevelByIndex(fix, 4, 2); // fix, rowIndex, expectedLevel
TreeGridFunctions.verifyRowIndentationLevelByIndex(fix, 5, 2);
});
it('check grand children are not visible when collapsing their grand parent', () => {
let rows = TreeGridFunctions.getAllRows(fix);
expect(rows.length).toBe(4);
// expand second level records
treeGrid.toggleRow(treeGrid.getRowByIndex(0).key);
fix.detectChanges();
// expand third level record
treeGrid.toggleRow(treeGrid.getRowByIndex(3).key);
fix.detectChanges();
rows = TreeGridFunctions.getAllRows(fix);
expect(rows.length).toBe(9);
// collapse first row with all its children and grand children
treeGrid.toggleRow(treeGrid.getRowByIndex(0).key);
fix.detectChanges();
rows = TreeGridFunctions.getAllRows(fix);
expect(rows.length).toBe(4);
});
it('should expand/collapse rows when changing the \'expanded\' property', () => {
let rows = TreeGridFunctions.getAllRows(fix);
expect(rows.length).toBe(4);
// expand a root level row
let aRow = treeGrid.gridAPI.get_row_by_index(0);
let cells = (aRow.cells as QueryList<CellType>).toArray();
expect(cells[0].value).toBe(147, 'wrong root level row');
expect(aRow.expanded).toBe(false);
aRow.expanded = true;
fix.detectChanges();
rows = TreeGridFunctions.getAllRows(fix);
expect(rows.length).toBe(7, 'root level row expanding problem');
// expand a second level row
aRow = treeGrid.gridAPI.get_row_by_index(3);
cells = (aRow.cells as QueryList<CellType>).toArray();
expect(cells[0].value).toBe(317, 'wrong second level row');
expect(aRow.expanded).toBe(false);
aRow.expanded = true;
fix.detectChanges();
rows = TreeGridFunctions.getAllRows(fix);
expect(rows.length).toBe(9, 'second level row expanding problem');
// check third level rows are having the correct values
aRow = treeGrid.gridAPI.get_row_by_index(4);
cells = (aRow.cells as QueryList<CellType>).toArray();
expect(cells[0].value).toBe(711, 'wrong third level row');
aRow = treeGrid.gridAPI.get_row_by_index(5);
cells = (aRow.cells as QueryList<CellType>).toArray();
expect(cells[0].value).toBe(998, 'wrong third level row');
// collapse a second level row
aRow = treeGrid.gridAPI.get_row_by_index(3);
aRow.expanded = false;
fix.detectChanges();
rows = TreeGridFunctions.getAllRows(fix);
expect(rows.length).toBe(7, 'second level row collapsing problem');
// collapse a root level row
aRow = treeGrid.gridAPI.get_row_by_index(0);
aRow.expanded = false;
fix.detectChanges();
rows = TreeGridFunctions.getAllRows(fix);
expect(rows.length).toBe(4, 'root level row collapsing problem');
});
it('should expand/collapse when using \'expandAll\' and \'collapseAll\' methods', () => {
treeGrid.paginator.perPage = 50;
fix.detectChanges();
let rows = TreeGridFunctions.getAllRows(fix);
expect(rows.length).toBe(4);
treeGrid.expandAll();
fix.detectChanges();
rows = TreeGridFunctions.getAllRows(fix);
expect(rows.length).toBeGreaterThan(10);
expect(rows.length).toBeLessThan(14);
treeGrid.collapseAll();
fix.detectChanges();
rows = TreeGridFunctions.getAllRows(fix);
expect(rows.length).toBe(4);
});
it('should emit an event when expanding rows (API)', (done) => {
const aRow = treeGrid.gridAPI.get_row_by_index(0);
treeGrid.rowToggle.pipe(first()).subscribe((args) => {
expect(args.cancel).toBe(false);
expect(args.event).toBeUndefined();
expect(args.expanded).toBe(true);
expect(args.rowID.ID).toBe(147);
done();
});
aRow.expanded = true;
});
it('should emit an event when collapsing rows (API)', (done) => {
const aRow = treeGrid.gridAPI.get_row_by_index(0);
aRow.expanded = true;
fix.detectChanges();
treeGrid.rowToggle.pipe(first()).subscribe((args) => {
expect(args.cancel).toBe(false);
expect(args.event).toBeUndefined();
expect(args.expanded).toBe(false);
expect(args.rowID.ID).toBe(147);
done();
});
aRow.expanded = false;
fix.detectChanges();
});
it('should emit an event when expanding rows (UI)', (done) => {
treeGrid.rowToggle.pipe(first()).subscribe((args) => {
expect(args.cancel).toBe(false);
expect(args.event).toBeDefined();
expect(args.expanded).toBe(true);
expect(args.rowID.ID).toBe(147);
done();
});
const rowsDOM = TreeGridFunctions.getAllRows(fix);
const indicatorDivDOM = TreeGridFunctions.getExpansionIndicatorDiv(rowsDOM[0]);
indicatorDivDOM.triggerEventHandler('click', new Event('click'));
});
it('should emit an event when collapsing rows (UI)', (done) => {
const rowsDOM = TreeGridFunctions.getAllRows(fix);
const indicatorDivDOM = TreeGridFunctions.getExpansionIndicatorDiv(rowsDOM[0]);
indicatorDivDOM.triggerEventHandler('click', new Event('click'));
fix.detectChanges();
treeGrid.rowToggle.pipe(first()).subscribe((args) => {
expect(args.cancel).toBe(false);
expect(args.event).toBeDefined();
expect(args.expanded).toBe(false);
expect(args.rowID.ID).toBe(147);
done();
});
indicatorDivDOM.triggerEventHandler('click', new Event('click'));
fix.detectChanges();
});
it('should update current page when \'collapseAll\' ', () => {
// Test prerequisites
treeGrid.paginator.perPage = 4;
fix.detectChanges();
treeGrid.expandAll();
fix.detectChanges();
// Verify current page
verifyGridPager(fix, 4, '147', '1\xA0of\xA05', [true, true, false, false]);
expect(treeGrid.paginator.totalPages).toBe(5);
// Go to fourth page
treeGrid.paginator.page = 3;
fix.detectChanges();
// Verify current page
verifyGridPager(fix, 4, '17', '4\xA0of\xA05', [false, false, false, false]);
expect(treeGrid.paginator.totalPages).toBe(5);
treeGrid.collapseAll();
fix.detectChanges();
// Verify current page is the first one and only root rows are visible.
verifyGridPager(fix, 4, '147', '1\xA0of\xA01', [true, true, true, true]);
expect(treeGrid.paginator.totalPages).toBe(1);
});
it('Should update the paginator when a row of any level is expanded', fakeAsync(() => {
// Test prerequisites
treeGrid.paginator.perPage = 5;
fix.detectChanges();
tick(16);
treeGrid.collapseAll();
fix.detectChanges();
tick(16);
// Verify current page
verifyGridPager(fix, 4, '147', '1\xA0of\xA01', [true, true, true, true]);
expect(treeGrid.paginator.totalPages).toBe(1);
// Expand a row
const rowsDOM = TreeGridFunctions.getAllRows(fix);
let indicatorDivDOM = TreeGridFunctions.getExpansionIndicatorDiv(rowsDOM[3]);
indicatorDivDOM.triggerEventHandler('click', new Event('click'));
fix.detectChanges();
// Verify current page
verifyGridPager(fix, 5, '147', '1\xA0of\xA02', [true, true, false, false]);
expect(treeGrid.paginator.totalPages).toBe(2);
// Expand another row
indicatorDivDOM = TreeGridFunctions.getExpansionIndicatorDiv(rowsDOM[1]);
indicatorDivDOM.triggerEventHandler('click', new Event('click'));
fix.detectChanges();
treeGrid.page = 1;
fix.detectChanges();
tick(16);
indicatorDivDOM = TreeGridFunctions.getExpansionIndicatorDiv(rowsDOM[1]);
indicatorDivDOM.triggerEventHandler('click', new Event('click'));
fix.detectChanges();
// Verify current page
verifyGridPager(fix, 5, '17', '2\xA0of\xA03', [false, false, false, false]);
expect(treeGrid.paginator.totalPages).toBe(3);
}));
it('Should update the paginator when a row of any level is collapsed', () => {
// Test prerequisites
treeGrid.paginator.perPage = 5;
fix.detectChanges();
treeGrid.expandAll();
fix.detectChanges();
// Verify current page
verifyGridPager(fix, 5, '147', '1\xA0of\xA04', [true, true, false, false]);
expect(treeGrid.paginator.totalPages).toBe(4);
// Go to third page
treeGrid.paginator.page = 2;
fix.detectChanges();
verifyGridPager(fix, 5, '19', '3\xA0of\xA04', [false, false, false, false]);
expect(treeGrid.paginator.totalPages).toBe(4);
const rowsDOM = TreeGridFunctions.getAllRows(fix);
let indicatorDivDOM = TreeGridFunctions.getExpansionIndicatorDiv(rowsDOM[0]);
indicatorDivDOM.triggerEventHandler('click', new Event('click'));
fix.detectChanges();
indicatorDivDOM = TreeGridFunctions.getExpansionIndicatorDiv(rowsDOM[2]);
indicatorDivDOM.triggerEventHandler('click', new Event('click'));
fix.detectChanges();
// // Verify current page
verifyGridPager(fix, 4, '19', '3\xA0of\xA03', [false, false, true, true]);
expect(treeGrid.paginator.totalPages).toBe(3);
treeGrid.paginator.page = 0;
fix.detectChanges();
indicatorDivDOM = TreeGridFunctions.getExpansionIndicatorDiv(rowsDOM[0]);
indicatorDivDOM.triggerEventHandler('click', new Event('click'));
fix.detectChanges();
// // Verify current page
verifyGridPager(fix, 5, '147', '1\xA0of\xA02', [true, true, false, false]);
expect(treeGrid.paginator.totalPages).toBe(2);
});
it('Should update the paginator when navigating through pages', async () => {
// Async tick is required for the pager to be rendered
fix.detectChanges();
await wait();
// Verify current page
verifyGridPager(fix, 4, '147', '1\xA0of\xA01', [true, true, true, true]);
expect(treeGrid.paginator.totalPages).toBe(1);
// Go to third page
const rowsDOM = TreeGridFunctions.getAllRows(fix);
let indicatorDivDOM = TreeGridFunctions.getExpansionIndicatorDiv(rowsDOM[3]);
indicatorDivDOM.triggerEventHandler('click', new Event('click'));
indicatorDivDOM = TreeGridFunctions.getExpansionIndicatorDiv(rowsDOM[1]);
indicatorDivDOM.triggerEventHandler('click', new Event('click'));
indicatorDivDOM = TreeGridFunctions.getExpansionIndicatorDiv(rowsDOM[0]);
indicatorDivDOM.triggerEventHandler('click', new Event('click'));
fix.detectChanges();
const tGrid: HTMLElement = treeGrid.nativeElement;
GridFunctions.navigateToNextPage(tGrid);
fix.detectChanges();
// Verify current page
verifyGridPager(fix, 1, '101', '2\xA0of\xA02', [false, false, true, true]);
expect(treeGrid.paginator.totalPages).toBe(2);
GridFunctions.navigateToFirstPage(tGrid);
fix.detectChanges();
// Verify current page
verifyGridPager(fix, 10, '147', '1\xA0of\xA02', [true, true, false, false]);
expect(treeGrid.paginator.totalPages).toBe(2);
});
});
describe('Primary/Foreign key', () => {
beforeEach(() => {
fix = TestBed.createComponent(IgxTreeGridPrimaryForeignKeyComponent);
treeGrid = fix.componentInstance.treeGrid;
treeGrid.expansionDepth = 0;
fix.detectChanges();
});
it('check row expanding and collapsing are changing rows count (UI)', () => {
let rows = TreeGridFunctions.getAllRows(fix);
expect(rows.length).toBe(3);
const firstRow = rows[0];
const indicatorDiv = TreeGridFunctions.getExpansionIndicatorDiv(firstRow);
indicatorDiv.triggerEventHandler('click', new Event('click'));
fix.detectChanges();
rows = TreeGridFunctions.getAllRows(fix);
expect(rows.length).toBe(5);
indicatorDiv.triggerEventHandler('click', new Event('click'));
fix.detectChanges();
rows = TreeGridFunctions.getAllRows(fix);
expect(rows.length).toBe(3);
});
it('check row expanding and collapsing are changing rows count (API)', () => {
let rows = TreeGridFunctions.getAllRows(fix);
expect(rows.length).toBe(3);
treeGrid.toggleRow(treeGrid.getRowByIndex(0).key);
fix.detectChanges();
rows = TreeGridFunctions.getAllRows(fix);
expect(rows.length).toBe(5);
treeGrid.toggleRow(treeGrid.getRowByIndex(0).key);
fix.detectChanges();
rows = TreeGridFunctions.getAllRows(fix);
expect(rows.length).toBe(3);
});
it('check expand/collapse indicator changes (UI)', () => {
const rows = TreeGridFunctions.getAllRows(fix);
rows.forEach(row => {
TreeGridFunctions.verifyTreeRowHasCollapsedIcon(row);
});
for (let rowToToggle = 0; rowToToggle < rows.length; rowToToggle++) {
if (rowToToggle === 1) {
continue;
}
const indicatorDiv = TreeGridFunctions.getExpansionIndicatorDiv(rows[rowToToggle]);
indicatorDiv.triggerEventHandler('click', new Event('click'));
fix.detectChanges();
for (let rowToCheck = 0; rowToCheck < rows.length; rowToCheck++) {
if (rowToCheck === rowToToggle) {
TreeGridFunctions.verifyTreeRowHasExpandedIcon(rows[rowToCheck]);
} else {
TreeGridFunctions.verifyTreeRowHasCollapsedIcon(rows[rowToCheck]);
}
}
indicatorDiv.triggerEventHandler('click', new Event('click'));
fix.detectChanges();
}
rows.forEach(row => {
TreeGridFunctions.verifyTreeRowHasCollapsedIcon(row);
});
});
it('check expand/collapse indicator changes (API)', () => {
const rows = TreeGridFunctions.getAllRows(fix);
rows.forEach(row => {
TreeGridFunctions.verifyTreeRowHasCollapsedIcon(row);
});
for (let rowToToggle = 0; rowToToggle < rows.length; rowToToggle++) {
const ri = treeGrid.getRowByIndex(rowToToggle).key;
treeGrid.toggleRow(ri);
fix.detectChanges();
for (let rowToCheck = 0; rowToCheck < rows.length; rowToCheck++) {
if (rowToCheck === rowToToggle && (treeGrid.gridAPI as IgxTreeGridAPIService).allow_expansion_state_change(ri, false)) {
TreeGridFunctions.verifyTreeRowHasExpandedIcon(rows[rowToCheck]);
} else {
TreeGridFunctions.verifyTreeRowHasCollapsedIcon(rows[rowToCheck]);
}
}
treeGrid.toggleRow(treeGrid.getRowByIndex(rowToToggle).key);
fix.detectChanges();
}
rows.forEach(row => {
TreeGridFunctions.verifyTreeRowHasCollapsedIcon(row);
});
});
it('check second level records are having the correct indentation (UI)', () => {
const rows = TreeGridFunctions.getAllRows(fix);
const indicatorDiv = TreeGridFunctions.getExpansionIndicatorDiv(rows[0]);
indicatorDiv.triggerEventHandler('click', new Event('click'));
fix.detectChanges();
TreeGridFunctions.verifyRowIndentationLevelByIndex(fix, 1, 1); // fix, rowIndex, expectedLevel
TreeGridFunctions.verifyRowIndentationLevelByIndex(fix, 2, 1);
TreeGridFunctions.verifyRowIndentationLevelByIndex(fix, 3, 0);
});
it('check second level records are having the correct indentation (API)', () => {
treeGrid.toggleRow(treeGrid.getRowByIndex(0).key);
fix.detectChanges();
TreeGridFunctions.verifyRowIndentationLevelByIndex(fix, 1, 1); // fix, rowIndex, expectedLevel
TreeGridFunctions.verifyRowIndentationLevelByIndex(fix, 2, 1);
TreeGridFunctions.verifyRowIndentationLevelByIndex(fix, 3, 0);
});
it('check third level records are having the correct indentation (UI)', () => {
// expand second level records
let rows = TreeGridFunctions.getAllRows(fix);
let indicatorDiv = TreeGridFunctions.getExpansionIndicatorDiv(rows[0]);
indicatorDiv.triggerEventHandler('click', new Event('click'));
fix.detectChanges();
// expand third level record
rows = TreeGridFunctions.getAllRows(fix);
indicatorDiv = TreeGridFunctions.getExpansionIndicatorDiv(rows[1]);
indicatorDiv.triggerEventHandler('click', new Event('click'));
fix.detectChanges();
// check third level records indentation
TreeGridFunctions.verifyRowIndentationLevelByIndex(fix, 2, 2); // fix, rowIndex, expectedLevel
TreeGridFunctions.verifyRowIndentationLevelByIndex(fix, 3, 2);
});
it('check third level records are having the correct indentation (API)', () => {
// expand second level records
treeGrid.toggleRow(treeGrid.getRowByIndex(0).key);
fix.detectChanges();
// expand third level record
treeGrid.toggleRow(treeGrid.getRowByIndex(1).key);
fix.detectChanges();
// check third level records indentation
TreeGridFunctions.verifyRowIndentationLevelByIndex(fix, 2, 2); // fix, rowIndex, expectedLevel
TreeGridFunctions.verifyRowIndentationLevelByIndex(fix, 3, 2);
});
it('check grand children are not visible when collapsing their grand parent', () => {
let rows = TreeGridFunctions.getAllRows(fix);
expect(rows.length).toBe(3);
// expand second level records
treeGrid.toggleRow(treeGrid.getRowByIndex(0).key);
fix.detectChanges();
// expand third level record
treeGrid.toggleRow(treeGrid.getRowByIndex(1).key);
fix.detectChanges();
rows = TreeGridFunctions.getAllRows(fix);
expect(rows.length).toBe(7);
// collapse first row with all its children and grand children
treeGrid.toggleRow(treeGrid.getRowByIndex(0).key);
fix.detectChanges();
rows = TreeGridFunctions.getAllRows(fix);
expect(rows.length).toBe(3);
});
it('should expand/collapse rows when changing the \'expanded\' property', () => {
let rows = TreeGridFunctions.getAllRows(fix);
expect(rows.length).toBe(3);
// expand a root level row
let aRow = treeGrid.gridAPI.get_row_by_index(0);
let cells = (aRow.cells as QueryList<CellType>).toArray();
expect(cells[0].value).toBe(1, 'wrong root level row');
expect(aRow.expanded).toBe(false);
aRow.expanded = true;
fix.detectChanges();
rows = TreeGridFunctions.getAllRows(fix);
expect(rows.length).toBe(5, 'root level row expanding problem');
// expand a second level row
aRow = treeGrid.gridAPI.get_row_by_index(1);
cells = (aRow.cells as QueryList<CellType>).toArray();
expect(cells[0].value).toBe(2, 'wrong second level row');
expect(aRow.expanded).toBe(false);
aRow.expanded = true;
fix.detectChanges();
rows = TreeGridFunctions.getAllRows(fix);
expect(rows.length).toBe(7, 'second level row expanding problem');
// check third level rows are having the correct values
aRow = treeGrid.gridAPI.get_row_by_index(2);
cells = (aRow.cells as QueryList<CellType>).toArray();
expect(cells[0].value).toBe(3, 'wrong third level row');
aRow = treeGrid.gridAPI.get_row_by_index(3);
cells = (aRow.cells as QueryList<CellType>).toArray();
expect(cells[0].value).toBe(7, 'wrong third level row');
// collapse a second level row
aRow = treeGrid.gridAPI.get_row_by_index(1);
aRow.expanded = false;
fix.detectChanges();
rows = TreeGridFunctions.getAllRows(fix);
expect(rows.length).toBe(5, 'second level row collapsing problem');
// collapse a root level row
aRow = treeGrid.gridAPI.get_row_by_index(0);
aRow.expanded = false;
fix.detectChanges();
rows = TreeGridFunctions.getAllRows(fix);
expect(rows.length).toBe(3, 'root level row collapsing problem');
});
it('should expand/collapse when using \'expandAll\' and \'collapseAll\' methods', () => {
let rows = TreeGridFunctions.getAllRows(fix);
expect(rows.length).toBe(3);
treeGrid.expandAll();
fix.detectChanges();
rows = TreeGridFunctions.getAllRows(fix);
expect(rows.length).toBe(8);
treeGrid.collapseAll();
fix.detectChanges();
rows = TreeGridFunctions.getAllRows(fix);
expect(rows.length).toBe(3);
});
it('should emit an event when expanding rows (API)', (done) => {
const aRow = treeGrid.getRowByIndex(0);
treeGrid.rowToggle.pipe(first()).subscribe((args) => {
expect(args.cancel).toBe(false);
expect(args.event).toBeUndefined();
expect(args.expanded).toBe(true);
expect(args.rowID).toBe(1);
done();
});
aRow.expanded = true;
});
it('should emit an event when collapsing rows (API)', (done) => {
const aRow = treeGrid.getRowByIndex(0);
aRow.expanded = true;
fix.detectChanges();
treeGrid.rowToggle.pipe(first()).subscribe((args) => {
expect(args.cancel).toBe(false);
expect(args.event).toBeUndefined();
expect(args.expanded).toBe(false);
expect(args.rowID).toBe(1);
done();
});
aRow.expanded = false;
});
it('should emit an event when expanding rows (UI)', (done) => {
treeGrid.rowToggle.pipe(first()).subscribe((args) => {
expect(args.cancel).toBe(false);
expect(args.event).toBeDefined();
expect(args.expanded).toBe(true);
expect(args.rowID).toBe(1);
done();
});
const rowsDOM = TreeGridFunctions.getAllRows(fix);
const indicatorDivDOM = TreeGridFunctions.getExpansionIndicatorDiv(rowsDOM[0]);
indicatorDivDOM.triggerEventHandler('click', new Event('click'));
});
it('should emit an event when collapsing rows (UI)', (done) => {
const rowsDOM = TreeGridFunctions.getAllRows(fix);
const indicatorDivDOM = TreeGridFunctions.getExpansionIndicatorDiv(rowsDOM[0]);
indicatorDivDOM.triggerEventHandler('click', new Event('click'));
fix.detectChanges();
treeGrid.rowToggle.pipe(first()).subscribe((args) => {
expect(args.cancel).toBe(false);
expect(args.event).toBeDefined();
expect(args.expanded).toBe(false);
expect(args.rowID).toBe(1);
done();
});
indicatorDivDOM.triggerEventHandler('click', new Event('click'));
});
it('should update current page when \'collapseAll\' ', () => {
// Test prerequisites
fix.componentInstance.paging = true;
fix.detectChanges();
treeGrid.paginator.perPage = 2;
fix.detectChanges();
treeGrid.expandAll();
fix.detectChanges();
// Verify current page
verifyGridPager(fix, 2, '1', '1\xA0of\xA04', [true, true, false, false]);
expect(treeGrid.paginator.totalPages).toBe(4);
// Go to fourth page
treeGrid.paginator.page = 3;
fix.detectChanges();
// Verify current page
verifyGridPager(fix, 2, '10', '4\xA0of\xA04', [false, false, true, true]);
expect(treeGrid.paginator.totalPages).toBe(4);
treeGrid.collapseAll();
fix.detectChanges();
// Verify current page is the last one and only root rows are visible.
verifyGridPager(fix, 1, '10', '2\xA0of\xA02', [false, false, true, true]);
expect(treeGrid.paginator.totalPages).toBe(2);
});
it('Should update the paginator when a row of any level is expanded', () => {
// Test prerequisites
fix.componentInstance.paging = true;
fix.detectChanges();
treeGrid.paginator.perPage = 5;
fix.detectChanges();
treeGrid.collapseAll();
fix.detectChanges();
// Verify current page
verifyGridPager(fix, 3, '1', '1\xA0of\xA01', [true, true, true, true]);
expect(treeGrid.paginator.totalPages).toBe(1);
// Expand a row
const rowsDOM = TreeGridFunctions.getAllRows(fix);
let indicatorDivDOM = TreeGridFunctions.getExpansionIndicatorDiv(rowsDOM[0]);
indicatorDivDOM.triggerEventHandler('click', new Event('click'));
fix.detectChanges();
// Verify current page
verifyGridPager(fix, 5, '1', '1\xA0of\xA01', [true, true, true, true]);
expect(treeGrid.paginator.totalPages).toBe(1);
// Expand another row
indicatorDivDOM = TreeGridFunctions.getExpansionIndicatorDiv(rowsDOM[1]);
indicatorDivDOM.triggerEventHandler('click', new Event('click'));
fix.detectChanges();
// Verify current page
verifyGridPager(fix, 5, '1', '1\xA0of\xA02', [true, true, false, false]);
expect(treeGrid.paginator.totalPages).toBe(2);
treeGrid.paginator.page = 1;
fix.detectChanges();
indicatorDivDOM = TreeGridFunctions.getExpansionIndicatorDiv(rowsDOM[1]);
indicatorDivDOM.triggerEventHandler('click', new Event('click'));
fix.detectChanges();
// Verify current page
verifyGridPager(fix, 3, '6', '2\xA0of\xA02', [false, false, true, true]);
expect(treeGrid.paginator.totalPages).toBe(2);
});
it('Should update the paginator when a row of any level is collapsed', () => {
// Test prerequisites
fix.componentInstance.paging = true;
fix.detectChanges();
treeGrid.paginator.perPage = 5;
fix.detectChanges();
treeGrid.expandAll();
fix.detectChanges();
// Verify current page
verifyGridPager(fix, 5, '1', '1\xA0of\xA02', [true, true, false, false]);
expect(treeGrid.paginator.totalPages).toBe(2);
// Go to third page
fix.detectChanges();
const rowsDOM = TreeGridFunctions.getAllRows(fix);
let indicatorDivDOM = TreeGridFunctions.getExpansionIndicatorDiv(rowsDOM[0]);
indicatorDivDOM.triggerEventHandler('click', new Event('click'));
fix.detectChanges();
indicatorDivDOM = TreeGridFunctions.getExpansionIndicatorDiv(rowsDOM[2]);
indicatorDivDOM.triggerEventHandler('click', new Event('click'));
fix.detectChanges();
// // Verify current page
verifyGridPager(fix, 3, '1', '1\xA0of\xA01', [true, true, true, true]);
expect(treeGrid.paginator.totalPages).toBe(1);
});
it('Should update the paginator when navigating through pages', () => {
// Test prerequisites
fix.componentInstance.paging = true;
fix.detectChanges();
treeGrid.paginator.perPage = 5;
fix.detectChanges();
// Verify current page
verifyGridPager(fix, 3, '1', '1\xA0of\xA01', [true, true, true, true]);
expect(treeGrid.paginator.totalPages).toBe(1);
// Go to third page
const rowsDOM = TreeGridFunctions.getAllRows(fix);
let indicatorDivDOM = TreeGridFunctions.getExpansionIndicatorDiv(rowsDOM[2]);
indicatorDivDOM.triggerEventHandler('click', new Event('click'));
indicatorDivDOM = TreeGridFunctions.getExpansionIndicatorDiv(rowsDOM[0]);
indicatorDivDOM.triggerEventHandler('click', new Event('click'));
fix.detectChanges();
// Verify current page
verifyGridPager(fix, 5, '1', '1\xA0of\xA02', [true, true, false, false]);
expect(treeGrid.paginator.totalPages).toBe(2);
const tGrid: HTMLElement = treeGrid.nativeElement;
GridFunctions.navigateToLastPage(tGrid);
fix.detectChanges();
// Verify current page
verifyGridPager(fix, 1, '9', '2\xA0of\xA02', [false, false, true, true]);
expect(treeGrid.paginator.totalPages).toBe(2);
GridFunctions.navigateToPrevPage(tGrid);
fix.detectChanges();
// Verify current page
verifyGridPager(fix, 5, '1', '1\xA0of\xA02', [true, true, false, false]);
expect(treeGrid.paginator.totalPages).toBe(2);
});
});
describe('Load On Demand', () => {
describe('Primary/Foreign key', () => {
beforeEach(() => {
fix = TestBed.createComponent(IgxTreeGridLoadOnDemandComponent);
fix.detectChanges();
treeGrid = fix.componentInstance.treeGrid;
});
it('check expanding and collapsing a row with children', fakeAsync(() => {
let rows = TreeGridFunctions.getAllRows(fix);
const row = rows[0];
TreeGridFunctions.verifyTreeRowIndicator(row, false);
expect(rows.length).toBe(3);
let indicatorDiv = TreeGridFunctions.getExpansionIndicatorDiv(row);
indicatorDiv.triggerEventHandler('click', new Event('click'));
fix.detectChanges();
rows = TreeGridFunctions.getAllRows(fix);
TreeGridFunctions.verifyTreeRowIndicator(row, true);
expect(rows.length).toBe(3);
// Wait for loading RAF on first expand to complete (RAF is in test component)
tick(16);
fix.detectChanges();
rows = TreeGridFunctions.getAllRows(fix);
TreeGridFunctions.verifyTreeRowIndicator(row, false);
expect(rows.length).toBe(5);
indicatorDiv = TreeGridFunctions.getExpansionIndicatorDiv(row);
indicatorDiv.triggerEventHandler('click', new Event('click'));
fix.detectChanges();
rows = TreeGridFunctions.getAllRows(fix);
TreeGridFunctions.verifyTreeRowIndicator(row, false);
expect(rows.length).toBe(3);
}));
it('check expanding and collapsing a row without children', fakeAsync(() => {
let rows = TreeGridFunctions.getAllRows(fix);
const row = rows[1];
const indicatorDiv = TreeGridFunctions.getExpansionIndicatorDiv(row);
TreeGridFunctions.verifyTreeRowIndicator(row, false);
expect(rows.length).toBe(3);
indicatorDiv.triggerEventHandler('click', new Event('click'));
fix.detectChanges();
rows = TreeGridFunctions.getAllRows(fix);
TreeGridFunctions.verifyTreeRowIndicator(row, true);
expect(rows.length).toBe(3);
// Wait for loading RAF on first expand to complete (RAF is in test component)
tick(16);
fix.detectChanges();
rows = TreeGridFunctions.getAllRows(fix);
TreeGridFunctions.verifyTreeRowIndicator(row, false, false);
expect(rows.length).toBe(3);
}));
it('check row selection when expand a row', fakeAsync(() => {
treeGrid.rowSelection = GridSelectionMode.multiple;
fix.detectChanges();
treeGrid.selectAllRows();
fix.detectChanges();
TreeGridFunctions.verifyHeaderCheckboxSelection(fix, true);
expect(treeGrid.selectedRows).toEqual([1, 6, 10]);
let rows = TreeGridFunctions.getAllRows(fix);
const row = rows[0];
expect(rows.length).toBe(3);
const indicatorDiv = TreeGridFunctions.getExpansionIndicatorDiv(row);
indicatorDiv.triggerEventHandler('click', new Event('click'));
// Wait for loading RAF on first expand to complete (RAF is in test component)
tick(16);
fix.detectChanges();
rows = TreeGridFunctions.getAllRows(fix);
expect(rows.length).toBe(5);
TreeGridFunctions.verifyHeaderCheckboxSelection(fix, null);
TreeGridFunctions.verifyTreeRowSelectionByIndex(fix, 0, true);
TreeGridFunctions.verifyTreeRowSelectionByIndex(fix, 1, false);
TreeGridFunctions.verifyTreeRowSelectionByIndex(fix, 2, false);
TreeGridFunctions.verifyTreeRowSelectionByIndex(fix, 3, true);
TreeGridFunctions.verifyTreeRowSelectionByIndex(fix, 4, true);
expect(treeGrid.selectedRows).toEqual([1, 6, 10]);
}));
it('check row selection within multipleCascade selection mode when expand a row', fakeAsync(() => {
treeGrid.rowSelection = GridSelectionMode.multipleCascade;
fix.detectChanges();
treeGrid.selectRows([1]);
fix.detectChanges();
expect(treeGrid.selectedRows).toEqual([1]);
TreeGridFunctions.verifyRowByIndexSelectionAndCheckboxState(fix, 0, true, true);
treeGrid.expandRow(1);
// Wait for loading RAF on first expand to complete (RAF is in test component)
tick(16);
fix.detectChanges();
expect(treeGrid.rowList.length).toBe(5);
expect(treeGrid.selectedRows.length).toBe(3);
TreeGridFunctions.verifyRowByIndexSelectionAndCheckboxState(fix, 0, true, true);
TreeGridFunctions.verifyRowByIndexSelectionAndCheckboxState(fix, 1, true, true);
TreeGridFunctions.verifyRowByIndexSelectionAndCheckboxState(fix, 2, true, true);
treeGrid.expandRow(2);
// Wait for loading RAF on first expand to complete (RAF is in test component)
tick(16);
fix.detectChanges();
expect(treeGrid.rowList.length).toBe(7);
expect(treeGrid.selectedRows.length).toBe(5);
TreeGridFunctions.verifyRowByIndexSelectionAndCheckboxState(fix, 0, true, true);
TreeGridFunctions.verifyRowByIndexSelectionAndCheckboxState(fix, 1, true, true);
TreeGridFunctions.verifyRowByIndexSelectionAndCheckboxState(fix, 2, true, true);
TreeGridFunctions.verifyRowByIndexSelectionAndCheckboxState(fix, 3, true, true);
TreeGridFunctions.verifyRowByIndexSelectionAndCheckboxState(fix, 4, true, true);
}));
});
describe('ChildDataKey', () => {
beforeEach(() => {
fix = TestBed.createComponent(IgxTreeGridLoadOnDemandChildDataComponent);
fix.detectChanges();
treeGrid = fix.componentInstance.treeGrid;
});
it('check expanding and collapsing a row with children', fakeAsync(() => {
let rows = TreeGridFunctions.getAllRows(fix);
const row = rows[0];
TreeGridFunctions.verifyTreeRowIndicator(row, false);
expect(rows.length).toBe(3);
let indicatorDiv = TreeGridFunctions.getExpansionIndicatorDiv(row);
indicatorDiv.triggerEventHandler('click', new Event('click'));
fix.detectChanges();
rows = TreeGridFunctions.getAllRows(fix);
TreeGridFunctions.verifyTreeRowIndicator(row, true);
expect(rows.length).toBe(3);
// Wait for loading RAF on first expand to complete (RAF is in test component)
tick(16);
fix.detectChanges();
rows = TreeGridFunctions.getAllRows(fix);
TreeGridFunctions.verifyTreeRowIndicator(row, false);
expect(rows.length).toBe(5);
indicatorDiv = TreeGridFunctions.getExpansionIndicatorDiv(row);
indicatorDiv.triggerEventHandler('click', new Event('click'));
fix.detectChanges();
rows = TreeGridFunctions.getAllRows(fix);
TreeGridFunctions.verifyTreeRowIndicator(row, false);
expect(rows.length).toBe(3);
}));
it('check expanding and collapsing a row without children', fakeAsync(() => {
let rows = TreeGridFunctions.getAllRows(fix);
const row = rows[1];
const indicatorDiv = TreeGridFunctions.getExpansionIndicatorDiv(row);
TreeGridFunctions.verifyTreeRowIndicator(row, false);
expect(rows.length).toBe(3);
indicatorDiv.triggerEventHandler('click', new Event('click'));
fix.detectChanges();
rows = TreeGridFunctions.getAllRows(fix);
TreeGridFunctions.verifyTreeRowIndicator(row, true);
expect(rows.length).toBe(3);
// Wait for loading RAF on first expand to complete (RAF is in test component)
tick(16);
fix.detectChanges();
rows = TreeGridFunctions.getAllRows(fix);
TreeGridFunctions.verifyTreeRowIndicator(row, false, false);
expect(rows.length).toBe(3);
}));
});
describe('HasChildrenKey', () => {
beforeEach(() => {
fix = TestBed.createComponent(IgxTreeGridLoadOnDemandHasChildrenComponent);
fix.detectChanges();
treeGrid = fix.componentInstance.treeGrid;
});
it('check expanding and collapsing a row with children', fakeAsync(() => {
let rows = TreeGridFunctions.getAllRows(fix);
const firstRow = rows[0];
const secondRow = rows[1];
TreeGridFunctions.verifyTreeRowIndicator(firstRow, false);
TreeGridFunctions.verifyTreeRowIndicator(secondRow, false, false);
expect(rows.length).toBe(3);
let indicatorDiv = TreeGridFunctions.getExpansionIndicatorDiv(firstRow);
indicatorDiv.triggerEventHandler('click', new Event('click'));
fix.detectChanges();
rows = TreeGridFunctions.getAllRows(fix);
TreeGridFunctions.verifyTreeRowIndicator(firstRow, true);
expect(rows.length).toBe(3);
// Wait for loading RAF on first expand to complete (RAF is in test component)
tick(16);
fix.detectChanges();
rows = TreeGridFunctions.getAllRows(fix);
TreeGridFunctions.verifyTreeRowIndicator(firstRow, false);
expect(rows.length).toBe(5);
indicatorDiv = TreeGridFunctions.getExpansionIndicatorDiv(firstRow);
indicatorDiv.triggerEventHandler('click', new Event('click'));
fix.detectChanges();