public async Task Should_Not_Call_Action_After_Unregister_2()
        {
            var totalData = 0;

            var action = new Func <MySimpleEventData, Task>(
                eventData =>
            {
                totalData += eventData.Value;
                return(Task.CompletedTask);
            });

            LocalEventBus.Subscribe(action);

            await LocalEventBus.PublishAsync(new MySimpleEventData(1));

            await LocalEventBus.PublishAsync(new MySimpleEventData(2));

            await LocalEventBus.PublishAsync(new MySimpleEventData(3));

            LocalEventBus.Unsubscribe(action);

            await LocalEventBus.PublishAsync(new MySimpleEventData(4));

            Assert.Equal(6, totalData);
        }
        public async Task Should_Throw_Single_Exception_If_Only_One_Of_Handlers_Fails()
        {
            LocalEventBus.Subscribe <MySimpleEventData>(eventData => throw new Exception("This exception is intentionally thrown!"));

            var appException = await Assert.ThrowsAsync <Exception>(async() =>
            {
                await LocalEventBus.PublishAsync(new MySimpleEventData(1));
            });

            appException.Message.ShouldBe("This exception is intentionally thrown!");
        }
Exemple #3
0
        public async Task Should_Change_TenantId_If_EventData_Is_MultiTenant()
        {
            var tenantId = Guid.NewGuid();
            var handler  = new MyEventHandler(GetRequiredService <ICurrentTenant>());

            LocalEventBus.Subscribe <EntityChangedEventData <MyEntity> >(handler);

            await LocalEventBus.PublishAsync(new EntityCreatedEventData <MyEntity>(new MyEntity(tenantId)));

            handler.TenantId.ShouldBe(tenantId);
        }
        public async Task Should_Automatically_Register_EventHandlers_From_Services()
        {
            await LocalEventBus.PublishAsync(new MySimpleEventData(1));

            await LocalEventBus.PublishAsync(new MySimpleEventData(2));

            await LocalEventBus.PublishAsync(new MySimpleEventData(3));

            await LocalEventBus.PublishAsync(new MySimpleEventData(4));

            GetRequiredService <MySimpleEventDataHandler>().TotalData.ShouldBe(10);
        }
        public async Task Should_Call_Created_And_Changed_Once()
        {
            var handler = new MyEventHandler();

            LocalEventBus.Subscribe <EntityChangedEventData <MyEntity> >(handler);
            LocalEventBus.Subscribe <EntityCreatedEventData <MyEntity> >(handler);

            await LocalEventBus.PublishAsync(new EntityCreatedEventData <MyEntity>(new MyEntity()));

            handler.EntityCreatedEventCount.ShouldBe(1);
            handler.EntityChangedEventCount.ShouldBe(1);
        }
        public async Task Should_Call_Handler_AndDispose()
        {
            LocalEventBus.Subscribe <MySimpleEventData, MySimpleTransientEventHandler>();

            await LocalEventBus.PublishAsync(new MySimpleEventData(1));

            await LocalEventBus.PublishAsync(new MySimpleEventData(2));

            await LocalEventBus.PublishAsync(new MySimpleEventData(3));

            Assert.Equal(3, MySimpleTransientEventHandler.HandleCount);
            Assert.Equal(3, MySimpleTransientEventHandler.DisposeCount);
        }
        public async Task Should_Trigger_For_Inherited_Generic_2()
        {
            var triggeredEvent = false;

            LocalEventBus.Subscribe <EntityChangedEventData <Person> >(
                eventData =>
            {
                eventData.Entity.Id.ShouldBe(42);
                triggeredEvent = true;
                return(Task.CompletedTask);
            });

            await LocalEventBus.PublishAsync(new EntityChangedEventData <Student>(new Student(42)));

            triggeredEvent.ShouldBe(true);
        }
        public async Task Should_Throw_Aggregate_Exception_If_More_Than_One_Of_Handlers_Fail()
        {
            LocalEventBus.Subscribe <MySimpleEventData>(
                eventData => throw new Exception("This exception is intentionally thrown #1!"));

            LocalEventBus.Subscribe <MySimpleEventData>(
                eventData => throw new Exception("This exception is intentionally thrown #2!"));

            var aggrException = await Assert.ThrowsAsync <AggregateException>(async() =>
            {
                await LocalEventBus.PublishAsync(new MySimpleEventData(1));
            });

            aggrException.InnerExceptions.Count.ShouldBe(2);
            aggrException.InnerExceptions[0].Message.ShouldBe("This exception is intentionally thrown #1!");
            aggrException.InnerExceptions[1].Message.ShouldBe("This exception is intentionally thrown #2!");
        }
        public async Task Should_Not_Handle_Exception()
        {
            var retryAttempt = 0;

            LocalEventBus.Subscribe <MySimpleEventData>(eventData =>
            {
                retryAttempt++;
                throw new Exception("This exception is intentionally thrown!");
            });

            var appException = await Assert.ThrowsAsync <Exception>(async() =>
            {
                await LocalEventBus.PublishAsync(new MySimpleEventData(1));
            });

            retryAttempt.ShouldBe(1);
            appException.Message.ShouldBe("This exception is intentionally thrown!");
        }
