コード例 #1
0
        /// <summary>
        /// Verify that controller throws the correct exception when no collection is specified.
        /// </summary>
        /// <param name="collectionValue">A string specifying the collection to search.</param>
        public void Get_EmptyCollection_ReturnsError(String collectionValue)
        {
            // The file needs to exist so it can be deserialized, but we don't make
            // use of the actual content.
            string testFile = "Search.CGov.En.BreastCancer.json";

            IOptions <AutosuggestIndexOptions> config = GetMockedAutosuggestIndexOptions();
            AutosuggestController ctrl = new AutosuggestController(
                ElasticTools.GetInMemoryElasticClient(testFile),
                config,
                NullLogger <AutosuggestController> .Instance
                );

            Exception ex = Assert.Throws <APIErrorException>(
                // Parameters don't matter, and for this test we don't care about saving the results
                () =>
                ctrl.Get(
                    collectionValue,
                    "en",
                    "some term"
                    )
                );

            // Search without a collection should report bad request (400)
            Assert.Equal(400, ((APIErrorException)ex).HttpStatusCode);
        }
コード例 #2
0
        public async void Autosuggest(BaseAutosuggestControllerScenario data)
        {
            // Sanity check for test data.  The expected result array should never
            // be larger than the value of the Size property. (Smaller is fine.)
            Assert.InRange(data.ExpectedResult.Length, 0, data.Size);

            // Set up the mock query service
            Mock <IAutosuggestQueryService> querySvc   = new Mock <IAutosuggestQueryService>();
            AutosuggestController           controller = new AutosuggestController(new NullLogger <AutosuggestController>(), querySvc.Object);

            querySvc.Setup(
                autoSuggestQSvc => autoSuggestQSvc.GetSuggestions(
                    It.IsAny <string>(),
                    It.IsAny <MatchType>(),
                    It.IsAny <int>(),
                    It.IsAny <DrugResourceType[]>(),
                    It.IsAny <TermNameType[]>(),
                    It.IsAny <TermNameType[]>()
                    )
                )
            .Returns(Task.FromResult(data.Data));

            // The search text doesn't matter.
            Suggestion[] actual = await controller.GetSuggestions("chicken", data.MatchType, data.Size);

            Assert.Equal(data.ExpectedResult, actual, new ArrayComparer <Suggestion, SuggestionComparer>());
        }
コード例 #3
0
        public async void Verify_Argument_passing(string dictionary, AudienceType audience, string language, string queryText, MatchType matchType)
        {
            const int expecedSizeRequest = 20;

            Mock <IAutosuggestQueryService> querySvc   = new Mock <IAutosuggestQueryService>();
            AutosuggestController           controller = new AutosuggestController(querySvc.Object);

            // Set up the mock query service to return an empty array.
            querySvc.Setup(
                autoSuggestQSvc => autoSuggestQSvc.GetSuggestions(
                    It.IsAny <string>(),
                    It.IsAny <AudienceType>(),
                    It.IsAny <string>(),
                    It.IsAny <string>(),
                    It.IsAny <MatchType>(),
                    It.IsAny <int>()
                    )
                )
            .Returns(Task.FromResult(new Suggestion[] { }));

            Suggestion[] result = await controller.GetSuggestions(dictionary, audience, language, queryText, matchType);

            // Verify that the service layer is called:
            //  a) with the exact values passed to the controller.
            //  b) exactly once.
            querySvc.Verify(
                svc => svc.GetSuggestions(dictionary, audience, language, queryText, matchType, expecedSizeRequest),
                Times.Once
                );

            Assert.Empty(result);
        }
コード例 #4
0
        public async void SearchText(string searchString)
        {
            // Set up the mock query service
            Mock <IAutosuggestQueryService> querySvc   = new Mock <IAutosuggestQueryService>();
            AutosuggestController           controller = new AutosuggestController(new NullLogger <AutosuggestController>(), querySvc.Object);

            querySvc.Setup(
                autoSuggestQSvc => autoSuggestQSvc.GetSuggestions(
                    It.IsAny <string>(),
                    It.IsAny <MatchType>(),
                    It.IsAny <int>(),
                    It.IsAny <DrugResourceType[]>(),
                    It.IsAny <TermNameType[]>(),
                    It.IsAny <TermNameType[]>()
                    )
                )
            .Returns(Task.FromResult(new Suggestion[0]));

            // The search return doesn't matter for this test, so don't capture it.
            await controller.GetSuggestions(searchString);

            querySvc.Verify(
                svc => svc.GetSuggestions(
                    searchString,
                    It.IsAny <MatchType>(),
                    It.IsAny <int>(),
                    It.IsAny <DrugResourceType[]>(),
                    It.IsAny <TermNameType[]>(),
                    It.IsAny <TermNameType[]>()
                    ),
                Times.Once
                );
        }
