diff --git a/src/GreenDonut/src/GreenDonut/BatchDataLoader.cs b/src/GreenDonut/src/GreenDonut/BatchDataLoader.cs index a48a781324b..66e717b5837 100644 --- a/src/GreenDonut/src/GreenDonut/BatchDataLoader.cs +++ b/src/GreenDonut/src/GreenDonut/BatchDataLoader.cs @@ -57,7 +57,7 @@ private static void CopyResults( } else { - results[i] = null; + results[i] = Result.Resolve(default); } } } @@ -133,7 +133,7 @@ private static void CopyResults( } else { - results[i] = null; + results[i] = Result.Resolve(default); } } } diff --git a/src/GreenDonut/test/GreenDonut.Tests/BatchDataLoaderTests.cs b/src/GreenDonut/test/GreenDonut.Tests/BatchDataLoaderTests.cs index 4653a1992db..ab35a7bb4dc 100644 --- a/src/GreenDonut/test/GreenDonut.Tests/BatchDataLoaderTests.cs +++ b/src/GreenDonut/test/GreenDonut.Tests/BatchDataLoaderTests.cs @@ -69,6 +69,44 @@ public async Task LoadAsync_Should_BatchAllItemsOfList() Assert.Equal(1, dataLoader.ExecutionCount); } + [Fact] + public async Task BatchDataLoader_MissingKey_Should_Be_ResultResolveDefault() + { + // arrange + var loader = new TestBatchLoader(); + var keys = new[] { 1, 2 }; + var results = new Result[2]; + + // act + await loader.FetchAsync(keys, results, default, CancellationToken.None); + + Assert.Equal("one", results[0].Value); + Assert.Equal(ResultKind.Value, results[0].Kind); + + // assert + Assert.Null(results[1].Value); + Assert.Equal(ResultKind.Value, results[1].Kind); + } + + [Fact] + public async Task StatefulBatchDataLoader_MissingKey_Should_Be_ResultResolveDefault() + { + // arrange + var loader = new TestStatefulBatchLoader(); + var keys = new[] { 1, 2 }; + var results = new Result[2]; + + // act + await loader.FetchAsync(keys, results, default, CancellationToken.None); + + Assert.Equal("one", results[0].Value); + Assert.Equal(ResultKind.Value, results[0].Kind); + + // assert + Assert.Null(results[1].Value); + Assert.Equal(ResultKind.Value, results[1].Kind); + } + [Fact] public async Task Null_Result() { @@ -114,6 +152,35 @@ protected override Task> LoadBatchAsync( } } + public class TestBatchLoader : BatchDataLoader + { + public TestBatchLoader() + : base(new TestBatchScheduler(), new DataLoaderOptions()) { } + + protected override Task> LoadBatchAsync( + IReadOnlyList keys, + CancellationToken cancellationToken) + { + return Task.FromResult>( + new Dictionary { { 1, "one" } }); + } + } + + public class TestStatefulBatchLoader : StatefulBatchDataLoader + { + public TestStatefulBatchLoader() + : base(new TestBatchScheduler(), new DataLoaderOptions()) { } + + protected override Task> LoadBatchAsync( + IReadOnlyList keys, + DataLoaderFetchContext context, + CancellationToken cancellationToken) + { + return Task.FromResult>( + new Dictionary { { 1, "one" } }); + } + } + public sealed class InstantDispatcher : IBatchScheduler { public void Schedule(Batch batch)