Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
122 changes: 97 additions & 25 deletions AudioCuesheetEditor.Tests/Services/IO/FileInputManagerTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,13 @@
using Microsoft.JSInterop;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;

namespace AudioCuesheetEditor.Tests.Services.IO
{
Expand All @@ -34,11 +40,12 @@ public void CheckFileMimeType_ReturnsTrue_WhenContentTypeDoesNotMatchButExtensio
var jsRuntimeMock = new Mock<IJSRuntime>();
var httpClientMock = new Mock<HttpClient>();
var loggerMock = new Mock<ILogger<FileInputManager>>();
var file = CreateBrowserFile("test.mp3", "audio/wav");
var fileName = "test.mp3";
var contentType = "audio/wav";
var manager = new FileInputManager(jsRuntimeMock.Object, httpClientMock.Object, loggerMock.Object);

// Act
var result = manager.CheckFileMimeType(file, "audio/mpeg", [".mp3"]);
var result = manager.CheckFileMimeType(contentType, fileName, "audio/mpeg", [".mp3"]);

// Assert
Assert.IsTrue(result);
Expand All @@ -51,11 +58,12 @@ public void CheckFileMimeType_ReturnsTrue_WhenContentTypeDoesMatchButNotExtensio
var jsRuntimeMock = new Mock<IJSRuntime>();
var httpClientMock = new Mock<HttpClient>();
var loggerMock = new Mock<ILogger<FileInputManager>>();
var file = CreateBrowserFile("test.mpeg", "audio/mpeg");
var fileName = "test.mpeg";
var contentType = "audio/mpeg";
var manager = new FileInputManager(jsRuntimeMock.Object, httpClientMock.Object, loggerMock.Object);

// Act
var result = manager.CheckFileMimeType(file, "audio/mpeg", [".mp3", ".txt"]);
var result = manager.CheckFileMimeType(contentType, fileName, "audio/mpeg", [".mp3", ".txt"]);

// Assert
Assert.IsTrue(result);
Expand All @@ -68,11 +76,12 @@ public void CheckFileMimeType_ReturnsFalse_WhenExtensionDoesNotMatchAndContentTy
var jsRuntimeMock = new Mock<IJSRuntime>();
var httpClientMock = new Mock<HttpClient>();
var loggerMock = new Mock<ILogger<FileInputManager>>();
var file = CreateBrowserFile("test.flac", string.Empty);
var fileName = "test.flac";
var contentType = string.Empty;
var manager = new FileInputManager(jsRuntimeMock.Object, httpClientMock.Object, loggerMock.Object);

// Act
var result = manager.CheckFileMimeType(file, "audio/flac", [".mp3"]);
var result = manager.CheckFileMimeType(contentType, fileName, "audio/flac", [".mp3"]);

// Assert
Assert.IsFalse(result);
Expand All @@ -85,11 +94,12 @@ public void CheckFileMimeType_ReturnsTrue_WhenContentTypeAndExtensionMatch()
var jsRuntimeMock = new Mock<IJSRuntime>();
var httpClientMock = new Mock<HttpClient>();
var loggerMock = new Mock<ILogger<FileInputManager>>();
var file = CreateBrowserFile("test.wav", "audio/wave");
var fileName = "test.wav";
var contentType = "audio/wave";
var manager = new FileInputManager(jsRuntimeMock.Object, httpClientMock.Object, loggerMock.Object);

// Act
var result = manager.CheckFileMimeType(file, "audio/wave", [".wav"]);
var result = manager.CheckFileMimeType(contentType, fileName, "audio/wave", [".wav"]);

// Assert
Assert.IsTrue(result);
Expand All @@ -102,11 +112,12 @@ public void CheckFileMimeType_ReturnsTrue_WhenContentMainTypeMatch()
var jsRuntimeMock = new Mock<IJSRuntime>();
var httpClientMock = new Mock<HttpClient>();
var loggerMock = new Mock<ILogger<FileInputManager>>();
var file = CreateBrowserFile("history.txt", "text/plain");
var fileName = "history.txt";
var contentType = "text/plain";
var manager = new FileInputManager(jsRuntimeMock.Object, httpClientMock.Object, loggerMock.Object);

// Act
var result = manager.CheckFileMimeType(file, "text/*", [".txt", ".text"]);
var result = manager.CheckFileMimeType(contentType, fileName, "text/*", [".txt", ".text"]);

// Assert
Assert.IsTrue(result);
Expand All @@ -119,11 +130,12 @@ public void IsValidAudiofile_ReturnsTrue_WithValidAudiocodec()
var jsRuntimeMock = new Mock<IJSRuntime>();
var httpClientMock = new Mock<HttpClient>();
var loggerMock = new Mock<ILogger<FileInputManager>>();
var file = CreateBrowserFile("test.wav", "audio/wav");
var fileName = "test.wav";
var contentType = "audio/wav";
var manager = new FileInputManager(jsRuntimeMock.Object, httpClientMock.Object, loggerMock.Object);

// Act
var result = manager.IsValidAudiofile(file);
var result = manager.IsValidAudiofile(contentType, fileName);

// Assert
Assert.IsTrue(result);
Expand All @@ -136,11 +148,12 @@ public void IsValidAudiofile_ReturnsFalse_WithInvalidAudiocodecAndExtension()
var jsRuntimeMock = new Mock<IJSRuntime>();
var httpClientMock = new Mock<HttpClient>();
var loggerMock = new Mock<ILogger<FileInputManager>>();
var file = CreateBrowserFile("test.mock", "just a fantasy");
var fileName = "test.mock";
var contentType = "just a fantasy";
var manager = new FileInputManager(jsRuntimeMock.Object, httpClientMock.Object, loggerMock.Object);

// Act
var result = manager.IsValidAudiofile(file);
var result = manager.IsValidAudiofile(contentType, fileName);

// Assert
Assert.IsFalse(result);
Expand All @@ -153,11 +166,12 @@ public void GetAudioCodec_ReturnsAudiocodec_WhenContentTypeMatches()
var jsRuntimeMock = new Mock<IJSRuntime>();
var httpClientMock = new Mock<HttpClient>();
var loggerMock = new Mock<ILogger<FileInputManager>>();
var file = CreateBrowserFile("test.wbem", "audio/webm");
var fileName = "test.wbem";
var contentType = "audio/webm";
var manager = new FileInputManager(jsRuntimeMock.Object, httpClientMock.Object, loggerMock.Object);

// Act
var result = manager.GetAudioCodec(file);
var result = manager.GetAudioCodec(contentType, fileName);

// Assert
Assert.IsNotNull(result);
Expand All @@ -171,11 +185,12 @@ public void GetAudioCodec_ReturnsAudiocodec_WhenContentTypeAndFileExtensionMatch
var jsRuntimeMock = new Mock<IJSRuntime>();
var httpClientMock = new Mock<HttpClient>();
var loggerMock = new Mock<ILogger<FileInputManager>>();
var file = CreateBrowserFile("test.webm", "audio/webm");
var fileName = "test.wbem";
var contentType = "audio/webm";
var manager = new FileInputManager(jsRuntimeMock.Object, httpClientMock.Object, loggerMock.Object);

// Act
var result = manager.GetAudioCodec(file);
var result = manager.GetAudioCodec(contentType, fileName);

// Assert
Assert.IsNotNull(result);
Expand All @@ -189,11 +204,12 @@ public void GetAudioCodec_ReturnsNull_WhenContentTypeAndFileExtensionNotMatch()
var jsRuntimeMock = new Mock<IJSRuntime>();
var httpClientMock = new Mock<HttpClient>();
var loggerMock = new Mock<ILogger<FileInputManager>>();
var file = CreateBrowserFile("test.acx", "fantasy stuff");
var fileName = "test.acx";
var contentType = "fantasy stuff";
var manager = new FileInputManager(jsRuntimeMock.Object, httpClientMock.Object, loggerMock.Object);

// Act
var result = manager.GetAudioCodec(file);
var result = manager.GetAudioCodec(contentType, fileName);

// Assert
Assert.IsNull(result);
Expand All @@ -206,11 +222,12 @@ public void IsValidForImportView_ReturnsTrue_WhenFileIsHtml()
var jsRuntimeMock = new Mock<IJSRuntime>();
var httpClientMock = new Mock<HttpClient>();
var loggerMock = new Mock<ILogger<FileInputManager>>();
var file = CreateBrowserFile("test.html", "text/html");
var fileName = "test.html";
var contentType = "text/html";
var manager = new FileInputManager(jsRuntimeMock.Object, httpClientMock.Object, loggerMock.Object);

// Act
var result = manager.IsValidForImportView(file);
var result = manager.IsValidForImportView(contentType, fileName);

// Assert
Assert.IsTrue(result);
Expand All @@ -223,21 +240,76 @@ public void IsValidForImportView_ReturnsFalse_WhenFileIsBinary()
var jsRuntimeMock = new Mock<IJSRuntime>();
var httpClientMock = new Mock<HttpClient>();
var loggerMock = new Mock<ILogger<FileInputManager>>();
var file = CreateBrowserFile("test.dat", "application/octet-stream");
var fileName = "test.dat";
var contentType = "application/octet-stream";
var manager = new FileInputManager(jsRuntimeMock.Object, httpClientMock.Object, loggerMock.Object);

// Act
var result = manager.IsValidForImportView(file);
var result = manager.IsValidForImportView(contentType, fileName);

// Assert
Assert.IsFalse(result);
}

