Exemple #1
0
        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()
            });
        }
Exemple #4
0
        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);
        }
Exemple #5
0
        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);
        }
Exemple #6
0
        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);
        }
Exemple #7
0
        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);
        }