Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions Coderynx.Functional.slnx
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,7 @@
</Folder>
<Folder Name="/tests/">
<Project Path="tests\Coderynx.Functional.Tests\Coderynx.Functional.Tests.csproj" Type="Classic C#"/>
<Project Path="tests\Coderynx.Functional.WebApi.Tests\Coderynx.Functional.WebApi.Tests.csproj"
Type="Classic C#"/>
</Folder>
</Solution>
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@
</ItemGroup>

<ItemGroup>
<PackageReference Include="Coderynx.Functional" Version="1.7.11" />
<PackageReference Include="Microsoft.Orleans.Sdk" Version="9.2.1" />
<PackageReference Include="Coderynx.Functional" Version="1.7.11"/>
<PackageReference Include="Microsoft.Orleans.Sdk" Version="9.2.1"/>
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
</ItemGroup>

<ItemGroup>
<PackageReference Include="Coderynx.Functional" Version="1.7.11" />
<PackageReference Include="Coderynx.Functional" Version="1.7.11"/>
</ItemGroup>

</Project>
4 changes: 3 additions & 1 deletion src/Coderynx.Functional.WebApi/ResultExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ public static IResult ToHttpResult<TValue>(this Result<TValue> result)
/// <returns>An IResult representing the appropriate HTTP response based on the Result state.</returns>
public static IResult ToHttpResult<TValue>(this Result<TValue> result, Func<TValue, object> transform)
{
if (result.Value is not null)
if (result.Value is null)
{
return ToHttpResultInternal(result, null);
}
Expand Down Expand Up @@ -91,6 +91,7 @@ private static IResult ToProblem(this Result result)
ErrorKind.None => "https://tools.ietf.org/html/rfc7231#section-6.5.1",
ErrorKind.NotFound => "https://tools.ietf.org/html/rfc7231#section-6.5.4",
ErrorKind.Conflict => "https://tools.ietf.org/html/rfc7231#section-6.5.8",
ErrorKind.InvalidInput => "https://tools.ietf.org/html/rfc7231#section-6.5.1",
_ => "https://tools.ietf.org/html/rfc7231#section-6.5.1"
},
Title = result.Error.Code,
Expand All @@ -99,6 +100,7 @@ private static IResult ToProblem(this Result result)
ErrorKind.None => StatusCodes.Status400BadRequest,
ErrorKind.NotFound => StatusCodes.Status404NotFound,
ErrorKind.Conflict => StatusCodes.Status409Conflict,
ErrorKind.InvalidInput => StatusCodes.Status400BadRequest,
_ => StatusCodes.Status500InternalServerError
},
Detail = result.Error.Message,
Expand Down
2 changes: 1 addition & 1 deletion src/Coderynx.Functional.WebApi/version.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"$schema": "https://raw.githubusercontent.com/dotnet/Nerdbank.GitVersioning/main/src/NerdBank.GitVersioning/version.schema.json",
"version": "1.4.1",
"version": "1.4.2",
"publicReleaseRefSpec": [
"^refs/heads/main$"
],
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
<IsTestProject>true</IsTestProject>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="coverlet.collector" Version="6.0.4">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.1"/>
<PackageReference Include="xunit" Version="2.9.3"/>
<PackageReference Include="xunit.runner.visualstudio" Version="3.1.4">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>

<ItemGroup>
<Using Include="Xunit"/>
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\..\src\Coderynx.Functional.WebApi\Coderynx.Functional.WebApi.csproj"/>
</ItemGroup>

</Project>
90 changes: 90 additions & 0 deletions tests/Coderynx.Functional.WebApi.Tests/OptionExtensionsTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
using Coderynx.Functional.Options;
using Microsoft.AspNetCore.Http.HttpResults;

namespace Coderynx.Functional.WebApi.Tests;

public sealed class OptionExtensionsTests
{
[Fact]
public void ToHttpResult_SomeOption_ReturnsOkWithValue()
{
// Arrange
var testValue = "test-value";
var option = Option.Some(testValue);

// Act
var actionResult = option.ToHttpResult();

// Assert
Assert.IsType<Ok<string>>(actionResult);

var okResult = (Ok<string>)actionResult;
Assert.Equal(testValue, okResult.Value);
}

[Fact]
public void ToHttpResult_NoneOption_ReturnsNotFound()
{
// Arrange
var option = Option.None<string>();

// Act
var actionResult = option.ToHttpResult();

// Assert
Assert.IsType<ProblemHttpResult>(actionResult);

var problemResult = (ProblemHttpResult)actionResult;
Assert.Equal(404, problemResult.StatusCode);
}

[Fact]
public void ToHttpResult_WithCustomTransform_ReturnsOkWithValue()
{
// Arrange
var testValue = "test-value";
var option = Option.Some(testValue);

// Act
var actionResult = option.ToHttpResult(value => $"{value}1");

// Assert
Assert.IsType<Ok<object>>(actionResult);

var okResult = (Ok<object>)actionResult;
Assert.Equal($"{testValue}1", okResult.Value);
}


[Fact]
public void ToHttpResult_WithCustomHandlers_NoneOption_CallsOnNone()
{
// Arrange
var option = Option.None<string>();

// Act
var actionResult = option.ToHttpResult(value => $"{value}1");

// Assert
Assert.IsType<ProblemHttpResult>(actionResult);

var problemResult = (ProblemHttpResult)actionResult;
Assert.Equal(404, problemResult.StatusCode);
}

[Fact]
public void ToHttpResult_NullValue_NoneOption_ReturnsNotFound()
{
// Arrange
var option = Option.None<object>();

// Act
var actionResult = option.ToHttpResult();

// Assert
Assert.IsType<ProblemHttpResult>(actionResult);

var problemResult = (ProblemHttpResult)actionResult;
Assert.Equal(404, problemResult.StatusCode);
}
}
Loading