public void HandleCallsFindByOnRepositoryWithExpectedItems(string topics, string types, long fromTimestamp, long toTimeStamp) { // Arrange Mock <IAuditLogItemRepository> repositoryMock = new Mock <IAuditLogItemRepository>(); Mock <IEventPublisher> eventPublisherMock = new Mock <IEventPublisher>(); List <string> topicNames = topics.Split(',').ToList(); List <string> typeNames = types.Split(',').ToList(); ReplayCommandListener commandListener = new ReplayCommandListener(repositoryMock.Object, eventPublisherMock.Object, new LoggerFactory()); ReplayEventsCommand command = new ReplayEventsCommand(toTimeStamp) { Topics = topicNames, Types = typeNames, FromTimeStamp = fromTimestamp }; AuditLogItemCriteria criteria = null; repositoryMock.Setup(e => e.FindBy(It.IsAny <AuditLogItemCriteria>())) .Callback <AuditLogItemCriteria>(e => criteria = e); // Act commandListener.Handle(command); // Assert Assert.AreEqual(fromTimestamp, criteria.FromTimeStamp); Assert.AreEqual(toTimeStamp, criteria.ToTimeStamp); Assert.AreEqual(topicNames, criteria.Topics); Assert.AreEqual(typeNames, criteria.Types); }
/// <summary> /// Retrieve audit log items based on criteria /// </summary> public IEnumerable <AuditLogItem> FindBy(AuditLogItemCriteria criteria) { return(_auditLogContext.AuditLogItems .AsNoTracking() .AsParallel() .Where(dbItem => criteria.AllowMetaEvents || !ReplayTopicNames.MetaTopics.Contains(dbItem.Topic)) .Where(dbItem => criteria.ToTimeStamp >= dbItem.TimeStamp) .Where(dbItem => criteria.FromTimeStamp <= dbItem.TimeStamp) .Where(dbItem => !criteria.Topics.Any() || criteria.Topics.Contains(dbItem.Topic)) .Where(dbItem => !criteria.Types.Any() || criteria.Types.Contains(dbItem.Type))); }
public ReplayEventsResult Handle(ReplayEventsCommand command) { AuditLogItemCriteria criteria = (AuditLogItemCriteria)command; _logger.LogInformation($"Received replaycommand with criteria: From: {criteria.FromTimeStamp}, " + $"to: {criteria.ToTimeStamp}, " + $"topics: {string.Join(',', criteria.Topics)} and " + $"types: {string.Join(',', criteria.Types)}"); IEnumerable <AuditLogItem> auditLogItems = _repository.FindBy(criteria).ToList(); _logger.LogDebug($"Found {auditLogItems.Count()} in the database"); Task.Run(() => { _logger.LogInformation($"Publishing start event with process id {command.ProcessId}"); _eventPublisher.Publish(new StartReplayEvent(command.ProcessId)); List <Task> tasks = new List <Task>(); foreach (AuditLogItem logItem in auditLogItems) { _logger.LogTrace($"Publishing logitem with id {logItem.Id}"); try { Task task = _eventPublisher.PublishAsync(logItem.TimeStamp, $"{ReplayTopicNames.ReplayEventTopicPrefix}{logItem.Topic}", new Guid(logItem.Id), logItem.Type, logItem.Data); tasks.Add(task); } catch (Exception e) { _logger.LogCritical($"A critical exception occured while asynchronously publishing event {logItem.Id} " + $"with exception {e.Message}"); throw; } } ; _logger.LogTrace("Waiting for all events to be published"); Task.WaitAll(tasks.ToArray()); _logger.LogInformation($"Publishing end event with process id {command.ProcessId}"); _eventPublisher.Publish(new EndReplayEvent(command.ProcessId)); }); _logger.LogDebug("Publishing ReplayEventsResult with auditlogitems count"); return(new ReplayEventsResult { AmountOfEvents = auditLogItems.Count() }); }
public void RetrievingItemsFromSpecificTimePeriodWorks(long fromTimeStamp, long toTimeStamp, int expectedAmount) { // Arrange InjectData(_dummyData); using var context = new AuditLogContext(_options); var repository = new AuditLogItemRepository(context); var criteria = new AuditLogItemCriteria { FromTimeStamp = fromTimeStamp, ToTimeStamp = toTimeStamp }; // Act AuditLogItem[] results = repository.FindBy(criteria).ToArray(); // Assert Assert.AreEqual(expectedAmount, results.Length); }
public void RetrievingItemsWithTypeWorks(string types, int expectedAmount) { string[] typeNames = types.Split(','); // Arrange InjectData(_dummyData); using var context = new AuditLogContext(_options); var repository = new AuditLogItemRepository(context); var criteria = new AuditLogItemCriteria { Types = typeNames, ToTimeStamp = 100 }; // Act AuditLogItem[] results = repository.FindBy(criteria).ToArray(); // Assert Assert.AreEqual(expectedAmount, results.Length); }
public void AllowingMetaEventsFiltersEvents(bool allowMeta, int expectedAmount) { // Arrange InjectData(_dummyData); using var context = new AuditLogContext(_options); var repository = new AuditLogItemRepository(context); var criteria = new AuditLogItemCriteria { AllowMetaEvents = allowMeta, ToTimeStamp = 600, FromTimeStamp = 0 }; // Act AuditLogItem[] results = repository.FindBy(criteria).ToArray(); // Assert Assert.AreEqual(expectedAmount, results.Length); }
public void CriteriaCanBeCreatedFromCastingReplayCommand(string topics, string types, long fromTimestamp, long toTimeStamp) { // Arrange List <string> topicNames = topics.Split(',').ToList(); List <string> typeNames = types.Split(',').ToList(); ReplayEventsCommand replayEventsCommand = new ReplayEventsCommand(toTimeStamp) { FromTimeStamp = fromTimestamp, Topics = topicNames, Types = typeNames }; // Act AuditLogItemCriteria criteria = (AuditLogItemCriteria)replayEventsCommand; // Assert Assert.AreEqual(topicNames, criteria.Topics); Assert.AreEqual(typeNames, criteria.Types); Assert.AreEqual(fromTimestamp, criteria.FromTimeStamp); Assert.AreEqual(toTimeStamp, criteria.ToTimeStamp); }