/// /// A bucket without a single object: every lookup answers with a 404 and every listing is empty /// until a test puts something in via , /// or . /// private static IAmazonS3 EmptyBucket() { var s3 = Substitute.For(); // Objects written during the test become visible to later lookups, just like in a real bucket. var writtenObjects = new Dictionary(StringComparer.Ordinal); s3.GetObjectMetadataAsync(Arg.Any(), Arg.Any()) .Returns(call => { var key = call.Arg().Key; if (!writtenObjects.TryGetValue(key, out var owner)) throw new AmazonS3Exception("not found") { StatusCode = System.Net.HttpStatusCode.NotFound }; return owner is null ? new GetObjectMetadataResponse() : MetadataResponse(owner); }); s3.ListObjectsV2Async(Arg.Any(), Arg.Any()) .Returns(_ => new ListObjectsV2Response { IsTruncated = false }); s3.CopyObjectAsync(Arg.Any(), Arg.Any()) .Returns(_ => new CopyObjectResponse()); s3.PutObjectAsync(Arg.Any(), Arg.Any()) .Returns(call => { var request = call.Arg(); writtenObjects[request.Key] = request.Metadata["efecte-org-id"]; return new PutObjectResponse(); }); s3.DeleteObjectsAsync(Arg.Any(), Arg.Any()) .Returns(_ => new DeleteObjectsResponse()); return s3; }