コード例 #1
0
        public async Task RecipeLookup_WithNegativeFromParameter_ReturnsNoRowsAndWarningAsync()
        {
            RecipePayload expected = new RecipePayload();

            expected.Q       = "chicken";
            expected.From    = 0;
            expected.To      = 10;
            expected.More    = false;
            expected.Count   = 0;
            expected.Warning = "Parameter From is less than zero.  Please provide a value greater than or equal to zero and less than the To parameter.";
            expected.Hits    = new List <Hit> ();

            SearchParams searchParams = new SearchParams("chicken", -1, 10);

            using (AutoMock mock = AutoMock.GetLoose()) {
                mock.Mock <IApiConfigProvider> ()
                .Setup(x => x.GetApiConfigSettings())
                .Returns(new ApiConfigSettings("123", "abc", "hello"));

                mock.Mock <IRecipeSearchProvider> ()
                .Setup(x => x.RunSearch(searchParams, "123", "abc"))
                .Returns(Task.FromResult(expected));

                RecipeProviderImpl sut    = mock.Create <RecipeProviderImpl> ();
                RecipePayload      actual = await sut.GetRecipientsFromSearch(searchParams);

                Assert.True(JsonCompare.Compare(expected, actual));
            }
        }
コード例 #2
0
        public async Task RecipeLookup_MissingSlackSecret_ReturnsNoRowsAndWarningAsync(string slackSecret)
        {
            RecipePayload expected = new RecipePayload();

            expected.Q       = "chicken";
            expected.From    = 0;
            expected.To      = 10;
            expected.More    = false;
            expected.Count   = 0;
            expected.Warning = "Configuration Error: Missing SlackSecret.";
            expected.Hits    = new List <Hit> ();

            SearchParams searchParams = new SearchParams("chicken", 0, 10);

            using (AutoMock mock = AutoMock.GetLoose()) {
                mock.Mock <IApiConfigProvider> ()
                .Setup(x => x.GetApiConfigSettings())
                .Returns(new ApiConfigSettings("123", "abc", slackSecret));

                mock.Mock <IRecipeSearchProvider> ()
                .Setup(x => x.RunSearch(searchParams, "123", "abc"))
                .Returns(Task.FromResult(expected));

                RecipeProviderImpl sut    = mock.Create <RecipeProviderImpl> ();
                RecipePayload      actual = await sut.GetRecipientsFromSearch(searchParams);

                Assert.True(JsonCompare.Compare(expected, actual));
            }
        }
コード例 #3
0
        public async Task RecipeLookup_WithEmptyStringSearchQuery_ReturnsNoRowsAndWarningAsync(
            string searchTerm
            )
        {
            RecipePayload expected = new RecipePayload();

            expected.Q       = searchTerm;
            expected.From    = 0;
            expected.To      = 10;
            expected.More    = false;
            expected.Count   = 0;
            expected.Warning = "Search term cannot be empty or null.";
            expected.Hits    = new List <Hit> ();

            SearchParams searchParams = new SearchParams(searchTerm, 0, 10);

            using (AutoMock mock = AutoMock.GetLoose()) {
                mock.Mock <IApiConfigProvider> ()
                .Setup(x => x.GetApiConfigSettings())
                .Returns(new ApiConfigSettings("123", "abc", "hello"));

                mock.Mock <IRecipeSearchProvider> ()
                .Setup(x => x.RunSearch(searchParams, "123", "abc"))
                .Returns(Task.FromResult(expected));

                RecipeProviderImpl sut    = mock.Create <RecipeProviderImpl> ();
                RecipePayload      actual = await sut.GetRecipientsFromSearch(searchParams);

                Assert.True(JsonCompare.Compare(expected, actual));
            }
        }
コード例 #4
0
        private RecipePayload RuntimeMisconfiguration(RuntimeSetting runtimeSetting, string searchTerm, int from, int to)
        {
            RecipePayload payload = new RecipePayload();

            payload.Q     = searchTerm;
            payload.From  = from;
            payload.To    = to;
            payload.More  = false;
            payload.Hits  = new List <Hit> ();
            payload.Count = 0;

            switch (runtimeSetting)
            {
            case RuntimeSetting.Both:
                payload.Warning = "Configuration Error: Both Dev and Prod config are set.";
                break;

            case RuntimeSetting.Neither:
                payload.Warning = "Configuration Error: Neither Dev and Prod config are set.";
                break;

            case RuntimeSetting.Unknown:
                payload.Warning = "Configuration Error: Unknown Config setting.";
                break;

            default:
                payload.Warning = "Configuration Error: Unknown Config setting.";
                break;
            }
            return(payload);
        }
コード例 #5
0
        public async Task RecipeLookup_WithSearchQuery_ReturnsCorrectListAsync()
        {
            List <Hit> hits = SampleData.SampleHits();

            const string searchTerm = "Chicken";

            RecipePayload expected = new RecipePayload();

            expected.Q       = searchTerm;
            expected.From    = 0;
            expected.To      = 10;
            expected.More    = true;
            expected.Count   = 100000;
            expected.Warning = "";
            expected.Hits    = hits;

            SearchParams searchParams = new SearchParams(searchTerm, 0, 10);

            using (AutoMock mock = AutoMock.GetLoose()) {
                mock.Mock <IApiConfigProvider> ()
                .Setup(x => x.GetApiConfigSettings())
                .Returns(new ApiConfigSettings("123", "abc", "hello"));

                mock.Mock <IRecipeSearchProvider> ()
                .Setup(x => x.RunSearch(searchParams, "123", "abc"))
                .Returns(Task.FromResult(expected));

                RecipeProviderImpl sut    = mock.Create <RecipeProviderImpl> ();
                RecipePayload      actual = await sut.GetRecipientsFromSearch(searchParams);

                Assert.True(JsonCompare.Compare(expected, actual));
            }
        }
