diff --git a/src/SqlStreamStore.AcceptanceTests/SqlStreamStoreAcceptanceTests.ReadStream.cs b/src/SqlStreamStore.AcceptanceTests/SqlStreamStoreAcceptanceTests.ReadStream.cs index 49677595e..25579446d 100644 --- a/src/SqlStreamStore.AcceptanceTests/SqlStreamStoreAcceptanceTests.ReadStream.cs +++ b/src/SqlStreamStore.AcceptanceTests/SqlStreamStoreAcceptanceTests.ReadStream.cs @@ -1,5 +1,6 @@ namespace SqlStreamStore { + using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; @@ -380,6 +381,25 @@ public async Task When_read_deleted_stream_backwards_then_should_get_StreamNotFo } } + [Theory, InlineData(0), InlineData(1)] + public async Task Can_read_stream_backwards_starting_past_end_of_stream(int fromVersionInclusive) + { + using(var fixture = GetFixture()) + { + using(var store = await fixture.GetStreamStore()) + { + await store.AppendToStream("stream-1", ExpectedVersion.NoStream, Array.Empty()); + + var streamMessagesPage = + await store.ReadStreamBackwards("stream-1", fromVersionInclusive, 1); + + streamMessagesPage.Status.ShouldBe(PageReadStatus.Success); + streamMessagesPage.Messages.Length.ShouldBe(0); + streamMessagesPage.IsEnd.ShouldBeTrue(); + } + } + } + // ReSharper disable once UnusedMethodReturnValue.Global public static IEnumerable GetReadStreamForwardsTheories() { diff --git a/src/SqlStreamStore/InMemory/InMemoryStreamStore.cs b/src/SqlStreamStore/InMemory/InMemoryStreamStore.cs index 45d7d6856..b51ff77b3 100644 --- a/src/SqlStreamStore/InMemory/InMemoryStreamStore.cs +++ b/src/SqlStreamStore/InMemory/InMemoryStreamStore.cs @@ -589,7 +589,7 @@ protected override Task ReadStreamBackwardsInternal( var messages = new List(); var i = fromVersionInclusive == StreamVersion.End ? stream.Messages.Count - 1 : fromVersionInclusive; - while (i >= 0 && count > 0) + while (i < stream.Messages.Count && i >= 0 && count > 0) { var inMemorymessage = stream.Messages[i]; StreamMessage message;