Example #1
0
        public void HandleShouldCallBasicAck()
        {
            // Arrange
            var sender = new object();
            var basicDeliverEventArgs = new BasicDeliverEventArgs
            {
                BasicProperties = new BasicProperties
                {
                    Type      = "SomeCommand",
                    Timestamp = new AmqpTimestamp(new DateTime(2019, 6, 4).Ticks),
                },
                Body = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(new ReplayEventsCommand
                {
                    EventType          = "DomainEvent",
                    RoutingKey         = "Test.*",
                    ReplayExchangeName = "AuditLog.TestExchange"
                })),
                RoutingKey = "TestQueue",
            };
            var eventReplayerMock     = new Mock <IEventReplayer>();
            var repositoryMock        = new Mock <IAuditLogRepository <LogEntry, long> >();
            var repository            = repositoryMock.Object;
            var eventReplayer         = eventReplayerMock.Object;
            var routingKeyMatcherMock = new Mock <IRoutingKeyMatcher>();
            var routingKeyMatcher     = routingKeyMatcherMock.Object;
            var eventBusMock          = new Mock <IEventBus>();
            var eventBus  = eventBusMock.Object;
            var modelMock = new Mock <IModel>();
            var model     = modelMock.Object;

            eventBusMock.Setup(mock => mock.Model).Returns(model);
            var commandListener = new AuditLogCommandListener(repository, eventReplayer, routingKeyMatcher, eventBus);

            repositoryMock.Setup(mock => mock.FindBy(It.IsAny <LogEntryCriteria>()))
            .Returns(new List <LogEntry>
            {
                new LogEntry
                {
                    Timestamp  = new DateTime(2019, 5, 8).Ticks,
                    RoutingKey = "Test.*",
                    EventJson  = "{'title': 'Some title'}",
                    EventType  = "DomainEvent"
                },
                new LogEntry
                {
                    Timestamp  = new DateTime(2019, 7, 2).Ticks,
                    RoutingKey = "Test.#",
                    EventJson  = "{'title': 'Some title'}",
                    EventType  = "DomainEvent"
                }
            });

            // Act
            commandListener.Handle(sender, basicDeliverEventArgs);

            // Assert
            modelMock.Verify(mock => mock.BasicAck(It.IsAny <ulong>(), false));
        }
Example #2
0
        public void ReplayEventsReturnsReplayEventResponse500()
        {
            // Arrange
            var result = new ReplayEventsResponse();
            var sender = new object();
            var basicDeliverEventArgs = new BasicDeliverEventArgs
            {
                BasicProperties = new BasicProperties
                {
                    Type      = "SomeCommand",
                    Timestamp = new AmqpTimestamp(new DateTime(2019, 6, 4).Ticks),
                },
                Body = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(new ReplayEventsCommand
                {
                    EventType  = "DomainEvent",
                    RoutingKey = "Test.*"
                })),
                RoutingKey = "TestQueue"
            };
            var eventReplayerMock     = new Mock <IEventReplayer>();
            var repositoryMock        = new Mock <IAuditLogRepository <LogEntry, long> >();
            var repository            = repositoryMock.Object;
            var eventReplayer         = eventReplayerMock.Object;
            var routingKeyMatcherMock = new Mock <IRoutingKeyMatcher>();
            var routingKeyMatcher     = routingKeyMatcherMock.Object;
            var eventBusMock          = new Mock <IEventBus>();
            var eventBus  = eventBusMock.Object;
            var modelMock = new Mock <IModel>();
            var model     = modelMock.Object;

            eventBusMock.Setup(mock => mock.Model).Returns(model);
            eventBusMock.Setup(mock => mock.PublishCommand(It.IsAny <ReplayEventsResponse>()))
            .Callback((DomainCommand response) => result = response as ReplayEventsResponse);
            var commandListener = new AuditLogCommandListener(repository, eventReplayer, routingKeyMatcher, eventBus);

            repositoryMock.Setup(mock => mock.FindBy(It.IsAny <LogEntryCriteria>()))
            .Throws(new Exception());

            // Act
            commandListener.Handle(sender, basicDeliverEventArgs);

            // Assert
            Assert.AreEqual(StatusCodes.Status500InternalServerError, result.Code);
            Assert.AreEqual("Internal Error", result.Status);
        }
Example #3
0
        public void ReplayEventCallsFindByOnRepositoryWithRightCriteria()
        {
            // Arrange
            var logEntryCriteria      = new LogEntryCriteria();
            var sender                = new object();
            var basicDeliverEventArgs = new BasicDeliverEventArgs
            {
                BasicProperties = new BasicProperties
                {
                    Type      = "SomeCommand",
                    Timestamp = new AmqpTimestamp(new DateTime(2019, 6, 4).Ticks),
                },
                Body = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(new ReplayEventsCommand
                {
                    EventType  = "DomainEvent",
                    RoutingKey = "Test.*"
                })),
                RoutingKey = "TestQueue"
            };
            var eventReplayerMock     = new Mock <IEventReplayer>();
            var repositoryMock        = new Mock <IAuditLogRepository <LogEntry, long> >();
            var repository            = repositoryMock.Object;
            var eventReplayer         = eventReplayerMock.Object;
            var routingKeyMatcherMock = new Mock <IRoutingKeyMatcher>();
            var routingKeyMatcher     = routingKeyMatcherMock.Object;
            var eventBusMock          = new Mock <IEventBus>();
            var eventBus  = eventBusMock.Object;
            var modelMock = new Mock <IModel>();
            var model     = modelMock.Object;

            eventBusMock.Setup(mock => mock.Model).Returns(model);
            var commandListener = new AuditLogCommandListener(repository, eventReplayer, routingKeyMatcher, eventBus);

            repositoryMock.Setup(mock => mock.FindBy(It.IsAny <LogEntryCriteria>()))
            .Callback((LogEntryCriteria criteria) => logEntryCriteria = criteria);

            // Act
            commandListener.Handle(sender, basicDeliverEventArgs);

            //
            Assert.AreEqual("DomainEvent", logEntryCriteria.EventType);
            Assert.AreEqual("Test.*", logEntryCriteria.RoutingKey);
            Assert.AreEqual(null, logEntryCriteria.FromTimestamp);
            Assert.AreEqual(null, logEntryCriteria.ToTimestamp);
        }