コード例 #5
0
        public async void GetSuggestions_ErrorMessage_LanguageMissing()
        {
            Mock <IAutosuggestQueryService> querySvc   = new Mock <IAutosuggestQueryService>();
            AutosuggestController           controller = new AutosuggestController(querySvc.Object);
            APIErrorException exception = await Assert.ThrowsAsync <APIErrorException>(
                () => controller.GetSuggestions("glossary", AudienceType.HealthProfessional, "", "suggest", false, 20, 0)
                );

            Assert.Equal("You must supply a valid dictionary, audience and language.", exception.Message);
        }
コード例 #6
0
        public async void GetSuggestions_ErrorMessage_AudienceType()
        {
            Mock <IAutosuggestQueryService> querySvc   = new Mock <IAutosuggestQueryService>();
            AutosuggestController           controller = new AutosuggestController(querySvc.Object);
            APIErrorException exception = await Assert.ThrowsAsync <APIErrorException>(
                () => controller.GetSuggestions("Dictionary", (AudienceType)(-20937), "EN", "Query", true, 20, 0)
                );

            Assert.Equal("You must supply a valid dictionary, audience and language.", exception.Message);
        }
コード例 #7
0
        public async void GetSuggestions_ErrorMessage_LanguageBad()
        {
            Mock <IAutosuggestQueryService> querySvc   = new Mock <IAutosuggestQueryService>();
            AutosuggestController           controller = new AutosuggestController(querySvc.Object);
            APIErrorException exception = await Assert.ThrowsAsync <APIErrorException>(
                () => controller.GetSuggestions("glossary", AudienceType.Patient, "invalid", "suggest", true, 20, 0)
                );

            Assert.Equal("Unsupported Language. Valid values are 'en' and 'es'.", exception.Message);
        }
コード例 #8
0
        public void GetStatus_Healthy(string datafile)
        {
            IOptions <AutosuggestIndexOptions> config = GetMockedAutosuggestIndexOptions();
            AutosuggestController ctrl = new AutosuggestController(
                ElasticTools.GetInMemoryElasticClient(datafile),
                config,
                NullLogger <AutosuggestController> .Instance
                );

            string status = ctrl.GetStatus();

            Assert.Equal(AutosuggestController.HEALTHY_STATUS, status, ignoreCase: true);
        }
コード例 #9
0
        [InlineData("ESHealthData/unexpected.json")]   // i.e. "Unexpected color"
        public void GetStatus_Unhealthy(string datafile)
        {
            IOptions <AutosuggestIndexOptions> config = GetMockedAutosuggestIndexOptions();
            AutosuggestController ctrl = new AutosuggestController(
                ElasticTools.GetInMemoryElasticClient(datafile),
                config,
                NullLogger <AutosuggestController> .Instance
                );

            APIErrorException ex = Assert.Throws <APIErrorException>(() => ctrl.GetStatus());

            Assert.Equal(500, ex.HttpStatusCode);
        }
コード例 #10
0
        /// <summary>
        /// Verify that the request sent to ES for a single term is being set up correctly.
        /// </summary>
        public void Check_For_Correct_Request_Data()
        {
            string term = "Breast Cancer";

            ISearchTemplateRequest actualReq = null;

            //Setup the client with the request handler callback to be executed later.
            IElasticClient client =
                ElasticTools.GetMockedSearchTemplateClient <Suggestion>(
                    req => actualReq = req,
                    resMock => {
                //Make sure we say that the response is valid.
                resMock.Setup(res => res.IsValid).Returns(true);
            }         // We don't care what the response looks like.
                    );

            IOptions <AutosuggestIndexOptions> config = GetMockedAutosuggestIndexOptions();
            AutosuggestController controller          = new AutosuggestController(
                client,
                config,
                NullLogger <AutosuggestController> .Instance
                );

            //NOTE: this is when actualReq will get set.
            controller.Get(
                "cgov",
                "en",
                term
                );

            SearchTemplateRequest <Suggestion> expReq = GetSearchRequest <Suggestion>(
                "cgov",                   // Search index to look in.
                "autosg_suggest_cgov_en", // Template name, preceded by the name of the directory it's stored in.
                term,                     // Search term
                10,                       // Max number of records to retrieve.
                "\"url\", \"title\", \"metatag.description\", \"metatag.dcterms.type\"",
                "all"
                );

            Assert.Equal(
                expReq,
                actualReq,
                new ElasticTools.SearchTemplateRequestComparer()
                );
        }
