mirror of
https://github.com/Alfresco/alfresco-ng2-components.git
synced 2025-07-24 17:32:15 +00:00
#113 full coverage for datatable component
This commit is contained in:
@@ -25,6 +25,7 @@ import {
|
|||||||
import { DataTableComponent } from './datatable.component';
|
import { DataTableComponent } from './datatable.component';
|
||||||
import {
|
import {
|
||||||
DataRow,
|
DataRow,
|
||||||
|
DataColumn,
|
||||||
DataSorting
|
DataSorting
|
||||||
} from './../data/datatable-adapter';
|
} from './../data/datatable-adapter';
|
||||||
import {
|
import {
|
||||||
@@ -82,20 +83,26 @@ describe('DataTable', () => {
|
|||||||
dataTable.onRowDblClick(row, null);
|
dataTable.onRowDblClick(row, null);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should prevent default behavior on row click event', () => {
|
it('should prevent default behaviour on row click event', () => {
|
||||||
let e = jasmine.createSpyObj('event', ['preventDefault']);
|
let e = jasmine.createSpyObj('event', ['preventDefault']);
|
||||||
dataTable.ngOnInit();
|
dataTable.ngOnInit();
|
||||||
dataTable.onRowClick(null, e);
|
dataTable.onRowClick(null, e);
|
||||||
expect(e.preventDefault).toHaveBeenCalled();
|
expect(e.preventDefault).toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should prevent default behavior on row double-click event', () => {
|
it('should prevent default behaviour on row double-click event', () => {
|
||||||
let e = jasmine.createSpyObj('event', ['preventDefault']);
|
let e = jasmine.createSpyObj('event', ['preventDefault']);
|
||||||
dataTable.ngOnInit();
|
dataTable.ngOnInit();
|
||||||
dataTable.onRowDblClick(null, e);
|
dataTable.onRowDblClick(null, e);
|
||||||
expect(e.preventDefault).toHaveBeenCalled();
|
expect(e.preventDefault).toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should prevent default behaviour on select all click', () => {
|
||||||
|
let e = jasmine.createSpyObj('event', ['preventDefault']);
|
||||||
|
dataTable.onSelectAllClick(e);
|
||||||
|
expect(e.preventDefault).toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
|
||||||
it('should not sort if column is missing', () => {
|
it('should not sort if column is missing', () => {
|
||||||
dataTable.ngOnInit();
|
dataTable.ngOnInit();
|
||||||
let adapter = dataTable.data;
|
let adapter = dataTable.data;
|
||||||
@@ -140,14 +147,16 @@ describe('DataTable', () => {
|
|||||||
dataTable.ngOnInit();
|
dataTable.ngOnInit();
|
||||||
|
|
||||||
let adapter = dataTable.data;
|
let adapter = dataTable.data;
|
||||||
|
let sorting = new DataSorting('column_1', 'asc');
|
||||||
spyOn(adapter, 'setSorting').and.callThrough();
|
spyOn(adapter, 'setSorting').and.callThrough();
|
||||||
spyOn(adapter, 'getSorting').and.returnValue(new DataSorting('column_1', 'asc'));
|
spyOn(adapter, 'getSorting').and.returnValue(sorting);
|
||||||
|
|
||||||
let column = new ObjectDataColumn({
|
let column = new ObjectDataColumn({
|
||||||
key: 'column_1',
|
key: 'column_1',
|
||||||
sortable: true
|
sortable: true
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// check first click on the header
|
||||||
dataTable.onColumnHeaderClick(column);
|
dataTable.onColumnHeaderClick(column);
|
||||||
expect(adapter.setSorting).toHaveBeenCalledWith(
|
expect(adapter.setSorting).toHaveBeenCalledWith(
|
||||||
jasmine.objectContaining({
|
jasmine.objectContaining({
|
||||||
@@ -156,6 +165,16 @@ describe('DataTable', () => {
|
|||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// check second click on the header
|
||||||
|
sorting.direction = 'desc';
|
||||||
|
dataTable.onColumnHeaderClick(column);
|
||||||
|
expect(adapter.setSorting).toHaveBeenCalledWith(
|
||||||
|
jasmine.objectContaining({
|
||||||
|
key: 'column_1',
|
||||||
|
direction: 'asc'
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should upgrade MDL components on view checked', () => {
|
it('should upgrade MDL components on view checked', () => {
|
||||||
@@ -166,4 +185,135 @@ describe('DataTable', () => {
|
|||||||
expect(handler.upgradeAllRegistered).toHaveBeenCalled();
|
expect(handler.upgradeAllRegistered).toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should upgrade MDL components only when component handler present', () => {
|
||||||
|
expect(window['componentHandler']).toBeNull();
|
||||||
|
dataTable.ngAfterViewChecked();
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
it('should invert "select all" status', () => {
|
||||||
|
expect(dataTable.isSelectAllChecked).toBeFalsy();
|
||||||
|
dataTable.onSelectAllClick(null);
|
||||||
|
expect(dataTable.isSelectAllChecked).toBeTruthy();
|
||||||
|
dataTable.onSelectAllClick(null);
|
||||||
|
expect(dataTable.isSelectAllChecked).toBeFalsy();
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
it('should update rows on "select all" click', () => {
|
||||||
|
let data = new ObjectDataTableAdapter([{}, {}, {}], []);
|
||||||
|
let rows = data.getRows();
|
||||||
|
|
||||||
|
dataTable.data = data;
|
||||||
|
dataTable.multiselect = true;
|
||||||
|
dataTable.ngOnInit();
|
||||||
|
|
||||||
|
dataTable.onSelectAllClick(null);
|
||||||
|
expect(dataTable.isSelectAllChecked).toBe(true);
|
||||||
|
for (let i = 0; i < rows.length; i++) {
|
||||||
|
expect(rows[i].isSelected).toBe(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
dataTable.onSelectAllClick(null);
|
||||||
|
expect(dataTable.isSelectAllChecked).toBe(false);
|
||||||
|
for (let i = 0; i < rows.length; i++) {
|
||||||
|
expect(rows[i].isSelected).toBe(false);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should allow "select all" calls with no rows', () => {
|
||||||
|
dataTable.multiselect = true;
|
||||||
|
dataTable.ngOnInit();
|
||||||
|
|
||||||
|
dataTable.onSelectAllClick(null);
|
||||||
|
expect(dataTable.isSelectAllChecked).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should require multiselect option to toggle row state', () => {
|
||||||
|
let data = new ObjectDataTableAdapter([{}, {}, {}], []);
|
||||||
|
let rows = data.getRows();
|
||||||
|
|
||||||
|
dataTable.data = data;
|
||||||
|
dataTable.multiselect = false;
|
||||||
|
dataTable.ngOnInit();
|
||||||
|
|
||||||
|
dataTable.onSelectAllClick(null);
|
||||||
|
expect(dataTable.isSelectAllChecked).toBe(true);
|
||||||
|
for (let i = 0; i < rows.length; i++) {
|
||||||
|
expect(rows[i].isSelected).toBe(false);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should require row and column for icon value check', () => {
|
||||||
|
expect(dataTable.isIconValue(null, null)).toBeFalsy();
|
||||||
|
expect(dataTable.isIconValue(<DataRow> {}, null)).toBeFalsy();
|
||||||
|
expect(dataTable.isIconValue(null, <DataColumn> {})).toBeFalsy();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should use special material url scheme', () => {
|
||||||
|
let column = <DataColumn> {};
|
||||||
|
|
||||||
|
let row = {
|
||||||
|
getValue: function (key: string) {
|
||||||
|
return 'material-icons://android';
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
expect(dataTable.isIconValue(<DataRow> row, column)).toBeTruthy();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should not use special material url scheme', () => {
|
||||||
|
let column = <DataColumn> {};
|
||||||
|
|
||||||
|
let row = {
|
||||||
|
getValue: function (key: string) {
|
||||||
|
return 'http://www.google.com';
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
expect(dataTable.isIconValue(<DataRow> row, column)).toBeFalsy();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should parse icon value', () => {
|
||||||
|
let column = <DataColumn> {};
|
||||||
|
|
||||||
|
let row = {
|
||||||
|
getValue: function (key: string) {
|
||||||
|
return 'material-icons://android';
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
expect(dataTable.asIconValue(<DataRow> row, column)).toBe('android');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should not parse icon value', () => {
|
||||||
|
let column = <DataColumn> {};
|
||||||
|
|
||||||
|
let row = {
|
||||||
|
getValue: function (key: string) {
|
||||||
|
return 'http://www.google.com';
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
expect(dataTable.asIconValue(<DataRow> row, column)).toBe(null);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should require column and direction to evaluate sorting state', () => {
|
||||||
|
expect(dataTable.isColumnSorted(null, null)).toBeFalsy();
|
||||||
|
expect(dataTable.isColumnSorted(<DataColumn> {}, null)).toBeFalsy();
|
||||||
|
expect(dataTable.isColumnSorted(null, 'asc')).toBeFalsy();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should require adapter sorting to evaluate sorting state', () => {
|
||||||
|
dataTable.ngOnInit();
|
||||||
|
spyOn(dataTable.data, 'getSorting').and.returnValue(null);
|
||||||
|
expect(dataTable.isColumnSorted(<DataColumn> {}, 'asc')).toBeFalsy();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should evaluate column sorting state', () => {
|
||||||
|
dataTable.ngOnInit();
|
||||||
|
spyOn(dataTable.data, 'getSorting').and.returnValue(new DataSorting('column_1', 'asc'));
|
||||||
|
expect(dataTable.isColumnSorted(<DataColumn> {key: 'column_1'}, 'asc')).toBeTruthy();
|
||||||
|
expect(dataTable.isColumnSorted(<DataColumn> {key: 'column_2'}, 'desc')).toBeFalsy();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
@@ -61,6 +61,7 @@ export class DataTableComponent implements OnInit, AfterViewChecked {
|
|||||||
|
|
||||||
isSelectAllChecked: boolean = false;
|
isSelectAllChecked: boolean = false;
|
||||||
|
|
||||||
|
// TODO: left for reference, will be removed during future revisions
|
||||||
constructor(/*private _ngZone?: NgZone*/) {
|
constructor(/*private _ngZone?: NgZone*/) {
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -117,27 +118,39 @@ export class DataTableComponent implements OnInit, AfterViewChecked {
|
|||||||
|
|
||||||
if (this.multiselect) {
|
if (this.multiselect) {
|
||||||
let rows = this.data.getRows();
|
let rows = this.data.getRows();
|
||||||
for (let i = 0; i < rows.length; i++) {
|
if (rows && rows.length > 0) {
|
||||||
rows[i].isSelected = this.isSelectAllChecked;
|
for (let i = 0; i < rows.length; i++) {
|
||||||
|
rows[i].isSelected = this.isSelectAllChecked;
|
||||||
|
}
|
||||||
|
// TODO: left for reference, will be removed during future revisions
|
||||||
|
/*
|
||||||
|
this._ngZone.run(() => {
|
||||||
|
this.data.getRows()[1].isSelected = true;
|
||||||
|
});
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
this._ngZone.run(() => {
|
|
||||||
this.data.getRows()[1].isSelected = true;
|
|
||||||
});
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
isIconValue(row: DataRow, col: DataColumn) {
|
isIconValue(row: DataRow, col: DataColumn) {
|
||||||
return row.getValue(col.key).startsWith('material-icons://');
|
if (row && col) {
|
||||||
|
return row.getValue(col.key).startsWith('material-icons://');
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
asIconValue(row: DataRow, col: DataColumn) {
|
asIconValue(row: DataRow, col: DataColumn) {
|
||||||
return row.getValue(col.key).replace('material-icons://', '');
|
if (this.isIconValue(row, col)) {
|
||||||
|
return row.getValue(col.key).replace('material-icons://', '');
|
||||||
|
}
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
isColumnSorted(col: DataColumn, direction: string) {
|
isColumnSorted(col: DataColumn, direction: string) {
|
||||||
let sorting = this.data.getSorting();
|
if (col && direction) {
|
||||||
return sorting.key === col.key && sorting.direction === direction;
|
let sorting = this.data.getSorting();
|
||||||
|
return sorting && sorting.key === col.key && sorting.direction === direction;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user