/// <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); }
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>()); }
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); }
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 ); }
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); }
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); }
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); }
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); }
[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); }
/// <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() ); }
[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" ) ); }
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); }
/// <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); }
/// <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); }
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); }
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); }
/// <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); }