public async Task AndISearchByTextThenAllTextSearchResultsShouldBeReturned()
        {
            //Arrange
            var query = new SearchOrganisationsQuery
            {
                SearchTerm     = "test",
                MaximumResults = 500
            };

            var search1Results = new List <Organisation> {
                new Organisation(), new Organisation()
            };
            var search2Results = new List <Organisation> {
                new Organisation()
            };

            _textSearchService1.Setup(x => x.Search(query.SearchTerm, query.MaximumResults)).ReturnsAsync(search1Results);
            _textSearchService2.Setup(x => x.Search(query.SearchTerm, query.MaximumResults)).ReturnsAsync(search2Results);

            //Act
            var response = await _handler.Handle(query);

            //Assert
            var allResults = new List <Organisation>();

            allResults.AddRange(search1Results);
            allResults.AddRange(search2Results);
            CollectionAssert.AreEqual(allResults, response.Organisations);

            _referenceSearchService1.Verify(x => x.Search(It.IsAny <string>()), Times.Never);
            _referenceSearchService2.Verify(x => x.Search(It.IsAny <string>()), Times.Never);
        }
        public async Task AndISearchByReferenceThenTheMatchingRecordShouldBeReturned()
        {
            //Arrange
            var query = new SearchOrganisationsQuery
            {
                SearchTerm     = "test",
                MaximumResults = 500
            };

            var searchResult = new Organisation();

            _referenceSearchService1.Setup(x => x.IsSearchTermAReference(query.SearchTerm)).Returns(true);
            _referenceSearchService2.Setup(x => x.Search(query.SearchTerm)).ReturnsAsync((Organisation)null);
            _referenceSearchService2.Setup(x => x.IsSearchTermAReference(query.SearchTerm)).Returns(true);
            _referenceSearchService2.Setup(x => x.Search(query.SearchTerm)).ReturnsAsync(searchResult);

            //Act
            var response = await _handler.Handle(query);

            //Assert
            Assert.AreEqual(searchResult, response.Organisations.Single());

            _textSearchService1.Verify(x => x.Search(It.IsAny <string>(), It.IsAny <int>()), Times.Never);
            _textSearchService2.Verify(x => x.Search(It.IsAny <string>(), It.IsAny <int>()), Times.Never);
        }
        public async Task AndMoreThanTheMaximumResultsAreFoundThenTheMaximumNumberOfResultsAreReturned()
        {
            var query = new SearchOrganisationsQuery
            {
                SearchTerm     = "test",
                MaximumResults = 3
            };

            var search1Results = new List <Organisation> {
                new Organisation(), new Organisation()
            };
            var search2Results = new List <Organisation> {
                new Organisation(), new Organisation()
            };

            _textSearchService1.Setup(x => x.Search(query.SearchTerm, query.MaximumResults)).ReturnsAsync(search1Results);
            _textSearchService2.Setup(x => x.Search(query.SearchTerm, query.MaximumResults)).ReturnsAsync(search2Results);

            //Act
            var response = await _handler.Handle(query);

            //Assert
            var expectedResults = new List <Organisation>();

            expectedResults.AddRange(search1Results);
            expectedResults.Add(search2Results.First());
            CollectionAssert.AreEqual(expectedResults, response.Organisations);
        }
        public async Task <IHttpActionResult> SearchOrganisations(string searchTerm = "", int maximumResults = 500)
        {
            var query = new SearchOrganisationsQuery
            {
                SearchTerm     = searchTerm,
                MaximumResults = maximumResults
            };
            SearchOrganisationsResponse response;

            try
            {
                response = await _mediator.SendAsync(query);
            }
            catch (Exception e)
            {
                _logger.Error(e, "Unhandled exception retreiving organisations");
                response = new SearchOrganisationsResponse()
                {
                    Organisations = new List <Organisation>()
                };
            }

            return(Ok(response.Organisations));
        }