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)); }
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); }
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); }
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)); }
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>())); }
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}"); } }