public async Task SaveEvents_updates_existing_UniqueIndexedProperty_correctly( FakeUserCreated created, FakeUsernameChanged usernameChanged) { // Arrange RaiseEvents(userId, created); await sut.SaveEvents <FakeUser>(new[] { created }); RaiseEvents(userId, 1, usernameChanged); // Act await sut.SaveEvents <FakeUser>(new[] { usernameChanged }); // Assert using (var db = new DataContext()) { UniqueIndexedProperty actual = await db .UniqueIndexedProperties .Where( p => p.AggregateId == userId && p.PropertyName == nameof(FakeUserCreated.Username)) .SingleOrDefaultAsync(); actual.Should().NotBeNull(); actual.PropertyValue.Should().Be(usernameChanged.Username); actual.Version.Should().Be(usernameChanged.Version); } }
public async Task SaveEvents_does_not_insert_UniqueIndexedProperty_if_property_value_is_null() { var created = new FakeUserCreated { Username = null }; var events = new DomainEvent[] { created }; RaiseEvents(userId, events); await sut.SaveEvents <FakeUser>(events); using (var db = new DataContext()) { UniqueIndexedProperty actual = await db .UniqueIndexedProperties .Where( p => p.AggregateType == typeof(FakeUser).FullName && p.PropertyName == nameof(FakeUserCreated.Username) && p.PropertyValue == created.Username) .SingleOrDefaultAsync(); actual.Should().BeNull(); } }
public async Task SaveEvents_removes_existing_UniqueIndexedProperty_if_property_value_is_null( FakeUserCreated created, FakeUsernameChanged usernameChanged) { // Arrange RaiseEvents(userId, created); await sut.SaveEvents <FakeUser>(new[] { created }); usernameChanged.Username = null; RaiseEvents(userId, 1, usernameChanged); // Act await sut.SaveEvents <FakeUser>(new[] { usernameChanged }); // Assert using (var db = new DataContext()) { UniqueIndexedProperty actual = await db .UniqueIndexedProperties .Where( p => p.AggregateType == typeof(FakeUser).FullName && p.PropertyName == nameof(FakeUserCreated.Username) && p.PropertyValue == created.Username) .SingleOrDefaultAsync(); actual.Should().BeNull(); } }
public async Task SaveEvents_inserts_UniqueIndexedProperty_for_new_property( FakeUserCreated created) { var events = new DomainEvent[] { created }; RaiseEvents(userId, events); await sut.SaveEvents <FakeUser>(events); using (var db = new DataContext()) { UniqueIndexedProperty actual = await db .UniqueIndexedProperties .Where( p => p.AggregateType == typeof(FakeUser).FullName && p.PropertyName == nameof(FakeUserCreated.Username) && p.PropertyValue == created.Username) .SingleOrDefaultAsync(); actual.Should().NotBeNull(); actual.AggregateId.Should().Be(userId); actual.Version.Should().Be(created.Version); } }
public async Task SaveEvents_does_not_insert_UniqueIndexedProperty_if_property_value_is_null() { // Arrange var userId = Guid.NewGuid(); var created = new FakeUserCreated { Username = null }; created.Raise(userId); var sut = new SqlEventStore( () => new FakeEventStoreDbContext(_dbContextOptions), new JsonMessageSerializer()); // Act await sut.SaveEvents <FakeUser>(new DomainEvent[] { created }); // Assert using (var db = new FakeEventStoreDbContext(_dbContextOptions)) { UniqueIndexedProperty actual = await db .UniqueIndexedProperties .Where( p => p.AggregateType == typeof(FakeUser).FullName && p.PropertyName == nameof(FakeUserCreated.Username) && p.PropertyValue == created.Username) .SingleOrDefaultAsync(); actual.Should().BeNull(); } }
public async Task SaveEvents_inserts_UniqueIndexedProperty_with_value_of_latest_indexed_event() { // Arrange var userId = Guid.NewGuid(); var created = new FakeUserCreated(); var usernameChanged = new FakeUsernameChanged(); var events = new DomainEvent[] { created, usernameChanged }; events.Raise(userId); var sut = new SqlEventStore( () => new FakeEventStoreDbContext(_dbContextOptions), new JsonMessageSerializer()); // Act await sut.SaveEvents <FakeUser>(events); // Assert using (var db = new FakeEventStoreDbContext(_dbContextOptions)) { UniqueIndexedProperty actual = await db .UniqueIndexedProperties .Where( p => p.AggregateId == userId && p.PropertyName == nameof(FakeUserCreated.Username)) .SingleOrDefaultAsync(); actual.PropertyValue.Should().Be(usernameChanged.Username); actual.Version.Should().Be(usernameChanged.Version); } }
private async Task UpdateUniqueIndexedProperties <T>( EventStoreDbContext context, Guid sourceId, List <IDomainEvent> events, CancellationToken cancellationToken) where T : class, IEventSourced { Dictionary <string, UniqueIndexedProperty> restored = await context .UniqueIndexedProperties .Where( p => p.AggregateType == typeof(T).FullName && p.AggregateId == sourceId) .ToDictionaryAsync(p => p.PropertyName, cancellationToken) .ConfigureAwait(false); var properties = new List <UniqueIndexedProperty>(); foreach (var indexedEvent in events.OfType <IUniqueIndexedDomainEvent>()) { foreach (string name in indexedEvent.UniqueIndexedProperties.Keys) { UniqueIndexedProperty property; if (restored.TryGetValue(name, out property)) { context.UniqueIndexedProperties.Remove(property); } property = properties.Find(p => p.PropertyName == name); if (property != null) { properties.Remove(property); } string value = indexedEvent.UniqueIndexedProperties[name]; if (value == null) { continue; } property = new UniqueIndexedProperty { AggregateType = typeof(T).FullName, PropertyName = name, PropertyValue = value, AggregateId = sourceId, Version = indexedEvent.Version }; properties.Add(property); } } context.UniqueIndexedProperties.AddRange(properties); }
private async Task <Guid?> FindIdByProperty <T>( string name, string value, CancellationToken cancellationToken) where T : class, IEventSourced { using (EventStoreDbContext context = _dbContextFactory.Invoke()) { IQueryable <UniqueIndexedProperty> query = from p in context.UniqueIndexedProperties where p.AggregateType == typeof(T).FullName && p.PropertyName == name && p.PropertyValue == value select p; UniqueIndexedProperty property = await query .SingleOrDefaultAsync(cancellationToken) .ConfigureAwait(false); return(property?.AggregateId); } }
public async Task SaveEvents_inserts_UniqueIndexedProperty_with_value_of_latest_indexed_event( FakeUserCreated created, FakeUsernameChanged usernameChanged) { var events = new DomainEvent[] { created, usernameChanged }; RaiseEvents(userId, events); await sut.SaveEvents <FakeUser>(events); using (var db = new DataContext()) { UniqueIndexedProperty actual = await db .UniqueIndexedProperties .Where( p => p.AggregateId == userId && p.PropertyName == nameof(FakeUserCreated.Username)) .SingleOrDefaultAsync(); actual.PropertyValue.Should().Be(usernameChanged.Username); actual.Version.Should().Be(usernameChanged.Version); } }