Exemple #10
0
        public async Task Should_Handle_Exception()
        {
            var retryAttempt = 0;

            LocalEventBus.Subscribe <MyExceptionHandleEventData>(eventData =>
            {
                eventData.Value.ShouldBe(0);
                retryAttempt++;
                if (retryAttempt < 2)
                {
                    throw new Exception("This exception is intentionally thrown!");
                }

                return(Task.CompletedTask);
            });

            await LocalEventBus.PublishAsync(new MyExceptionHandleEventData(0));

            retryAttempt.ShouldBe(2);
        }
Exemple #11
0
        public async Task Should_Handle_Events_For_Derived_Classes()
        {
            var totalData = 0;

            LocalEventBus.Subscribe <MySimpleEventData>(
                eventData =>
            {
                totalData += eventData.Value;
                return(Task.CompletedTask);
            });

            await LocalEventBus.PublishAsync(new MySimpleEventData(1)).ConfigureAwait(false);  //Should handle directly registered class

            await LocalEventBus.PublishAsync(new MySimpleEventData(2)).ConfigureAwait(false);  //Should handle directly registered class

            await LocalEventBus.PublishAsync(new MyDerivedEventData(3)).ConfigureAwait(false); //Should handle derived class too

            await LocalEventBus.PublishAsync(new MyDerivedEventData(4)).ConfigureAwait(false); //Should handle derived class too

            Assert.Equal(10, totalData);
        }
        public async Task Should_Call_Handler_With_Non_Generic_Trigger()
        {
            var totalData = 0;

            LocalEventBus.Subscribe <MySimpleEventData>(
                eventData =>
            {
                totalData += eventData.Value;
                return(Task.CompletedTask);
            });

            await LocalEventBus.PublishAsync(typeof(MySimpleEventData), new MySimpleEventData(1));

            await LocalEventBus.PublishAsync(typeof(MySimpleEventData), new MySimpleEventData(2));

            await LocalEventBus.PublishAsync(typeof(MySimpleEventData), new MySimpleEventData(3));

            await LocalEventBus.PublishAsync(typeof(MySimpleEventData), new MySimpleEventData(4));

            Assert.Equal(10, totalData);
        }
        public async Task Should_Call_Action_On_Event_With_Correct_Source()
        {
            var totalData = 0;

            LocalEventBus.Subscribe <MySimpleEventData>(
                eventData =>
            {
                totalData += eventData.Value;
                return(Task.CompletedTask);
            });

            await LocalEventBus.PublishAsync(new MySimpleEventData(1));

            await LocalEventBus.PublishAsync(new MySimpleEventData(2));

            await LocalEventBus.PublishAsync(new MySimpleEventData(3));

            await LocalEventBus.PublishAsync(new MySimpleEventData(4));

            Assert.Equal(10, totalData);
        }
Exemple #14
0
        public async Task Should_Throw_Exception_After_Error_Handle()
        {
            var retryAttempt = 0;

            LocalEventBus.Subscribe <MyExceptionHandleEventData>(eventData =>
            {
                eventData.Value.ShouldBe(0);

                retryAttempt++;

                throw new Exception("This exception is intentionally thrown!");
            });

            var appException = await Assert.ThrowsAsync <Exception>(async() =>
            {
                await LocalEventBus.PublishAsync(new MyExceptionHandleEventData(0));
            });

            retryAttempt.ShouldBe(4);
            appException.Message.ShouldBe("This exception is intentionally thrown!");
        }
Exemple #15
0
        public async Task Should_Not_Handle_Events_For_Base_Classes()
        {
            var totalData = 0;

            LocalEventBus.Subscribe <MyDerivedEventData>(
                eventData =>
            {
                totalData += eventData.Value;
                return(Task.CompletedTask);
            });

            await LocalEventBus.PublishAsync(new MySimpleEventData(1)).ConfigureAwait(false);  //Should not handle

            await LocalEventBus.PublishAsync(new MySimpleEventData(2)).ConfigureAwait(false);  //Should not handle

            await LocalEventBus.PublishAsync(new MyDerivedEventData(3)).ConfigureAwait(false); //Should handle

            await LocalEventBus.PublishAsync(new MyDerivedEventData(4)).ConfigureAwait(false); //Should handle

            Assert.Equal(7, totalData);
        }
        public async Task Should_Call_Action_On_Event_With_Correct_Source_Async()
        {
            int totalData = 0;

            LocalEventBus.Subscribe <MySimpleEventData>(
                async eventData =>
            {
                await Task.Delay(20);
                Interlocked.Add(ref totalData, eventData.Value);
                await Task.Delay(20);
            });

            await LocalEventBus.PublishAsync(new MySimpleEventData(1));

            await LocalEventBus.PublishAsync(new MySimpleEventData(2));

            await LocalEventBus.PublishAsync(new MySimpleEventData(3));

            await LocalEventBus.PublishAsync(new MySimpleEventData(4));

            Assert.Equal(10, totalData);
        }
        public async Task Should_Not_Call_Action_After_Unregister_1()
        {
            var totalData = 0;

            var registerDisposer = LocalEventBus.Subscribe <MySimpleEventData>(
                eventData =>
            {
                totalData += eventData.Value;
                return(Task.CompletedTask);
            });

            await LocalEventBus.PublishAsync(new MySimpleEventData(1));

            await LocalEventBus.PublishAsync(new MySimpleEventData(2));

            await LocalEventBus.PublishAsync(new MySimpleEventData(3));

            registerDisposer.Dispose();

            await LocalEventBus.PublishAsync(new MySimpleEventData(4));

            Assert.Equal(6, totalData);
        }