public void GivenSearchParametersStatusFilterUpperCaseMatchingOrganisationsGetReturned()
        {
            var organisations = EntityHelpers.CreateOrganisations(10).ToList();
            var orgToFind     = EntityHelpers.CreateOrganisation();

            orgToFind.Status = "published";
            organisations.Add(orgToFind);
            DatabaseContext.AddRange(organisations);
            DatabaseContext.SaveChanges();
            var searchParams = new OrganisationSearchRequest();

            searchParams.Search    = orgToFind.Name;
            searchParams.Sort      = "Name";
            searchParams.Status    = "PUBLISHED";
            searchParams.Direction = SortDirection.Asc.ToString();
            var gatewayResult = _classUnderTest.SearchOrganisations(searchParams).Result;

            gatewayResult.Should().NotBeNull();
            gatewayResult.First().Should().BeEquivalentTo(orgToFind, options =>
            {
                options.Excluding(ex => ex.ReviewerU);
                options.Excluding(ex => ex.Services);
                options.Excluding(ex => ex.UserOrganisations);
                return(options);
            });
        }
        public void Organisation_search_by_company_name()
        {
            _validator.Setup(x => x.IsValidUKPRN(It.IsAny <string>())).Returns(false);
            var organisations = new List <Organisation>
            {
                new Organisation {
                    UKPRN = 10001234, LegalName = "TEST PROVIDER"
                }
            };
            var organisationSearchResults = new OrganisationSearchResults
            {
                SearchResults = organisations,
                TotalCount    = 1
            };

            _repository.Setup(x => x.OrganisationSearchByName(It.IsAny <string>())).ReturnsAsync(organisationSearchResults);
            _repository.Setup(x => x.OrganisationSearchByUkPrn(It.IsAny <string>()));

            var organisationSearchRequest = new OrganisationSearchRequest {
                SearchTerm = "TEST"
            };
            Task <OrganisationSearchResults> searchResults =
                _organisationSearchHandler.Handle(organisationSearchRequest, new CancellationToken());

            searchResults.Result.SearchResults.Count().Should().Be(1);

            _repository.Verify(x => x.OrganisationSearchByName(It.IsAny <string>()), Times.Once);
            _repository.Verify(x => x.OrganisationSearchByUkPrn(It.IsAny <string>()), Times.Never);
        }
        public void Organisation_search_will_not_search_by_legal_name_if_valid_UKPRN_but_no_match_found()
        {
            _validator.Setup(x => x.IsValidUKPRN(It.IsAny <string>())).Returns(true);

            var organisationSearchResults = new OrganisationSearchResults
            {
                SearchResults = new List <Organisation>(),
                TotalCount    = 0
            };

            _repository.Setup(x => x.OrganisationSearchByName(It.IsAny <string>())).ReturnsAsync(organisationSearchResults);
            _repository.Setup(x => x.OrganisationSearchByUkPrn(It.IsAny <string>())).ReturnsAsync(organisationSearchResults);

            var organisationSearchRequest = new OrganisationSearchRequest {
                SearchTerm = "10002345"
            };
            Task <OrganisationSearchResults> searchResults =
                _organisationSearchHandler.Handle(organisationSearchRequest, new CancellationToken());

            searchResults.Result.SearchResults.Count().Should().Be(0);
            searchResults.Result.TotalCount.Should().Be(0);

            _repository.Verify(x => x.OrganisationSearchByName(It.IsAny <string>()), Times.Never);
            _repository.Verify(x => x.OrganisationSearchByUkPrn(It.IsAny <string>()), Times.Once);
        }
        public void Organisation_search_with_invalid_search_term()
        {
            _validator.Setup(x => x.IsValidSearchTerm(It.IsAny <string>())).Returns(false);

            var organisationSearchRequest = new OrganisationSearchRequest {
                SearchTerm = "10001234"
            };
            Func <Task> result = async() => await
                                 _organisationSearchHandler.Handle(organisationSearchRequest, new CancellationToken());

            result.Should().Throw <BadRequestException>();
        }
        public void Organisation_search_with_more_results_than_result_limit()
        {
            _validator.Setup(x => x.IsValidUKPRN(It.IsAny <string>())).Returns(false);

            var organisations = new List <Organisation>
            {
                new Organisation {
                    UKPRN = 10001001, LegalName = "TEST PROVIDER 1"
                },
                new Organisation {
                    UKPRN = 10001002, LegalName = "TEST PROVIDER 2"
                },
                new Organisation {
                    UKPRN = 10001003, LegalName = "TEST PROVIDER 3"
                },
                new Organisation {
                    UKPRN = 10001004, LegalName = "TEST PROVIDER 4"
                },
                new Organisation {
                    UKPRN = 10001005, LegalName = "TEST PROVIDER 5"
                }
            };

            var organisationSearchResults = new OrganisationSearchResults
            {
                SearchResults = organisations,
                TotalCount    = 17
            };

            _repository.Setup(x => x.OrganisationSearchByName(It.IsAny <string>())).ReturnsAsync(organisationSearchResults);
            _repository.Setup(x => x.OrganisationSearchByUkPrn(It.IsAny <string>()));

            var organisationSearchRequest = new OrganisationSearchRequest {
                SearchTerm = "TEST PROVIDER"
            };
            Task <OrganisationSearchResults> searchResults =
                _organisationSearchHandler.Handle(organisationSearchRequest, new CancellationToken());

            searchResults.Result.SearchResults.Count().Should().Be(5);
            searchResults.Result.TotalCount.Should().Be(17);

            _repository.Verify(x => x.OrganisationSearchByName(It.IsAny <string>()), Times.Once);
            _repository.Verify(x => x.OrganisationSearchByUkPrn(It.IsAny <string>()), Times.Never);
        }
