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
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,30 @@ public void MapErrorResult_ReturnsBadRequest_WhenInvalidDataErrorInResult()
}


[Fact]
public void MapErrorResult_ReturnsUnprocessableContent_WhenBusinessRuleViolationErrorInResult()
{
// Arrange
Mock<ILogger<ApiControllerBase>> mockLogger = new Mock<ILogger<ApiControllerBase>>();
Mock<IMapper> mockMapper = new Mock<IMapper>();
Mock<ApiControllerBase> mockController = new Mock<ApiControllerBase>(mockLogger.Object, mockMapper.Object);
mockController.CallBase = true;
Result result = Result.Failure(new BusinessRuleViolationError("That is not allowed!"));

// Act
var actionResult = mockController.Object.MapErrorResult(result);

// Assert
actionResult.ShouldBeOfType<UnprocessableEntityObjectResult>();

var badRequestResult = actionResult as UnprocessableEntityObjectResult;
badRequestResult.Value.ShouldBeOfType<ApiMessageModel>();

var apiMessageModel = badRequestResult.Value as ApiMessageModel;
apiMessageModel.Message.ShouldBe("That is not allowed!");
}



[Fact]
public void MapErrorResult_ReturnsObjectNotFound_WhenObjectNotFoundErrorInResult()
Expand Down Expand Up @@ -149,6 +173,32 @@ public void MapErrorResult_ReturnsBadRequest_WhenResultIsFailure_WithInvalidData
}



[Fact]
public void MapErrorResult_ReturnsUnprocessableEntity_WhenResultIsFailure_WithBusinessRuleViolationError()
{
// Arrange
Mock<ILogger<ApiControllerBase>> mockLogger = new Mock<ILogger<ApiControllerBase>>();
Mock<IMapper> mockMapper = new Mock<IMapper>();
Mock<ApiControllerBase> mockController = new Mock<ApiControllerBase>(mockLogger.Object, mockMapper.Object);
mockController.CallBase = true;
Result result = Result.Failure(new BusinessRuleViolationError("That is not allowed"));

// Act
var actionResult = mockController.Object.MapErrorResult<TestEntity, TestModel>(result);

// Assert
actionResult.ShouldBeOfType<UnprocessableEntityObjectResult>();

var badRequestResult = actionResult as UnprocessableEntityObjectResult;
badRequestResult.Value.ShouldBeOfType<ApiMessageModel>();

var apiMessageModel = badRequestResult.Value as ApiMessageModel;
apiMessageModel.Message.ShouldBe("That is not allowed");

}


[Fact]
public void MapErrorResult_ReturnsNotFound_WhenResultIsFailure_WithObjectNotFoundError()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,8 @@ protected internal ActionResult MapErrorResult<TEntity, TModel>(Result result)
{
case InvalidDataError error:
return BadRequest(new ApiMessageModel() { Message = error.Message });
case BusinessRuleViolationError error:
return UnprocessableEntity(new ApiMessageModel() { Message = error.Message });
case ObjectNotFoundError error:
return NotFound(new ApiMessageModel() { Message = error.Message });
case ObjectAlreadyExistsError<TEntity> error:
Expand All @@ -132,6 +134,8 @@ protected internal ActionResult MapErrorResult(Result result)
{
case InvalidDataError e:
return BadRequest(new ApiMessageModel() { Message = e.Message });
case BusinessRuleViolationError error:
return UnprocessableEntity(new ApiMessageModel() { Message = error.Message });
case ObjectNotFoundError e:
return NotFound(new ApiMessageModel() { Message = e.Message });
default:
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DavidBerry.Framework.Functional
{
/// <summary>
/// Represents an error where a business rule has been violated
/// </summary>
public class BusinessRuleViolationError : Error
{

public BusinessRuleViolationError(string message) : base(message)
{
}
}
}