Example #4
0
        public void ShouldImplementICommandListener()
        {
            // Arrange
            var eventReplayerMock     = new Mock <IEventReplayer>();
            var repositoryMock        = new Mock <IAuditLogRepository <LogEntry, long> >();
            var repository            = repositoryMock.Object;
            var eventReplayer         = eventReplayerMock.Object;
            var routingKeyMatcherMock = new Mock <IRoutingKeyMatcher>();
            var routingKeyMatcher     = routingKeyMatcherMock.Object;
            var eventBusMock          = new Mock <IEventBus>();
            var eventBus  = eventBusMock.Object;
            var modelMock = new Mock <IModel>();
            var model     = modelMock.Object;

            eventBusMock.Setup(mock => mock.Model).Returns(model);

            // Act
            var commandListener = new AuditLogCommandListener(repository, eventReplayer, routingKeyMatcher, eventBus);

            // Assert
            Assert.IsInstanceOfType(commandListener, typeof(ICommandListener));
        }
Example #5
0
        public void ReplayEventsReturnsReplayEventsResponse()
        {
            // Arrange
            var sender = new object();
            var basicDeliverEventArgs = new BasicDeliverEventArgs
            {
                BasicProperties = new BasicProperties
                {
                    Type      = "SomeCommand",
                    Timestamp = new AmqpTimestamp(new DateTime(2019, 6, 4).Ticks),
                },
                Body = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(new ReplayEventsCommand
                {
                    EventType  = "DomainEvent",
                    RoutingKey = "Test.*"
                })),
                RoutingKey = "TestQueue"
            };
            var eventReplayerMock     = new Mock <IEventReplayer>();
            var repositoryMock        = new Mock <IAuditLogRepository <LogEntry, long> >();
            var repository            = repositoryMock.Object;
            var eventReplayer         = eventReplayerMock.Object;
            var routingKeyMatcherMock = new Mock <IRoutingKeyMatcher>();
            var routingKeyMatcher     = routingKeyMatcherMock.Object;
            var eventBusMock          = new Mock <IEventBus>();
            var eventBus  = eventBusMock.Object;
            var modelMock = new Mock <IModel>();
            var model     = modelMock.Object;

            eventBusMock.Setup(mock => mock.Model).Returns(model);
            var commandListener = new AuditLogCommandListener(repository, eventReplayer, routingKeyMatcher, eventBus);

            // Act
            commandListener.Handle(sender, basicDeliverEventArgs);

            // Assert
            eventBusMock.Verify(mock => mock.PublishCommand(It.IsAny <ReplayEventsResponse>()));
        }
Example #6
0
        public static void Main(string[] args)
        {
            var logLevel = Environment.GetEnvironmentVariable("LOG_LEVEL") ??
                           throw new InvalidEnvironmentException(
                                     "Environment variable [LOG_LEVEL] was not provided.");

            Enum.TryParse(logLevel, true, out LogLevel result);

            var loggerFactory = LoggerFactory.Create(builder => builder.SetMinimumLevel(result).AddConsole());

            AuditLogLoggerFactory.LoggerFactory = loggerFactory;

            var logger = loggerFactory.CreateLogger("Program");

            try
            {
                var connectionString = Environment.GetEnvironmentVariable("CONNECTION_STRING") ??
                                       throw new InvalidEnvironmentException(
                                                 "Environment variable [CONNECTION_STRING] was not provided.");

                var options = new DbContextOptionsBuilder <AuditLogContext>()
                              .UseMySql(connectionString)
                              .Options;
                using var context = new AuditLogContext(options);

                var       createdAndSeeded = false;
                const int waitTime         = 1000;
                while (!createdAndSeeded)
                {
                    try
                    {
                        context.Database.EnsureCreated();
                        createdAndSeeded = true;
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                        Thread.Sleep(waitTime);
                    }
                }

                var repository        = new AuditLogRepository(context);
                var routingKeyMatcher = new RoutingKeyMatcher();
                var eventListener     = new AuditLogEventListener(repository);
                var eventBusBuilder   = new EventBusBuilder().FromEnvironment();
                using var eventBus = eventBusBuilder.CreateEventBus(new ConnectionFactory
                {
                    HostName = eventBusBuilder.HostName,
                    Port     = eventBusBuilder.Port,
                    UserName = eventBusBuilder.UserName,
                    Password = eventBusBuilder.Password
                });
                var eventReplayer   = new EventReplayer(eventBus);
                var commandListener =
                    new AuditLogCommandListener(repository, eventReplayer, routingKeyMatcher, eventBus);
                eventBus.AddEventListener(eventListener, "#");
                eventBus.AddCommandListener(commandListener, "AuditLog");

                logger.LogTrace("Host started, audit logger ready to log");

                _stopEvent.WaitOne();
            }
            catch (Exception e)
            {
                logger.LogError($"Error occured while running the client with message: {e.Message}");
            }
        }