コード例 #11
0
        [InlineData(500)] // Server error
        /// <summary>
        /// Verify that controller throws the correct exception when the
        /// ES client reports an error.
        /// </summary>
        /// <param name="offset">Offset into the list of results of the item to check.</param>
        /// <param name="expectedTerm">The expected term text</param>
        public void Handle_Failed_Query(int errorCode)
        {
            IOptions <AutosuggestIndexOptions> config = GetMockedAutosuggestIndexOptions();
            AutosuggestController ctrl = new AutosuggestController(
                ElasticTools.GetErrorElasticClient(errorCode),
                config,
                NullLogger <AutosuggestController> .Instance
                );

            Assert.Throws <APIErrorException>(
                // Parameters don't matter, and for this test we don't care about saving the results
                () =>
                ctrl.Get(
                    "cgov",
                    "en",
                    "breast cancer"
                    )
                );
        }
コード例 #12
0
        public async void Verify_Negative_Value_Handling()
        {
            const string       dictionary  = "Cancer.gov";
            const AudienceType audience    = AudienceType.Patient;
            const string       language    = "en";
            const string       queryText   = "chicken";
            const bool         contains    = true;
            const int          invalidSize = -200;
            const int          invalidFrom = -100;

            const int expecedSizeRequest  = 20;
            const int expectedFromRequest = 0;

            Mock <IAutosuggestQueryService> querySvc   = new Mock <IAutosuggestQueryService>();
            AutosuggestController           controller = new AutosuggestController(querySvc.Object);

            // Set up the mock query service to return an empty array.
            querySvc.Setup(
                autoSuggestQSvc => autoSuggestQSvc.GetSuggestions(
                    It.IsAny <string>(),
                    It.IsAny <AudienceType>(),
                    It.IsAny <string>(),
                    It.IsAny <string>(),
                    It.IsAny <bool>(),
                    It.IsAny <int>(),
                    It.IsAny <int>()
                    )
                )
            .Returns(Task.FromResult(new Suggestion[] { }));

            Suggestion[] result = await controller.GetSuggestions(dictionary, audience, language, queryText, contains, invalidSize, invalidFrom);

            // Verify that the service layer is called:
            //  a) with the expected values.
            //  b) exactly once.
            querySvc.Verify(
                svc => svc.GetSuggestions(dictionary, audience, language, queryText, contains, expecedSizeRequest, expectedFromRequest),
                Times.Once
                );

            Assert.Empty(result);
        }
コード例 #13
0
        /// <summary>
        /// Test that the list of results exists.
        /// </summary>
        public void Check_Results_Exist()
        {
            string testFile = "AutoSuggest.CGov.En.BreastCancer.json";

            IOptions <AutosuggestIndexOptions> config = GetMockedAutosuggestIndexOptions();
            AutosuggestController ctrl = new AutosuggestController(
                ElasticTools.GetInMemoryElasticClient(testFile),
                config,
                NullLogger <AutosuggestController> .Instance
                );

            //Parameters don't matter in this case...
            Suggestions results = ctrl.Get(
                "cgov",
                "en",
                "breast cancer"
                );

            Assert.NotEmpty(results.Results);
        }
コード例 #14
0
        /// <summary>
        /// Test that the suggested search strings from arbitrary offsets
        /// in the collection have the correct values
        /// </summary>
        /// <param name="offset">Offset into the list of results of the item to check.</param>
        /// <param name="expectedTerm">The expected term text</param>
        public void Check_Arbitrary_Result(int offset, string expectedTerm)
        {
            string testFile = "AutoSuggest.CGov.En.BreastCancer.json";

            IOptions <AutosuggestIndexOptions> config = GetMockedAutosuggestIndexOptions();
            AutosuggestController ctrl = new AutosuggestController(
                ElasticTools.GetInMemoryElasticClient(testFile),
                config,
                NullLogger <AutosuggestController> .Instance
                );

            //Parameters don't matter in this case...
            Suggestions results = ctrl.Get(
                "cgov",
                "en",
                "breast cancer"
                );

            Assert.Equal(expectedTerm, results.Results[offset].Term);
        }