private static IBrowserFile CreateBrowserFile(string name, string contentType)
[TestMethod]
public async Task CreateFileUploadsAsync_ReturnsFileUploads_WhenFileHasTextContentAsync()
{
// Arrange
var jsRuntimeMock = new Mock<IJSRuntime>();
var httpClientMock = new Mock<HttpClient>();
var loggerMock = new Mock<ILogger<FileInputManager>>();
var manager = new FileInputManager(jsRuntimeMock.Object, httpClientMock.Object, loggerMock.Object);
var firstFile = CreateBrowserFile("Test.txt", "text/plain", "Just a test!");
var secondFile = CreateBrowserFile("Test.mp3", "audio/mpeg");
var fileInputId = nameof(CreateFileUploadsAsync_ReturnsFileUploads_WhenFileHasTextContentAsync);
IReadOnlyList<IBrowserFile> browserfiles = [
firstFile,
secondFile
];
var objectUrl = "Some object url!";
jsRuntimeMock.Setup(js => js.InvokeAsync<String>(It.IsAny<string>(), It.IsAny<object[]>())).ReturnsAsync(objectUrl);
// Act
var result = await manager.CreateFileUploadsAsync(browserfiles, fileInputId);
// Assert
Assert.AreEqual(2, result.Count());
Assert.AreEqual(firstFile.Name, result.First().Name);
Assert.AreEqual(firstFile.ContentType, result.First().ContentType);
Assert.AreEqual("Just a test!", result.First().Content);
Assert.AreEqual(secondFile.Name, result.Last().Name);
Assert.AreEqual(secondFile.ContentType, result.Last().ContentType);
Assert.IsNull(result.Last().Content);
Assert.AreEqual(objectUrl, result.Last().ObjectUrl);
}

