Skip to content

Commit dcaf006

Browse files
Merge pull request #550 from NeoCoderMatrix86/549-dropping-a-file-doesnt-close-the-overlay-directly
Dropping a file doesnt close the overlay directly
2 parents 14b720e + 8cbd6af commit dcaf006

11 files changed

Lines changed: 273 additions & 146 deletions

File tree

AudioCuesheetEditor.Tests/Services/IO/FileInputManagerTests.cs

Lines changed: 97 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,13 @@
2020
using Microsoft.JSInterop;
2121
using Microsoft.VisualStudio.TestTools.UnitTesting;
2222
using Moq;
23+
using System;
24+
using System.Collections.Generic;
25+
using System.IO;
26+
using System.Linq;
2327
using System.Net.Http;
28+
using System.Text;
29+
using System.Threading.Tasks;
2430

2531
namespace 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
}

AudioCuesheetEditor.Tests/Services/IO/ImportManagerTests.cs

Lines changed: 21 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -215,10 +215,10 @@ public async Task UploadFilesAsync_ProjectFile_ImportsCorrectly()
215215
{
216216
// Arrange
217217
var fileContent = "This is the content";
218-
var file = CreateBrowserFileMock("test.projectfile", fileContent);
219-
_fileInputManagerMock.Setup(f => f.CheckFileMimeType(file, FileMimeTypes.Projectfile, It.IsAny<IEnumerable<string>>())).Returns(true);
220-
_fileInputManagerMock.Setup(f => f.CheckFileMimeType(file, FileMimeTypes.Cuesheet, It.IsAny<IEnumerable<string>>())).Returns(false);
221-
_fileInputManagerMock.Setup(f => f.IsValidForImportView(file)).Returns(false);
218+
var file = new FileUpload("test.projectfile", "text/plain", fileContent);
219+
_fileInputManagerMock.Setup(f => f.CheckFileMimeType(file.ContentType, file.Name, FileMimeTypes.Projectfile, It.IsAny<IEnumerable<string>>())).Returns(true);
220+
_fileInputManagerMock.Setup(f => f.CheckFileMimeType(file.ContentType, file.Name, FileMimeTypes.Cuesheet, It.IsAny<IEnumerable<string>>())).Returns(false);
221+
_fileInputManagerMock.Setup(f => f.IsValidForImportView(file.ContentType, file.Name)).Returns(false);
222222

223223
IImportfile? sessionStateContainerImportfile = null;
224224
_sessionStateContainerMock.SetupSet(x => x.Importfile = It.IsAny<IImportfile>()).Callback<IImportfile>(x => sessionStateContainerImportfile = x);
@@ -237,11 +237,11 @@ public async Task UploadFilesAsync_CuesheetFile_ImportsCorrectly()
237237
{
238238
// Arrange
239239
var fileContent = "Cuesheet file content";
240-
var file = CreateBrowserFileMock("test.cue", fileContent);
241-
242-
_fileInputManagerMock.Setup(f => f.CheckFileMimeType(file, FileMimeTypes.Projectfile, It.IsAny<IEnumerable<string>>())).Returns(false);
243-
_fileInputManagerMock.Setup(f => f.CheckFileMimeType(file, FileMimeTypes.Cuesheet, It.IsAny<IEnumerable<string>>())).Returns(true);
244-
_fileInputManagerMock.Setup(f => f.IsValidForImportView(file)).Returns(false);
240+
var file = new FileUpload("test.cue", "text/plain", fileContent);
241+
242+
_fileInputManagerMock.Setup(f => f.CheckFileMimeType(file.ContentType, file.Name, FileMimeTypes.Projectfile, It.IsAny<IEnumerable<string>>())).Returns(false);
243+
_fileInputManagerMock.Setup(f => f.CheckFileMimeType(file.ContentType, file.Name, FileMimeTypes.Cuesheet, It.IsAny<IEnumerable<string>>())).Returns(true);
244+
_fileInputManagerMock.Setup(f => f.IsValidForImportView(file.ContentType, file.Name)).Returns(false);
245245

246246
IImportfile? sessionStateContainerImportfile = null;
247247
_sessionStateContainerMock.SetupSet(x => x.Importfile = It.IsAny<IImportfile>()).Callback<IImportfile>(x => sessionStateContainerImportfile = x);
@@ -260,11 +260,11 @@ public async Task UploadFilesAsync_TextFile_ImportsCorrectly()
260260
{
261261
// Arrange
262262
var fileContent = "TextFileContent";
263-
var file = CreateBrowserFileMock("test.txt", fileContent);
264-
265-
_fileInputManagerMock.Setup(f => f.CheckFileMimeType(file, FileMimeTypes.Projectfile, It.IsAny<IEnumerable<string>>())).Returns(false);
266-
_fileInputManagerMock.Setup(f => f.CheckFileMimeType(file, FileMimeTypes.Cuesheet, It.IsAny<IEnumerable<string>>())).Returns(false);
267-
_fileInputManagerMock.Setup(f => f.IsValidForImportView(file)).Returns(true);
263+
var file = new FileUpload("test.txt", "text/plain", fileContent);
264+
265+
_fileInputManagerMock.Setup(f => f.CheckFileMimeType(file.ContentType, file.Name, FileMimeTypes.Projectfile, It.IsAny<IEnumerable<string>>())).Returns(false);
266+
_fileInputManagerMock.Setup(f => f.CheckFileMimeType(file.ContentType, file.Name, FileMimeTypes.Cuesheet, It.IsAny<IEnumerable<string>>())).Returns(false);
267+
_fileInputManagerMock.Setup(f => f.IsValidForImportView(file.ContentType, file.Name)).Returns(true);
268268

269269
IImportfile? sessionStateContainerImportfile = null;
270270
_sessionStateContainerMock.SetupSet(x => x.Importfile = It.IsAny<IImportfile>()).Callback<IImportfile>(x => sessionStateContainerImportfile = x);
@@ -282,13 +282,13 @@ public async Task UploadFilesAsync_TextFile_ImportsCorrectly()
282282
public async Task UploadFilesAsync_WithAudiofile_ImportsCorrectly()
283283
{
284284
// Arrange
285-
var file = CreateBrowserFileMock("test.mp3");
286-
287-
_fileInputManagerMock.Setup(f => f.CheckFileMimeType(file, FileMimeTypes.Projectfile, It.IsAny<IEnumerable<string>>())).Returns(false);
288-
_fileInputManagerMock.Setup(f => f.CheckFileMimeType(file, FileMimeTypes.Cuesheet, It.IsAny<IEnumerable<string>>())).Returns(false);
289-
_fileInputManagerMock.Setup(f => f.IsValidForImportView(file)).Returns(false);
290-
_fileInputManagerMock.Setup(f => f.IsValidAudiofile(file)).Returns(true);
291-
_fileInputManagerMock.Setup(f => f.CreateAudiofileAsync(It.IsAny<string>(), It.IsAny<IBrowserFile?>(), It.IsAny<Action<Task<Stream>>?>())).ReturnsAsync(new AudioCuesheetEditor.Model.IO.Audio.Audiofile(file.Name));
285+
var file = new FileUpload("test.mp3", "audio/mpeg");
286+
287+
_fileInputManagerMock.Setup(f => f.CheckFileMimeType(file.ContentType, file.Name, FileMimeTypes.Projectfile, It.IsAny<IEnumerable<string>>())).Returns(false);
288+
_fileInputManagerMock.Setup(f => f.CheckFileMimeType(file.ContentType, file.Name, FileMimeTypes.Cuesheet, It.IsAny<IEnumerable<string>>())).Returns(false);
289+
_fileInputManagerMock.Setup(f => f.IsValidForImportView(file.ContentType, file.Name)).Returns(false);
290+
_fileInputManagerMock.Setup(f => f.IsValidAudiofile(file.ContentType, file.Name)).Returns(true);
291+
_fileInputManagerMock.Setup(f => f.CreateAudiofileAsync(It.IsAny<FileUpload>(), It.IsAny<Action<Task<Stream>>?>())).ReturnsAsync(new AudioCuesheetEditor.Model.IO.Audio.Audiofile(file.Name));
292292

293293
IImportfile? sessionStateContainerImportfile = null;
294294
_sessionStateContainerMock.SetupSet(x => x.Importfile = It.IsAny<IImportfile>()).Callback<IImportfile>(x => sessionStateContainerImportfile = x);
@@ -359,14 +359,5 @@ public void ImportData_ValidData_SetsImportfile()
359359
Assert.AreEqual(importData, sessionStateContainerImportfile.FileContentRecognized);
360360
Assert.AreEqual(ImportFileType.Textfile, sessionStateContainerImportfile.FileType);
361361
}
362-
363-
private static IBrowserFile CreateBrowserFileMock(string name, string content = "TestContent")
364-
{
365-
var fileMock = new Mock<IBrowserFile>();
366-
fileMock.Setup(f => f.Name).Returns(name);
367-
fileMock.Setup(f => f.OpenReadStream(It.IsAny<long>(), It.IsAny<CancellationToken>()))
368-
.Returns(new MemoryStream(Encoding.UTF8.GetBytes(content)));
369-
return fileMock.Object;
370-
}
371362
}
372363
}

0 commit comments

Comments
 (0)