1
1
import { async , fakeAsync , tick , ComponentFixture , TestBed } from '@angular/core/testing' ;
2
2
import { By } from '@angular/platform-browser' ;
3
3
import { Component , DebugElement , ViewChild } from '@angular/core'
4
- import { MdlVirtualTableComponent , MdlVirtualTableModule } from './' ;
4
+ import { MdlVirtualTableComponent , MdlVirtualTableModule , MdlVirtualTableColumnComponent } from './' ;
5
5
import { VirtualScrollModule , VirtualScrollComponent } from 'angular2-virtual-scroll' ;
6
6
import { Observable } from 'rxjs/Observable' ;
7
7
import 'rxjs/add/observable/of' ;
@@ -25,7 +25,10 @@ describe('VirtualTableComponent', () => {
25
25
imports : [
26
26
MdlVirtualTableModule . forRoot ( )
27
27
] ,
28
- declarations : [ TestMdlVirtualTableComponent ] ,
28
+ declarations : [ TestMdlVirtualTableComponent ,
29
+ TestMdlVirtualTableComponentWithAutoInit ,
30
+ TestMdlVirtualTableComponentWithoutRowCountRequest ,
31
+ TestMdlVirtualTableComponentWithoutRowDataRequest ] ,
29
32
providers : [
30
33
]
31
34
} ) ;
@@ -78,13 +81,130 @@ describe('VirtualTableComponent', () => {
78
81
} , 20 ) ; //wait for requestAnimationFrame
79
82
} ) ;
80
83
} ) ) ;
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
+
81
201
} ) ;
82
202
83
203
@Component ( {
84
204
template : `
85
205
<div style="display: flex; flex-direction: column; max-height: 100vh">
86
206
<mdl-virtual-table #table flex-height mdl-shadow="2" maxHeight="500px"
87
- init-refresh-disabled
207
+ init-refresh-disabled [style.display]="visible ? 'block' : 'none'"
88
208
[rowDataStream]="rowDataStream" [rowCountStream]="rowCountStream"
89
209
(rowCountRequest)="onRowCountRequest()" (rowDataRequest)="onRowDataRequest($event)"
90
210
(sort)="onSort($event)" (rowClick)="onRowClick($event)">
@@ -99,9 +219,11 @@ describe('VirtualTableComponent', () => {
99
219
class TestMdlVirtualTableComponent {
100
220
101
221
@ViewChild ( 'table' ) table : MdlVirtualTableComponent ;
102
-
103
- private rows : any [ ] ;
104
-
222
+
223
+ protected rows : any [ ] ;
224
+
225
+ public visible : boolean = true ;
226
+
105
227
public rowCountStream : Observable < number > ;
106
228
public rowDataStream : Observable < { rows : any [ ] , offset : number , limit : number } > ;
107
229
@@ -137,4 +259,72 @@ describe('VirtualTableComponent', () => {
137
259
this . rows = rows ;
138
260
this . table . refresh ( true ) ;
139
261
}
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