using Api.SeaHavenIndustries.Controllers; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Moq; using SeaHaven.Services.DTOs; using SeaHaven.Services.Interfaces; using Xunit; namespace Api.SeaHavenIndustries.Tests; public class WorkOrderMediaControllerTests { private static WorkOrderMediaController CreateController( Mock? service = null, Mock? storage = null) { var controller = new WorkOrderMediaController( (service ?? new Mock()).Object, (storage ?? new Mock()).Object); controller.ControllerContext = new ControllerContext { HttpContext = new DefaultHttpContext() }; return controller; } [Fact] public void AddMedia_HasFiftyMegabyteRequestLimit() { var method = typeof(WorkOrderMediaController).GetMethod(nameof(WorkOrderMediaController.AddMedia)); var attribute = Assert.Single( method!.CustomAttributes, candidate => candidate.AttributeType == typeof(RequestSizeLimitAttribute)); var bytes = Assert.Single(attribute.ConstructorArguments); Assert.Equal(50_000_000L, bytes.Value); } [Fact] public async Task AddMedia_FileOverLimit_ReturnsStableUnprocessableEntity() { var file = new Mock(); file.SetupGet(candidate => candidate.Length).Returns(50_000_001); var storage = new Mock(MockBehavior.Strict); var controller = CreateController(storage: storage); var result = await controller.AddMedia(1, null, file.Object, CancellationToken.None); var response = Assert.IsType(result); var error = Assert.IsType(response.Value); Assert.Equal("FileTooLarge", error.Code); Assert.Equal("The uploaded file must not exceed 50 MB.", error.Message); storage.VerifyNoOtherCalls(); } [Fact] public async Task AddMedia_UnsupportedType_ReturnsUnprocessableEntity() { var bytes = new byte[] { 1, 2, 3 }; var file = new FormFile(new MemoryStream(bytes), 0, bytes.Length, "file", "payload.exe") { Headers = new HeaderDictionary(), ContentType = "application/octet-stream" }; var storage = new Mock(MockBehavior.Strict); var controller = CreateController(storage: storage); var result = await controller.AddMedia(1, null, file, CancellationToken.None); var response = Assert.IsType(result); var error = Assert.IsType(response.Value); Assert.Equal("UnsupportedMediaType", error.Code); storage.VerifyNoOtherCalls(); } }