public async Task SaveAfterRetry()
        {
            var storageMock = new Mock <IStorage>();

            storageMock.SetupSequence(x => x.Save(It.IsAny <MultipartItem>()))
            .ReturnsAsync((HttpStatusCode.BadGateway, null))
            .ReturnsAsync((HttpStatusCode.BadGateway, null))
            .ReturnsAsync((HttpStatusCode.BadGateway, null))
            .ReturnsAsync((HttpStatusCode.OK, null))
            .ReturnsAsync((HttpStatusCode.BadGateway, null));

            var options = new StorageOptions
            {
                WaitBeforeRetryMilliseconds = 10, RetryHttpStatusCodes = new List <int> {
                    (int)HttpStatusCode.BadGateway
                }
            };
            var retryableStorage = new RetryableStorage(options,
                                                        new Mock <ILogger <RetryableStorage> >().Object, storageMock.Object);

            var response = await retryableStorage.Save(new MultipartItem());

            Assert.AreEqual(HttpStatusCode.OK, response.statusCode);
            storageMock.Verify(x => x.Save(It.IsAny <MultipartItem>()), Times.Exactly(4));
        }
        public async Task Save()
        {
            var storageMock      = CreateStorageMock(HttpStatusCode.OK, null);
            var retryableStorage = new RetryableStorage(new StorageOptions(),
                                                        new Mock <ILogger <RetryableStorage> >().Object, storageMock.Object);

            var response = await retryableStorage.Save(new MultipartItem());

            Assert.AreEqual(HttpStatusCode.OK, response.statusCode);
            storageMock.Verify(x => x.Save(It.IsAny <MultipartItem>()), Times.Once);
        }
        public void IsRetryableOnSubStatusCode(HttpStatusCode code, bool isRetryable)
        {
            var retryableStorage = new RetryableStorage(
                new StorageOptions {
                RetryHttpStatusCodes = new List <int> {
                    (int)HttpStatusCode.BadGateway
                }
            },
                new Mock <ILogger <RetryableStorage> >().Object, null);

            Assert.AreEqual(isRetryable, retryableStorage.IsRetryable(code));
        }
        public async Task KeepRetrySave()
        {
            var storageMock = CreateStorageMock(HttpStatusCode.BadGateway, null);
            var options     = new StorageOptions
            {
                WaitBeforeRetryMilliseconds = 10,
                RetryHttpStatusCodes        = new List <int> {
                    (int)HttpStatusCode.BadGateway
                }
            };
            var retryableStorage = new RetryableStorage(options,
                                                        new Mock <ILogger <RetryableStorage> >().Object, storageMock.Object);

            var response = await retryableStorage.Save(new MultipartItem());

            Assert.AreEqual(HttpStatusCode.BadGateway, response.statusCode);
            storageMock.Verify(x => x.Save(It.IsAny <MultipartItem>()), Times.Exactly(options.Retries + 1));
        }