From 414a8c188f5a7ae6eba5be8e7f59dc45344b0e1a Mon Sep 17 00:00:00 2001 From: Mikhail Shabanov Date: Tue, 21 Jul 2020 12:37:17 +0200 Subject: [PATCH] Pipeline test added --- .../PipelineTests/FirstTestOperation.cs | 14 +++ .../PipelineTests/PipelineEngineTest.cs | 85 +++++++++++++++++++ .../PipelineTests/SecondTestOperation.cs | 14 +++ .../PipelineTests/TestContext.cs | 7 ++ 4 files changed, 120 insertions(+) create mode 100644 WotBlitzStatisticsPro.Tests/PipelineTests/FirstTestOperation.cs create mode 100644 WotBlitzStatisticsPro.Tests/PipelineTests/PipelineEngineTest.cs create mode 100644 WotBlitzStatisticsPro.Tests/PipelineTests/SecondTestOperation.cs create mode 100644 WotBlitzStatisticsPro.Tests/PipelineTests/TestContext.cs diff --git a/WotBlitzStatisticsPro.Tests/PipelineTests/FirstTestOperation.cs b/WotBlitzStatisticsPro.Tests/PipelineTests/FirstTestOperation.cs new file mode 100644 index 0000000..306a5a6 --- /dev/null +++ b/WotBlitzStatisticsPro.Tests/PipelineTests/FirstTestOperation.cs @@ -0,0 +1,14 @@ +using System; +using System.Threading.Tasks; +using WotBlitzStatisticsPro.Logic.Pipeline; + +namespace WotBlitzStatisticsPro.Tests.PipelineTests +{ + public class FirstTestOperation: IOperation + { + public virtual Task Invoke(TestContext context, Func next) + { + return Task.CompletedTask; + } + } +} \ No newline at end of file diff --git a/WotBlitzStatisticsPro.Tests/PipelineTests/PipelineEngineTest.cs b/WotBlitzStatisticsPro.Tests/PipelineTests/PipelineEngineTest.cs new file mode 100644 index 0000000..145c1b8 --- /dev/null +++ b/WotBlitzStatisticsPro.Tests/PipelineTests/PipelineEngineTest.cs @@ -0,0 +1,85 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Moq; +using NUnit.Framework; +using WotBlitzStatisticsPro.Logic.Pipeline; +using FluentAssertions; + +namespace WotBlitzStatisticsPro.Tests.PipelineTests +{ + [TestFixture] + public class PipelineEngineTest + { + private readonly Mock _operationFactoryMock = new Mock(); + private readonly Mock _firstOperationMock = new Mock(); + private readonly Mock _secondOperationMock = new Mock(); + + [SetUp] + public void Init() + { + _operationFactoryMock.Setup(f => f.Create(typeof(FirstTestOperation))) + .Returns(_firstOperationMock.Object); + _operationFactoryMock.Setup(f => f.Create(typeof(SecondTestOperation))) + .Returns(_secondOperationMock.Object); + } + + [Test] + public async Task PipelineShouldBeBuiltAndInvokedCorrectly() + { + var context = new TestContext(); + var pipeline = new Pipeline(_operationFactoryMock.Object); + + pipeline.AddOperation() + .AddOperation(); + + var callsSequence = new List(); + + _firstOperationMock.Setup(f => f.Invoke(context, It.IsAny>())) + .Callback((TestContext c, Func n) => callsSequence.Add(typeof(FirstTestOperation))) + .Returns((TestContext c, Func n) => n.Invoke(c)); + _secondOperationMock.Setup(f => f.Invoke(context, It.IsAny>())) + .Callback((TestContext c, Func n) => callsSequence.Add(typeof(SecondTestOperation))); + + await pipeline.Build() + .Invoke(context, null) + .ConfigureAwait(false); + + // Check if first operation called first and only once. And second called second and once + _firstOperationMock.Verify(f => f.Invoke(context, It.IsAny>()), Times.Once); + _secondOperationMock.Verify(f => f.Invoke(context, It.IsAny>()), Times.Once); + callsSequence.Count.Should().Be(2); + callsSequence[0].Should().Be(typeof(FirstTestOperation)); + callsSequence[1].Should().Be(typeof(SecondTestOperation)); + } + + [Test] + public async Task PipelineShouldStopIfFirstTaskDoesNotCallNext() + { + var context = new TestContext(); + var pipeline = new Pipeline(_operationFactoryMock.Object); + + pipeline.AddOperation() + .AddOperation(); + + var callsSequence = new List(); + + _firstOperationMock.Setup(f => f.Invoke(context, It.IsAny>())) + .Callback((TestContext c, Func n) => callsSequence.Add(typeof(FirstTestOperation))) + .Returns(Task.CompletedTask); + _secondOperationMock.Setup(f => f.Invoke(context, It.IsAny>())) + .Callback((TestContext c, Func n) => callsSequence.Add(typeof(SecondTestOperation))); + + await pipeline.Build() + .Invoke(context, null) + .ConfigureAwait(false); + + // Check if first operation called first and only once. And second did not call + _firstOperationMock.Verify(f => f.Invoke(context, It.IsAny>()), Times.Once); + _secondOperationMock.Verify(f => f.Invoke(context, It.IsAny>()), Times.Never); + callsSequence.Count.Should().Be(1); + callsSequence[0].Should().Be(typeof(FirstTestOperation)); + } + + } +} \ No newline at end of file diff --git a/WotBlitzStatisticsPro.Tests/PipelineTests/SecondTestOperation.cs b/WotBlitzStatisticsPro.Tests/PipelineTests/SecondTestOperation.cs new file mode 100644 index 0000000..dc6e2bc --- /dev/null +++ b/WotBlitzStatisticsPro.Tests/PipelineTests/SecondTestOperation.cs @@ -0,0 +1,14 @@ +using System; +using System.Threading.Tasks; +using WotBlitzStatisticsPro.Logic.Pipeline; + +namespace WotBlitzStatisticsPro.Tests.PipelineTests +{ + public class SecondTestOperation: IOperation + { + public virtual Task Invoke(TestContext context, Func next) + { + return Task.CompletedTask; + } + } +} \ No newline at end of file diff --git a/WotBlitzStatisticsPro.Tests/PipelineTests/TestContext.cs b/WotBlitzStatisticsPro.Tests/PipelineTests/TestContext.cs new file mode 100644 index 0000000..cf6f386 --- /dev/null +++ b/WotBlitzStatisticsPro.Tests/PipelineTests/TestContext.cs @@ -0,0 +1,7 @@ +namespace WotBlitzStatisticsPro.Tests.PipelineTests +{ + public class TestContext + { + + } +} \ No newline at end of file