diff --git a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/DomainEvents/DomainEvents_Tests.cs b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/DomainEvents/DomainEvents_Tests.cs index 978d411634..776e7d4766 100644 --- a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/DomainEvents/DomainEvents_Tests.cs +++ b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/DomainEvents/DomainEvents_Tests.cs @@ -26,11 +26,14 @@ public class AbpEfCoreDomainEvents_Tests : EntityFrameworkCoreTestBase { protected readonly IRepository AppEntityWithNavigationsRepository; protected readonly ILocalEventBus LocalEventBus; + protected readonly IRepository PersonRepository; + protected bool _loadEntityWithDetails = false; public AbpEfCoreDomainEvents_Tests() { AppEntityWithNavigationsRepository = GetRequiredService>(); LocalEventBus = GetRequiredService(); + PersonRepository = GetRequiredService>(); } protected override void AfterAddApplication(IServiceCollection services) @@ -39,16 +42,279 @@ public class AbpEfCoreDomainEvents_Tests : EntityFrameworkCoreTestBase { options.Entity(opt => { - opt.DefaultWithDetailsFunc = q => q; + if (_loadEntityWithDetails) + { + opt.DefaultWithDetailsFunc = q => q; + } }); }); base.AfterAddApplication(services); } + [Fact] + public async Task Should_Trigger_Domain_Events_For_Aggregate_Root_When_Navigation_Changes_Tests() + { + _loadEntityWithDetails = false; + + var entityId = Guid.NewGuid(); + + await AppEntityWithNavigationsRepository.InsertAsync(new AppEntityWithNavigations(entityId, "TestEntity")); + + var entityUpdatedEventTriggered = false; + var personCreatedEventCount = 0; + var entityUpdatedEventTriggerCount = 0; + + LocalEventBus.Subscribe>(_ => + { + personCreatedEventCount++; + return Task.CompletedTask; + }); + + LocalEventBus.Subscribe>(async _ => + { + entityUpdatedEventTriggered = true; + await PersonRepository.InsertAsync(new Person(Guid.NewGuid(), Guid.NewGuid().ToString(), new Random().Next(1, 100))); + }); + + // Test with simple property + await WithUnitOfWorkAsync(async () => + { + var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId); + entity.Name = Guid.NewGuid().ToString(); + await AppEntityWithNavigationsRepository.UpdateAsync(entity); + }); + entityUpdatedEventTriggered.ShouldBeTrue(); + personCreatedEventCount.ShouldBe(++entityUpdatedEventTriggerCount); + + // Test with value object + entityUpdatedEventTriggered = false; + await WithUnitOfWorkAsync(async () => + { + var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId); + entity.AppEntityWithValueObjectAddress = new AppEntityWithValueObjectAddress("Turkey"); + await AppEntityWithNavigationsRepository.UpdateAsync(entity); + }); + entityUpdatedEventTriggered.ShouldBeTrue(); + personCreatedEventCount.ShouldBe(++entityUpdatedEventTriggerCount); + + entityUpdatedEventTriggered = false; + await WithUnitOfWorkAsync(async () => + { + var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId); + entity.AppEntityWithValueObjectAddress.Country = "USA"; + await AppEntityWithNavigationsRepository.UpdateAsync(entity); + }); + entityUpdatedEventTriggered.ShouldBeTrue(); + personCreatedEventCount.ShouldBe(++entityUpdatedEventTriggerCount); + + LocalEventBus.Subscribe>(_ => + { + throw new Exception("Should not trigger this event"); + }); + + entityUpdatedEventTriggered = false; + await WithUnitOfWorkAsync(async () => + { + var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId); + entity.AppEntityWithValueObjectAddress = null; + await AppEntityWithNavigationsRepository.UpdateAsync(entity); + }); + entityUpdatedEventTriggered.ShouldBeTrue(); + personCreatedEventCount.ShouldBe(++entityUpdatedEventTriggerCount); + + // Test with one to one + entityUpdatedEventTriggered = false; + await WithUnitOfWorkAsync(async () => + { + var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId); + entity.OneToOne = new AppEntityWithNavigationChildOneToOne + { + ChildName = "ChildName", + OneToOne = new AppEntityWithNavigationChildOneToOneAndOneToOne + { + ChildName = "OneToOne-ChildName" + } + }; + await AppEntityWithNavigationsRepository.UpdateAsync(entity); + }); + entityUpdatedEventTriggered.ShouldBeTrue(); + personCreatedEventCount.ShouldBe(++entityUpdatedEventTriggerCount); + + var oneToOneEntityUpdatedEventTriggered = false; + var oneToOneAndOneToOneEntityUpdatedEventTriggered = false; + + LocalEventBus.Subscribe>(async _ => + { + oneToOneEntityUpdatedEventTriggered = true; + }); + LocalEventBus.Subscribe>(async _ => + { + oneToOneAndOneToOneEntityUpdatedEventTriggered = true; + }); + + entityUpdatedEventTriggered = false; + await WithUnitOfWorkAsync(async () => + { + var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId); + entity.OneToOne.ChildName = "ChildName2"; + await AppEntityWithNavigationsRepository.UpdateAsync(entity); + }); + entityUpdatedEventTriggered.ShouldBeTrue(); + oneToOneEntityUpdatedEventTriggered.ShouldBeTrue(); + oneToOneAndOneToOneEntityUpdatedEventTriggered.ShouldBeFalse(); + personCreatedEventCount.ShouldBe(++entityUpdatedEventTriggerCount); + + entityUpdatedEventTriggered = false; + oneToOneEntityUpdatedEventTriggered = false; + oneToOneAndOneToOneEntityUpdatedEventTriggered = false; + await WithUnitOfWorkAsync(async () => + { + var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId); + entity.OneToOne.OneToOne.ChildName = "OneToOne-ChildName2"; + await AppEntityWithNavigationsRepository.UpdateAsync(entity); + }); + entityUpdatedEventTriggered.ShouldBeTrue(); + oneToOneEntityUpdatedEventTriggered.ShouldBeTrue(); + oneToOneAndOneToOneEntityUpdatedEventTriggered.ShouldBeTrue(); + personCreatedEventCount.ShouldBe(++entityUpdatedEventTriggerCount); + + LocalEventBus.Subscribe>(_ => + { + throw new Exception("Should not trigger this event"); + }); + + entityUpdatedEventTriggered = false; + await WithUnitOfWorkAsync(async () => + { + var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId); + entity.OneToOne = null; + await AppEntityWithNavigationsRepository.UpdateAsync(entity); + }); + entityUpdatedEventTriggered.ShouldBeTrue(); + personCreatedEventCount.ShouldBe(++entityUpdatedEventTriggerCount); + + // Test with one to many + entityUpdatedEventTriggered = false; + await WithUnitOfWorkAsync(async () => + { + var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId); + entity.OneToMany = new List() + { + new AppEntityWithNavigationChildOneToMany + { + AppEntityWithNavigationId = entity.Id, + ChildName = "ChildName1", + OneToMany = new List() + { + new AppEntityWithNavigationChildOneToManyAndOneToMany() + { + ChildName = "OneToMany-ChildName1" + } + } + } + }; + await AppEntityWithNavigationsRepository.UpdateAsync(entity); + }); + entityUpdatedEventTriggered.ShouldBeTrue(); + personCreatedEventCount.ShouldBe(++entityUpdatedEventTriggerCount); + + var oneToManyEntityUpdatedEventTriggered = false; + var oneToManyAndOneToManyEntityUpdatedEventTriggered = false; + + LocalEventBus.Subscribe>(async _ => + { + oneToManyEntityUpdatedEventTriggered = true; + }); + LocalEventBus.Subscribe>(async _ => + { + oneToManyAndOneToManyEntityUpdatedEventTriggered = true; + }); + + entityUpdatedEventTriggered = false; + await WithUnitOfWorkAsync(async () => + { + var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId); + entity.OneToMany[0].ChildName = "ChildName2"; + await AppEntityWithNavigationsRepository.UpdateAsync(entity); + }); + entityUpdatedEventTriggered.ShouldBeTrue(); + oneToManyEntityUpdatedEventTriggered.ShouldBeTrue(); + oneToManyAndOneToManyEntityUpdatedEventTriggered.ShouldBeFalse(); + personCreatedEventCount.ShouldBe(++entityUpdatedEventTriggerCount); + + entityUpdatedEventTriggered = false; + oneToManyEntityUpdatedEventTriggered = false; + oneToManyAndOneToManyEntityUpdatedEventTriggered = false; + await WithUnitOfWorkAsync(async () => + { + var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId); + entity.OneToMany[0].OneToMany[0].ChildName = "OneToMany-ChildName2"; + await AppEntityWithNavigationsRepository.UpdateAsync(entity); + }); + entityUpdatedEventTriggered.ShouldBeTrue(); + oneToManyEntityUpdatedEventTriggered.ShouldBeTrue(); + oneToManyAndOneToManyEntityUpdatedEventTriggered.ShouldBeTrue(); + personCreatedEventCount.ShouldBe(++entityUpdatedEventTriggerCount); + + LocalEventBus.Subscribe>(_ => + { + throw new Exception("Should not trigger this event"); + }); + + entityUpdatedEventTriggered = false; + await WithUnitOfWorkAsync(async () => + { + var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId); + entity.OneToMany.Clear(); + await AppEntityWithNavigationsRepository.UpdateAsync(entity); + }); + entityUpdatedEventTriggered.ShouldBeTrue(); + personCreatedEventCount.ShouldBe(++entityUpdatedEventTriggerCount); + + // Test with many to many + entityUpdatedEventTriggered = false; + await WithUnitOfWorkAsync(async () => + { + var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId); + entity.ManyToMany = new List() + { + new AppEntityWithNavigationChildManyToMany + { + ChildName = "ChildName1" + } + }; + await AppEntityWithNavigationsRepository.UpdateAsync(entity); + }); + entityUpdatedEventTriggered.ShouldBeTrue(); + personCreatedEventCount.ShouldBe(++entityUpdatedEventTriggerCount); + + entityUpdatedEventTriggered = false; + await WithUnitOfWorkAsync(async () => + { + var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId); + entity.ManyToMany[0].ChildName = "ChildName2"; + await AppEntityWithNavigationsRepository.UpdateAsync(entity); + }); + entityUpdatedEventTriggered.ShouldBeTrue(); + personCreatedEventCount.ShouldBe(++entityUpdatedEventTriggerCount); + + entityUpdatedEventTriggered = false; + await WithUnitOfWorkAsync(async () => + { + var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId); + entity.ManyToMany.Clear(); + await AppEntityWithNavigationsRepository.UpdateAsync(entity); + }); + entityUpdatedEventTriggered.ShouldBeTrue(); + personCreatedEventCount.ShouldBe(++entityUpdatedEventTriggerCount); + } + [Fact] public async Task Should_Trigger_Domain_Events_For_Aggregate_Root_When_EnsureCollectionLoaded_Navigation_Changes_Tests() { + _loadEntityWithDetails = true; + var entityId = Guid.NewGuid(); await AppEntityWithNavigationsRepository.InsertAsync(new AppEntityWithNavigations(entityId, "TestEntity") diff --git a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/EntityFrameworkCoreTestBase.cs b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/EntityFrameworkCoreTestBase.cs index a046c5ade9..119b169638 100644 --- a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/EntityFrameworkCoreTestBase.cs +++ b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/EntityFrameworkCoreTestBase.cs @@ -1,8 +1,8 @@ -using Volo.Abp.Testing; +using Volo.Abp.TestApp.Testing; namespace Volo.Abp.EntityFrameworkCore; -public abstract class EntityFrameworkCoreTestBase : AbpIntegratedTest +public abstract class EntityFrameworkCoreTestBase : TestAppTestBase { protected override void SetAbpApplicationCreationOptions(AbpApplicationCreationOptions options) { diff --git a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/DomainEvents_Tests.cs b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/DomainEvents_Tests.cs index 6032d33a2f..7db0ba180d 100644 --- a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/DomainEvents_Tests.cs +++ b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/DomainEvents_Tests.cs @@ -176,262 +176,6 @@ public abstract class DomainEvents_Tests : TestAppTestBase>(_ => - { - personCreatedEventCount++; - return Task.CompletedTask; - }); - - LocalEventBus.Subscribe>(async _ => - { - entityUpdatedEventTriggered = true; - await PersonRepository.InsertAsync(new Person(Guid.NewGuid(), Guid.NewGuid().ToString(), new Random().Next(1, 100))); - }); - - // Test with simple property - await WithUnitOfWorkAsync(async () => - { - var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId); - entity.Name = Guid.NewGuid().ToString(); - await AppEntityWithNavigationsRepository.UpdateAsync(entity); - }); - entityUpdatedEventTriggered.ShouldBeTrue(); - personCreatedEventCount.ShouldBe(++entityUpdatedEventTriggerCount); - - // Test with value object - entityUpdatedEventTriggered = false; - await WithUnitOfWorkAsync(async () => - { - var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId); - entity.AppEntityWithValueObjectAddress = new AppEntityWithValueObjectAddress("Turkey"); - await AppEntityWithNavigationsRepository.UpdateAsync(entity); - }); - entityUpdatedEventTriggered.ShouldBeTrue(); - personCreatedEventCount.ShouldBe(++entityUpdatedEventTriggerCount); - - entityUpdatedEventTriggered = false; - await WithUnitOfWorkAsync(async () => - { - var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId); - entity.AppEntityWithValueObjectAddress.Country = "USA"; - await AppEntityWithNavigationsRepository.UpdateAsync(entity); - }); - entityUpdatedEventTriggered.ShouldBeTrue(); - personCreatedEventCount.ShouldBe(++entityUpdatedEventTriggerCount); - - LocalEventBus.Subscribe>(_ => - { - throw new Exception("Should not trigger this event"); - }); - - entityUpdatedEventTriggered = false; - await WithUnitOfWorkAsync(async () => - { - var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId); - entity.AppEntityWithValueObjectAddress = null; - await AppEntityWithNavigationsRepository.UpdateAsync(entity); - }); - entityUpdatedEventTriggered.ShouldBeTrue(); - personCreatedEventCount.ShouldBe(++entityUpdatedEventTriggerCount); - - // Test with one to one - entityUpdatedEventTriggered = false; - await WithUnitOfWorkAsync(async () => - { - var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId); - entity.OneToOne = new AppEntityWithNavigationChildOneToOne - { - ChildName = "ChildName", - OneToOne = new AppEntityWithNavigationChildOneToOneAndOneToOne - { - ChildName = "OneToOne-ChildName" - } - }; - await AppEntityWithNavigationsRepository.UpdateAsync(entity); - }); - entityUpdatedEventTriggered.ShouldBeTrue(); - personCreatedEventCount.ShouldBe(++entityUpdatedEventTriggerCount); - - var oneToOneEntityUpdatedEventTriggered = false; - var oneToOneAndOneToOneEntityUpdatedEventTriggered = false; - - LocalEventBus.Subscribe>(async _ => - { - oneToOneEntityUpdatedEventTriggered = true; - }); - LocalEventBus.Subscribe>(async _ => - { - oneToOneAndOneToOneEntityUpdatedEventTriggered = true; - }); - - entityUpdatedEventTriggered = false; - await WithUnitOfWorkAsync(async () => - { - var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId); - entity.OneToOne.ChildName = "ChildName2"; - await AppEntityWithNavigationsRepository.UpdateAsync(entity); - }); - entityUpdatedEventTriggered.ShouldBeTrue(); - oneToOneEntityUpdatedEventTriggered.ShouldBeTrue(); - oneToOneAndOneToOneEntityUpdatedEventTriggered.ShouldBeFalse(); - personCreatedEventCount.ShouldBe(++entityUpdatedEventTriggerCount); - - entityUpdatedEventTriggered = false; - oneToOneEntityUpdatedEventTriggered = false; - oneToOneAndOneToOneEntityUpdatedEventTriggered = false; - await WithUnitOfWorkAsync(async () => - { - var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId); - entity.OneToOne.OneToOne.ChildName = "OneToOne-ChildName2"; - await AppEntityWithNavigationsRepository.UpdateAsync(entity); - }); - entityUpdatedEventTriggered.ShouldBeTrue(); - oneToOneEntityUpdatedEventTriggered.ShouldBeTrue(); - oneToOneAndOneToOneEntityUpdatedEventTriggered.ShouldBeTrue(); - personCreatedEventCount.ShouldBe(++entityUpdatedEventTriggerCount); - - LocalEventBus.Subscribe>(_ => - { - throw new Exception("Should not trigger this event"); - }); - - entityUpdatedEventTriggered = false; - await WithUnitOfWorkAsync(async () => - { - var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId); - entity.OneToOne = null; - await AppEntityWithNavigationsRepository.UpdateAsync(entity); - }); - entityUpdatedEventTriggered.ShouldBeTrue(); - personCreatedEventCount.ShouldBe(++entityUpdatedEventTriggerCount); - - // Test with one to many - entityUpdatedEventTriggered = false; - await WithUnitOfWorkAsync(async () => - { - var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId); - entity.OneToMany = new List() - { - new AppEntityWithNavigationChildOneToMany - { - AppEntityWithNavigationId = entity.Id, - ChildName = "ChildName1", - OneToMany = new List() - { - new AppEntityWithNavigationChildOneToManyAndOneToMany() - { - ChildName = "OneToMany-ChildName1" - } - } - } - }; - await AppEntityWithNavigationsRepository.UpdateAsync(entity); - }); - entityUpdatedEventTriggered.ShouldBeTrue(); - personCreatedEventCount.ShouldBe(++entityUpdatedEventTriggerCount); - - var oneToManyEntityUpdatedEventTriggered = false; - var oneToManyAndOneToManyEntityUpdatedEventTriggered = false; - - LocalEventBus.Subscribe>(async _ => - { - oneToManyEntityUpdatedEventTriggered = true; - }); - LocalEventBus.Subscribe>(async _ => - { - oneToManyAndOneToManyEntityUpdatedEventTriggered = true; - }); - - entityUpdatedEventTriggered = false; - await WithUnitOfWorkAsync(async () => - { - var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId); - entity.OneToMany[0].ChildName = "ChildName2"; - await AppEntityWithNavigationsRepository.UpdateAsync(entity); - }); - entityUpdatedEventTriggered.ShouldBeTrue(); - oneToManyEntityUpdatedEventTriggered.ShouldBeTrue(); - oneToManyAndOneToManyEntityUpdatedEventTriggered.ShouldBeFalse(); - personCreatedEventCount.ShouldBe(++entityUpdatedEventTriggerCount); - - entityUpdatedEventTriggered = false; - oneToManyEntityUpdatedEventTriggered = false; - oneToManyAndOneToManyEntityUpdatedEventTriggered = false; - await WithUnitOfWorkAsync(async () => - { - var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId); - entity.OneToMany[0].OneToMany[0].ChildName = "OneToMany-ChildName2"; - await AppEntityWithNavigationsRepository.UpdateAsync(entity); - }); - entityUpdatedEventTriggered.ShouldBeTrue(); - oneToManyEntityUpdatedEventTriggered.ShouldBeTrue(); - oneToManyAndOneToManyEntityUpdatedEventTriggered.ShouldBeTrue(); - personCreatedEventCount.ShouldBe(++entityUpdatedEventTriggerCount); - - LocalEventBus.Subscribe>(_ => - { - throw new Exception("Should not trigger this event"); - }); - - entityUpdatedEventTriggered = false; - await WithUnitOfWorkAsync(async () => - { - var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId); - entity.OneToMany.Clear(); - await AppEntityWithNavigationsRepository.UpdateAsync(entity); - }); - entityUpdatedEventTriggered.ShouldBeTrue(); - personCreatedEventCount.ShouldBe(++entityUpdatedEventTriggerCount); - - // Test with many to many - entityUpdatedEventTriggered = false; - await WithUnitOfWorkAsync(async () => - { - var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId); - entity.ManyToMany = new List() - { - new AppEntityWithNavigationChildManyToMany - { - ChildName = "ChildName1" - } - }; - await AppEntityWithNavigationsRepository.UpdateAsync(entity); - }); - entityUpdatedEventTriggered.ShouldBeTrue(); - personCreatedEventCount.ShouldBe(++entityUpdatedEventTriggerCount); - - entityUpdatedEventTriggered = false; - await WithUnitOfWorkAsync(async () => - { - var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId); - entity.ManyToMany[0].ChildName = "ChildName2"; - await AppEntityWithNavigationsRepository.UpdateAsync(entity); - }); - entityUpdatedEventTriggered.ShouldBeTrue(); - personCreatedEventCount.ShouldBe(++entityUpdatedEventTriggerCount); - - entityUpdatedEventTriggered = false; - await WithUnitOfWorkAsync(async () => - { - var entity = await AppEntityWithNavigationsRepository.GetAsync(entityId); - entity.ManyToMany.Clear(); - await AppEntityWithNavigationsRepository.UpdateAsync(entity); - }); - entityUpdatedEventTriggered.ShouldBeTrue(); - personCreatedEventCount.ShouldBe(++entityUpdatedEventTriggerCount); - } - private class MyCustomEventData { public string Value { get; set; }