Exemplo n.º 1
0
        public async Task ThenAllSnapshotsAreHard_Deleted()
        {
            var streamId          = ScenarioContext.Current.GetStreamId();
            var snapshotDocuments = await CosmosSetup.QueryAllDocumentsInStream <SnapshotDocument>(this.Context.Client, this.Context.Database, this.Context.Collection, this.Context.PartitionKey, streamId);

            Assert.IsEmpty(snapshotDocuments);
        }
Exemplo n.º 2
0
        public async Task ThenAllSnapshotsAreHard_Deleted()
        {
            var streamId          = this.Context.StreamId;
            var snapshotDocuments = await CosmosSetup.QueryAllDocumentsInStream(this.Context.Client, this.Context.Database, this.Context.Container, streamId, DocumentType.Snapshot);

            Assert.IsEmpty(snapshotDocuments);
        }
Exemplo n.º 3
0
        public async Task ThenTheEventInVersionInStreamIsReplaced(ulong version, string streamId)
        {
            var currentDocuments = await CosmosSetup.QueryAllDocumentsInStream(this.Context.Client, this.Context.Database, this.Context.Container, streamId, DocumentType.Event);

            var eventDocument = currentDocuments.SingleOrDefault(x => x.Id == EveneumDocument.GenerateEventId(streamId, version));

            Assert.AreEqual(DocumentType.Event, eventDocument.DocumentType);
            Assert.AreEqual(streamId, eventDocument.StreamId);
            Assert.AreEqual(this.Context.EventStoreOptions.TypeProvider.GetIdentifierForType(this.Context.ReplacedEvent.Body.GetType()), eventDocument.BodyType);
            Assert.NotNull(eventDocument.Body);
            Assert.AreEqual(JToken.FromObject(this.Context.ReplacedEvent.Body, JsonSerializer.Create(this.Context.JsonSerializerSettings)), eventDocument.Body);
            Assert.NotNull(eventDocument.ETag);
            Assert.False(eventDocument.Deleted);

            if (this.Context.ReplacedEvent.Metadata == null)
            {
                Assert.IsNull(eventDocument.MetadataType);
                Assert.IsNull(eventDocument.Metadata);
            }
            else
            {
                Assert.AreEqual(this.Context.EventStoreOptions.TypeProvider.GetIdentifierForType(this.Context.ReplacedEvent.Metadata.GetType()), eventDocument.MetadataType);
                Assert.NotNull(eventDocument.Metadata);
                Assert.AreEqual(JToken.FromObject(this.Context.ReplacedEvent.Metadata, JsonSerializer.Create(this.Context.JsonSerializerSettings)), eventDocument.Metadata);
            }
        }
Exemplo n.º 4
0
        public async Task WhenIDeleteStreamInExpectedVersion(string streamId, ulong expectedVersion)
        {
            ScenarioContext.Current.SetStreamId(streamId);
            ScenarioContext.Current.SetExistingDocuments(await CosmosSetup.QueryAllDocuments(this.Context.Client, this.Context.Database, this.Context.Collection));

            await this.Context.EventStore.DeleteStream(ScenarioContext.Current.GetStreamId(), expectedVersion);
        }
Exemplo n.º 5
0
        public async Task DeletedDocumentsAppearInChangeFeed(bool partitioned)
        {
            // Arrange
            var partition = partitioned ? Guid.NewGuid().ToString() : null;

            var client = await CosmosSetup.GetClient(this.Database, this.Collection, partitioned : partitioned);

            var store = new EventStore(client, this.Database, this.Collection, partition);

            var streamId = Guid.NewGuid().ToString();
            var events   = TestSetup.GetEvents(10);

            await store.WriteToStream(streamId, events);

            await store.CreateSnapshot(streamId, 2, 2);

            await store.CreateSnapshot(streamId, 4, 4);

            await store.CreateSnapshot(streamId, 8, 8);

            // Act
            var token = await this.GetCurrentChangeFeedToken(client, partition);

            await store.DeleteStream(streamId, (ulong)events.Length);

            // Assert
            var documents = await this.LoadChangeFeed(client, partition, token);

            Assert.AreEqual(1 + events.Length + 3, documents.Count);

            foreach (var document in documents)
            {
                Assert.IsTrue(document.Deleted);
            }
        }
