Skip to content
This repository was archived by the owner on Jun 16, 2019. It is now read-only.

Commit 1e72a45

Browse files
committed
add some more tests for virtual-table component
1 parent dbb69c4 commit 1e72a45

File tree

1 file changed

+197
-7
lines changed

1 file changed

+197
-7
lines changed

src/components/virtual-table/table.component.spec.ts

Lines changed: 197 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { async, fakeAsync, tick, ComponentFixture, TestBed } from '@angular/core/testing';
22
import { By } from '@angular/platform-browser';
33
import {Component, DebugElement, ViewChild} from '@angular/core'
4-
import { MdlVirtualTableComponent, MdlVirtualTableModule } from './';
4+
import { MdlVirtualTableComponent, MdlVirtualTableModule, MdlVirtualTableColumnComponent } from './';
55
import { VirtualScrollModule, VirtualScrollComponent } from 'angular2-virtual-scroll';
66
import { Observable } from 'rxjs/Observable';
77
import 'rxjs/add/observable/of';
@@ -25,7 +25,10 @@ describe('VirtualTableComponent', () => {
2525
imports: [
2626
MdlVirtualTableModule.forRoot()
2727
],
28-
declarations: [TestMdlVirtualTableComponent],
28+
declarations: [TestMdlVirtualTableComponent,
29+
TestMdlVirtualTableComponentWithAutoInit,
30+
TestMdlVirtualTableComponentWithoutRowCountRequest,
31+
TestMdlVirtualTableComponentWithoutRowDataRequest],
2932
providers: [
3033
]
3134
});
@@ -78,13 +81,130 @@ describe('VirtualTableComponent', () => {
7881
}, 20); //wait for requestAnimationFrame
7982
});
8083
}));
84+
85+
it('should sort columns with sortable attribute', async(() => {
86+
let testInstance = fixture.componentInstance;
87+
let debugTableInstance = fixture.debugElement.query(By.directive(MdlVirtualTableComponent));
88+
let componentInstance: MdlVirtualTableComponent = debugTableInstance.
89+
componentInstance;
90+
91+
testInstance.initData(rows);
92+
fixture.autoDetectChanges();
93+
fixture.whenStable().then(() => {
94+
95+
let sortSpy = spyOn(testInstance, 'onSort').and.callThrough();
96+
97+
let columnElements = debugTableInstance.nativeElement.querySelectorAll("div.table-header div.header-cell");
98+
columnElements[0].click();
99+
expect(testInstance.onSort).toHaveBeenCalledWith({column: '_index', direction: 'asc'});
100+
sortSpy.calls.reset();
101+
columnElements[0].click();
102+
expect(testInstance.onSort).toHaveBeenCalledWith({column: '_index', direction: 'desc'});
103+
});
104+
}));
105+
106+
it('should not sort columns without sortable attribute', async(() => {
107+
let testInstance = fixture.componentInstance;
108+
let debugTableInstance = fixture.debugElement.query(By.directive(MdlVirtualTableComponent));
109+
let componentInstance: MdlVirtualTableComponent = debugTableInstance.
110+
componentInstance;
111+
112+
testInstance.initData(rows);
113+
fixture.autoDetectChanges();
114+
fixture.whenStable().then(() => {
115+
116+
spyOn(testInstance, 'onSort').and.callThrough();
117+
118+
let columnElements = debugTableInstance.nativeElement.querySelectorAll("div.table-header div.header-cell");
119+
columnElements[1].click();
120+
expect(testInstance.onSort).not.toHaveBeenCalled();
121+
});
122+
}));
123+
124+
it('should emit event on click on a row', async(() => {
125+
let testInstance = fixture.componentInstance;
126+
let debugTableInstance = fixture.debugElement.query(By.directive(MdlVirtualTableComponent));
127+
let componentInstance: MdlVirtualTableComponent = debugTableInstance.
128+
componentInstance;
129+
130+
testInstance.initData(rows);
131+
fixture.autoDetectChanges();
132+
fixture.whenStable().then(() => {
133+
134+
spyOn(testInstance, 'onRowClick').and.callThrough();
135+
136+
let visibleRows = debugTableInstance.nativeElement.querySelectorAll("div.table div.table-row");
137+
visibleRows[0].click();
138+
expect(testInstance.onRowClick).toHaveBeenCalled();
139+
});
140+
}));
141+
142+
it('should throw error on missing rowCountRequest listener', async(() => {
143+
TestBed.compileComponents().then(() => {
144+
let fixtureWrongConfig: ComponentFixture<TestMdlVirtualTableComponentWithoutRowCountRequest> = TestBed.createComponent(TestMdlVirtualTableComponentWithoutRowCountRequest);
145+
fixtureWrongConfig.detectChanges();
146+
expect(() => fixtureWrongConfig.componentInstance.refresh()).toThrowError('mdl-virtual-table component has no rowCountRequest Listener');
147+
});
148+
149+
}));
150+
151+
it('should throw error on missing rowDataRequest listener', async(() => {
152+
TestBed.compileComponents().then(() => {
153+
let fixtureTest: ComponentFixture<TestMdlVirtualTableComponentWithoutRowDataRequest> = TestBed.createComponent(TestMdlVirtualTableComponentWithoutRowDataRequest);
154+
fixtureTest.detectChanges();
155+
expect(() => fixtureTest.componentInstance.refresh()).toThrowError('mdl-virtual-table component has no rowDataRequest Listener');
156+
});
157+
}));
158+
159+
160+
it('should load with auto initial load data', fakeAsync(() => {
161+
let fixtureAutoInit: ComponentFixture<TestMdlVirtualTableComponentWithAutoInit>;
162+
TestBed.compileComponents().then(() => {
163+
fixtureAutoInit = TestBed.createComponent(TestMdlVirtualTableComponentWithAutoInit);
164+
165+
});
166+
tick();
167+
let debugComponent = fixtureAutoInit.debugElement.query(By.directive(MdlVirtualTableComponent));
168+
expect(fixtureAutoInit).toBeDefined();
169+
fixtureAutoInit.componentInstance.initData(rows);
170+
fixtureAutoInit.autoDetectChanges();
171+
fixtureAutoInit.whenStable().then(() => {
172+
expect(debugComponent.componentInstance.values.length).toBe(rows.length, 'Rows length should be 1000');
173+
});
174+
tick();
175+
}));
176+
177+
it('should refresh data if table becomes visible', (done) => {
178+
let testInstance = fixture.componentInstance;
179+
180+
let debugComponent = fixture.debugElement.query(By.directive(MdlVirtualTableComponent));
181+
let componentInstance:MdlVirtualTableComponent = debugComponent.componentInstance;
182+
let debugVirtualScroll = fixture.debugElement.query(By.directive(VirtualScrollComponent));
183+
184+
testInstance.hideTable();
185+
testInstance.initData(rows);
186+
fixture.autoDetectChanges();
187+
fixture.whenStable().then(() => {
188+
189+
spyOn(debugVirtualScroll.componentInstance, 'refresh');
190+
191+
testInstance.showTable();
192+
fixture.detectChanges();
193+
setTimeout(() => {
194+
expect(debugVirtualScroll.componentInstance.refresh).toHaveBeenCalled();
195+
done();
196+
}, 10); // IntersectionObserver delay
197+
});
198+
});
199+
200+
81201
});
82202

