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.Api.Internal.FileOperations.Services.QueueServices; namespace LCU.Api.Internal.FileOperationsTests.Controllers; public class FileOperationsControllerTest { private readonly FileOperationsController _controller; private readonly Mock _mockFileOperationsService; private readonly Mock> _mockMoveFileService; private readonly Mock> _mockCopyFileService; private readonly Mock> _mockModifyFileService; private readonly Mock> _mockDeleteFileService; private readonly Mock> _mockRenameFileService; private readonly Mock> _mockZipDirectoryService; private readonly Mock> _mockUnzipFileService; private readonly Mock> _mockUnzipPasswordProtectedFileService; private readonly Mock> _mockCreateDirectoryService; private readonly Mock> _mockRenameDirectoryService; private readonly Mock>> _mockBulkMoveFileService; private readonly Mock> _mockEncryptFileDataService; private readonly Mock> _mockDecryptFileDataService; private readonly Mock> _mockWriteFileDataService; private readonly Mock> _mockDeleteDirectoryService; private readonly Mock> _mockDeleteEmptyDirectoriesService; private readonly Mock _mockDirectFileService; public FileOperationsControllerTest() { _mockFileOperationsService = new Mock(); _mockMoveFileService = new Mock>(); _mockCopyFileService = new Mock>(); _mockModifyFileService = new Mock>(); _mockDeleteFileService = new Mock>(); _mockRenameFileService = new Mock>(); _mockZipDirectoryService = new Mock>(); _mockUnzipFileService = new Mock>(); _mockUnzipPasswordProtectedFileService = new Mock>(); _mockCreateDirectoryService = new Mock>(); _mockRenameDirectoryService = new Mock>(); _mockBulkMoveFileService = new Mock>>(); _mockEncryptFileDataService = new Mock>(); _mockDecryptFileDataService = new Mock>(); _mockWriteFileDataService = new Mock>(); _mockDeleteDirectoryService = new Mock>(); _mockDeleteEmptyDirectoriesService = new Mock>(); _mockDirectFileService = new Mock(); _controller = new FileOperationsController( _mockFileOperationsService.Object, _mockMoveFileService.Object, _mockCopyFileService.Object, _mockModifyFileService.Object, _mockDeleteFileService.Object, _mockRenameFileService.Object, _mockZipDirectoryService.Object, _mockUnzipFileService.Object, _mockUnzipPasswordProtectedFileService.Object, _mockCreateDirectoryService.Object, _mockRenameDirectoryService.Object, _mockBulkMoveFileService.Object, _mockEncryptFileDataService.Object, _mockDecryptFileDataService.Object, _mockWriteFileDataService.Object, _mockDeleteDirectoryService.Object, _mockDeleteEmptyDirectoriesService.Object, _mockDirectFileService.Object); } [Fact] public async Task WriteBinaryFileDataPost_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 }; _mockWriteFileDataService.Setup(service => service.PreQueueValidation(It.IsAny())).Returns(validRequestResponse); var result = await _controller.WriteBinaryFileData(request); var okResult = result as OkResult; Assert.NotNull(okResult); Assert.Equal(200, okResult.StatusCode); } [Fact] public void GetFile_OK() { var bytes = new byte[1]; _mockDirectFileService.Setup(service => service.GetFileBytes(It.IsAny())).Returns(bytes); // act var result = _controller.GetFile("\\\\fakeit\\file.csv"); Assert.NotNull(result); var okResult = result as FileContentResult; // assert Assert.NotNull(okResult); _mockDirectFileService.Verify(service => service.GetFileBytes(It.IsAny()), Times.Once); } [Fact] public void GetFile_BadRequest_Pre() { var bytes = new byte[1]; _mockDirectFileService.Setup(service => service.GetFileBytes(It.IsAny())).Returns(bytes); // act var result = _controller.GetFile(" "); Assert.NotNull(result); var badResult = result as BadRequestObjectResult; // assert Assert.NotNull(badResult); Assert.Equal(400, badResult.StatusCode); _mockDirectFileService.Verify(service => service.GetFileBytes(It.IsAny()), Times.Never); } [Fact] public void GetFile_BadRequest_Post() { _mockDirectFileService.Setup(service => service.GetFileBytes(It.IsAny())) .Throws(); // act var result = _controller.GetFile("\\\\fakeit\\file.csv"); Assert.NotNull(result); var badResult = result as BadRequestObjectResult; // assert Assert.NotNull(badResult); Assert.Equal(400, badResult.StatusCode); _mockDirectFileService.Verify(service => service.GetFileBytes(It.IsAny()), Times.Once); } // Post tests [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); // act var result = await _controller.MoveFile(request); Assert.NotNull(result); var okResult = result as OkResult; // assert Assert.NotNull(okResult); Assert.Equal(200, okResult.StatusCode); } // Post tests [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); } // Post tests [Fact] public async Task CopyFilePost_OK() { // arrange var request = new CopyFileRequest() { SourcePath = "", SourceFile = "", DestinationPath = "" }; var validRequestResponse = new RequestResponse() { MessageStack = new List(), IsSuccessful = true }; _mockCopyFileService.Setup(service => service.PreQueueValidation(It.IsAny())).Returns(validRequestResponse); // act var result = await _controller.CopyFile(request); Assert.NotNull(result); var okResult = result as OkResult; // assert Assert.NotNull(okResult); Assert.Equal(200, okResult.StatusCode); } // Post tests [Fact] public async Task CopyFilePost_InvalidRequest() { // arrange var request = new CopyFileRequest() { }; var validRequestResponse = new RequestResponse() { MessageStack = new List() { "Invalid" }, IsSuccessful = false }; _mockCopyFileService.Setup(service => service.PreQueueValidation(It.IsAny())).Returns(validRequestResponse); // act var result = await _controller.CopyFile(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); } // Post tests [Fact] public async Task UnzipPasswordProtectedFilePost_OK() { // arrange var request = new UnzipPasswordProtectedFileRequest() { SourceDirectory = "", PasswordProtectedZipFileName = "", Password = "", DestinationPath = "" }; var validRequestResponse = new RequestResponse() { MessageStack = new List(), IsSuccessful = true }; _mockUnzipPasswordProtectedFileService.Setup(service => service.PreQueueValidation(It.IsAny())).Returns(validRequestResponse); // act var result = await _controller.UnzipPasswordProtectedFile(request); // assert Assert.NotNull(result); Assert.Equal(200, (result as OkResult).StatusCode); } // Post tests [Fact] public async Task UnzipPasswordProtectedFilePost_InvalidRequest() { // arrange var request = new UnzipPasswordProtectedFileRequest() { }; var validRequestResponse = new RequestResponse() { MessageStack = new List() { "Invalid" }, IsSuccessful = false }; _mockUnzipPasswordProtectedFileService.Setup(service => service.PreQueueValidation(It.IsAny())).Returns(validRequestResponse); // act var result = await _controller.UnzipPasswordProtectedFile(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); } // Post tests [Fact] public async Task HandleRequestResponsePost_CopyFileRequest_OK() { // arrange var request = new CopyFileRequest() { SourcePath = "", SourceFile = "", DestinationPath = "" }; var validRequestResponse = new RequestResponse() { MessageStack = new List(), IsSuccessful = true }; _mockCopyFileService.Setup(service => service.PreQueueValidation(It.IsAny())).Returns(validRequestResponse); // act var result = await _controller.HandleRequestResponse(request, FileOperationType.Copy, _mockCopyFileService.Object); Assert.NotNull(result); var okResult = result as OkResult; // assert Assert.NotNull(okResult); Assert.Equal(200, okResult.StatusCode); } // Post tests [Fact] public async Task HandleRequestResponsePost_CreateDirectoryRequest_OK() { // arrange var request = new CreateDirectoryRequest() { DirectoryName = "", DirectoryPath = "" }; var validRequestResponse = new RequestResponse() { MessageStack = new List(), IsSuccessful = true }; _mockCreateDirectoryService.Setup(service => service.PreQueueValidation(It.IsAny())).Returns(validRequestResponse); // act var result = await _controller.HandleRequestResponse(request, FileOperationType.CreateDirectory, _mockCreateDirectoryService.Object); Assert.NotNull(result); var okResult = result as OkResult; // assert Assert.NotNull(okResult); Assert.Equal(200, okResult.StatusCode); } }