public async Task Terminates_On_Exceeding_Timeout()
        {
            var maxTimeout     = TimeSpan.FromSeconds(1);
            var delayedTimeout = TimeSpan.FromSeconds(2);

            Func <DateTime, Task <Result <CalculatedPositionInfoLocalDate> > > delayedResponse = async date =>
            {
                await Task.Delay(delayedTimeout);

                return(Result <CalculatedPositionInfoLocalDate> .Bottom);
            };

            var mockService = new Mock <IPositionService>();

            mockService.Setup(svc => svc.GetPositionAsync(It.IsAny <DateTime>()))
            .Returns(delayedResponse);

            var policy = PositionServiceProxyFactory.CreatePolicy(maxTimeout);

            var sut = new PositionServiceProxy(policy, mockService.Object);

            var agg = await sut.GetPositionAsync(It.IsAny <DateTime>());

            agg.IsFaulted.Should().BeTrue("Proxy must terminate on long service call.");
        }
        public async Task Retries_On_Failure_Until_Timeout_Reached()
        {
            var mockService = new Mock <IPositionService>();

            mockService.Setup(svc => svc.GetPositionAsync(It.IsAny <DateTime>()))
            .ThrowsAsync(new Exception("Simulated failure during test."));

            var policy = PositionServiceProxyFactory.CreatePolicy(TimeSpan.FromSeconds(1));

            var sut = new PositionServiceProxy(policy, mockService.Object);

            await sut.GetPositionAsync(It.IsAny <DateTime>());

            mockService.Verify(svc => svc.GetPositionAsync(It.IsAny <DateTime>()), Times.AtLeast(2), "Proxy must retries on service failure.");
        }