Exemplo n.º 6
0
        public async Task ThenSnapshotsAndNewerAreNotHard_Deleted(ulong version)
        {
            var snapshotDocuments = await CosmosSetup.QueryAllDocumentsInStream(this.Context.Client, this.Context.Database, this.Context.Container, this.Context.StreamId, DocumentType.Snapshot);

            var newerSnapshotDocuments = snapshotDocuments.Where(x => x.Version >= version);

            Assert.IsNotEmpty(newerSnapshotDocuments);
        }
Exemplo n.º 7
0
        public async Task ThenTheSnapshotsOlderThanAreHard_Deleted(ulong version)
        {
            var snapshotDocuments = await CosmosSetup.QueryAllDocumentsInStream(this.Context.Client, this.Context.Database, this.Context.Container, this.Context.StreamId, DocumentType.Snapshot);

            var olderSnapshotDocuments = snapshotDocuments.Where(x => x.Version < version);

            Assert.IsEmpty(olderSnapshotDocuments);
        }
Exemplo n.º 8
0
        public async Task WhenIAppendEventsToStreamInExpectedVersion(int events, string streamId, ushort expectedVersion)
        {
            ScenarioContext.Current.SetStreamId(streamId);
            ScenarioContext.Current.SetNewEvents(TestSetup.GetEvents(events, expectedVersion + 1));
            ScenarioContext.Current.SetExistingDocuments(await CosmosSetup.QueryAllDocuments(this.Context.Client, this.Context.Database, this.Context.Collection));

            await this.Context.EventStore.WriteToStream(ScenarioContext.Current.GetStreamId(), ScenarioContext.Current.GetNewEvents(), expectedVersion, metadata : ScenarioContext.Current.GetHeaderMetadata());
        }
Exemplo n.º 9
0
        public async Task WhenIWriteNewStreamWithEvents(string streamId, int events)
        {
            ScenarioContext.Current.SetStreamId(streamId);
            ScenarioContext.Current.SetNewEvents(TestSetup.GetEvents(events));
            ScenarioContext.Current.SetExistingDocuments(await CosmosSetup.QueryAllDocuments(this.Context.Client, this.Context.Database, this.Context.Collection));

            await this.Context.EventStore.WriteToStream(ScenarioContext.Current.GetStreamId(), ScenarioContext.Current.GetNewEvents(), metadata : ScenarioContext.Current.GetHeaderMetadata());
        }
Exemplo n.º 10
0
        public async Task WhenIDeleteStreamInExpectedVersion(string streamId, ulong expectedVersion)
        {
            this.Context.StreamId          = streamId;
            this.Context.ExistingDocuments = await CosmosSetup.QueryAllDocuments(this.Context.Client, this.Context.Database, this.Context.Container);

            var response = await this.Context.EventStore.DeleteStream(streamId, expectedVersion);

            this.Context.Response = response;
        }
Exemplo n.º 11
0
        public async Task ThenStreamIsNotSoft_Deleted(string streamId)
        {
            var documents = await CosmosSetup.QueryAllDocumentsInStream(this.Context.Client, this.Context.Database, this.Context.Container, streamId);

            foreach (var document in documents)
            {
                Assert.IsFalse(document.Deleted);
            }
        }
Exemplo n.º 12
0
        public async Task ThenStreamIsNotSoft_Deleted(string streamId)
        {
            var documents = await CosmosSetup.QueryAllDocumentsInStream <EveneumDocument>(this.Context.Client, this.Context.Database, this.Context.Collection, this.Context.PartitionKey, streamId);

            foreach (var document in documents)
            {
                Assert.IsFalse(document.Deleted);
            }
        }
Exemplo n.º 13
0
        public async Task ThenSnapshotsAndNewerAreNotHard_Deleted(ulong version)
        {
            var streamId         = ScenarioContext.Current.GetStreamId();
            var currentDocuments = await CosmosSetup.QueryAllDocumentsInStream <SnapshotDocument>(this.Context.Client, this.Context.Database, this.Context.Collection, this.Context.PartitionKey, streamId);

            var newerSnapshotDocuments = currentDocuments.Where(x => x.Version >= version);

            Assert.IsNotEmpty(newerSnapshotDocuments);
        }