83203
@Component({
84204
template: `
85205
<div style="display: flex; flex-direction: column; max-height: 100vh">
86206
<mdl-virtual-table #table flex-height mdl-shadow="2" maxHeight="500px"
87-
init-refresh-disabled
207+
init-refresh-disabled [style.display]="visible ? 'block' : 'none'"
88208
[rowDataStream]="rowDataStream" [rowCountStream]="rowCountStream"
89209
(rowCountRequest)="onRowCountRequest()" (rowDataRequest)="onRowDataRequest($event)"
90210
(sort)="onSort($event)" (rowClick)="onRowClick($event)">
@@ -99,9 +219,11 @@ describe('VirtualTableComponent', () => {
99219
class TestMdlVirtualTableComponent {
100220

101221
@ViewChild('table') table: MdlVirtualTableComponent;
102-
103-
private rows: any[];
104-
222+
223+
protected rows: any[];
224+
225+
public visible: boolean = true;
226+
105227
public rowCountStream: Observable<number>;
106228
public rowDataStream: Observable<{rows: any[], offset: number, limit: number}>;
107229

@@ -137,4 +259,72 @@ describe('VirtualTableComponent', () => {
137259
this.rows = rows;
138260
this.table.refresh(true);
139261
}
140-
}
262+
263+
hideTable() {
264+
this.visible = false;
265+
}
266+
267+
showTable() {
268+
this.visible = true;
269+
}
270+
}
271+
272+
@Component({
273+
template: `
274+
<div style="display: flex; flex-direction: column; max-height: 100vh">
275+
<mdl-virtual-table #table flex-height mdl-shadow="2" maxHeight="500px"
276+
init-refresh-disabled (rowDataRequest)="onRowDataRequest($event)"
277+
[rowDataStream]="rowDataStream" [rowCountStream]="rowCountStream">
278+
<mdl-column label="Index" sortable field="_index" width="1%"></mdl-column>
279+
<mdl-column label="Description" field="_label" width="1%">
280+
<ng-template let-value><div style="text-align: right;">Title: {{value}}</div></ng-template>
281+
</mdl-column>
282+
</mdl-virtual-table>
283+
</div>
284+
`
285+
})
286+
class TestMdlVirtualTableComponentWithoutRowCountRequest extends TestMdlVirtualTableComponent {
287+
288+
refresh() {
289+
this.table.refresh();
290+
}
291+
}
292+
293+
@Component({
294+
template: `
295+
<div style="display: flex; flex-direction: column; max-height: 100vh">
296+
<mdl-virtual-table #table flex-height mdl-shadow="2" maxHeight="500px"
297+
init-refresh-disabled (rowCountRequest)="onRowCountRequest()"
298+
[rowDataStream]="rowDataStream" [rowCountStream]="rowCountStream"
299+
(sort)="onSort($event)" (rowClick)="onRowClick($event)">
300+
<mdl-column label="Index" sortable field="_index" width="1%"></mdl-column>
301+
<mdl-column label="Description" field="_label" width="1%">
302+
<ng-template let-value><div style="text-align: right;">Title: {{value}}</div></ng-template>
303+
</mdl-column>
304+
</mdl-virtual-table>
305+
</div>
306+
`
307+
})
308+
class TestMdlVirtualTableComponentWithoutRowDataRequest extends TestMdlVirtualTableComponent {
309+
refresh() {
310+
this.table.refresh();
311+
}
312+
}
313+
314+
@Component({
315+
template: `
316+
<div style="display: flex; flex-direction: column; max-height: 100vh">
317+
<mdl-virtual-table #table flex-height mdl-shadow="2" maxHeight="500px"
318+
[rowDataStream]="rowDataStream" [rowCountStream]="rowCountStream"
319+
(rowCountRequest)="onRowCountRequest()" (rowDataRequest)="onRowDataRequest($event)">
320+
<mdl-column label="Index" sortable field="_index" width="1%"></mdl-column>
321+
<mdl-column label="Description" field="_label" width="1%">
322+
<ng-template let-value><div style="text-align: right;">Title: {{value}}</div></ng-template>
323+
</mdl-column>
324+
</mdl-virtual-table>
325+
</div>
326+
`
327+
})
328+
class TestMdlVirtualTableComponentWithAutoInit extends TestMdlVirtualTableComponent {
329+
330+
}

0 commit comments

Comments
 (0)