1
+ import { FileWithPath } from './file' ;
1
2
import { fromEvent } from './file-selector' ;
2
3
3
4
@@ -21,8 +22,9 @@ it('should return the DataTransfer {files} if the passed event is a DragEvent',
21
22
22
23
const files = await fromEvent ( evt ) ;
23
24
expect ( files ) . toHaveLength ( 1 ) ;
25
+ expect ( files . every ( file => file instanceof File ) ) . toBe ( true ) ;
24
26
25
- const [ file ] = files ;
27
+ const [ file ] = files as FileWithPath [ ] ;
26
28
27
29
expect ( file . name ) . toBe ( mockFile . name ) ;
28
30
expect ( file . type ) . toBe ( mockFile . type ) ;
@@ -40,8 +42,9 @@ it('should return the evt {target} {files} if the passed event is an input evt',
40
42
41
43
const files = await fromEvent ( evt ) ;
42
44
expect ( files ) . toHaveLength ( 1 ) ;
45
+ expect ( files . every ( file => file instanceof File ) ) . toBe ( true ) ;
43
46
44
- const [ file ] = files ;
47
+ const [ file ] = files as FileWithPath [ ] ;
45
48
46
49
expect ( file . name ) . toBe ( mockFile . name ) ;
47
50
expect ( file . type ) . toBe ( mockFile . type ) ;
@@ -60,8 +63,9 @@ it('uses the DataTransfer {items} instead of {files} if it exists', async () =>
60
63
61
64
const files = await fromEvent ( evt ) ;
62
65
expect ( files ) . toHaveLength ( 1 ) ;
66
+ expect ( files . every ( file => file instanceof File ) ) . toBe ( true ) ;
63
67
64
- const [ file ] = files ;
68
+ const [ file ] = files as FileWithPath [ ] ;
65
69
66
70
expect ( file . name ) . toBe ( mockFile . name ) ;
67
71
expect ( file . type ) . toBe ( mockFile . type ) ;
@@ -78,9 +82,9 @@ it('uses the DataTransfer {files} if {items} is empty', async () => {
78
82
const evt = dragEvtFromFilesAndItems ( [ mockFile ] , [ ] ) ;
79
83
80
84
const files = await fromEvent ( evt ) ;
81
- expect ( files ) . toHaveLength ( 1 ) ;
85
+ expect ( files . every ( file => file instanceof File ) ) . toBe ( true ) ;
82
86
83
- const [ file ] = files ;
87
+ const [ file ] = files as FileWithPath [ ] ;
84
88
85
89
expect ( file . name ) . toBe ( mockFile . name ) ;
86
90
expect ( file . type ) . toBe ( mockFile . type ) ;
@@ -90,11 +94,24 @@ it('uses the DataTransfer {files} if {items} is empty', async () => {
90
94
} ) ;
91
95
92
96
it ( 'skips DataTransfer {items} that are of kind "string"' , async ( ) => {
93
- const item = dataTransferItemFromStr ( 'test' ) ;
94
- const evt = dragEvtFromItems ( item ) ;
97
+ const name = 'test.json' ;
98
+ const mockFile = createFile ( name , { ping : true } , {
99
+ type : 'application/json'
100
+ } ) ;
101
+ const f = dataTransferItemFromFile ( mockFile ) ;
102
+ const str = dataTransferItemFromStr ( 'test' ) ;
103
+ const evt = dragEvtFromItems ( [ str , f ] ) ;
95
104
96
105
const files = await fromEvent ( evt ) ;
97
- expect ( files ) . toHaveLength ( 0 ) ;
106
+ expect ( files ) . toHaveLength ( 1 ) ;
107
+
108
+ const [ file ] = files as FileWithPath [ ] ;
109
+
110
+ expect ( file . name ) . toBe ( mockFile . name ) ;
111
+ expect ( file . type ) . toBe ( mockFile . type ) ;
112
+ expect ( file . size ) . toBe ( mockFile . size ) ;
113
+ expect ( file . lastModified ) . toBe ( mockFile . lastModified ) ;
114
+ expect ( file . path ) . toBe ( name ) ;
98
115
} ) ;
99
116
100
117
it ( 'can read a tree of directories recursively and return a flat list of FileWithPath objects' , async ( ) => {
@@ -126,26 +143,74 @@ it('can read a tree of directories recursively and return a flat list of FileWit
126
143
fileSystemFileEntryFromFile ( f8 )
127
144
] ;
128
145
129
- const evt = dragEvtFromItems ( ... entries . map ( dataTransferItemFromEntry ) ) ;
146
+ const evt = dragEvtFromItems ( entries . map ( dataTransferItemFromEntry ) ) ;
130
147
131
- const files = sortFiles ( await fromEvent ( evt ) ) ;
148
+ const items = await fromEvent ( evt ) ;
149
+ const files = sortFiles ( items as FileWithPath [ ] ) ;
132
150
expect ( files ) . toHaveLength ( 6 ) ;
133
151
expect ( files . every ( file => file instanceof File ) ) . toBe ( true ) ;
134
152
expect ( files . every ( file => typeof file . path === 'string' ) ) . toBe ( true ) ;
135
153
expect ( files ) . toEqual ( mockFiles ) ;
136
154
} ) ;
137
155
156
+ it ( 'returns the DataTransfer {items} if the DragEvent {type} is not "drop"' , async ( ) => {
157
+ const name = 'test.json' ;
158
+ const mockFile = createFile ( name , { ping : true } , {
159
+ type : 'application/json'
160
+ } ) ;
161
+ const item = dataTransferItemFromFile ( mockFile ) ;
162
+ const evt = dragEvtFromItems ( item , 'dragenter' ) ;
163
+
164
+ const items = await fromEvent ( evt ) ;
165
+ expect ( items ) . toHaveLength ( 1 ) ;
166
+
167
+ const [ itm ] = items as DataTransferItem [ ] ;
168
+
169
+ expect ( itm . kind ) . toBe ( item . kind ) ;
170
+ expect ( itm . kind ) . toBe ( 'file' ) ;
171
+ } ) ;
172
+
173
+ // tslint:disable-next-line: max-line-length
174
+ it ( 'filters DataTransfer {items} if the DragEvent {type} is not "drop" and DataTransferItem {kind} is "string"' , async ( ) => {
175
+ const name = 'test.json' ;
176
+ const mockFile = createFile ( name , { ping : true } , {
177
+ type : 'application/json'
178
+ } ) ;
179
+ const file = dataTransferItemFromFile ( mockFile ) ;
180
+ const str = dataTransferItemFromStr ( 'test' ) ;
181
+ const evt = dragEvtFromItems ( [ file , str ] , 'dragenter' ) ;
182
+
183
+ const items = await fromEvent ( evt ) ;
184
+ expect ( items ) . toHaveLength ( 1 ) ;
185
+
186
+ const [ item ] = items as DataTransferItem [ ] ;
187
+
188
+ expect ( item . kind ) . toBe ( file . kind ) ;
189
+ expect ( item . kind ) . toBe ( 'file' ) ;
190
+ } ) ;
191
+
138
192
139
- function dragEvtFromFiles ( ...files : File [ ] ) : DragEvent {
140
- return { dataTransfer : { files} } as any ;
193
+ function dragEvtFromFiles ( files : File | File [ ] , type : string = 'drop' ) : DragEvent {
194
+ return {
195
+ type,
196
+ dataTransfer : {
197
+ files : Array . isArray ( files ) ? files : [ files ]
198
+ }
199
+ } as any ;
141
200
}
142
201
143
- function dragEvtFromItems ( ...items : DataTransferItem [ ] ) : DragEvent {
144
- return { dataTransfer : { items} } as any ;
202
+ function dragEvtFromItems ( items : DataTransferItem | DataTransferItem [ ] , type : string = 'drop' ) : DragEvent {
203
+ return {
204
+ type,
205
+ dataTransfer : {
206
+ items : Array . isArray ( items ) ? items : [ items ]
207
+ }
208
+ } as any ;
145
209
}
146
210
147
- function dragEvtFromFilesAndItems ( files : File [ ] , items : DataTransferItem [ ] ) : DragEvent {
211
+ function dragEvtFromFilesAndItems ( files : File [ ] , items : DataTransferItem [ ] , type : string = 'drop' ) : DragEvent {
148
212
return {
213
+ type,
149
214
dataTransfer : { files, items}
150
215
} as any ;
151
216
}
@@ -177,6 +242,7 @@ function dataTransferItemFromStr(str: string): DataTransferItem {
177
242
178
243
function dataTransferItemFromEntry ( entry : FileEntry | DirEntry ) : DataTransferItem {
179
244
return {
245
+ kind : 'file' ,
180
246
webkitGetAsEntry : ( ) => {
181
247
return entry ;
182
248
}
0 commit comments