public async Task TestPutAsyncByteArray()
        {
            var storageSession = new S3StorageSession(
                ValidStorageOptions,
                TestFixture.FakeAwsOptions,
                null
                );

            // Moq client
            var mock = new Mock <IAmazonS3>();

            mock
            .Setup(foo => foo.PutObjectAsync(It.IsAny <PutObjectRequest>(), default(CancellationToken)))
            .ReturnsAsync(new PutObjectResponse());
            storageSession.S3Client = mock.Object;

            // Test S3 Response
            var testId      = Guid.NewGuid().ToString();
            var contentType = "text/css";
            var fileBytes   = await File.ReadAllBytesAsync("test.css");

            string uri = await storageSession.PutAsync(testId, contentType, fileBytes);

            Assert.False(string.IsNullOrWhiteSpace(uri));
            Assert.StartsWith(ValidUnitTestUriHost, ValidUnitTestUriHost);
        }
        public async Task TestDeleteAsync()
        {
            S3StorageSession storageSession = new S3StorageSession(ValidStorageOptions, null, null);

            // Moq client
            var mock = new Mock <IAmazonS3>();

            mock
            .Setup(foo => foo.DeleteObjectAsync(ValidStorageOptions.BucketName, ValidStorageOptions.KeyPrefix, default(CancellationToken)))
            .ReturnsAsync(new DeleteObjectResponse());
            storageSession.S3Client = mock.Object;

            // Test S3 Response
            var testId   = Guid.NewGuid().ToString();
            var response = await storageSession.DeleteAsync(testId);

            Assert.True(response);

            // Moq throws async not working.

            /*
             * mock = new Mock<IAmazonS3>();
             * var tcs = new TaskCompletionSource<DeleteObjectResponse>();
             * mock
             *      .Setup(foo => foo.DeleteObjectAsync(s3StorageConfiguration.BucketName, s3StorageConfiguration.KeyPrefix, default(CancellationToken)))
             *      .ThrowsAsync(new Exception());
             * storageSession.S3Client = mock.Object;
             * response = await storageSession.DeleteAsync(testId);
             * Assert.False(response);
             */
        }
        public async void TestGetAsync()
        {
            S3StorageSession storageSession = new S3StorageSession(ValidStorageOptions, null, null);
            var testId    = Guid.NewGuid().ToString();
            var objectKey = Url.Combine(ValidStorageOptions.KeyPrefix, testId);

            // Moq client
            var mock = new Mock <IAmazonS3>();

            using (var fileStream = new FileStream("test.css", FileMode.Open))
                using (var memoryStream = new MemoryStream())
                {
                    mock
                    .Setup(foo => foo.GetObjectAsync(ValidUnitTestBucketName, objectKey, default(CancellationToken)))
                    .ReturnsAsync(new GetObjectResponse {
                        ResponseStream = fileStream
                    });
                    storageSession.S3Client = mock.Object;

                    bool success = await storageSession.GetAsync(testId, memoryStream);

                    Assert.True(success);
                    var outString = Encoding.UTF8.GetString(memoryStream.ToArray());
                    Assert.Contains("body", outString);
                }
        }