Beispiel #1
0
        public void SetUp()
        {
            sendEndpointProviderMock  = new Mock <ISendEndpointProvider>();
            _cacheServiceMock         = new Mock <ICacheService>();
            rabbitMqConfigurationMock = new Mock <IOptions <RabbitMqConfiguration> >();
            _loggerMock      = new Mock <ILogger <IDispatcher> >();
            sendEndpointMock = new Mock <ISendEndpoint>();

            RabbitMqConfiguration rabbitMqConfiguration = new RabbitMqConfiguration();

            rabbitMqConfiguration.Host     = "localhost";
            rabbitMqConfiguration.Port     = 15672;
            rabbitMqConfiguration.Username = "******";
            rabbitMqConfiguration.Password = "******";

            _cacheServiceMock.Setup(x => x.Get($"deepsearch-{NotSearchRequestKey}-{dataPartner}"))
            .Returns(Task.FromResult(JsonConvert.SerializeObject(wave)));
            _cacheServiceMock.Setup(x => x.SaveRequest(It.IsAny <SearchRequest>()))
            .Returns(Task.CompletedTask);

            _cacheServiceMock.Setup(x => x.GetRequest(It.IsAny <string>()))
            .Returns(Task.FromResult(new SearchRequest {
                DataPartners = new List <DataPartner>()
                {
                    new DataPartner {
                        Completed = false, Name = "ICBC"
                    }
                }
            }));


            _cacheServiceMock.Setup(x => x.Get($"deepsearch-{SearchRequestKey}-{dataPartner}"))
            .Returns(Task.FromResult(""));
            wave = new WaveSearchData
            {
                AllParameter       = new List <Person>(),
                CurrentWave        = 2,
                DataPartner        = dataPartner,
                NewParameter       = new List <Person>(),
                SearchRequestKey   = SearchRequestKey,
                NumberOfRetries    = 1,
                TimeBetweenRetries = 3
            };
            _cacheServiceMock.Setup(x => x.Get($"deepsearch-{NotSearchRequestKey}-{dataPartner}"))
            .Returns(Task.FromResult(JsonConvert.SerializeObject(wave)));

            sendEndpointProviderMock
            .Setup(x => x.GetSendEndpoint(It.IsAny <Uri>()))
            .Returns(Task.FromResult(sendEndpointMock.Object));


            rabbitMqConfigurationMock.Setup(x => x.Value).Returns(rabbitMqConfiguration);

            sendEndpointMock.Setup(x => x.Send <PersonSearchOrdered>(It.IsAny <PersonSearchOrdered>(), It.IsAny <CancellationToken>()))
            .Returns(Task.FromResult(sendEndpointMock));

            sut = new Dispatcher(_loggerMock.Object, sendEndpointProviderMock.Object, rabbitMqConfigurationMock.Object, _cacheServiceMock.Object);
        }
Beispiel #2
0
        public void should_have_current_wave_maximum_2()
        {
            var wave = new WaveSearchData
            {
                CurrentWave = 2
            };

            Assert.AreEqual(2, wave.CurrentWave);
        }
Beispiel #3
0
 public async Task StartAnotherWave(string searchRequestKey, WaveSearchData wave, Person person, int noOfRetries, int timeBetweenRetries)
 {
     _logger.LogInformation($"About to dispatch new wave {wave.CurrentWave} for {wave.DataPartner}");
     await _dispatcher.Dispatch(new PersonSearchRequest(person.FirstName, person.LastName, person.DateOfBirth, person.Identifiers, person.Addresses, person.Phones, person.Names, person.RelatedPersons, person.Employments, new List <DataProvider>
     {
         new DataProvider {
             Completed = false, Name = wave.DataPartner, NumberOfRetries = noOfRetries, TimeBetweenRetries = timeBetweenRetries, SearchSpeedType = wave.SearchSpeed
         }
     }, searchRequestKey), Guid.NewGuid());
 }
