public async Task ShouldScheduleEvent5()
        {
            // arrange
            var publisher     = provider.GetService <IDomainEventOutboxPublisher>();
            var db            = provider.GetService <EntityContext>();
            var correlationId = Guid.NewGuid().ToString();
            var messageId     = Guid.NewGuid().ToString();
            var scheduleDate  = DateTime.UtcNow.AddDays(1);

            // act
            var @event = new WidgetStateChangedEvent()
            {
                WidgetId = 1, Timestamp = DateTime.UtcNow
            };
            await publisher.ScheduleAsync(JsonConvert.SerializeObject(@event), scheduleDate, new EventProperties()
            {
                EventType = "foo", Topic = "bar", RoutingKey = "baz", CorrelationId = correlationId, MessageId = messageId
            }).ConfigureAwait(false);

            await db.SaveChangesAsync().ConfigureAwait(false);

            // assert
            var messages = await db.Set <Outbox>().ToListAsync().ConfigureAwait(false);

            Assert.Single(messages);
            Assert.Equal(correlationId, messages[0].CorrelationId);
            Assert.Equal(messageId, messages[0].MessageId);
            Assert.Equal("foo", messages[0].EventType);
            Assert.Equal("bar", messages[0].Topic);
            Assert.Equal("baz", messages[0].RoutingKey);
            Assert.Equal(scheduleDate, messages[0].ScheduledDate);
        }
        public async Task ShouldScheduleEvent2()
        {
            // arrange
            var publisher     = provider.GetService <IDomainEventOutboxPublisher>();
            var db            = provider.GetService <EntityContext>();
            var correlationId = Guid.NewGuid().ToString();
            var scheduleDate  = DateTime.UtcNow.AddDays(1);

            // act
            var @event = new WidgetStateChangedEvent()
            {
                WidgetId = 1, Timestamp = DateTime.UtcNow
            };
            await publisher.ScheduleAsync(@event, scheduleDate, new EventProperties()
            {
                CorrelationId = correlationId
            }).ConfigureAwait(false);

            await db.SaveChangesAsync().ConfigureAwait(false);

            // assert
            var messages = await db.Set <Outbox>().ToListAsync().ConfigureAwait(false);

            Assert.Single(messages);
            Assert.Equal(correlationId, messages[0].CorrelationId);
            messages[0].ScheduledDate.Should().BeCloseTo(scheduleDate);
        }
        public async Task ShouldPublishEvent4()
        {
            // arrange
            var publisher     = provider.GetService <IDomainEventOutboxPublisher>();
            var db            = provider.GetService <EntityContext>();
            var correlationId = Guid.NewGuid().ToString();

            // act
            var @event = new WidgetStateChangedEvent()
            {
                WidgetId = 1, Timestamp = DateTime.UtcNow
            };
            await publisher.PublishAsync(@event, new EventProperties()
            {
                EventType = "foo", Topic = "bar", RoutingKey = "baz", CorrelationId = correlationId
            }).ConfigureAwait(false);

            await db.SaveChangesAsync().ConfigureAwait(false);

            // assert
            var messages = await db.Set <Outbox>().ToListAsync().ConfigureAwait(false);

            Assert.Single(messages);
            Assert.Equal(correlationId, messages[0].CorrelationId);
            Assert.Equal("foo", messages[0].EventType);
            Assert.Equal("bar", messages[0].Topic);
            Assert.Equal("baz", messages[0].RoutingKey);
        }
        public async Task ShouldPublishEvent1()
        {
            // arrange
            var publisher = provider.GetService <IDomainEventOutboxPublisher>();
            var db        = provider.GetService <EntityContext>();

            // act
            var @event = new WidgetStateChangedEvent()
            {
                WidgetId = 1, Timestamp = DateTime.UtcNow
            };
            await publisher.PublishAsync(@event).ConfigureAwait(false);

            await db.SaveChangesAsync().ConfigureAwait(false);

            // assert
            var messages = await db.Set <Outbox>().ToListAsync().ConfigureAwait(false);

            Assert.Single(messages);
        }
        public async Task ShouldPublishEventWithSerializerSettingsAsync()
        {
            // arrange
            var settings = provider.GetService <DomainEventPublisherSettings>();

            settings.SerializerSettings = new JsonSerializerSettings()
            {
                Converters = new List <JsonConverter> {
                    new StringEnumConverter(new SnakeCaseNamingStrategy())
                }
            };

            var db        = provider.GetService <EntityContext>();
            var publisher = new DomainEventOutboxPublisher <EntityContext>(settings, db, new NullLogger <DomainEventOutboxPublisher <EntityContext> >());

            var correlationId = Guid.NewGuid().ToString();
            var messageId     = Guid.NewGuid().ToString();

            // act
            var @event = new WidgetStateChangedEvent()
            {
                WidgetId = 1, Timestamp = DateTime.UtcNow, Status = WidgetStatus.CreatedWidget
            };
            await publisher.PublishAsync(@event, new EventProperties()
            {
                EventType = "foo", Topic = "bar", RoutingKey = "baz", CorrelationId = correlationId, MessageId = messageId
            }).ConfigureAwait(false);

            await db.SaveChangesAsync().ConfigureAwait(false);

            // assert
            var messages = await db.Set <Outbox>().ToListAsync().ConfigureAwait(false);

            Assert.Single(messages);
            Assert.Equal(correlationId, messages[0].CorrelationId);
            Assert.Equal(messageId, messages[0].MessageId);
            Assert.Equal("foo", messages[0].EventType);
            Assert.Equal("bar", messages[0].Topic);
            Assert.Equal("baz", messages[0].RoutingKey);
            Assert.Contains("created_widget", messages[0].Body);
        }
        public async Task ShouldScheduleEvent1Async()
        {
            // arrange
            var publisher    = provider.GetService <IDomainEventOutboxPublisher>();
            var db           = provider.GetService <EntityContext>();
            var scheduleDate = DateTime.UtcNow.AddDays(1);

            // act
            var @event = new WidgetStateChangedEvent()
            {
                WidgetId = 1, Timestamp = DateTime.UtcNow
            };
            await publisher.ScheduleAsync(@event, scheduleDate).ConfigureAwait(false);

            await db.SaveChangesAsync().ConfigureAwait(false);

            // assert
            var messages = await db.Set <Outbox>().ToListAsync().ConfigureAwait(false);

            Assert.Single(messages);
            messages[0].ScheduledDate.Should().BeCloseTo(scheduleDate, 5.Seconds());
        }