public async Task GetProviderById_WhenProviderIdDoesNotExistForProviderVersion_NotFoundReturned()
        {
            // Arrange
            ProviderVersionViewModel providerVersionViewModel = CreateProviderVersion();

            Provider provider = GetProvider();

            providerVersionViewModel.Providers   = providerVersionViewModel.Providers.Concat(new[] { provider });
            providerVersionViewModel.VersionType = ProviderVersionType.Custom;

            ICacheProvider cacheProvider = CreateCacheProvider();

            SearchResults <ProvidersIndex> searchResults = new SearchResults <ProvidersIndex>();

            ISearchRepository <ProvidersIndex> searchRepository = CreateSearchRepository();

            searchRepository
            .Search(Arg.Any <string>(), Arg.Any <SearchParameters>())
            .Returns(searchResults);

            IProviderVersionSearchService providerService = CreateProviderVersionSearchService(cacheProvider: cacheProvider, searchRepository: searchRepository);

            // Act
            IActionResult notFoundRequest = await providerService.GetProviderById(providerVersionViewModel.ProviderVersionId, string.Empty);

            await searchRepository.Received(1)
            .Search(Arg.Any <string>(), Arg.Is <SearchParameters>(c => c.Filter.Contains(providerVersionViewModel.ProviderVersionId)));

            notFoundRequest
            .Should()
            .BeOfType <NotFoundResult>();
        }
        public async Task GetProviderById_WhenSearchThrowsError_InternalServerErrorThrown()
        {
            // Arrange
            ProviderVersionViewModel providerVersionViewModel = CreateProviderVersion();

            Provider provider = GetProvider();

            providerVersionViewModel.Providers   = providerVersionViewModel.Providers.Concat(new[] { provider });
            providerVersionViewModel.VersionType = ProviderVersionType.Custom;

            ICacheProvider cacheProvider = CreateCacheProvider();

            SearchResults <ProvidersIndex> searchResults = new SearchResults <ProvidersIndex>();

            ISearchRepository <ProvidersIndex> searchRepository = CreateSearchRepository();

            searchRepository
            .When(s => s.Search(Arg.Any <string>(), Arg.Any <SearchParameters>()))
            .Do(x => { throw new FailedToQuerySearchException("Test Message", null); });

            IProviderVersionSearchService providerService = CreateProviderVersionSearchService(cacheProvider: cacheProvider, searchRepository: searchRepository);

            // Act
            IActionResult internalServerResult = await providerService.GetProviderById(providerVersionViewModel.ProviderVersionId, string.Empty);

            await searchRepository.Received(1)
            .Search(Arg.Any <string>(), Arg.Is <SearchParameters>(c => c.Filter.Contains(providerVersionViewModel.ProviderVersionId)));

            internalServerResult
            .Should()
            .BeOfType <InternalServerErrorResult>();
        }
        public async Task GetProviderById_WhenProviderIdExistsForDate_ProviderReturned(int day, int month, int year)
        {
            // Arrange
            ProviderVersionViewModel providerVersionViewModel = CreateProviderVersion();

            Provider provider = GetProvider();

            providerVersionViewModel.Providers   = providerVersionViewModel.Providers.Concat(new[] { provider });
            providerVersionViewModel.VersionType = ProviderVersionType.Custom;

            ICacheProvider cacheProvider = CreateCacheProvider();

            SearchResults <ProvidersIndex> searchResults = new SearchResults <ProvidersIndex> {
                Results = new List <Repositories.Common.Search.SearchResult <ProvidersIndex> > {
                    new Repositories.Common.Search.SearchResult <ProvidersIndex> {
                        Result = new ProvidersIndex {
                            ProviderVersionId = provider.ProviderVersionId, UKPRN = provider.UKPRN
                        }
                    }
                }
            };

            IProviderVersionService providerVersionService = CreateProviderVersionService();

            ISearchRepository <ProvidersIndex> searchRepository = CreateSearchRepository();

            searchRepository
            .Search(Arg.Any <string>(), Arg.Any <SearchParameters>())
            .Returns(searchResults);

            IProviderVersionSearchService providerService = CreateProviderVersionSearchService(cacheProvider: cacheProvider, searchRepository: searchRepository, providerVersionService: providerVersionService);

            providerVersionService
            .GetProviderVersionByDate(Arg.Any <int>(), Arg.Any <int>(), Arg.Any <int>())
            .Returns <ProviderVersionByDate>(new ProviderVersionByDate {
                Day = day, Month = month, Year = year, ProviderVersionId = provider.ProviderVersionId
            });

            // Act
            IActionResult okRequest = await providerService.GetProviderById(year, month, day, provider.ProviderId);

            await searchRepository.Received(1)
            .Search(Arg.Any <string>(), Arg.Is <SearchParameters>(c => c.Filter.Contains(provider.ProviderId)));

            okRequest
            .Should()
            .BeOfType <OkObjectResult>();

            ((OkObjectResult)okRequest).Value
            .Should()
            .BeOfType <ProviderVersionSearchResult>();

            Assert.AreEqual(((ProviderVersionSearchResult)((OkObjectResult)okRequest).Value).Id, provider.ProviderVersionId + "_" + provider.UKPRN);
        }
        public async Task <IActionResult> GetCurrentProviderForFundingStream(string fundingStreamId,
                                                                             string providerId)
        {
            Guard.IsNullOrWhiteSpace(fundingStreamId, nameof(fundingStreamId));
            Guard.IsNullOrWhiteSpace(providerId, nameof(providerId));

            CurrentProviderVersion currentProviderVersion = await GetCurrentProviderVersion(fundingStreamId);

            if (currentProviderVersion == null)
            {
                LogError("Unable to get current provider for funding stream. " +
                         $"No current provider version information located for {fundingStreamId}");

                return(new NotFoundResult());
            }

            return(await _providerVersionSearchPolicy.ExecuteAsync(()
                                                                   => _providerVersionSearch.GetProviderById(currentProviderVersion.ProviderVersionId, providerId)));
        }
        public async Task GetProviderById_WhenProviderIdDoesNotExistsForDate_NotFoundReturned(int day, int month, int year)
        {
            // Arrange
            ProviderVersionViewModel providerVersionViewModel = CreateProviderVersion();

            Provider provider = GetProvider();

            providerVersionViewModel.Providers   = providerVersionViewModel.Providers.Concat(new[] { provider });
            providerVersionViewModel.VersionType = ProviderVersionType.Custom;

            ICacheProvider cacheProvider = CreateCacheProvider();

            SearchResults <ProvidersIndex> searchResults = new SearchResults <ProvidersIndex>();

            ISearchRepository <ProvidersIndex> searchRepository = CreateSearchRepository();

            searchRepository
            .Search(Arg.Any <string>(), Arg.Any <SearchParameters>())
            .Returns(searchResults);

            IProviderVersionService providerVersionService = CreateProviderVersionService();

            string providerVersionId = Guid.NewGuid().ToString();

            providerVersionService
            .GetProviderVersionByDate(Arg.Any <int>(), Arg.Any <int>(), Arg.Any <int>())
            .Returns <ProviderVersionByDate>(new ProviderVersionByDate {
                Day = day, Month = month, Year = year, ProviderVersionId = providerVersionId
            });

            IProviderVersionSearchService providerService = CreateProviderVersionSearchService(cacheProvider: cacheProvider, searchRepository: searchRepository, providerVersionService: providerVersionService);

            // Act
            IActionResult notFoundRequest = await providerService.GetProviderById(year, month, day, "12345");

            await searchRepository.Received(1)
            .Search(Arg.Any <string>(), Arg.Is <SearchParameters>(c => c.Filter.Contains(providerVersionId)));

            notFoundRequest
            .Should()
            .BeOfType <NotFoundResult>();
        }
 public async Task <IActionResult> GetProviderByIdFromProviderVersion([FromRoute] int year, [FromRoute] int month, [FromRoute] int day, [FromRoute] string providerId)
 {
     return(await _providerVersionSearchService.GetProviderById(year, month, day, providerId));
 }
 public async Task <IActionResult> GetProviderByIdFromProviderVersion([FromRoute] string providerVersionId, [FromRoute] string providerId)
 {
     return(await _providerVersionSearchService.GetProviderById(providerVersionId, providerId));
 }