[TestMethod]
public async Task CreateFileUploadsAsync_ReturnsEmpty_WhenFilesHaveInvalidMimeTypeAsync()
{
// Arrange
var jsRuntimeMock = new Mock<IJSRuntime>();
var httpClientMock = new Mock<HttpClient>();
var loggerMock = new Mock<ILogger<FileInputManager>>();
var manager = new FileInputManager(jsRuntimeMock.Object, httpClientMock.Object, loggerMock.Object);
var firstFile = CreateBrowserFile("Test.bin", "binary", "Just a test!");
var secondFile = CreateBrowserFile("Test.bin", "octet/stream");
IReadOnlyList<IBrowserFile> browserfiles = [
firstFile,
secondFile
];
// Act
var result = await manager.CreateFileUploadsAsync(browserfiles);
// Assert
Assert.AreEqual(0, result.Count());
}

private static IBrowserFile CreateBrowserFile(string name, string contentType, string? content = null)
{
var fileMock = new Mock<IBrowserFile>();
fileMock.Setup(f => f.Name).Returns(name);
fileMock.Setup(f => f.ContentType).Returns(contentType);
if (content != null)
{
fileMock.Setup(f => f.OpenReadStream()).Returns(new MemoryStream(Encoding.UTF8.GetBytes(content)));
}
return fileMock.Object;
}
}
Expand Down
51 changes: 21 additions & 30 deletions AudioCuesheetEditor.Tests/Services/IO/ImportManagerTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -215,10 +215,10 @@ public async Task UploadFilesAsync_ProjectFile_ImportsCorrectly()
{
// Arrange
var fileContent = "This is the content";
var file = CreateBrowserFileMock("test.projectfile", fileContent);
_fileInputManagerMock.Setup(f => f.CheckFileMimeType(file, FileMimeTypes.Projectfile, It.IsAny<IEnumerable<string>>())).Returns(true);
_fileInputManagerMock.Setup(f => f.CheckFileMimeType(file, FileMimeTypes.Cuesheet, It.IsAny<IEnumerable<string>>())).Returns(false);
_fileInputManagerMock.Setup(f => f.IsValidForImportView(file)).Returns(false);
var file = new FileUpload("test.projectfile", "text/plain", fileContent);
_fileInputManagerMock.Setup(f => f.CheckFileMimeType(file.ContentType, file.Name, FileMimeTypes.Projectfile, It.IsAny<IEnumerable<string>>())).Returns(true);
_fileInputManagerMock.Setup(f => f.CheckFileMimeType(file.ContentType, file.Name, FileMimeTypes.Cuesheet, It.IsAny<IEnumerable<string>>())).Returns(false);
_fileInputManagerMock.Setup(f => f.IsValidForImportView(file.ContentType, file.Name)).Returns(false);

IImportfile? sessionStateContainerImportfile = null;
_sessionStateContainerMock.SetupSet(x => x.Importfile = It.IsAny<IImportfile>()).Callback<IImportfile>(x => sessionStateContainerImportfile = x);
Expand All @@ -237,11 +237,11 @@ public async Task UploadFilesAsync_CuesheetFile_ImportsCorrectly()
{
// Arrange
var fileContent = "Cuesheet file content";
var file = CreateBrowserFileMock("test.cue", fileContent);
_fileInputManagerMock.Setup(f => f.CheckFileMimeType(file, FileMimeTypes.Projectfile, It.IsAny<IEnumerable<string>>())).Returns(false);
_fileInputManagerMock.Setup(f => f.CheckFileMimeType(file, FileMimeTypes.Cuesheet, It.IsAny<IEnumerable<string>>())).Returns(true);
_fileInputManagerMock.Setup(f => f.IsValidForImportView(file)).Returns(false);
var file = new FileUpload("test.cue", "text/plain", fileContent);

_fileInputManagerMock.Setup(f => f.CheckFileMimeType(file.ContentType, file.Name, FileMimeTypes.Projectfile, It.IsAny<IEnumerable<string>>())).Returns(false);
_fileInputManagerMock.Setup(f => f.CheckFileMimeType(file.ContentType, file.Name, FileMimeTypes.Cuesheet, It.IsAny<IEnumerable<string>>())).Returns(true);
_fileInputManagerMock.Setup(f => f.IsValidForImportView(file.ContentType, file.Name)).Returns(false);

IImportfile? sessionStateContainerImportfile = null;
_sessionStateContainerMock.SetupSet(x => x.Importfile = It.IsAny<IImportfile>()).Callback<IImportfile>(x => sessionStateContainerImportfile = x);
Expand All @@ -260,11 +260,11 @@ public async Task UploadFilesAsync_TextFile_ImportsCorrectly()
{
// Arrange
var fileContent = "TextFileContent";
var file = CreateBrowserFileMock("test.txt", fileContent);
_fileInputManagerMock.Setup(f => f.CheckFileMimeType(file, FileMimeTypes.Projectfile, It.IsAny<IEnumerable<string>>())).Returns(false);
_fileInputManagerMock.Setup(f => f.CheckFileMimeType(file, FileMimeTypes.Cuesheet, It.IsAny<IEnumerable<string>>())).Returns(false);
_fileInputManagerMock.Setup(f => f.IsValidForImportView(file)).Returns(true);
var file = new FileUpload("test.txt", "text/plain", fileContent);

_fileInputManagerMock.Setup(f => f.CheckFileMimeType(file.ContentType, file.Name, FileMimeTypes.Projectfile, It.IsAny<IEnumerable<string>>())).Returns(false);
_fileInputManagerMock.Setup(f => f.CheckFileMimeType(file.ContentType, file.Name, FileMimeTypes.Cuesheet, It.IsAny<IEnumerable<string>>())).Returns(false);
_fileInputManagerMock.Setup(f => f.IsValidForImportView(file.ContentType, file.Name)).Returns(true);

IImportfile? sessionStateContainerImportfile = null;
_sessionStateContainerMock.SetupSet(x => x.Importfile = It.IsAny<IImportfile>()).Callback<IImportfile>(x => sessionStateContainerImportfile = x);
Expand All @@ -282,13 +282,13 @@ public async Task UploadFilesAsync_TextFile_ImportsCorrectly()
public async Task UploadFilesAsync_WithAudiofile_ImportsCorrectly()
{
// Arrange
var file = CreateBrowserFileMock("test.mp3");
_fileInputManagerMock.Setup(f => f.CheckFileMimeType(file, FileMimeTypes.Projectfile, It.IsAny<IEnumerable<string>>())).Returns(false);
_fileInputManagerMock.Setup(f => f.CheckFileMimeType(file, FileMimeTypes.Cuesheet, It.IsAny<IEnumerable<string>>())).Returns(false);
_fileInputManagerMock.Setup(f => f.IsValidForImportView(file)).Returns(false);
_fileInputManagerMock.Setup(f => f.IsValidAudiofile(file)).Returns(true);
_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));
var file = new FileUpload("test.mp3", "audio/mpeg");

_fileInputManagerMock.Setup(f => f.CheckFileMimeType(file.ContentType, file.Name, FileMimeTypes.Projectfile, It.IsAny<IEnumerable<string>>())).Returns(false);
_fileInputManagerMock.Setup(f => f.CheckFileMimeType(file.ContentType, file.Name, FileMimeTypes.Cuesheet, It.IsAny<IEnumerable<string>>())).Returns(false);
_fileInputManagerMock.Setup(f => f.IsValidForImportView(file.ContentType, file.Name)).Returns(false);
_fileInputManagerMock.Setup(f => f.IsValidAudiofile(file.ContentType, file.Name)).Returns(true);
_fileInputManagerMock.Setup(f => f.CreateAudiofileAsync(It.IsAny<FileUpload>(), It.IsAny<Action<Task<Stream>>?>())).ReturnsAsync(new AudioCuesheetEditor.Model.IO.Audio.Audiofile(file.Name));

IImportfile? sessionStateContainerImportfile = null;
_sessionStateContainerMock.SetupSet(x => x.Importfile = It.IsAny<IImportfile>()).Callback<IImportfile>(x => sessionStateContainerImportfile = x);
Expand Down Expand Up @@ -359,14 +359,5 @@ public void ImportData_ValidData_SetsImportfile()
Assert.AreEqual(importData, sessionStateContainerImportfile.FileContentRecognized);
Assert.AreEqual(ImportFileType.Textfile, sessionStateContainerImportfile.FileType);
}

private static IBrowserFile CreateBrowserFileMock(string name, string content = "TestContent")
{
var fileMock = new Mock<IBrowserFile>();
fileMock.Setup(f => f.Name).Returns(name);
fileMock.Setup(f => f.OpenReadStream(It.IsAny<long>(), It.IsAny<CancellationToken>()))
.Returns(new MemoryStream(Encoding.UTF8.GetBytes(content)));
return fileMock.Object;
}
}
}
Loading