Beispiel #4
0
        public async Task <bool> IsWaveSearchReadyToFinalize(string searchRequestKey)
        {
            var waveData = await GetWaveDataForSearch(searchRequestKey);

            if (waveData.Any())
            {
                if (!await CurrentWaveIsCompleted(searchRequestKey))
                {
                    return(false);
                }

                if (waveData.Any(x => x.CurrentWave == _deepSearchOptions.MaxWaveCount) || NoNewParameter(waveData))
                {
                    _logger.Log(LogLevel.Information, $"{searchRequestKey} no new wave to initiate");
                    return(true);
                }
                else
                {
                    foreach (var wave in waveData)
                    {
                        if (wave.NewParameter != null)
                        {
                            //new parameter only contain 1 person.
                            foreach (var person in wave.NewParameter)
                            {
                                await _deepSearchDispatcher.StartAnotherWave(searchRequestKey, wave, person, wave.NumberOfRetries, wave.TimeBetweenRetries);
                            }
                        }
                        else
                        {
                            string cacheKey     = searchRequestKey.DeepSearchKey(wave.DataPartner);
                            var    waveMetaData = await _cacheService.Get(cacheKey);

                            if (waveMetaData != null)
                            {
                                _logger.Log(LogLevel.Information, $"{searchRequestKey} has an active wave but no new parameter");
                                WaveSearchData metaData = JsonConvert.DeserializeObject <WaveSearchData>(waveMetaData);
                                _logger.Log(LogLevel.Information, $"{searchRequestKey} Current Metadata Wave : {metaData.CurrentWave}");
                                metaData.CurrentWave++;
                                metaData.NewParameter = null;
                                await _cacheService.Save(cacheKey, metaData);

                                _logger.Log(LogLevel.Information, $"{searchRequestKey} New wave {metaData.CurrentWave} saved");
                            }
                        }
                    }
                    return(false);
                }
            }
            else
            {
                return(await AllSearchDataPartnerIsCompleted(searchRequestKey));
            }
        }
Beispiel #5
0
        public void should_have_all_parameter()
        {
            var wave = new WaveSearchData
            {
                CurrentWave  = 2,
                AllParameter = new List <Person>()
                {
                    new Person()
                }
            };

            Assert.IsInstanceOf <List <Person> >(wave.AllParameter);
        }
Beispiel #6
0
        private async Task SaveForDeepSearch(PersonSearchRequest person, DataProvider dataPartner)
        {
            _logger.Log(LogLevel.Information, $"Check if request {person.SearchRequestKey} has an active wave on-going");

            _logger.Log(LogLevel.Information, $"In wave for {person.SearchRequestKey} with {dataPartner.Name} -  {nameof(dataPartner.SearchSpeedType)} Search");

            string cacheKey     = person.SearchRequestKey.DeepSearchKey(dataPartner.Name);
            var    waveMetaData = await _cacheService.Get(cacheKey);

            if (string.IsNullOrEmpty(waveMetaData))
            {
                _logger.Log(LogLevel.Information, $"{person.SearchRequestKey} does not have active wave");
                await _cacheService.Save(cacheKey, new WaveSearchData
                {
                    AllParameter = new List <Person>
                    {
                        person
                    },
                    NewParameter       = null,
                    CurrentWave        = 1,
                    DataPartner        = dataPartner.Name,
                    NumberOfRetries    = dataPartner.NumberOfRetries,
                    TimeBetweenRetries = dataPartner.TimeBetweenRetries,
                    SearchRequestKey   = person.SearchRequestKey,
                    SearchSpeed        = dataPartner.SearchSpeedType
                });

                _logger.Log(LogLevel.Information, $"{person.SearchRequestKey} saved");
            }
            else
            {
                _logger.Log(LogLevel.Information, $"{person.SearchRequestKey} has an active wave");
                WaveSearchData metaData = JsonConvert.DeserializeObject <WaveSearchData>(waveMetaData);
                _logger.Log(LogLevel.Information, $"{person.SearchRequestKey} Current Metadata Wave : {metaData.CurrentWave}");
                metaData.CurrentWave++;
                metaData.NewParameter = null;
                await _cacheService.Save(cacheKey, metaData);

                _logger.Log(LogLevel.Information, $"{person.SearchRequestKey} New wave {metaData.CurrentWave} saved");
            }

            await ResetDataPartner(person.SearchRequestKey, dataPartner.Name);
        }