diff --git a/Govor.API.Tests/IntegrationTests/Controllers/MediaControllerTests.cs b/Govor.API.Tests/IntegrationTests/Controllers/MediaControllerTests.cs new file mode 100644 index 0000000..e0175b6 --- /dev/null +++ b/Govor.API.Tests/IntegrationTests/Controllers/MediaControllerTests.cs @@ -0,0 +1,99 @@ +using AutoFixture; +using Govor.API.Controllers; +using Govor.Application.Interfaces.Infrastructure.Extensions; +using Govor.Application.Interfaces.Medias; +using Govor.Contracts.Requests; +using Govor.Core.Models.Messages; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; +using Moq; + +namespace Govor.API.Tests.IntegrationTests.Controllers; + +[TestFixture] +public class MediaControllerTests +{ + private Fixture _fixture; + private Mock _currentUserMock; + private Mock> _loggerMock; + private Mock _mockMedia; + private MediaController _controller; + private Guid _userId = Guid.NewGuid(); + + [SetUp] + public void SetUp() + { + _fixture = new Fixture(); + _fixture.Behaviors.OfType().ToList().ForEach(b => _fixture.Behaviors.Remove(b)); + _fixture.Behaviors.Add(new OmitOnRecursionBehavior()); + + _currentUserMock = new Mock(); + _loggerMock = new Mock>(); + _mockMedia = new Mock(); + + _currentUserMock.Setup(f => f.GetCurrentUserId()).Returns(_userId); + + _controller = new MediaController(_loggerMock.Object, _mockMedia.Object, _currentUserMock.Object); + } + + // Test for Upload action + [Test] + public async Task Upload_ValidRequest_ReturnsOkResult() + { + // Arrange + 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(); + 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(), default)) + .Returns((target, _) => stream.CopyToAsync(target)); + + var uploadRequest = _fixture.Build() + .With(r => r.FromFile, formFileMock.Object) + .With(r => r.Type, MediaType.Image) + .With(r => r.MimeType, "image/png") + .With(r => r.EncryptedKey, "secret") + .Create(); + + var media = new Media( + _userId, + DateTime.UtcNow, + Path.GetFileName(uploadRequest.FromFile.FileName), + fileBytes, + uploadRequest.Type, + uploadRequest.MimeType, + uploadRequest.EncryptedKey + ); + + var uploadResult = _fixture.Create(); + + _mockMedia.Setup(f => f.UploadMediaAsync(It.IsAny())) + .ReturnsAsync(uploadResult); + + // Act + var result = await _controller.Upload(uploadRequest); + + // Assert + Assert.That(result, Is.InstanceOf()); + + var okResult = result as OkObjectResult; + var value = okResult?.Value as MediaUploadResult; + + Assert.That(value, Is.Not.Null); + Assert.That(value!.Url, Is.EqualTo(uploadResult.Url)); + Assert.That(value.MediaId, Is.EqualTo(uploadResult.MediaId)); + } + + + [TearDown] + public void TearDown() + { + _controller.Dispose(); + } +} \ No newline at end of file