Exemplo n.º 14
0
        public async Task WhenIWriteNewStreamWithEvents(string streamId, int events)
        {
            this.Context.StreamId          = streamId;
            this.Context.NewEvents         = TestSetup.GetEvents(events);
            this.Context.ExistingDocuments = await CosmosSetup.QueryAllDocuments(this.Context.Client, this.Context.Database, this.Context.Container);

            var response = await this.Context.EventStore.WriteToStream(this.Context.StreamId, this.Context.NewEvents, metadata : this.Context.HeaderMetadata);

            this.Context.Response = response;
        }
Exemplo n.º 15
0
        public async Task ThenTheHeaderIsSoft_Deleted()
        {
            var documents = await CosmosSetup.QueryAllDocumentsInStream(this.Context.Client, this.Context.Database, this.Context.Container, this.Context.StreamId, DocumentType.Header);

            Assert.AreEqual(1, documents.Count);

            var headerDocument = documents[0];

            Assert.IsTrue(headerDocument.Deleted);
        }
Exemplo n.º 16
0
        public async Task WhenIAppendEventsToStreamInExpectedVersion(int events, string streamId, ushort expectedVersion)
        {
            this.Context.StreamId          = streamId;
            this.Context.NewEvents         = TestSetup.GetEvents(events, expectedVersion + 1);
            this.Context.ExistingDocuments = await CosmosSetup.QueryAllDocuments(this.Context.Client, this.Context.Database, this.Context.Container);

            var response = await this.Context.EventStore.WriteToStream(this.Context.StreamId, this.Context.NewEvents, expectedVersion, metadata : this.Context.HeaderMetadata);

            this.Context.Response = response;
        }
Exemplo n.º 17
0
        public async Task ThenAllEventsAreSoft_Deleted()
        {
            var streamId       = ScenarioContext.Current.GetStreamId();
            var eventDocuments = await CosmosSetup.QueryAllDocumentsInStream <EventDocument>(this.Context.Client, this.Context.Database, this.Context.Collection, this.Context.PartitionKey, streamId);

            foreach (var eventDocument in eventDocuments)
            {
                Assert.IsTrue(eventDocument.Deleted);
            }
        }
Exemplo n.º 18
0
        public async Task ThenAllSnapshotsAreSoft_Deleted()
        {
            var streamId          = this.Context.StreamId;
            var snapshotDocuments = await CosmosSetup.QueryAllDocumentsInStream(this.Context.Client, this.Context.Database, this.Context.Container, streamId, DocumentType.Snapshot);

            foreach (var snapshotDocument in snapshotDocuments)
            {
                Assert.IsTrue(snapshotDocument.Deleted);
            }
        }
Exemplo n.º 19
0
        public async Task ThenNoEventsAreAppended()
        {
            var streamId         = ScenarioContext.Current.GetStreamId();
            var currentDocuments = await CosmosSetup.QueryAllDocumentsInStream <EventDocument>(this.Context.Client, this.Context.Database, this.Context.Collection, this.Context.PartitionKey, streamId);

            var existingDocumentIds = ScenarioContext.Current.GetExistingDocuments().Select(x => x.Id);

            var newEventDocuments = currentDocuments.Where(x => !existingDocumentIds.Contains(x.Id));

            Assert.IsEmpty(newEventDocuments);
        }
Exemplo n.º 20
0
        public async Task ThenNoEventsAreAppended()
        {
            var streamId         = this.Context.StreamId;
            var currentDocuments = await CosmosSetup.QueryAllDocumentsInStream(this.Context.Client, this.Context.Database, this.Context.Container, streamId, DocumentType.Event);

            var existingDocumentIds = this.Context.ExistingDocuments.Select(x => x.Id);

            var newEventDocuments = currentDocuments.Where(x => !existingDocumentIds.Contains(x.Id));

            Assert.IsEmpty(newEventDocuments);
        }