Esempio n. 6
0
 public IActionResult SearchOrganisations([FromQuery] OrganisationSearchRequest requestParams)
 {
     //add validation
     try
     {
         var response = _organisationsUseCase.ExecuteGet(requestParams).Result;
         return(Ok(response));
     }
     catch (Exception e)
     {
         LoggingHandler.LogError(e.Message);
         return(BadRequest(
                    new ErrorResponse($"An error occurred")
         {
             Status = "Error", Errors = new List <string> {
                 $"An error occurred while processing this request.  Please see logs for details."
             }
         }));
     }
 }
        public void GivenSearchParametersStatusFilterNoMatchingOrganisationsGetReturned()
        {
            var organisations = EntityHelpers.CreateOrganisations(10).ToList();
            var orgToFind     = EntityHelpers.CreateOrganisation();

            orgToFind.Status = "published";
            organisations.Add(orgToFind);
            DatabaseContext.AddRange(organisations);
            DatabaseContext.SaveChanges();
            var searchParams = new OrganisationSearchRequest();

            searchParams.Search    = orgToFind.Name;
            searchParams.Sort      = "Name";
            searchParams.Status    = "rejected";
            searchParams.Direction = SortDirection.Asc.ToString();
            var gatewayResult = _classUnderTest.SearchOrganisations(searchParams).Result;

            gatewayResult.Should().NotBeNull();
            gatewayResult.Count.Should().Be(0);
        }
        public void Organisation_search_by_company_name_with_no_results_found()
        {
            _validator.Setup(x => x.IsValidUKPRN(It.IsAny <string>())).Returns(false);
            var emptyResults = new OrganisationSearchResults
            {
                SearchResults = new List <Organisation>(),
                TotalCount    = 0
            };

            _repository.Setup(x => x.OrganisationSearchByName(It.IsAny <string>())).ReturnsAsync(emptyResults);
            _repository.Setup(x => x.OrganisationSearchByUkPrn(It.IsAny <string>()));

            var organisationSearchRequest = new OrganisationSearchRequest {
                SearchTerm = "10001234"
            };
            Task <OrganisationSearchResults> searchResults =
                _organisationSearchHandler.Handle(organisationSearchRequest, new CancellationToken());

            searchResults.Result.SearchResults.Should().BeEmpty();

            _repository.Verify(x => x.OrganisationSearchByName(It.IsAny <string>()), Times.Once);
            _repository.Verify(x => x.OrganisationSearchByUkPrn(It.IsAny <string>()), Times.Never);
        }
        public async Task <List <OrganisationDomain> > SearchOrganisations(OrganisationSearchRequest requestParams)
        {
            // Search       search term to use (searches on [name] column for the MVP)
            // Sort         the column name by which to sort
            // Direction    sort order; asc, desc
            // Limit        maximum number of records to return
            // Offset       number of records to skip for pagination

            List <OrganisationDomain> response = new List <OrganisationDomain>();
            var direction = ConvertToEnum(requestParams.Direction);

            if (direction == SortDirection.None)
            {
                throw new UseCaseException()
                      {
                          UserErrorMessage = "The sort direction was not valid (must be one of asc, desc)"
                      }
            }
            ;

            var matchingOrganisations = Context.Organisations.AsQueryable();

            // handle search
            if (!string.IsNullOrWhiteSpace(requestParams.Search))
            {
                matchingOrganisations = matchingOrganisations.Where(o => EF.Functions.ILike(o.Name, $"%{requestParams.Search}%"));
            }

            if (!string.IsNullOrWhiteSpace(requestParams.Status))
            {
                matchingOrganisations = matchingOrganisations.Where(o => o.Status == requestParams.Status.ToLower());
            }

            // handle sort by column name and sort direction
            var entityPropName = GetEntityPropertyForColumnName(typeof(Organisation), requestParams.Sort);

            if (entityPropName == null)
            {
                throw new UseCaseException()
                      {
                          UserErrorMessage = $"The 'Sort' parameter contained the value '{requestParams.Sort}' " +
                                             "which is not a valid column name"
                      }
            }
            ;

            matchingOrganisations = (direction == SortDirection.Asc) ?
                                    matchingOrganisations.OrderBy(u => EF.Property <Organisation>(u, entityPropName)) :
                                    matchingOrganisations.OrderByDescending(u => EF.Property <Organisation>(u, entityPropName));

            // handle pagination options
            if (requestParams.Offset.HasValue)
            {
                matchingOrganisations = matchingOrganisations.Skip(requestParams.Offset.Value);
            }

            if (requestParams.Limit.HasValue)
            {
                matchingOrganisations = matchingOrganisations.Take(requestParams.Limit.Value);
            }

            try
            {
                var organisationList = await matchingOrganisations
                                       .Include(o => o.ReviewerU)
                                       .Include(o => o.UserOrganisations)
                                       .ThenInclude(uo => uo.User)
                                       .AsNoTracking()
                                       .ToListAsync()
                                       .ConfigureAwait(false);

                response = _mapper.ToDomain(organisationList);
            }
            catch (InvalidOperationException e)
            {
                throw new UseCaseException()
                      {
                          UserErrorMessage = "Could not run the user search query with the supplied input parameters",
                          DevErrorMessage  = e.Message
                      };
            }

            return(response);
        }
        public async Task <OrganisationResponseList> ExecuteGet(OrganisationSearchRequest requestParams)
        {
            var gatewayResponse = await _organisationsGateway.SearchOrganisations(requestParams).ConfigureAwait(false);

            return(gatewayResponse == null ? new OrganisationResponseList() : gatewayResponse.ToResponse());
        }
 public async Task <IActionResult> Index(OrganisationSearchRequest searchQuery)
 {
     return(Ok(await _mediator.Send(searchQuery)));
 }