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 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 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 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 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);
        }
        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);
        }