Exemplo n.º 21
0
        public async Task ThenSnapshotsAndNewerAreNotSoft_Deleted(ulong version)
        {
            var snapshotDocuments = await CosmosSetup.QueryAllDocumentsInStream(this.Context.Client, this.Context.Database, this.Context.Container, this.Context.StreamId, DocumentType.Snapshot);

            var newerSnapshotDocuments = snapshotDocuments.Where(x => x.Version >= version);

            foreach (var newerSnapshotDocument in newerSnapshotDocuments)
            {
                Assert.IsFalse(newerSnapshotDocument.Deleted);
            }
        }
Exemplo n.º 22
0
        public async Task ThenTheSnapshotsOlderThanAreSoft_Deleted(ulong version)
        {
            var streamId         = ScenarioContext.Current.GetStreamId();
            var currentDocuments = await CosmosSetup.QueryAllDocumentsInStream <SnapshotDocument>(this.Context.Client, this.Context.Database, this.Context.Collection, this.Context.PartitionKey, streamId);

            var olderSnapshotDocuments = currentDocuments.Where(x => x.Version < version);

            foreach (var olderSnapshotDocument in olderSnapshotDocuments)
            {
                Assert.IsTrue(olderSnapshotDocument.Deleted);
            }
        }
Exemplo n.º 23
0
        public async Task ThenTheHeaderVersionWithNoMetadataIsPersisted(ulong version)
        {
            var headerDocuments = await CosmosSetup.QueryAllDocumentsInStream(this.Context.Client, this.Context.Database, this.Context.Container, this.Context.StreamId, DocumentType.Header);

            Assert.AreEqual(1, headerDocuments.Count);

            var headerDocument = headerDocuments[0];

            Assert.AreEqual(DocumentType.Header, headerDocument.DocumentType);
            Assert.AreEqual(this.Context.StreamId, headerDocument.StreamId);
            Assert.AreEqual(version, headerDocument.Version);
            Assert.AreEqual(version + EveneumDocument.GetOrderingFraction(DocumentType.Header), headerDocument.SortOrder);
            Assert.IsNull(headerDocument.MetadataType);
            Assert.IsFalse(headerDocument.Metadata.HasValues);
            Assert.NotNull(headerDocument.ETag);
            Assert.False(headerDocument.Deleted);
        }
Exemplo n.º 24
0
        public async Task ThenTheHeaderVersionWithMetadataIsPersisted(ulong version)
        {
            var headerDocuments = await CosmosSetup.QueryAllDocumentsInStream(this.Context.Client, this.Context.Database, this.Context.Container, this.Context.StreamId, DocumentType.Header);

            Assert.AreEqual(1, headerDocuments.Count);

            var headerDocument = headerDocuments[0];

            Assert.AreEqual(DocumentType.Header, headerDocument.DocumentType);
            Assert.AreEqual(this.Context.StreamId, headerDocument.StreamId);
            Assert.AreEqual(version, headerDocument.Version);
            Assert.AreEqual(version + EveneumDocument.GetOrderingFraction(DocumentType.Header), headerDocument.SortOrder);
            Assert.AreEqual(this.Context.EventStoreOptions.TypeProvider.GetIdentifierForType(typeof(SampleMetadata)), headerDocument.MetadataType);
            Assert.NotNull(headerDocument.Metadata);
            Assert.AreEqual(JToken.FromObject(this.Context.HeaderMetadata), headerDocument.Metadata);
            Assert.NotNull(headerDocument.ETag);
            Assert.False(headerDocument.Deleted);
        }
