using Ardalis.Result; using FluentAssertions; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http.HttpResults; using WebApi.Extensions; using Xunit; using IResult = Microsoft.AspNetCore.Http.IResult; namespace Musify.WebApi.Tests.Extensions; public sealed class ResultHttpExtensionsTests { private static int StatusCodeOf(IResult result) => ((IStatusCodeHttpResult)result).StatusCode ?? 0; [Fact] public void Result_Ok_maps_to_204_no_content() { StatusCodeOf(Result.Success().ToHttpResult()).Should().Be(StatusCodes.Status204NoContent); } [Fact] public void Result_NoContent_maps_to_204() { StatusCodeOf(Result.NoContent().ToHttpResult()).Should().Be(StatusCodes.Status204NoContent); } [Fact] public void Result_NotFound_maps_to_404() { StatusCodeOf(Result.NotFound("nope").ToHttpResult()).Should().Be(StatusCodes.Status404NotFound); } [Fact] public void Result_Invalid_maps_to_validation_problem_400() { var result = Result.Invalid(new ValidationError("field", "bad")).ToHttpResult(); result.Should().BeOfType(); StatusCodeOf(result).Should().Be(StatusCodes.Status400BadRequest); } [Fact] public void Result_Unauthorized_maps_to_401() { StatusCodeOf(Result.Unauthorized().ToHttpResult()).Should().Be(StatusCodes.Status401Unauthorized); } [Fact] public void Result_Forbidden_maps_to_403() { StatusCodeOf(Result.Forbidden().ToHttpResult()).Should().Be(StatusCodes.Status403Forbidden); } [Fact] public void Result_Conflict_maps_to_409() { StatusCodeOf(Result.Conflict("dup").ToHttpResult()).Should().Be(StatusCodes.Status409Conflict); } [Fact] public void Result_Error_maps_to_problem_500() { var result = Result.Error("boom").ToHttpResult(); result.Should().BeOfType(); StatusCodeOf(result).Should().Be(StatusCodes.Status500InternalServerError); } [Fact] public void ResultT_Ok_maps_to_200_with_value() { var result = Result.Success("payload").ToHttpResult(); result.Should().BeOfType>(); result.As>().Value.Should().Be("payload"); } [Fact] public void ResultT_NotFound_maps_to_404() { StatusCodeOf(Result.NotFound("nope").ToHttpResult()).Should().Be(StatusCodes.Status404NotFound); } [Fact] public void ResultT_Invalid_maps_to_validation_problem_with_grouped_errors() { var result = Result.Invalid( new ValidationError("Name", "required"), new ValidationError("Name", "too short"), new ValidationError("Age", "invalid")).ToHttpResult(); result.Should().BeOfType(); var details = result.As().ProblemDetails.Should().BeOfType().Subject; details.Errors.Should().ContainKey("Name"); details.Errors["Name"].Should().BeEquivalentTo("required", "too short"); details.Errors.Should().ContainKey("Age"); } [Fact] public void ResultT_Unauthorized_maps_to_401() { StatusCodeOf(Result.Unauthorized().ToHttpResult()).Should().Be(StatusCodes.Status401Unauthorized); } [Fact] public void ResultT_Forbidden_maps_to_403() { StatusCodeOf(Result.Forbidden().ToHttpResult()).Should().Be(StatusCodes.Status403Forbidden); } [Fact] public void ResultT_Conflict_maps_to_409() { StatusCodeOf(Result.Conflict("dup").ToHttpResult()).Should().Be(StatusCodes.Status409Conflict); } [Fact] public void ResultT_Error_maps_to_problem_500() { var result = Result.Error("boom").ToHttpResult(); result.Should().BeOfType(); StatusCodeOf(result).Should().Be(StatusCodes.Status500InternalServerError); } }