コード例 #15
0
        public async void Verify_Zero_Size_Handling()
        {
            const string    queryText   = "chicken";
            const MatchType matchType   = MatchType.Begins;
            const int       invalidSize = 0;

            const int expecedSizeRequest = 20;

            DrugResourceType[] expectedResourceTypes     = DEFAULT_DRUG_RESOURCE_TYPE_LIST;
            TermNameType[]     expectedIncludedTermTypes = DEFAULT_INCLUDED_TERM_TYPE_LIST;
            TermNameType[]     expectedExclusionList     = DEFAULT_EXCLUDED_TERM_TYPE_LIST;

            Mock <IAutosuggestQueryService> querySvc   = new Mock <IAutosuggestQueryService>();
            AutosuggestController           controller = new AutosuggestController(NullLogger <AutosuggestController> .Instance, querySvc.Object);

            // Set up the mock query service to return an empty array.
            querySvc.Setup(
                autoSuggestQSvc => autoSuggestQSvc.GetSuggestions(
                    It.IsAny <string>(),
                    It.IsAny <MatchType>(),
                    It.IsAny <int>(),
                    It.IsAny <DrugResourceType[]>(),
                    It.IsAny <TermNameType[]>(),
                    It.IsAny <TermNameType[]>()
                    )
                )
            .Returns(Task.FromResult(new Suggestion[] { }));

            Suggestion[] result = await controller.GetSuggestions(queryText, matchType, invalidSize);

            // Verify that the service layer is called:
            //  a) with the expected values.
            //  b) exactly once.
            querySvc.Verify(
                svc => svc.GetSuggestions(queryText, matchType, expecedSizeRequest, expectedResourceTypes, expectedIncludedTermTypes, expectedExclusionList),
                Times.Once
                );

            Assert.Empty(result);
        }
コード例 #16
0
        public async void Verify_Default_Values_Passed_to_Service()
        {
            const string       dictionary = "Cancer.gov";
            const AudienceType audience   = AudienceType.Patient;
            const string       language   = "en";
            const string       queryText  = "chicken";

            const MatchType expectedMatchType  = MatchType.Begins;
            const int       expecedSizeRequest = 20;

            Mock <IAutosuggestQueryService> querySvc   = new Mock <IAutosuggestQueryService>();
            AutosuggestController           controller = new AutosuggestController(querySvc.Object);

            // Set up the mock query service to return an empty array.
            querySvc.Setup(
                autoSuggestQSvc => autoSuggestQSvc.GetSuggestions(
                    It.IsAny <string>(),
                    It.IsAny <AudienceType>(),
                    It.IsAny <string>(),
                    It.IsAny <string>(),
                    It.IsAny <MatchType>(),
                    It.IsAny <int>()
                    )
                )
            .Returns(Task.FromResult(new Suggestion[] { }));

            Suggestion[] result = await controller.GetSuggestions(dictionary, audience, language, queryText);

            // Verify that the service layer is called:
            //  a) with the expected values.
            //  b) exactly once.
            querySvc.Verify(
                svc => svc.GetSuggestions(dictionary, audience, language, queryText, expectedMatchType, expecedSizeRequest),
                Times.Once
                );

            Assert.Empty(result);
        }
コード例 #17
0
        /// <summary>
        /// Verify that controller throws the correct exception when no search text is specified.
        /// </summary>
        /// <param name="termValue">A string the text to search for.</param>
        public void Get_EmptyTerm_ReturnsError(String termValue)
        {
            string testFile = "Search.CGov.En.BreastCancer.json";

            IOptions <AutosuggestIndexOptions> config = GetMockedAutosuggestIndexOptions();
            AutosuggestController ctrl = new AutosuggestController(
                ElasticTools.GetInMemoryElasticClient(testFile),
                config,
                NullLogger <AutosuggestController> .Instance
                );

            Exception ex = Assert.Throws <APIErrorException>(
                // Parameters don't matter, and for this test we don't care about saving the results
                () =>
                ctrl.Get(
                    "some collection",
                    "en",
                    termValue
                    )
                );

            // Search without something to search for should report bad request (400)
            Assert.Equal(400, ((APIErrorException)ex).HttpStatusCode);
        }