using Ardalis.Result; using FluentAssertions; using Musify.Application.Extensions; using Xunit; namespace Musify.Application.Tests.Extensions; public sealed class ResultExtensionsTests { [Fact] public void NotFound_maps_to_NotFound_and_preserves_errors() { var source = Result.NotFound("missing"); var mapped = source.As(); mapped.Status.Should().Be(ResultStatus.NotFound); mapped.Errors.Should().Contain("missing"); } [Fact] public void Conflict_maps_to_Conflict() { Result.Conflict("dup").As().Status.Should().Be(ResultStatus.Conflict); } [Fact] public void Unauthorized_maps_to_Unauthorized() { Result.Unauthorized().As().Status.Should().Be(ResultStatus.Unauthorized); } [Fact] public void Forbidden_maps_to_Forbidden() { Result.Forbidden().As().Status.Should().Be(ResultStatus.Forbidden); } [Fact] public void Invalid_maps_to_Invalid_and_preserves_validation_errors() { var source = Result.Invalid(new ValidationError("field", "bad")); var mapped = source.As(); mapped.Status.Should().Be(ResultStatus.Invalid); mapped.ValidationErrors.Should().ContainSingle(e => e.ErrorMessage == "bad"); } [Fact] public void Error_maps_to_Error() { Result.Error("boom").As().Status.Should().Be(ResultStatus.Error); } [Theory] [InlineData(ResultStatus.Ok)] [InlineData(ResultStatus.Created)] [InlineData(ResultStatus.NoContent)] public void Successful_results_throw_when_converted(ResultStatus status) { Result source = status switch { ResultStatus.Ok => Result.Success(1), ResultStatus.Created => Result.Created(1), ResultStatus.NoContent => Result.NoContent(), _ => throw new InvalidOperationException() }; var act = () => source.As(); act.Should().Throw(); } }