novo-elements
Version:
Bullhorn's NOVO Element Repository for Angular 2
662 lines (596 loc) • 23.5 kB
text/typescript
// NG2
import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
import { TestBed, async } from '@angular/core/testing';
import { FormsModule, FormGroupDirective, NgControl, FormControlName, FormBuilder } from '@angular/forms';
// Vendor
import { TextMaskModule } from 'angular2-text-mask';
import { OverlayModule } from '@angular/cdk/overlay';
// App
import { NovoOverlayModule } from '../overlay/Overlay.module';
import { NovoTableElement } from './Table';
import { Pagination } from './extras/pagination/Pagination';
import { RowDetails } from './extras/row-details/RowDetails';
import { TableCell } from './extras/table-cell/TableCell';
import { TableFilter } from './extras/table-filter/TableFilter';
import { ThOrderable } from './extras/th-orderable/ThOrderable';
import { ThSortable } from './extras/th-sortable/ThSortable';
import { NovoTableKeepFilterFocus } from './extras/keep-filter-focus/KeepFilterFocus';
import { NovoTableActionsElement } from './extras/table-actions/TableActions';
import { NovoTableFooterElement } from './extras/table-footer/TableFooter';
import { NovoTableHeaderElement } from './extras/table-header/TableHeader';
import { NovoFormElement } from '../form/Form';
import { NovoControlElement } from '../form/Control';
import { NovoCheckboxElement } from '../form/extras/checkbox/Checkbox';
import { NovoCheckListElement } from '../form/extras/checkbox/CheckList';
import { NovoAddressElement } from '../form/extras/address/Address';
import { NovoDatePickerElement } from '../date-picker/DatePicker';
import { NovoToastElement } from '../toast/Toast';
import { NovoLoadingElement } from '../loading/Loading';
import { NovoItemElement, NovoListElement } from '../dropdown/Dropdown';
import { NovoChipsElement, NovoChipElement } from '../chips/Chips';
import { NovoDropdownElement, NovoDropdownContainer } from '../dropdown/Dropdown';
import { TooltipDirective } from '../tooltip/Tooltip';
import { NovoSelectElement } from '../select/Select';
import { NovoLabelService } from '../../services/novo-label-service';
import { FormUtils } from '../../utils/form-utils/FormUtils';
import { DateFormatService } from '../../services/date-format/DateFormat';
describe('Elements: NovoTableElement', () => {
let fixture;
let component;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [
// Table:
NovoTableElement,
Pagination,
RowDetails,
TableCell,
TableFilter,
ThOrderable,
ThSortable,
NovoTableKeepFilterFocus,
NovoTableActionsElement,
NovoTableFooterElement,
NovoTableHeaderElement,
// Form:
NovoFormElement,
NovoControlElement,
NovoCheckboxElement,
NovoCheckListElement,
NovoAddressElement,
// Novo Elements
NovoDatePickerElement,
NovoToastElement,
NovoListElement,
NovoChipElement,
NovoDropdownContainer,
NovoLoadingElement,
NovoItemElement,
NovoChipsElement,
NovoDropdownElement,
TooltipDirective,
NovoSelectElement,
// NG2
FormGroupDirective,
FormControlName,
],
imports: [
FormsModule,
//Vendor
TextMaskModule,
OverlayModule,
NovoOverlayModule
],
providers: [
{ provide: NovoLabelService, useClass: NovoLabelService },
{ provide: FormUtils, useClass: FormUtils },
NgControl,
FormBuilder,
DateFormatService
],
schemas: [
CUSTOM_ELEMENTS_SCHEMA
]
}).compileComponents();
fixture = TestBed.createComponent(NovoTableElement);
component = fixture.debugElement.componentInstance;
}));
it('should initialize with all of its defaults.', () => {
expect(component).toBeDefined();
component._rows = [];
component.mode = 'TEST';
// NG2
expect(component.onRowClick).toBeDefined();
expect(component.onRowSelect).toBeDefined();
expect(component.onTableChange).toBeDefined();
// Vars
expect(component.activeId).toBeDefined();
expect(component.master).toBeDefined();
expect(component.indeterminate).toBeDefined();
expect(component.lastPage).toBeDefined();
expect(component.rows).toBeDefined();
// Setters
component.rows = [];
component.dataProvider = [];
// Getters
expect(component.dataProvider).toBeDefined();
expect(component.editing).toBeDefined();
expect(component.formValue).toBeDefined();
});
describe('Method: onDropdownToggled()', () => {
it('should be defined.', () => {
expect(component.onDropdownToggled).toBeDefined();
component.onDropdownToggled();
});
});
describe('Method: onPageChange()', () => {
it('should be defined.', () => {
expect(component.onPageChange).toBeDefined();
component.onPageChange();
});
});
describe('Method: getOptionDataAutomationId()', () => {
it('should be defined.', () => {
expect(component.getOptionDataAutomationId).toBeDefined();
component.getOptionDataAutomationId({ value: 2 });
});
});
describe('Method: setupColumnDefaults()', () => {
it('should be defined.', () => {
expect(component.setupColumnDefaults).toBeDefined();
component.columns = [
{ type: 'misc' }
];
component.setupColumnDefaults();
});
});
describe('Method: ngDoCheck()', () => {
it('should be defined.', () => {
expect(component.ngDoCheck).toBeDefined();
component.ngDoCheck();
});
});
describe('Method: getPageStart()', () => {
it('should be defined.', () => {
expect(component.getPageStart).toBeDefined();
component.getPageStart();
});
});
describe('Method: getPageEnd()', () => {
it('should be defined.', () => {
expect(component.getPageEnd).toBeDefined();
});
});
describe('Method: onFilterClick(column, filter)', () => {
beforeEach(() => {
component.columns = [
{
filtering: true,
name: 'date',
type: 'date'
}
];
component.originalRows = [
{
id: 1,
date: new Date()
},
{
id: 2,
date: new Date()
}
];
component.config = {
filtering: true
};
});
xit('should allow multiple date selections if multiple=true/false', () => {
expect(component.onFilterClick).toBeDefined();
component.columns[0].multiple = true;
component.setupColumnDefaults();
// Select 4 rows
component.onFilterClick(component.columns[0], component.columns[0].options[0]);
component.onFilterClick(component.columns[0], component.columns[0].options[1]);
component.onFilterClick(component.columns[0], component.columns[0].options[2]);
component.onFilterClick(component.columns[0], component.columns[0].options[3]);
expect(component.columns[0].filter.length).toBe(4);
// deselect 4 rows
component.onFilterClick(component.columns[0], component.columns[0].options[0]);
component.onFilterClick(component.columns[0], component.columns[0].options[1]);
component.onFilterClick(component.columns[0], component.columns[0].options[2]);
component.onFilterClick(component.columns[0], component.columns[0].options[3]);
expect(component.columns[0].filter).toBe(null);
// set multiple to false and try and click 2 rows
component.columns[0].multiple = false;
component.onFilterClick(component.columns[0], component.columns[0].options[1]);
component.onFilterClick(component.columns[0], component.columns[0].options[2]);
expect(component.columns[0].filter.length).toBe(1);
});
it('should add range to options (11 total) if range is set', () => {
expect(component.onFilterClick).toBeDefined();
component.columns[0].range = true;
component.setupColumnDefaults();
expect(component.columns[0].options.length).toBe(11);
});
it('should add calenderShow if range is set', () => {
expect(component.onFilterClick).toBeDefined();
component.columns[0].range = true;
component.setupColumnDefaults();
component.onFilterClick(component.columns[0], component.columns[0].options[component.columns[0].options.length - 1]);
expect(component.columns[0].calenderShow).toBeTruthy();
});
});
describe('Method: onFilterClear(column)', () => {
it('should be defined.', () => {
expect(component.onFilterClear).toBeDefined();
component.onFilterClear({ filer: true, freetextFilter: true });
});
});
describe('Method: clearAllSortAndFilters()', () => {
it('should be defined.', () => {
expect(component.clearAllSortAndFilters).toBeDefined();
component.clearAllSortAndFilters();
});
});
xdescribe('Method: onFilterChange()', () => {
beforeEach(() => {
component.columns = [
{
filter: 'a',
filtering: true,
name: 'name'
}
];
component.originalRows = [
{
id: 1,
name: 'Jane'
},
{
id: 2,
name: 'John'
}
];
component.config = {
filtering: true
};
});
it('should update the row data to reflect the active filters (string comparison).', () => {
expect(component.onFilterChange).toBeDefined();
component.onFilterChange();
expect(component.rows.length).toBe(1);
});
it('should update the row data to reflect the active filters (array comparison).', () => {
expect(component.onFilterChange).toBeDefined();
component.originalRows[0].name = ['Jane', 'Janet', 'Janice'];
component.originalRows[1].name = ['Jon', 'Joe', 'Jose'];
component.onFilterChange();
expect(component.rows.length).toBe(1);
});
it('should update the row data to reflect the active filters (custom filter).', () => {
expect(component.onFilterChange).toBeDefined();
component.config.filtering = (filterValue, data) => {
let matches = [];
data.forEach(row => {
if (row.name === 'John') {
matches.push(row);
}
});
return matches;
};
component.onFilterChange();
expect(component.rows.length).toBe(1);
});
it('should update the row data to reflect the active filters (custom config filter).', () => {
expect(component.onFilterChange).toBeDefined();
let mockOption = { label: 'Today', min: -2, max: 2 };
component.columns = [{
name: 'name',
type: 'date',
options: [mockOption]
}];
// Set dates
component.originalRows[0].name = new Date();
component.originalRows[1].name = new Date(1970, 3, 11, 13, 13);
// Set active filter
component.columns[0].filter = [mockOption];
component.onFilterChange();
expect(component.rows.length).toBe(1);
});
it('should update the row data to reflect the active filters (custom match function).', () => {
expect(component.onFilterChange).toBeDefined();
component.columns[0].match = (item, filter) => {
return item.match(new RegExp(filter, 'gi'));
};
component.onFilterChange();
expect(component.rows.length).toBe(1);
});
});
xdescribe('Method: isFilterActive(columnFilters, filter)', () => {
it('should return true when the filter is active and false when it is not.', () => {
expect(component.isFilterActive).toBeDefined();
let mockColumnFilters = {
filter: []
};
let mockFilter = {
label: 'Filter'
};
// Using Filter Objects
expect(component.isFilterActive(mockColumnFilters, mockFilter)).toBeFalsy();
mockColumnFilters.filter.push(mockFilter);
expect(component.isFilterActive(mockColumnFilters, mockFilter)).toBeTruthy();
// Using strings
expect(component.isFilterActive({ filter: ['Filter'] }, 'Filter')).toBeTruthy();
expect(component.isFilterActive({ filter: ['Filter'] }, 'z')).toBeFalsy();
});
});
describe('Method: onSortChange(newSortColumn)', () => {
it('should be defined.', () => {
expect(component.onSortChange).toBeDefined();
});
});
describe('Method: fireTableChangeEvent()', () => {
it('should be defined.', () => {
expect(component.fireTableChangeEvent).toBeDefined();
});
});
describe('Method: findColumnIndex(value)', () => {
it('should be defined.', () => {
expect(component.findColumnIndex).toBeDefined();
});
});
describe('Method: onOrderChange(event)', () => {
it('should be defined.', () => {
expect(component.onOrderChange).toBeDefined();
});
});
describe('Method: selectPage()', () => {
it('should be defined.', () => {
expect(component.selectPage).toBeDefined();
});
});
describe('Method: selectAll()', () => {
it('should be defined.', () => {
expect(component.selectAll).toBeDefined();
});
});
describe('Method: rowSelectHandler()', () => {
it('should be defined.', () => {
expect(component.rowSelectHandler).toBeDefined();
});
});
describe('Method: emitSelected()', () => {
it('should be defined.', () => {
expect(component.emitSelected).toBeDefined();
});
});
describe('Method: rowClickHandler()', () => {
it('should be defined.', () => {
expect(component.rowClickHandler).toBeDefined();
});
});
describe('Method: getDefaultOptions()', () => {
it('should return a subset of options when the data dates cover a small range.', () => {
expect(component.getDefaultOptions).toBeDefined();
let mockOptions = component.getDefaultOptions();
expect(mockOptions.length).toBe(10);
});
});
describe('Method: onCalenderSelect(column, event)', () => {
it('should be defined.', () => {
expect(component.onCalenderSelect).toBeDefined();
component.onCalenderSelect(null, { startDate: new Date(), endDate: new Date() });
});
});
describe('Method: onFilterKeywords()', () => {
it('should be defined.', () => {
expect(component.onFilterKeywords).toBeDefined();
// component.onFilterKeywords();
});
});
describe('Method: setTableEdit()', () => {
beforeEach(() => {
component._dataProvider = {
edit: () => { }
};
component.columns = [
{
name: 'name'
},
{
name: 'id'
}
];
component._rows = [
{
id: 1,
name: 'Jane'
},
{
id: 2,
name: 'John'
}
];
});
it('should be defined.', () => {
expect(component.setTableEdit).toBeDefined();
});
it('should set the table to edit mode', () => {
component.setTableEdit();
expect(component.mode).toBe(2);
});
it('should set columns with viewOnly to editing false', () => {
component.columns[0].viewOnly = true;
component.setTableEdit();
expect(component._rows).toEqual([
{
id: 1,
name: 'Jane',
_editing: {
id: true,
name: false
}
},
{
id: 2,
name: 'John',
_editing: {
id: true,
name: false
}
}
]);
});
});
describe('Method: leaveEditMode()', () => {
beforeEach(() => {
component._dataProvider = {
undo: () => { },
commit: () => { }
};
component.columns = [
{
name: 'name'
},
{
name: 'id'
}
];
component._rows = [
{
id: 1,
name: 'Jane'
},
{
id: 2,
name: 'John'
}
];
});
it('should be defined.', () => {
expect(component.leaveEditMode).toBeDefined();
});
it('should set the table to view mode', () => {
component.leaveEditMode();
expect(component.mode).toBe(1);
});
it('should set the table colums editing to false', () => {
component.leaveEditMode();
expect(component._rows).toEqual([
{
id: 1,
name: 'Jane',
_editing: {
id: false,
name: false
}
},
{
id: 2,
name: 'John',
_editing: {
id: false,
name: false
}
}
]);
});
});
describe('Method: addEditableRow()', () => {
it('should be defined.', () => {
expect(component.addEditableRow).toBeDefined();
// component.addEditableRow();
});
});
describe('Method: validateAndGetUpdatedData()', () => {
it('should be defined.', () => {
expect(component.validateAndGetUpdatedData).toBeDefined();
component.validateAndGetUpdatedData();
});
});
describe('Method: cancelEditing()', () => {
beforeEach(() => {
component._dataProvider = {
undo: () => { },
commit: () => { }
};
});
it('should be defined.', () => {
expect(component.cancelEditing).toBeDefined();
});
it('should set the table to view mode', () => {
component.leaveEditMode();
expect(component.mode).toBe(1);
});
});
describe('Method: displayToastMessage()', () => {
it('should be defined.', () => {
expect(component.displayToastMessage).toBeDefined();
component.displayToastMessage();
});
});
describe('Method: hideToastMessage()', () => {
it('should be defined.', () => {
expect(component.hideToastMessage).toBeDefined();
component.hideToastMessage();
});
});
describe('Method: toggleLoading()', () => {
it('should be defined.', () => {
expect(component.toggleLoading).toBeDefined();
});
it('should set loading to true', () => {
component.toggleLoading(true);
expect(component.loading).toBe(true);
});
it('should set loading to false', () => {
component.toggleLoading(false);
expect(component.loading).toBe(false);
});
});
describe('Method: isColumnHidden()', () => {
it('should be defined.', () => {
expect(component.isColumnHidden).toBeDefined();
});
it('should return true if column has hideColumnOnEdit and in editing mode', () => {
let column = { name: 'name', hideColumnOnEdit: true };
component.mode = 2;
expect(component.isColumnHidden(column)).toBe(true);
});
it('should return false if column does not have hideColumnOnEdit and in editing mode', () => {
let column = { name: 'name' };
component.mode = 2;
expect(component.isColumnHidden(column)).toBe(false);
});
it('should return false if column does not have hideColumnOnEdit and not in editing mode', () => {
let column = { name: 'name' };
component.mode = 1;
expect(component.isColumnHidden(column)).toBe(false);
});
it('should return false if column has hideColumnOnEdit and not in editing mode', () => {
let column = { name: 'name', hideColumnOnEdit: true };
component.mode = 1;
expect(component.isColumnHidden(column)).toBe(false);
});
it('should return false if column has hideColumnOnView and in editing mode', () => {
let column = { name: 'name', hideColumnOnView: true };
component.mode = 2;
expect(component.isColumnHidden(column)).toBe(false);
});
it('should return false if column does not have hideColumnOnView and in editing mode', () => {
let column = { name: 'name' };
component.mode = 2;
expect(component.isColumnHidden(column)).toBe(false);
});
it('should return false if column does not have hideColumnOnView and not in editing mode', () => {
let column = { name: 'name' };
component.mode = 1;
expect(component.isColumnHidden(column)).toBe(false);
});
it('should return false if column has hideColumnOnView and not in editing mode', () => {
let column = { name: 'name', hideColumnOnView: true };
component.mode = 1;
expect(component.isColumnHidden(column)).toBe(true);
});
});
});