Exemplo n.º 25
0
        public async Task DeletedSnapshotAppearsInChangeFeed(bool partitioned)
        {
            // Arrange
            var partition = partitioned ? Guid.NewGuid().ToString() : null;

            var client = await CosmosSetup.GetClient(this.Database, this.Collection, partitioned : partitioned);

            var store = new EventStore(client, this.Database, this.Collection, partition);

            var streamId = Guid.NewGuid().ToString();
            var events   = TestSetup.GetEvents(10);

            await store.WriteToStream(streamId, events);

            await store.CreateSnapshot(streamId, 2, 2);

            await store.CreateSnapshot(streamId, 4, 4);

            await store.CreateSnapshot(streamId, 8, 8);

            // Act
            var token = await this.GetCurrentChangeFeedToken(client, partition);

            await store.DeleteSnapshots(streamId, 8);

            // Assert
            var documents = await this.LoadChangeFeed(client, partition, token);

            Assert.AreEqual(2, documents.Count);
            var snapshots = documents.OfType <SnapshotDocument>().ToList();

            Assert.AreEqual(2, snapshots.Count);

            foreach (var snapshot in snapshots)
            {
                Assert.IsTrue(snapshot.Deleted);
                Assert.Contains(snapshot.Version, new[] { 2, 4 });
            }
        }
Exemplo n.º 26
0
        public async Task ThenNewEventsAreAppended()
        {
            var streamId         = this.Context.StreamId;
            var currentDocuments = await CosmosSetup.QueryAllDocumentsInStream(this.Context.Client, this.Context.Database, this.Context.Container, streamId, DocumentType.Event);

            var existingDocumentIds = this.Context.ExistingDocuments.Select(x => x.Id);

            var newEventDocuments = currentDocuments.Where(x => !existingDocumentIds.Contains(x.Id)).ToList();

            var newEvents = this.Context.NewEvents;

            Assert.AreEqual(newEventDocuments.Count, newEvents.Length);

            foreach (var newEvent in newEvents)
            {
                var eventDocument = newEventDocuments.Find(x => x.Id == EveneumDocument.GenerateEventId(streamId, newEvent.Version));

                Assert.IsNotNull(eventDocument);
                Assert.AreEqual(DocumentType.Event, eventDocument.DocumentType);
                Assert.AreEqual(streamId, eventDocument.StreamId);
                Assert.AreEqual(this.Context.EventStoreOptions.TypeProvider.GetIdentifierForType(newEvent.Body.GetType()), eventDocument.BodyType);
                Assert.NotNull(eventDocument.Body);
                Assert.AreEqual(JToken.FromObject(newEvent.Body, JsonSerializer.Create(this.Context.JsonSerializerSettings)), eventDocument.Body);
                Assert.NotNull(eventDocument.ETag);
                Assert.False(eventDocument.Deleted);

                if (newEvent.Metadata == null)
                {
                    Assert.IsNull(eventDocument.MetadataType);
                    Assert.IsNull(eventDocument.Metadata);
                }
                else
                {
                    Assert.AreEqual(this.Context.EventStoreOptions.TypeProvider.GetIdentifierForType(newEvent.Metadata.GetType()), eventDocument.MetadataType);
                    Assert.NotNull(eventDocument.Metadata);
                    Assert.AreEqual(JToken.FromObject(newEvent.Metadata, JsonSerializer.Create(this.Context.JsonSerializerSettings)), eventDocument.Metadata);
                }
            }
        }
Exemplo n.º 27
0
        public async Task ThenNewEventsAreAppended()
        {
            var streamId         = ScenarioContext.Current.GetStreamId();
            var currentDocuments = await CosmosSetup.QueryAllDocumentsInStream <EventDocument>(this.Context.Client, this.Context.Database, this.Context.Collection, this.Context.PartitionKey, streamId);

            var existingDocumentIds = ScenarioContext.Current.GetExistingDocuments().Select(x => x.Id);

            var newEventDocuments = currentDocuments.Where(x => !existingDocumentIds.Contains(x.Id)).ToList();

            var newEvents = ScenarioContext.Current.GetNewEvents();

            Assert.AreEqual(newEventDocuments.Count, newEvents.Length);

            foreach (var newEvent in newEvents)
            {
                var eventDocument = newEventDocuments.Find(x => x.Partition == this.Context.Partition && x.Id == EventDocument.GenerateId(streamId, newEvent.Version));

                Assert.IsNotNull(eventDocument);
                Assert.AreEqual(DocumentType.Event, eventDocument.DocumentType);
                Assert.AreEqual(streamId, eventDocument.StreamId);
                Assert.AreEqual(newEvent.Body.GetType().AssemblyQualifiedName, eventDocument.BodyType);
                Assert.NotNull(eventDocument.Body);
                Assert.AreEqual(JToken.FromObject(newEvent.Body), eventDocument.Body);
                Assert.NotNull(eventDocument.ETag);
                Assert.False(eventDocument.Deleted);

                if (newEvent.Metadata == null)
                {
                    Assert.IsNull(eventDocument.MetadataType);
                    Assert.IsNull(eventDocument.Metadata);
                }
                else
                {
                    Assert.AreEqual(newEvent.Metadata.GetType().AssemblyQualifiedName, eventDocument.MetadataType);
                    Assert.NotNull(eventDocument.Metadata);
                    Assert.AreEqual(JToken.FromObject(newEvent.Metadata), eventDocument.Metadata);
                }
            }
        }
