1 import { ComponentFixture, TestBed } from '@angular/core/testing';
2 import { FormsModule } from '@angular/forms';
3 import { RouterTestingModule } from '@angular/router/testing';
5 import { NgxDatatableModule } from '@swimlane/ngx-datatable';
6 import { BsDropdownModule } from 'ngx-bootstrap/dropdown';
8 import { configureTestBed } from '../../../../testing/unit-test-helper';
9 import { ComponentsModule } from '../../components/components.module';
10 import { CellTemplate } from '../../enum/cell-template.enum';
11 import { CdTableColumn } from '../../models/cd-table-column';
12 import { CdDatePipe } from '../../pipes/cd-date.pipe';
13 import { PipesModule } from '../../pipes/pipes.module';
14 import { TableComponent } from '../table/table.component';
15 import { TableKeyValueComponent } from './table-key-value.component';
17 describe('TableKeyValueComponent', () => {
18 let component: TableKeyValueComponent;
19 let fixture: ComponentFixture<TableKeyValueComponent>;
22 declarations: [TableComponent, TableKeyValueComponent],
28 BsDropdownModule.forRoot(),
34 fixture = TestBed.createComponent(TableKeyValueComponent);
35 component = fixture.componentInstance;
38 it('should create', () => {
39 fixture.detectChanges();
40 expect(component).toBeTruthy();
43 it('should make key value object pairs out of arrays with length two', () => {
44 component.data = [['someKey', 0], ['arrayKey', [1, 2, 3]], [3, 'something']];
46 expect(component.tableData).toEqual([
47 { key: 'arrayKey', value: '1, 2, 3' },
48 { key: 'someKey', value: 0 },
49 { key: 3, value: 'something' }
53 it('should remove items with objects as values', () => {
54 component.data = [[3, 'something'], ['will be removed', { a: 3, b: 4, c: 5 }]];
56 expect(component.tableData).toEqual([{ key: 3, value: 'something' }]);
59 it('makes key value object pairs out of an object', () => {
60 component.data = { 3: 'something', someKey: 0 };
62 expect(component.tableData).toEqual([
63 { key: '3', value: 'something' },
64 { key: 'someKey', value: 0 }
68 it('does nothing if data does not need to be converted', () => {
69 component.data = [{ key: 3, value: 'something' }, { key: 'someKey', value: 0 }];
71 expect(component.tableData).toEqual(component.data);
74 it('throws errors if data cannot be converted', () => {
76 expect(() => component.ngOnInit()).toThrowError('Wrong data format');
77 component.data = [['someKey', 0, 3]];
78 expect(() => component.ngOnInit()).toThrowError(
79 'Array contains too many elements (3). Needs to be of type [string, any][]'
83 it('tests makePairs()', () => {
84 const makePairs = (data) => component['makePairs'](data);
85 expect(makePairs([['dash', 'board']])).toEqual([{ key: 'dash', value: 'board' }]);
86 const pair = [{ key: 'dash', value: 'board' }, { key: 'ceph', value: 'mimic' }];
87 const pairInverse = [{ key: 'ceph', value: 'mimic' }, { key: 'dash', value: 'board' }];
88 expect(makePairs(pair)).toEqual(pairInverse);
89 expect(makePairs({ dash: 'board' })).toEqual([{ key: 'dash', value: 'board' }]);
90 expect(makePairs({ dash: 'board', ceph: 'mimic' })).toEqual(pairInverse);
93 it('tests makePairsFromArray()', () => {
94 const makePairsFromArray = (data) => component['makePairsFromArray'](data);
95 expect(makePairsFromArray([['dash', 'board']])).toEqual([{ key: 'dash', value: 'board' }]);
96 const pair = [{ key: 'dash', value: 'board' }, { key: 'ceph', value: 'mimic' }];
97 expect(makePairsFromArray(pair)).toEqual(pair);
100 it('tests makePairsFromObject()', () => {
101 const makePairsFromObject = (data) => component['makePairsFromObject'](data);
102 expect(makePairsFromObject({ dash: 'board' })).toEqual([{ key: 'dash', value: 'board' }]);
103 expect(makePairsFromObject({ dash: 'board', ceph: 'mimic' })).toEqual([
104 { key: 'dash', value: 'board' },
105 { key: 'ceph', value: 'mimic' }
109 describe('tests convertValue()', () => {
110 const convertValue = (data) => component['convertValue'](data);
111 const expectConvertValue = (value, expectation) =>
112 expect(convertValue(value)).toBe(expectation);
114 it('should not convert strings', () => {
115 expectConvertValue('something', 'something');
118 it('should not convert integers', () => {
119 expectConvertValue(29, 29);
122 it('should convert arrays with any type to strings', () => {
123 expectConvertValue([1, 2, 3], '1, 2, 3');
124 expectConvertValue([{ sth: 'something' }], '{"sth":"something"}');
125 expectConvertValue([1, 'two', { 3: 'three' }], '1, two, {"3":"three"}');
128 it('should only convert objects if renderObjects is set to true', () => {
129 expect(convertValue({ sth: 'something' })).toBe(null);
130 component.renderObjects = true;
131 expect(convertValue({ sth: 'something' })).toEqual({ sth: 'something' });
135 describe('automatically pipe UTC dates through cdDate', () => {
136 let datePipe: CdDatePipe;
139 datePipe = TestBed.get(CdDatePipe);
140 spyOn(datePipe, 'transform').and.callThrough();
143 const expectTimeConversion = (date: string) => {
144 component.data = { dateKey: date };
145 component.ngOnInit();
146 expect(datePipe.transform).toHaveBeenCalledWith(date);
147 expect(component.tableData[0].key).not.toBe(date);
150 it('converts some date', () => {
151 expectTimeConversion('2019-04-15 12:26:52.305285');
154 it('converts UTC date', () => {
155 expectTimeConversion('2019-04-16T12:35:46.646300974Z');
159 describe('render objects', () => {
164 stringKey: 'somethingElse',
179 additionalKeyContainingObject: { type: 'none' },
180 keyWithEmptyObject: {}
182 component.renderObjects = true;
185 it('with parent key', () => {
186 component.ngOnInit();
187 expect(component.tableData).toEqual([
188 { key: 'additionalKeyContainingObject type', value: 'none' },
189 { key: 'keyWithEmptyObject', value: '' },
190 { key: 'options numberKey', value: 38 },
191 { key: 'options objectKey sub1', value: 12 },
192 { key: 'options objectKey sub2', value: 34 },
193 { key: 'options objectKey sub3', value: 56 },
194 { key: 'options stringKey', value: 'somethingElse' },
195 { key: 'otherOptions sub1 x', value: 42 },
196 { key: 'otherOptions sub2 y', value: 555 }
200 it('without parent key', () => {
201 component.appendParentKey = false;
202 component.ngOnInit();
203 expect(component.tableData).toEqual([
204 { key: 'keyWithEmptyObject', value: '' },
205 { key: 'numberKey', value: 38 },
206 { key: 'stringKey', value: 'somethingElse' },
207 { key: 'sub1', value: 12 },
208 { key: 'sub2', value: 34 },
209 { key: 'sub3', value: 56 },
210 { key: 'type', value: 'none' },
211 { key: 'x', value: 42 },
212 { key: 'y', value: 555 }
217 describe('subscribe fetchData', () => {
218 it('should not subscribe fetchData of table', () => {
219 component.ngOnInit();
220 expect(component.table.fetchData.observers.length).toBe(0);
223 it('should call fetchData', () => {
225 component.fetchData.subscribe(() => {
228 component.ngOnInit();
229 expect(component.table.fetchData.observers.length).toBe(1);
230 component.table.fetchData.emit();
231 expect(called).toBeTruthy();
235 describe('hide empty items', () => {
249 someDifferentNumber: 1,
257 component.renderObjects = true;
260 it('should show all items as default', () => {
261 expect(component.hideEmpty).toBe(false);
262 component.ngOnInit();
263 expect(component.tableData).toEqual([
264 { key: 'array', value: '' },
265 { key: 'booleanFalse', value: false },
266 { key: 'booleanTrue', value: true },
267 { key: 'emptyObject array', value: '' },
268 { key: 'emptyObject object', value: '' },
269 { key: 'emptyObject string', value: '' },
270 { key: 'object', value: '' },
271 { key: 'someArray', value: '0, 1' },
272 { key: 'someDifferentNumber', value: 1 },
273 { key: 'someNumber', value: 0 },
274 { key: 'someObject empty', value: '' },
275 { key: 'someObject something', value: 0.1 },
276 { key: 'someString', value: '0' },
277 { key: 'string', value: '' }
281 it('should hide all empty items', () => {
282 component.hideEmpty = true;
283 component.ngOnInit();
284 expect(component.tableData).toEqual([
285 { key: 'booleanFalse', value: false },
286 { key: 'booleanTrue', value: true },
287 { key: 'someArray', value: '0, 1' },
288 { key: 'someDifferentNumber', value: 1 },
289 { key: 'someNumber', value: 0 },
290 { key: 'someObject something', value: 0.1 },
291 { key: 'someString', value: '0' }
296 describe('columns set up', () => {
297 let columns: CdTableColumn[];
301 { prop: 'key', flexGrow: 1, cellTransformation: CellTemplate.bold },
302 { prop: 'value', flexGrow: 3 }
306 it('should have the following default column set up', () => {
307 component.ngOnInit();
308 expect(component.columns).toEqual(columns);
311 it('should have the following column set up if customCss is defined', () => {
312 component.customCss = { 'class-name': 42 };
313 component.ngOnInit();
314 columns[1].cellTransformation = CellTemplate.classAdding;
315 expect(component.columns).toEqual(columns);