Media Controller Tests and other

This commit is contained in:
Artemy
2025-07-21 16:18:04 +07:00
parent c0d02e0fa1
commit c434ca447c
8 changed files with 286 additions and 22 deletions
@@ -1,3 +1,4 @@
using System.Text;
using AutoFixture;
using Govor.API.Controllers;
using Govor.Application.Interfaces.Infrastructure.Extensions;
@@ -43,7 +44,7 @@ public class MediaControllerTests
_currentUserMock.Object);
}
// Test for Upload action
// Tests for Upload action
[Test]
public async Task Upload_ValidRequest_ReturnsOkResult()
{
@@ -86,6 +87,272 @@ public class MediaControllerTests
Assert.That(value.MediaId, Is.EqualTo(uploadResult.MediaId));
}
[Test]
public async Task Upload_InvalidModelState_ReturnsBadRequest()
{
// Arrange
_controller.ModelState.AddModelError("Error", "Invalid model state");
var content = "fake file content";
var fileName = "testfile.txt";
var fileBytes = System.Text.Encoding.UTF8.GetBytes(content);
var stream = new MemoryStream(fileBytes);
var formFileMock = new Mock<IFormFile>();
formFileMock.Setup(f => f.Length).Returns(fileBytes.Length);
formFileMock.Setup(f => f.FileName).Returns(fileName);
formFileMock.Setup(f => f.OpenReadStream()).Returns(stream);
formFileMock.Setup(f => f.CopyToAsync(It.IsAny<Stream>(), default))
.Returns<Stream, CancellationToken>((target, _) => stream.CopyToAsync(target));
var uploadRequest = _fixture.Build<MediaUploadRequest>()
.With(r => r.FromFile, formFileMock.Object)
.With(r => r.Type, MediaType.Image)
.With(r => r.MimeType, "image/png")
.With(r => r.EncryptedKey, "secret")
.Create();
// Act
var result = await _controller.Upload(uploadRequest);
// Assert
Assert.That(result, Is.InstanceOf<BadRequestObjectResult>());
}
[Test]
public async Task Upload_NoFileUploaded_ReturnsBadRequest()
{
// Arrange
var uploadRequest = _fixture.Build<MediaUploadRequest>()
.With(r => r.FromFile, (IFormFile)null)
.Create();
// Act
var result = await _controller.Upload(uploadRequest);
// Assert
Assert.That(result, Is.InstanceOf<BadRequestObjectResult>());
var badRequestResult = result as BadRequestObjectResult;
Assert.That(badRequestResult?.Value, Is.EqualTo("No file uploaded"));
}
[Test]
public async Task Upload_EmptyFile_ReturnsBadRequest()
{
// Arrange
var formFileMock = new Mock<IFormFile>();
formFileMock.Setup(f => f.Length).Returns(0);
var uploadRequest = _fixture.Build<MediaUploadRequest>()
.With(r => r.FromFile, formFileMock.Object)
.Create();
// Act
var result = await _controller.Upload(uploadRequest);
// Assert
Assert.That(result, Is.InstanceOf<BadRequestObjectResult>());
var badRequestResult = result as BadRequestObjectResult;
Assert.That(badRequestResult?.Value, Is.EqualTo("No file uploaded"));
}
[Test]
public async Task Upload_FileTooLarge_ReturnsBadRequest()
{
// Arrange
var formFileMock = new Mock<IFormFile>();
formFileMock.Setup(f => f.Length).Returns(20_000_001); // Just over 20MB
var uploadRequest = _fixture.Build<MediaUploadRequest>()
.With(r => r.FromFile, formFileMock.Object)
.Create();
// Act
var result = await _controller.Upload(uploadRequest);
// Assert
Assert.That(result, Is.InstanceOf<BadRequestObjectResult>());
var badRequestResult = result as BadRequestObjectResult;
Assert.That(badRequestResult?.Value, Is.EqualTo("File is too large"));
}
[Test]
public async Task Upload_MissingMimeType_ReturnsBadRequest()
{
// Arrange
var formFileMock = new Mock<IFormFile>();
formFileMock.Setup(f => f.Length).Returns(1000);
formFileMock.Setup(f => f.FileName).Returns("testfile.txt");
var uploadRequest = _fixture.Build<MediaUploadRequest>()
.With(r => r.FromFile, formFileMock.Object)
.With(r => r.MimeType, string.Empty)
.Create();
// Act
var result = await _controller.Upload(uploadRequest);
// Assert
Assert.That(result, Is.InstanceOf<BadRequestObjectResult>());
var badRequestResult = result as BadRequestObjectResult;
Assert.That(badRequestResult?.Value, Is.EqualTo("Missing MIME type"));
}
[Test]
public async Task Upload_UnauthorizedAccess_ReturnsUnauthorized()
{
// Arrange
var formFileMock = new Mock<IFormFile>();
formFileMock.Setup(f => f.Length).Returns(1000);
formFileMock.Setup(f => f.FileName).Returns("testfile.txt");
formFileMock.Setup(f => f.OpenReadStream()).Returns(new MemoryStream(new byte[1000]));
var uploadRequest = _fixture.Build<MediaUploadRequest>()
.With(r => r.FromFile, formFileMock.Object)
.With(r => r.MimeType, "text/plain")
.Create();
_mockMedia.Setup(f => f.UploadMediaAsync(It.IsAny<Media>()))
.ThrowsAsync(new UnauthorizedAccessException("Access denied"));
// Act
var result = await _controller.Upload(uploadRequest);
// Assert
Assert.That(result, Is.InstanceOf<UnauthorizedObjectResult>());
var unauthorizedResult = result as UnauthorizedObjectResult;
Assert.That(unauthorizedResult?.Value, Is.EqualTo("Access denied"));
}
[Test]
public async Task Upload_InvalidOperation_ReturnsBadRequest()
{
// Arrange
var formFileMock = new Mock<IFormFile>();
formFileMock.Setup(f => f.Length).Returns(1000);
formFileMock.Setup(f => f.FileName).Returns("testfile.txt");
formFileMock.Setup(f => f.OpenReadStream()).Returns(new MemoryStream(new byte[1000]));
var uploadRequest = _fixture.Build<MediaUploadRequest>()
.With(r => r.FromFile, formFileMock.Object)
.With(r => r.MimeType, "text/plain")
.Create();
_mockMedia.Setup(f => f.UploadMediaAsync(It.IsAny<Media>()))
.ThrowsAsync(new InvalidOperationException("Invalid operation"));
// Act
var result = await _controller.Upload(uploadRequest);
// Assert
Assert.That(result, Is.InstanceOf<BadRequestObjectResult>());
var badRequestResult = result as BadRequestObjectResult;
Assert.That(badRequestResult?.Value, Is.EqualTo("Invalid operation"));
}
[Test]
public async Task Upload_GeneralException_ReturnsInternalServerError()
{
// Arrange
var formFileMock = new Mock<IFormFile>();
formFileMock.Setup(f => f.Length).Returns(1000);
formFileMock.Setup(f => f.FileName).Returns("testfile.txt");
formFileMock.Setup(f => f.OpenReadStream()).Returns(new MemoryStream(new byte[1000]));
var uploadRequest = _fixture.Build<MediaUploadRequest>()
.With(r => r.FromFile, formFileMock.Object)
.With(r => r.MimeType, "text/plain")
.Create();
_mockMedia.Setup(f => f.UploadMediaAsync(It.IsAny<Media>()))
.ThrowsAsync(new Exception("Something went wrong"));
// Act
var result = await _controller.Upload(uploadRequest);
// Assert
Assert.That(result, Is.InstanceOf<ObjectResult>());
var objectResult = result as ObjectResult;
Assert.That(objectResult.StatusCode, Is.EqualTo(500));
}
// Tests for Download action
[Test]
public async Task Download_HasAccessAndMediaExists_ReturnsFile()
{
// Arrange
var mediaId = Guid.NewGuid();
var media = _fixture.Build<Media>()
.With(m => m.Data, Encoding.UTF8.GetBytes("fake file content"))
.With(m => m.MimeType, "application/octet-stream") // Ensure MimeType is set
.With(m => m.FileName, "testfile.txt")
.Create();
_mockAccesser.Setup(f => f.HasAccessAsync(mediaId, _userId)).ReturnsAsync(true);
_mockMedia.Setup(f => f.GetMediaByIdAsync(mediaId)).ReturnsAsync(media);
// Act
var result = await _controller.Download(mediaId);
// Assert
Assert.That(result, Is.InstanceOf<FileContentResult>());
var fileResult = result as FileContentResult;
Assert.That(fileResult?.FileContents, Is.EqualTo(media.Data));
Assert.That(fileResult?.ContentType, Is.EqualTo(media.MimeType)); // Changed MineType to MimeType
Assert.That(fileResult?.FileDownloadName, Is.EqualTo(Path.GetFileName(media.FileName)));
}
[Test]
public async Task Download_NoAccess_ReturnsForbid()
{
// Arrange
var mediaId = Guid.NewGuid();
_mockAccesser.Setup(f => f.HasAccessAsync(mediaId, _userId)).ReturnsAsync(false);
// Act
var result = await _controller.Download(mediaId);
// Assert
Assert.That(result, Is.InstanceOf<ForbidResult>());
}
[Test]
public async Task Download_MediaNotFound_ReturnsNotFound()
{
// Arrange
var mediaId = Guid.NewGuid();
_mockAccesser.Setup(f => f.HasAccessAsync(mediaId, _userId)).ReturnsAsync(true);
_mockMedia.Setup(f => f.GetMediaByIdAsync(mediaId))
.ThrowsAsync(new KeyNotFoundException("Media not found"));
// Act
var result = await _controller.Download(mediaId);
// Assert
Assert.That(result, Is.InstanceOf<NotFoundObjectResult>());
var notFoundResult = result as NotFoundObjectResult;
Assert.That(notFoundResult?.Value, Is.EqualTo("Media not found"));
}
[Test]
public async Task Download_GeneralException_ReturnsInternalServerError()
{
// Arrange
var mediaId = Guid.NewGuid();
_mockAccesser.Setup(f => f.HasAccessAsync(mediaId, _userId)).ReturnsAsync(true);
_mockMedia.Setup(f => f.GetMediaByIdAsync(mediaId))
.ThrowsAsync(new Exception("Something went wrong"));
// Act
var result = await _controller.Download(mediaId);
// Assert
Assert.That(result, Is.InstanceOf<ObjectResult>());
var objectResult = result as ObjectResult;
Assert.That(objectResult.StatusCode, Is.EqualTo(500));
}
[TearDown]
public void TearDown()