using System.Collections.Generic;
using System.Threading.Tasks;
namespace YourNamespace.Tests
public class S3PullRequestStoreTests
private readonly Mock<IAmazonS3> _amazonS3ClientMock;
private readonly S3PullRequestStore _s3PullRequestStore;
public S3PullRequestStoreTests()
_amazonS3ClientMock = new Mock<IAmazonS3>();
_s3PullRequestStore = new S3PullRequestStore(_amazonS3ClientMock.Object);
public async Task GetPullRequestesToSkipAsync_ShouldReturnList_WhenGetObjectSucceeds()
var bucketName = "bucket-name";
var environment = "test";
var pullRequestFileName = $"{environment}/pullRequestesToSkip";
var text = "[\"PR1\", \"PR2\", \"PR3\"]";
var getObjectResponse = new GetObjectResponse
HttpStatusCode = HttpStatusCode.OK,
ResponseStream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(text))
_s3PullRequestStore.GetType()
.GetField("_bucketName", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic)
.SetValue(_s3PullRequestStore, bucketName);
_s3PullRequestStore.GetType()
.GetField("_environment", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic)
.SetValue(_s3PullRequestStore, environment);
_amazonS3ClientMock.Setup(client => client.GetObjectAsync(It.IsAny<GetObjectRequest>()))
.ReturnsAsync(getObjectResponse);
var result = await _s3PullRequestStore.GetPullRequestesToSkipAsync();
Assert.Equal(new List<string> { "PR1", "PR2", "PR3" }, result);
_amazonS3ClientMock.Verify(client => client.GetObjectAsync(It.Is<GetObjectRequest>(request => request.BucketName == bucketName && request.Key == pullRequestFileName)), Times.Once);
public void GetPullRequestesToSkip_ShouldReturnList_WhenGetObjectSucceeds()
var pullRequests = new List<string> { "PR1", "PR2", "PR3" };
_amazonS3ClientMock.Setup(client => client.GetObjectAsync(It.IsAny<GetObjectRequest>()))
.ReturnsAsync(new GetObjectResponse { HttpStatusCode = HttpStatusCode.OK, ResponseStream = new MemoryStream() });
_s3PullRequestStore.GetType()
.GetMethod("GetPullRequestesToSkipAsync", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic)
.SetupImplementation((Func<Task<List<string>>>)(() => Task.FromResult(pullRequests)));
var result = _s3PullRequestStore.GetPullRequestesToSkip();
Assert.Equal(pullRequests, result);
_amazonS3ClientMock.Verify(client => client.GetObjectAsync(It.IsAny<GetObjectRequest>()), Times.Never);
public async Task SavePullRequestesToSkip_ShouldReturnTrue_WhenPutObjectSucceeds()
var bucketName = "bucket-name";
var environment = "test";
var pullRequestFileName = $"{environment}/pullRequestesToSkip";
var pullRequestNumbers = new List<string> { "PR1", "PR2", "PR3" };
var putObjectResponse = new PutObjectResponse { HttpStatusCode = HttpStatusCode.OK };
_s3PullRequestStore.GetType()
.GetField("_bucketName", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic)
.SetValue(_s3PullRequestStore, bucketName);
_amazonS3ClientMock.Setup(client => client.PutObjectAsync(It.IsAny<PutObjectRequest>()))
.ReturnsAsync(putObjectResponse);
var result = await _s3PullRequestStore.SavePullRequestesToSkip(pullRequestNumbers);
_amazonS3ClientMock.Verify(client => client.PutObjectAsync(It.Is<PutObjectRequest>(request => request.BucketName == bucketName && request.Key == pullRequestFileName)), Times.Once);