2020using Microsoft . JSInterop ;
2121using Microsoft . VisualStudio . TestTools . UnitTesting ;
2222using Moq ;
23+ using System ;
24+ using System . Collections . Generic ;
25+ using System . IO ;
26+ using System . Linq ;
2327using System . Net . Http ;
28+ using System . Text ;
29+ using System . Threading . Tasks ;
2430
2531namespace AudioCuesheetEditor . Tests . Services . IO
2632{
@@ -34,11 +40,12 @@ public void CheckFileMimeType_ReturnsTrue_WhenContentTypeDoesNotMatchButExtensio
3440 var jsRuntimeMock = new Mock < IJSRuntime > ( ) ;
3541 var httpClientMock = new Mock < HttpClient > ( ) ;
3642 var loggerMock = new Mock < ILogger < FileInputManager > > ( ) ;
37- var file = CreateBrowserFile ( "test.mp3" , "audio/wav" ) ;
43+ var fileName = "test.mp3" ;
44+ var contentType = "audio/wav" ;
3845 var manager = new FileInputManager ( jsRuntimeMock . Object , httpClientMock . Object , loggerMock . Object ) ;
3946
4047 // Act
41- var result = manager . CheckFileMimeType ( file , "audio/mpeg" , [ ".mp3" ] ) ;
48+ var result = manager . CheckFileMimeType ( contentType , fileName , "audio/mpeg" , [ ".mp3" ] ) ;
4249
4350 // Assert
4451 Assert . IsTrue ( result ) ;
@@ -51,11 +58,12 @@ public void CheckFileMimeType_ReturnsTrue_WhenContentTypeDoesMatchButNotExtensio
5158 var jsRuntimeMock = new Mock < IJSRuntime > ( ) ;
5259 var httpClientMock = new Mock < HttpClient > ( ) ;
5360 var loggerMock = new Mock < ILogger < FileInputManager > > ( ) ;
54- var file = CreateBrowserFile ( "test.mpeg" , "audio/mpeg" ) ;
61+ var fileName = "test.mpeg" ;
62+ var contentType = "audio/mpeg" ;
5563 var manager = new FileInputManager ( jsRuntimeMock . Object , httpClientMock . Object , loggerMock . Object ) ;
5664
5765 // Act
58- var result = manager . CheckFileMimeType ( file , "audio/mpeg" , [ ".mp3" , ".txt" ] ) ;
66+ var result = manager . CheckFileMimeType ( contentType , fileName , "audio/mpeg" , [ ".mp3" , ".txt" ] ) ;
5967
6068 // Assert
6169 Assert . IsTrue ( result ) ;
@@ -68,11 +76,12 @@ public void CheckFileMimeType_ReturnsFalse_WhenExtensionDoesNotMatchAndContentTy
6876 var jsRuntimeMock = new Mock < IJSRuntime > ( ) ;
6977 var httpClientMock = new Mock < HttpClient > ( ) ;
7078 var loggerMock = new Mock < ILogger < FileInputManager > > ( ) ;
71- var file = CreateBrowserFile ( "test.flac" , string . Empty ) ;
79+ var fileName = "test.flac" ;
80+ var contentType = string . Empty ;
7281 var manager = new FileInputManager ( jsRuntimeMock . Object , httpClientMock . Object , loggerMock . Object ) ;
7382
7483 // Act
75- var result = manager . CheckFileMimeType ( file , "audio/flac" , [ ".mp3" ] ) ;
84+ var result = manager . CheckFileMimeType ( contentType , fileName , "audio/flac" , [ ".mp3" ] ) ;
7685
7786 // Assert
7887 Assert . IsFalse ( result ) ;
@@ -85,11 +94,12 @@ public void CheckFileMimeType_ReturnsTrue_WhenContentTypeAndExtensionMatch()
8594 var jsRuntimeMock = new Mock < IJSRuntime > ( ) ;
8695 var httpClientMock = new Mock < HttpClient > ( ) ;
8796 var loggerMock = new Mock < ILogger < FileInputManager > > ( ) ;
88- var file = CreateBrowserFile ( "test.wav" , "audio/wave" ) ;
97+ var fileName = "test.wav" ;
98+ var contentType = "audio/wave" ;
8999 var manager = new FileInputManager ( jsRuntimeMock . Object , httpClientMock . Object , loggerMock . Object ) ;
90100
91101 // Act
92- var result = manager . CheckFileMimeType ( file , "audio/wave" , [ ".wav" ] ) ;
102+ var result = manager . CheckFileMimeType ( contentType , fileName , "audio/wave" , [ ".wav" ] ) ;
93103
94104 // Assert
95105 Assert . IsTrue ( result ) ;
@@ -102,11 +112,12 @@ public void CheckFileMimeType_ReturnsTrue_WhenContentMainTypeMatch()
102112 var jsRuntimeMock = new Mock < IJSRuntime > ( ) ;
103113 var httpClientMock = new Mock < HttpClient > ( ) ;
104114 var loggerMock = new Mock < ILogger < FileInputManager > > ( ) ;
105- var file = CreateBrowserFile ( "history.txt" , "text/plain" ) ;
115+ var fileName = "history.txt" ;
116+ var contentType = "text/plain" ;
106117 var manager = new FileInputManager ( jsRuntimeMock . Object , httpClientMock . Object , loggerMock . Object ) ;
107118
108119 // Act
109- var result = manager . CheckFileMimeType ( file , "text/*" , [ ".txt" , ".text" ] ) ;
120+ var result = manager . CheckFileMimeType ( contentType , fileName , "text/*" , [ ".txt" , ".text" ] ) ;
110121
111122 // Assert
112123 Assert . IsTrue ( result ) ;
@@ -119,11 +130,12 @@ public void IsValidAudiofile_ReturnsTrue_WithValidAudiocodec()
119130 var jsRuntimeMock = new Mock < IJSRuntime > ( ) ;
120131 var httpClientMock = new Mock < HttpClient > ( ) ;
121132 var loggerMock = new Mock < ILogger < FileInputManager > > ( ) ;
122- var file = CreateBrowserFile ( "test.wav" , "audio/wav" ) ;
133+ var fileName = "test.wav" ;
134+ var contentType = "audio/wav" ;
123135 var manager = new FileInputManager ( jsRuntimeMock . Object , httpClientMock . Object , loggerMock . Object ) ;
124136
125137 // Act
126- var result = manager . IsValidAudiofile ( file ) ;
138+ var result = manager . IsValidAudiofile ( contentType , fileName ) ;
127139
128140 // Assert
129141 Assert . IsTrue ( result ) ;
@@ -136,11 +148,12 @@ public void IsValidAudiofile_ReturnsFalse_WithInvalidAudiocodecAndExtension()
136148 var jsRuntimeMock = new Mock < IJSRuntime > ( ) ;
137149 var httpClientMock = new Mock < HttpClient > ( ) ;
138150 var loggerMock = new Mock < ILogger < FileInputManager > > ( ) ;
139- var file = CreateBrowserFile ( "test.mock" , "just a fantasy" ) ;
151+ var fileName = "test.mock" ;
152+ var contentType = "just a fantasy" ;
140153 var manager = new FileInputManager ( jsRuntimeMock . Object , httpClientMock . Object , loggerMock . Object ) ;
141154
142155 // Act
143- var result = manager . IsValidAudiofile ( file ) ;
156+ var result = manager . IsValidAudiofile ( contentType , fileName ) ;
144157
145158 // Assert
146159 Assert . IsFalse ( result ) ;
@@ -153,11 +166,12 @@ public void GetAudioCodec_ReturnsAudiocodec_WhenContentTypeMatches()
153166 var jsRuntimeMock = new Mock < IJSRuntime > ( ) ;
154167 var httpClientMock = new Mock < HttpClient > ( ) ;
155168 var loggerMock = new Mock < ILogger < FileInputManager > > ( ) ;
156- var file = CreateBrowserFile ( "test.wbem" , "audio/webm" ) ;
169+ var fileName = "test.wbem" ;
170+ var contentType = "audio/webm" ;
157171 var manager = new FileInputManager ( jsRuntimeMock . Object , httpClientMock . Object , loggerMock . Object ) ;
158172
159173 // Act
160- var result = manager . GetAudioCodec ( file ) ;
174+ var result = manager . GetAudioCodec ( contentType , fileName ) ;
161175
162176 // Assert
163177 Assert . IsNotNull ( result ) ;
@@ -171,11 +185,12 @@ public void GetAudioCodec_ReturnsAudiocodec_WhenContentTypeAndFileExtensionMatch
171185 var jsRuntimeMock = new Mock < IJSRuntime > ( ) ;
172186 var httpClientMock = new Mock < HttpClient > ( ) ;
173187 var loggerMock = new Mock < ILogger < FileInputManager > > ( ) ;
174- var file = CreateBrowserFile ( "test.webm" , "audio/webm" ) ;
188+ var fileName = "test.wbem" ;
189+ var contentType = "audio/webm" ;
175190 var manager = new FileInputManager ( jsRuntimeMock . Object , httpClientMock . Object , loggerMock . Object ) ;
176191
177192 // Act
178- var result = manager . GetAudioCodec ( file ) ;
193+ var result = manager . GetAudioCodec ( contentType , fileName ) ;
179194
180195 // Assert
181196 Assert . IsNotNull ( result ) ;
@@ -189,11 +204,12 @@ public void GetAudioCodec_ReturnsNull_WhenContentTypeAndFileExtensionNotMatch()
189204 var jsRuntimeMock = new Mock < IJSRuntime > ( ) ;
190205 var httpClientMock = new Mock < HttpClient > ( ) ;
191206 var loggerMock = new Mock < ILogger < FileInputManager > > ( ) ;
192- var file = CreateBrowserFile ( "test.acx" , "fantasy stuff" ) ;
207+ var fileName = "test.acx" ;
208+ var contentType = "fantasy stuff" ;
193209 var manager = new FileInputManager ( jsRuntimeMock . Object , httpClientMock . Object , loggerMock . Object ) ;
194210
195211 // Act
196- var result = manager . GetAudioCodec ( file ) ;
212+ var result = manager . GetAudioCodec ( contentType , fileName ) ;
197213
198214 // Assert
199215 Assert . IsNull ( result ) ;
@@ -206,11 +222,12 @@ public void IsValidForImportView_ReturnsTrue_WhenFileIsHtml()
206222 var jsRuntimeMock = new Mock < IJSRuntime > ( ) ;
207223 var httpClientMock = new Mock < HttpClient > ( ) ;
208224 var loggerMock = new Mock < ILogger < FileInputManager > > ( ) ;
209- var file = CreateBrowserFile ( "test.html" , "text/html" ) ;
225+ var fileName = "test.html" ;
226+ var contentType = "text/html" ;
210227 var manager = new FileInputManager ( jsRuntimeMock . Object , httpClientMock . Object , loggerMock . Object ) ;
211228
212229 // Act
213- var result = manager . IsValidForImportView ( file ) ;
230+ var result = manager . IsValidForImportView ( contentType , fileName ) ;
214231
215232 // Assert
216233 Assert . IsTrue ( result ) ;
@@ -223,21 +240,76 @@ public void IsValidForImportView_ReturnsFalse_WhenFileIsBinary()
223240 var jsRuntimeMock = new Mock < IJSRuntime > ( ) ;
224241 var httpClientMock = new Mock < HttpClient > ( ) ;
225242 var loggerMock = new Mock < ILogger < FileInputManager > > ( ) ;
226- var file = CreateBrowserFile ( "test.dat" , "application/octet-stream" ) ;
243+ var fileName = "test.dat" ;
244+ var contentType = "application/octet-stream" ;
227245 var manager = new FileInputManager ( jsRuntimeMock . Object , httpClientMock . Object , loggerMock . Object ) ;
228246
229247 // Act
230- var result = manager . IsValidForImportView ( file ) ;
248+ var result = manager . IsValidForImportView ( contentType , fileName ) ;
231249
232250 // Assert
233251 Assert . IsFalse ( result ) ;
234252 }
235253
236- private static IBrowserFile CreateBrowserFile ( string name , string contentType )
254+ [ TestMethod ]
255+ public async Task CreateFileUploadsAsync_ReturnsFileUploads_WhenFileHasTextContentAsync ( )
256+ {
257+ // Arrange
258+ var jsRuntimeMock = new Mock < IJSRuntime > ( ) ;
259+ var httpClientMock = new Mock < HttpClient > ( ) ;
260+ var loggerMock = new Mock < ILogger < FileInputManager > > ( ) ;
261+ var manager = new FileInputManager ( jsRuntimeMock . Object , httpClientMock . Object , loggerMock . Object ) ;
262+ var firstFile = CreateBrowserFile ( "Test.txt" , "text/plain" , "Just a test!" ) ;
263+ var secondFile = CreateBrowserFile ( "Test.mp3" , "audio/mpeg" ) ;
264+ var fileInputId = nameof ( CreateFileUploadsAsync_ReturnsFileUploads_WhenFileHasTextContentAsync ) ;
265+ IReadOnlyList < IBrowserFile > browserfiles = [
266+ firstFile ,
267+ secondFile
268+ ] ;
269+ var objectUrl = "Some object url!" ;
270+ jsRuntimeMock . Setup ( js => js . InvokeAsync < String > ( It . IsAny < string > ( ) , It . IsAny < object [ ] > ( ) ) ) . ReturnsAsync ( objectUrl ) ;
271+ // Act
272+ var result = await manager . CreateFileUploadsAsync ( browserfiles , fileInputId ) ;
273+ // Assert
274+ Assert . AreEqual ( 2 , result . Count ( ) ) ;
275+ Assert . AreEqual ( firstFile . Name , result . First ( ) . Name ) ;
276+ Assert . AreEqual ( firstFile . ContentType , result . First ( ) . ContentType ) ;
277+ Assert . AreEqual ( "Just a test!" , result . First ( ) . Content ) ;
278+ Assert . AreEqual ( secondFile . Name , result . Last ( ) . Name ) ;
279+ Assert . AreEqual ( secondFile . ContentType , result . Last ( ) . ContentType ) ;
280+ Assert . IsNull ( result . Last ( ) . Content ) ;
281+ Assert . AreEqual ( objectUrl , result . Last ( ) . ObjectUrl ) ;
282+ }
283+
284+ [ TestMethod ]
285+ public async Task CreateFileUploadsAsync_ReturnsEmpty_WhenFilesHaveInvalidMimeTypeAsync ( )
286+ {
287+ // Arrange
288+ var jsRuntimeMock = new Mock < IJSRuntime > ( ) ;
289+ var httpClientMock = new Mock < HttpClient > ( ) ;
290+ var loggerMock = new Mock < ILogger < FileInputManager > > ( ) ;
291+ var manager = new FileInputManager ( jsRuntimeMock . Object , httpClientMock . Object , loggerMock . Object ) ;
292+ var firstFile = CreateBrowserFile ( "Test.bin" , "binary" , "Just a test!" ) ;
293+ var secondFile = CreateBrowserFile ( "Test.bin" , "octet/stream" ) ;
294+ IReadOnlyList < IBrowserFile > browserfiles = [
295+ firstFile ,
296+ secondFile
297+ ] ;
298+ // Act
299+ var result = await manager . CreateFileUploadsAsync ( browserfiles ) ;
300+ // Assert
301+ Assert . AreEqual ( 0 , result . Count ( ) ) ;
302+ }
303+
304+ private static IBrowserFile CreateBrowserFile ( string name , string contentType , string ? content = null )
237305 {
238306 var fileMock = new Mock < IBrowserFile > ( ) ;
239307 fileMock . Setup ( f => f . Name ) . Returns ( name ) ;
240308 fileMock . Setup ( f => f . ContentType ) . Returns ( contentType ) ;
309+ if ( content != null )
310+ {
311+ fileMock . Setup ( f => f . OpenReadStream ( ) ) . Returns ( new MemoryStream ( Encoding . UTF8 . GetBytes ( content ) ) ) ;
312+ }
241313 return fileMock . Object ;
242314 }
243315 }
0 commit comments