コード例 #6
0
        public async Task <RecipePayload> Search(SearchParams searchParams)
        {
            RecipeProviderImpl recipieProvider = new RecipeProviderImpl(_errorWriter, _apiConfigProvider, _searchProvider);

            RecipeLookup recipeLookup =
                new RecipeLookup(recipieProvider, _configuration);

            RecipePayload recipePayload =
                await recipeLookup.SearchRecipes(searchParams);

            return(recipePayload);
        }
コード例 #7
0
        public static RecipePayload ExceptionResponse(Exception ex, string searchTerm)
        {
            RecipePayload errorPayload = new RecipePayload();

            errorPayload.Count   = 0;
            errorPayload.Q       = searchTerm;
            errorPayload.From    = 0;
            errorPayload.To      = 10;
            errorPayload.Warning = ex.Message;
            errorPayload.Hits    = new List <Hit> ();
            return(errorPayload);
        }
コード例 #8
0
        private RecipePayload BadSearchParameterResult(string searchTerm, string warningMsg)
        {
            RecipePayload errorPayload = new RecipePayload();

            errorPayload.Count   = 0;
            errorPayload.Q       = searchTerm;
            errorPayload.From    = 0;
            errorPayload.To      = 10;
            errorPayload.Warning = warningMsg;
            errorPayload.Hits    = new List <Hit> ();
            return(errorPayload);
        }
コード例 #9
0
        private RecipePayload MissingConfigurationResult(string searchTerm, string warningMsg)
        {
            RecipePayload errorPayload = new RecipePayload();

            errorPayload.Count   = 0;
            errorPayload.Q       = searchTerm;
            errorPayload.From    = 0;
            errorPayload.To      = 10;
            errorPayload.Warning = warningMsg;
            errorPayload.Hits    = new List <Hit> ();
            return(errorPayload);
        }
コード例 #10
0
        private RecipePayload FailureRequest(string errorMessage, SearchParams searchParams)
        {
            RecipePayload payload = new RecipePayload();

            payload.Q       = searchParams.SearchTerm;
            payload.Count   = 0;
            payload.More    = false;
            payload.Warning = errorMessage;
            payload.Hits    = new List <Hit> ();
            payload.From    = searchParams.From;
            payload.To      = searchParams.To;
            return(payload);
        }
コード例 #11
0
        GetRecipientsFromSearch(SearchParams searchParams)
        {
            // error handling
            if (string.IsNullOrEmpty(searchParams.SearchTerm))
            {
                return(BadSearchParameterResult(searchParams.SearchTerm, "Search term cannot be empty or null."));
            }

            if (searchParams.From < 0)
            {
                return(BadSearchParameterResult(searchParams.SearchTerm, "Parameter From is less than zero.  Please provide a value greater than or equal to zero and less than the To parameter."));
            }
            else if (searchParams.To < 0)
            {
                return(BadSearchParameterResult(searchParams.SearchTerm, "Parameter To is less than zero.  Please provide a value greater than the To parameter."));
            }
            else if (searchParams.From >= searchParams.To)
            {
                return(BadSearchParameterResult(searchParams.SearchTerm, "Parameter From is greater than or equal to parameter To.  Please provide a From parameter that is less that the To parameter."));
            }

            string appId       = _apiConfigProvider.GetApiConfigSettings().AppId;
            string appKey      = _apiConfigProvider.GetApiConfigSettings().AppKey;
            string slackSecret = _apiConfigProvider.GetApiConfigSettings().SlackSecret;

            if (string.IsNullOrEmpty(appId))
            {
                return(MissingConfigurationResult(searchParams.SearchTerm, "Configuration Error: Missing AppId."));
            }
            if (string.IsNullOrEmpty(appKey))
            {
                return(MissingConfigurationResult(searchParams.SearchTerm, "Configuration Error: Missing AppKey."));
            }
            if (string.IsNullOrEmpty(slackSecret))
            {
                return(MissingConfigurationResult(searchParams.SearchTerm, "Configuration Error: Missing SlackSecret."));
            }

            RecipePayload data = await _recipeSearchProvider.RunSearch(searchParams, appId, appKey);

            return(data);
        }
コード例 #12
0
        public async Task <RecipePayload> SearchRecipes(string searchTerm, int from = 0, int to = 10)
        {
            try {
                RuntimeSetting       setting = GetRuntimeSetting();
                IRecipeSearchHandler recipeSearchHandler;

                switch (setting)
                {
                case RuntimeSetting.Production:
                    // setup for prod
                    recipeSearchHandler = new ProdRecipeSearchHandlerImpl(_configuration);
                    break;

                case RuntimeSetting.Development:
                    // setup for dev
                    recipeSearchHandler = new DevRecipeSearchHandlerImpl(_configuration);
                    break;

                case RuntimeSetting.Both:
                    return(RuntimeMisconfiguration(RuntimeSetting.Both, searchTerm, from, to));

                case RuntimeSetting.Neither:
                    return(RuntimeMisconfiguration(RuntimeSetting.Neither, searchTerm, from, to));

                default:
                    return(RuntimeMisconfiguration(RuntimeSetting.Unknown, searchTerm, from, to));
                }

                SearchParams searchParams = new SearchParams(searchTerm, from, to);

                RecipePayload payload = await recipeSearchHandler.Search(searchParams);

                return(payload);
            } catch (System.Exception ex) {
                HandleEx(ex);
                return(RecipeErrorResponses.ExceptionResponse(ex, searchTerm));
            }
        }