Exemplo n.º 28
0
        public async Task ThenEventsFromVersionToAreReturned(ulong fromVersion, ulong toVersion)
        {
            var stream       = this.Context.Stream;
            var allDocuments = await CosmosSetup.QueryAllDocumentsInStream(this.Context.Client, this.Context.Database, this.Context.Container, stream.Value.StreamId, Documents.DocumentType.Event);

            var eventDocuments = allDocuments.ToDictionary(x => x.Version);

            Assert.IsTrue(stream.HasValue);
            Assert.IsNotEmpty(stream.Value.Events);
            Assert.AreEqual(toVersion - fromVersion + 1, stream.Value.Events.Length);

            for (ulong version = fromVersion, index = 0; version <= toVersion; ++version, ++index)
            {
                var @event = stream.Value.Events[index];

                Assert.AreEqual(version, @event.Version);
                Assert.IsTrue(eventDocuments.ContainsKey(version));

                var eventDocument = eventDocuments[version];

                Assert.AreEqual(eventDocument.Metadata, JToken.FromObject(@event.Metadata));
            }
        }
Exemplo n.º 29
0
        public async Task ThenTheSnapshotForVersionIsPersisted(ulong version)
        {
            var streamId = this.Context.StreamId;
            var snapshot = this.Context.Snapshot;

            var snapshotDocuments = await CosmosSetup.QueryAllDocumentsInStream(this.Context.Client, this.Context.Database, this.Context.Container, this.Context.StreamId, DocumentType.Snapshot);

            Assert.IsNotEmpty(snapshotDocuments);

            var snapshotDocument = snapshotDocuments.Find(x => x.Version == version);

            Assert.IsNotNull(snapshotDocument);

            var snapshotMetadata = this.Context.SnapshotMetadata;

            Assert.AreEqual(DocumentType.Snapshot, snapshotDocument.DocumentType);
            Assert.AreEqual(streamId, snapshotDocument.StreamId);
            Assert.AreEqual(version, snapshotDocument.Version);
            Assert.AreEqual(version + EveneumDocument.GetOrderingFraction(DocumentType.Snapshot), snapshotDocument.SortOrder);

            if (snapshotMetadata == null)
            {
                Assert.IsNull(snapshotDocument.MetadataType);
                Assert.IsFalse(snapshotDocument.Metadata.HasValues);
            }
            else
            {
                Assert.AreEqual(snapshotMetadata.GetType().AssemblyQualifiedName, snapshotDocument.MetadataType);
                Assert.AreEqual(JToken.FromObject(snapshotMetadata), snapshotDocument.Metadata);
            }

            Assert.AreEqual(snapshot.GetType().AssemblyQualifiedName, snapshotDocument.BodyType);
            Assert.AreEqual(JToken.FromObject(snapshot), snapshotDocument.Body);
            Assert.False(snapshotDocument.Deleted);
            Assert.IsNotNull(snapshotDocument.ETag);
        }
Exemplo n.º 30
0
        public async Task ThenTheHeaderIsHard_Deleted()
        {
            var documents = await CosmosSetup.QueryAllDocumentsInStream <HeaderDocument>(this.Context.Client, this.Context.Database, this.Context.Collection, this.Context.PartitionKey, ScenarioContext.Current.GetStreamId());

            Assert.IsEmpty(documents);
        }