using System; using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Moq; using Xunit; using LCU.Api.Internal.FileOperations.Controllers; using LCU.Api.Internal.FileOperations.Services; using LCU.Api.Internal.FileOperations.Services.FileActionServices; using LCU.Library.Internal.FileOperationsModels.Models; using LCU.Library.Internal.Exceptions; namespace LCU.Api.Internal.FileOperationsTests.Controllers; public class DirectFileOperationsControllerTest { private readonly DirectFileOperationsController _controller; private readonly Mock _mockDirectFileOperationsService; private readonly Mock> _mockMoveFileService; private readonly Mock> _mockWriteFileService; private readonly Mock> _mockCreateDirectoryService; private readonly Mock> _mockUnzipFileService; private readonly Mock> _mockZipDirectoryService; private readonly Mock> _mockDeleteDirectoryService; private readonly Mock> _mockDeleteFileService; private readonly Mock> _mockAppendFileService; public DirectFileOperationsControllerTest() { _mockDirectFileOperationsService = new Mock(); _mockMoveFileService = new Mock>(); _mockWriteFileService = new Mock>(); _mockCreateDirectoryService = new Mock>(); _mockUnzipFileService = new Mock>(); _mockZipDirectoryService = new Mock>(); _mockDeleteDirectoryService = new Mock>(); _mockDeleteFileService = new Mock>(); _mockAppendFileService = new Mock>(); _controller = new DirectFileOperationsController(_mockDirectFileOperationsService.Object, _mockMoveFileService.Object, _mockWriteFileService.Object, _mockCreateDirectoryService.Object, _mockUnzipFileService.Object, _mockZipDirectoryService.Object, _mockDeleteDirectoryService.Object, _mockDeleteFileService.Object, _mockAppendFileService.Object); } [Fact] public async Task WriteBinaryFilePost_Ok() { var request = new WriteFileRequest { FileData = Convert.ToBase64String(new byte[] { 0x52, 0x49, 0x46, 0x46 }), DestinationPath = "SomePath", Extension = ".wav", FileName = "FileName" }; var validRequestResponse = new RequestResponse() { MessageStack = new List(), IsSuccessful = true }; _mockWriteFileService.Setup(service => service.PreQueueValidation(It.IsAny())).Returns(validRequestResponse); _mockDirectFileOperationsService.Setup(service => service.HandleDirectFileOperationsRequest(It.IsAny(), FileOperationType.WriteBinaryFile)) .ReturnsAsync(validRequestResponse) .Verifiable(); var result = await _controller.WriteBinaryFile(request); var okResult = result as OkObjectResult; Assert.NotNull(okResult); Assert.Equal(200, okResult.StatusCode); _mockWriteFileService.Verify(service => service.PreQueueValidation(It.IsAny()), Times.Once); _mockDirectFileOperationsService.Verify(service => service.HandleDirectFileOperationsRequest(It.IsAny(), FileOperationType.WriteBinaryFile), Times.Once); } [Fact] public async Task MoveFilePost_OK() { // arrange var request = new MoveFileRequest() { SourcePath = "", SourceFile = "", DestinationPath = "" }; var validRequestResponse = new RequestResponse() { MessageStack = new List(), IsSuccessful = true }; _mockMoveFileService.Setup(service => service.PreQueueValidation(It.IsAny())).Returns(validRequestResponse); _mockDirectFileOperationsService.Setup(service => service.HandleDirectFileOperationsRequest(It.IsAny(), FileOperationType.Move)) .ReturnsAsync(validRequestResponse) .Verifiable(); // act var result = await _controller.MoveFile(request); Assert.NotNull(result); var okResult = result as OkObjectResult; // assert Assert.NotNull(okResult); Assert.Equal(200, okResult.StatusCode); _mockMoveFileService.Verify(service => service.PreQueueValidation(It.IsAny()), Times.Once); _mockDirectFileOperationsService.Verify(service => service.HandleDirectFileOperationsRequest(It.IsAny(), FileOperationType.Move), Times.Once); } [Fact] public async Task MoveFilePost_InvalidRequest() { // arrange var request = new MoveFileRequest() { }; var validRequestResponse = new RequestResponse() { MessageStack = new List() { "Invalid" }, IsSuccessful = false }; _mockMoveFileService.Setup(service => service.PreQueueValidation(It.IsAny())).Returns(validRequestResponse); // act var result = await _controller.MoveFile(request); Assert.NotNull(result); var badRequest = result as BadRequestObjectResult; Assert.Equal(400, badRequest.StatusCode); Assert.Equal($"Request is invalid. Response: {String.Join("\n ", validRequestResponse.MessageStack.ToArray())}", badRequest.Value); _mockMoveFileService.Verify(service => service.PreQueueValidation(It.IsAny()), Times.Once); _mockDirectFileOperationsService.Verify(service => service.HandleDirectFileOperationsRequest(It.IsAny(), FileOperationType.Move), Times.Never); } [Fact] public async Task MoveFile_Failure_UnexpectedException() { var request = new MoveFileRequest() { SourcePath = "", SourceFile = "", DestinationPath = "" }; var validRequestResponse = new RequestResponse() { MessageStack = new List(), IsSuccessful = true }; _mockMoveFileService.Setup(service => service.PreQueueValidation(It.IsAny())).Returns(validRequestResponse).Verifiable(); _mockDirectFileOperationsService.Setup(service => service.HandleDirectFileOperationsRequest(It.IsAny(), FileOperationType.Move)) .ThrowsAsync(new Exception("Thrown From Unit Test")) .Verifiable(); var result = await _controller.MoveFile(request); Assert.NotNull(result); var statusResult = result as StatusCodeResult; Assert.NotNull(statusResult); Assert.Equal(500, statusResult!.StatusCode); _mockMoveFileService.Verify(service => service.PreQueueValidation(It.IsAny()), Times.Once); _mockDirectFileOperationsService.Verify(service => service.HandleDirectFileOperationsRequest(It.IsAny(), FileOperationType.Move), Times.Once); } [Fact] public async Task MoveFile_Failure_ServiceException() { var request = new MoveFileRequest() { SourcePath = "", SourceFile = "", DestinationPath = "" }; var validRequestResponse = new RequestResponse() { MessageStack = new List(), IsSuccessful = true }; _mockMoveFileService.Setup(service => service.PreQueueValidation(It.IsAny())).Returns(validRequestResponse).Verifiable(); _mockDirectFileOperationsService.Setup(service => service.HandleDirectFileOperationsRequest(It.IsAny(), FileOperationType.Move)) .ThrowsAsync(new ServiceException("Thrown From Unit Test")) .Verifiable(); var result = await _controller.MoveFile(request); Assert.NotNull(result); var statusResult = result as ObjectResult; Assert.NotNull(statusResult); Assert.Equal(500, statusResult!.StatusCode); _mockMoveFileService.Verify(service => service.PreQueueValidation(It.IsAny()), Times.Once); _mockDirectFileOperationsService.Verify(service => service.HandleDirectFileOperationsRequest(It.IsAny(), FileOperationType.Move), Times.Once); } [Fact] public async Task AppendFilePost_Ok() { var request = new AppendFileRequest() { FileData = "Text to write", DestinationPath = "SomePath", Extension = ".txt", FileName = "FileName" }; var validRequestResponse = new RequestResponse() { MessageStack = new List(), IsSuccessful = true }; _mockAppendFileService.Setup(service => service.PreQueueValidation(It.IsAny())).Returns(validRequestResponse); _mockDirectFileOperationsService.Setup(service => service.HandleDirectFileOperationsRequest(It.IsAny(), FileOperationType.AppendFile)) .ReturnsAsync(validRequestResponse) .Verifiable(); // act var result = await _controller.AppendFile(request); Assert.NotNull(result); var okResult = result as OkObjectResult; // assert Assert.NotNull(okResult); Assert.Equal(200, okResult.StatusCode); _mockAppendFileService.Verify(service => service.PreQueueValidation(It.IsAny()), Times.Once); _mockDirectFileOperationsService.Verify(service => service.HandleDirectFileOperationsRequest(It.IsAny(), FileOperationType.AppendFile), Times.Once); } [Fact] public async Task AppendFilePost_InvalidRequest() { // arrange var request = new AppendFileRequest() { }; var validRequestResponse = new RequestResponse() { MessageStack = new List() { "Invalid" }, IsSuccessful = false }; _mockAppendFileService.Setup(service => service.PreQueueValidation(It.IsAny())).Returns(validRequestResponse); // act var result = await _controller.AppendFile(request); Assert.NotNull(result); var badRequest = result as BadRequestObjectResult; Assert.Equal(400, badRequest.StatusCode); Assert.Equal($"Request is invalid. Response: {String.Join("\n ", validRequestResponse.MessageStack.ToArray())}", badRequest.Value); _mockAppendFileService.Verify(service => service.PreQueueValidation(It.IsAny()), Times.Once); _mockDirectFileOperationsService.Verify(service => service.HandleDirectFileOperationsRequest(It.IsAny(), FileOperationType.AppendFile), Times.Never); } [Fact] public async Task AppendFile_Failure_ServiceException() { var request = new AppendFileRequest() { FileData = "Text to write", DestinationPath = "SomePath", Extension = ".txt", FileName = "FileName" }; var validRequestResponse = new RequestResponse() { MessageStack = new List(), IsSuccessful = true }; _mockAppendFileService.Setup(service => service.PreQueueValidation(It.IsAny())).Returns(validRequestResponse).Verifiable(); _mockDirectFileOperationsService.Setup(service => service.HandleDirectFileOperationsRequest(It.IsAny(), FileOperationType.AppendFile)) .ThrowsAsync(new ServiceException("Thrown From Unit Test")) .Verifiable(); var result = await _controller.AppendFile(request); Assert.NotNull(result); var statusResult = result as ObjectResult; Assert.NotNull(statusResult); Assert.Equal(500, statusResult!.StatusCode); _mockAppendFileService.Verify(service => service.PreQueueValidation(It.IsAny()), Times.Once); _mockDirectFileOperationsService.Verify(service => service.HandleDirectFileOperationsRequest(It.IsAny(), FileOperationType.AppendFile), Times.Once); } }