public async Task HandleRetry_DirectSuccess()
        {
            var setup = new Setup();

            setup.Response.SetupGet(r => r.StatusCode).Returns(HttpStatusCode.OK);

            var retryCalled = 0;

            setup.Retry = (request) =>
            {
                retryCalled++;
                return(Task.FromResult(setup.Response.Object));
            };

            var handler = new SimpleRetryHandler(setup.Sleep.Object)
            {
                TooManyRequestsConsumesARetry = true,
                RetryTimes = 10,
                RetryAfter = TimeSpan.FromMilliseconds(50)
            };
            var response = await handler.HandleRetry(setup.Request.Object, setup.Response.Object, setup.Retry);

            Assert.AreEqual(0, retryCalled);
            Assert.AreEqual(setup.Response.Object, response);
            setup.Sleep.Verify(s => s(TimeSpan.FromMilliseconds(50)), Times.Exactly(0));
        }
        public async Task HandleRetry_TooManyRetriesWithSuccess()
        {
            var setup = new Setup();

            setup.Response.SetupGet(r => r.StatusCode).Returns(HttpStatusCode.TooManyRequests);
            setup.Response.SetupGet(r => r.Headers).Returns(new Dictionary <string, string> {
                { "Retry-After", "50" }
            });

            var successResponse = new Mock <IResponse>();

            successResponse.SetupGet(r => r.StatusCode).Returns(HttpStatusCode.OK);

            var retryCalled = 0;

            setup.Retry = (request) =>
            {
                retryCalled++;
                return(Task.FromResult(successResponse.Object));
            };

            var handler = new SimpleRetryHandler(setup.Sleep.Object)
            {
                TooManyRequestsConsumesARetry = true,
                RetryTimes = 10
            };
            var response = await handler.HandleRetry(setup.Request.Object, setup.Response.Object, setup.Retry);

            Assert.AreEqual(1, retryCalled);
            Assert.AreEqual(successResponse.Object, response);
            setup.Sleep.Verify(s => s(TimeSpan.FromSeconds(50)), Times.Once);
        }
        public void HandleRetry_WorksWithLowerCaseHeader()
        {
            var setup = new Setup();

            setup.Response.SetupGet(r => r.StatusCode).Returns(HttpStatusCode.TooManyRequests);
            setup.Response.SetupGet(r => r.Headers).Returns(new Dictionary <string, string> {
                { "retry-after", "50" }
            });

            var retryCalled = 0;

            setup.Retry = (IRequest request) =>
            {
                retryCalled++;
                return(Task.FromResult(setup.Response.Object));
            };

            var handler = new SimpleRetryHandler(setup.Sleep.Object)
            {
                TooManyRequestsConsumesARetry = true,
                RetryTimes = 1
            };

            Assert.DoesNotThrowAsync(async() =>
            {
                var response = await handler.HandleRetry(setup.Request.Object, setup.Response.Object, setup.Retry);
            });

            Assert.AreEqual(1, retryCalled);
        }