Skip to content

Commit

Permalink
[add] ControllersExecutorTests
Browse files Browse the repository at this point in the history
  • Loading branch information
i4004 committed May 25, 2024
1 parent 327e95f commit 71f5920
Showing 1 changed file with 141 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using Moq;
using NUnit.Framework;
using Simplify.Web.Controllers;
using Simplify.Web.Controllers.Execution;
using Simplify.Web.Controllers.Execution.Resolver;
using Simplify.Web.Controllers.Meta;
using Simplify.Web.Controllers.Response;

namespace Simplify.Web.Tests.Controllers.Execution;

[TestFixture]
public class ControllersExecutorTests
{
private readonly IControllerMetadata _controllerMetadata1 = Mock.Of<IControllerMetadata>();
private readonly IControllerMetadata _controllerMetadata2 = Mock.Of<IControllerMetadata>();
private readonly IControllerMetadata _controllerMetadata3 = Mock.Of<IControllerMetadata>();

private IMatchedController _controller1 = null!;
private IMatchedController _controller2 = null!;
private IMatchedController _controller3 = null!;

private ControllerResponse _controllerResponse1 = null!;
private ControllerResponse _controllerResponse2 = null!;

private Mock<IControllerExecutor> _controllerExecutor1 = null!;
private Mock<IControllerExecutor> _controllerExecutor2 = null!;

private Mock<IControllerResponseExecutor> _responseExecutor = null!;

[SetUp]
public void Initialize()
{
_controller1 = Mock.Of<IMatchedController>(x => x.Controller == _controllerMetadata1);
_controller2 = Mock.Of<IMatchedController>(x => x.Controller == _controllerMetadata2);
_controller3 = Mock.Of<IMatchedController>(x => x.Controller == _controllerMetadata3);

_controllerExecutor1 = new Mock<IControllerExecutor>();
_controllerExecutor2 = new Mock<IControllerExecutor>();

_controllerResponse1 = Mock.Of<ControllerResponse>();
_controllerResponse2 = Mock.Of<ControllerResponse>();

_responseExecutor = new Mock<IControllerResponseExecutor>();
}

[Test]
public async Task ExecuteAsync_ControllerWithNoResponse_ExecutedDefaultBehavior()
{
// Arrange

var resolver = new Mock<IControllerExecutorResolver>();
var controllers = new List<IMatchedController> { _controller1 };

resolver.Setup(x => x.Resolve(It.Is<IControllerMetadata>(m => m == _controllerMetadata1)))
.Returns(_controllerExecutor1.Object);

var executor = new ControllersExecutor(resolver.Object, _responseExecutor.Object);

// Act
var result = await executor.ExecuteAsync(controllers);

// Assert

Assert.That(result, Is.EqualTo(ResponseBehavior.Default));

_controllerExecutor1.Verify(x => x.ExecuteAsync(It.Is<IMatchedController>(c => c == _controller1)));
_responseExecutor.Verify(x => x.ExecuteAsync(It.IsAny<ControllerResponse>()), Times.Never);
}

[Test]
public async Task ExecuteAsync_ControllerWithRawOutputBehavior_ExecutedRawOutputBehavior()
{
// Arrange

var resolver = new Mock<IControllerExecutorResolver>();
var controllers = new List<IMatchedController> { _controller1 };

resolver.Setup(x => x.Resolve(It.Is<IControllerMetadata>(m => m == _controllerMetadata1)))
.Returns(_controllerExecutor1.Object);

_controllerExecutor1.Setup(x => x.ExecuteAsync(It.Is<IMatchedController>(c => c == _controller1)))
.ReturnsAsync(_controllerResponse1);

_responseExecutor.Setup(x => x.ExecuteAsync(It.Is<ControllerResponse>(r => r == _controllerResponse1)))
.ReturnsAsync(ResponseBehavior.RawOutput);

var executor = new ControllersExecutor(resolver.Object, _responseExecutor.Object);

// Act
var result = await executor.ExecuteAsync(controllers);

// Assert

Assert.That(result, Is.EqualTo(ResponseBehavior.RawOutput));

_controllerExecutor1.Verify(x => x.ExecuteAsync(It.Is<IMatchedController>(c => c == _controller1)));
_responseExecutor.Verify(x => x.ExecuteAsync(It.Is<ControllerResponse>(r => r == _controllerResponse1)));
}

[TestCase(ResponseBehavior.RawOutput)]
[TestCase(ResponseBehavior.Redirect)]
public async Task ExecuteAsync_ThreeControllersSecondNonDefaultBehavior_TwoExecutedNonDefaultResponse(ResponseBehavior secondControllerResult)
{
// Arrange

var resolver = new Mock<IControllerExecutorResolver>();
var controllers = new List<IMatchedController> { _controller1, _controller2, _controller3 };

resolver.Setup(x => x.Resolve(It.Is<IControllerMetadata>(m => m == _controllerMetadata1)))
.Returns(_controllerExecutor1.Object);

resolver.Setup(x => x.Resolve(It.Is<IControllerMetadata>(m => m == _controllerMetadata2)))
.Returns(_controllerExecutor2.Object);

_controllerExecutor1.Setup(x => x.ExecuteAsync(It.Is<IMatchedController>(c => c == _controller1)))
.ReturnsAsync(_controllerResponse1);

_controllerExecutor2.Setup(x => x.ExecuteAsync(It.Is<IMatchedController>(c => c == _controller2)))
.ReturnsAsync(_controllerResponse2);

_responseExecutor.Setup(x => x.ExecuteAsync(It.Is<ControllerResponse>(r => r == _controllerResponse1)));
_responseExecutor.Setup(x => x.ExecuteAsync(It.Is<ControllerResponse>(r => r == _controllerResponse2))).ReturnsAsync(secondControllerResult);

var executor = new ControllersExecutor(resolver.Object, _responseExecutor.Object);

// Act
var result = await executor.ExecuteAsync(controllers);

// Assert

Assert.That(result, Is.EqualTo(secondControllerResult));

_controllerExecutor1.Verify(x => x.ExecuteAsync(It.Is<IMatchedController>(c => c == _controller1)));
_controllerExecutor2.Verify(x => x.ExecuteAsync(It.Is<IMatchedController>(c => c == _controller2)));

_responseExecutor.Verify(x => x.ExecuteAsync(It.Is<ControllerResponse>(r => r == _controllerResponse1)));
_responseExecutor.Verify(x => x.ExecuteAsync(It.Is<ControllerResponse>(r => r == _controllerResponse2)));
}
}

0 comments on commit 71f5920

Please sign in to comment.