public void CanConvertToPostPayload() { var parameters = new SuggestParameters() { Filter = "x eq y", HighlightPostTag = "</em>", HighlightPreTag = "<em>", MinimumCoverage = 33.3, OrderBy = new[] { "a", "b desc" }, SearchFields = new[] { "a", "b", "c" }, Select = new[] { "e", "f", "g" }, Top = 5, UseFuzzyMatching = true }; SuggestParametersPayload payload = parameters.ToPayload("find me", "mySuggester"); Assert.Equal(parameters.Filter, payload.Filter); Assert.Equal(parameters.HighlightPostTag, payload.HighlightPostTag); Assert.Equal(parameters.HighlightPreTag, payload.HighlightPreTag); Assert.Equal(parameters.MinimumCoverage, payload.MinimumCoverage); Assert.Equal(parameters.OrderBy.ToCommaSeparatedString(), payload.OrderBy); Assert.Equal("find me", payload.Search); Assert.Equal(parameters.SearchFields.ToCommaSeparatedString(), payload.SearchFields); Assert.Equal(parameters.Select.ToCommaSeparatedString(), payload.Select); Assert.Equal("mySuggester", payload.SuggesterName); Assert.Equal(parameters.Top, payload.Top); Assert.Equal(parameters.UseFuzzyMatching, payload.Fuzzy); }
public void MissingParametersAreMissingInThePayload() { var parameters = new SuggestParameters(); // Search text and suggester name can never be null. SuggestParametersPayload payload = parameters.ToPayload("find me", "mySuggester"); Assert.Null(payload.Filter); Assert.Null(payload.HighlightPostTag); Assert.Null(payload.HighlightPreTag); Assert.Null(payload.MinimumCoverage); Assert.Null(payload.OrderBy); Assert.Equal("find me", payload.Search); Assert.Null(payload.SearchFields); Assert.Equal("*", payload.Select); // Nothing selected for Suggest means select everything. Assert.Equal("mySuggester", payload.SuggesterName); Assert.Null(payload.Top); Assert.True(payload.Fuzzy.HasValue); Assert.False(payload.Fuzzy.Value); // Fuzzy is non-nullable in the client-side contract. }
private async Task <TResponse> DoSuggestAsync <TResponse, TResult, TDoc>( string searchText, string suggesterName, SuggestParameters suggestParameters, CancellationToken cancellationToken, Func <string, DocumentSuggestResponsePayload <TResult, TDoc> > deserialize) where TResponse : DocumentSuggestResponseBase <TResult, TDoc>, new() where TResult : SuggestResultBase <TDoc> where TDoc : class { // Validate if (searchText == null) { throw new ArgumentNullException("searchText"); } if (suggesterName == null) { throw new ArgumentNullException("suggesterName"); } if (suggestParameters == null) { throw new ArgumentNullException("suggestParameters"); } // Tracing bool shouldTrace = TracingAdapter.IsEnabled; string invocationId = null; if (shouldTrace) { invocationId = TracingAdapter.NextInvocationId.ToString(); Dictionary <string, object> tracingParameters = new Dictionary <string, object>(); tracingParameters.Add("searchText", searchText); tracingParameters.Add("suggesterName", suggesterName); tracingParameters.Add("suggestParameters", suggestParameters); TracingAdapter.Enter(invocationId, this, "SuggestAsync", tracingParameters); } // Construct URL bool useGet = Client.UseHttpGetForQueries; const string ApiVersion = "api-version=2015-02-28"; string url = useGet ? String.Format( "docs/search.suggest?search={0}&suggesterName={1}&{2}&{3}", Uri.EscapeDataString(searchText), suggesterName, suggestParameters.ToString(), ApiVersion) : String.Format("docs/search.post.suggest?{0}", ApiVersion); string baseUrl = this.Client.BaseUri.AbsoluteUri; // Trim '/' character from the end of baseUrl and beginning of url. if (baseUrl[baseUrl.Length - 1] == '/') { baseUrl = baseUrl.Substring(0, baseUrl.Length - 1); } url = baseUrl + "/" + url; url = url.Replace(" ", "%20"); // Create HTTP transport objects HttpRequestMessage httpRequest = null; try { httpRequest = new HttpRequestMessage(); httpRequest.Method = useGet ? HttpMethod.Get : HttpMethod.Post; httpRequest.RequestUri = new Uri(url); // Set Headers httpRequest.Headers.Add("Accept", "application/json;odata.metadata=none"); // Set Credentials cancellationToken.ThrowIfCancellationRequested(); await this.Client.Credentials.ProcessHttpRequestAsync(httpRequest, cancellationToken).ConfigureAwait(false); // Serialize Request for POST only if (!useGet) { SuggestParametersPayload payload = suggestParameters.ToPayload(searchText, suggesterName); string requestContent = JsonUtility.SerializeObject(payload, JsonUtility.DefaultSerializerSettings); httpRequest.Content = new StringContent(requestContent, Encoding.UTF8); httpRequest.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json"); } // Send Request HttpResponseMessage httpResponse = null; try { if (shouldTrace) { TracingAdapter.SendRequest(invocationId, httpRequest); } cancellationToken.ThrowIfCancellationRequested(); httpResponse = await this.Client.HttpClient.SendAsync(httpRequest, cancellationToken).ConfigureAwait(false); if (shouldTrace) { TracingAdapter.ReceiveResponse(invocationId, httpResponse); } HttpStatusCode statusCode = httpResponse.StatusCode; if (statusCode != HttpStatusCode.OK) { cancellationToken.ThrowIfCancellationRequested(); CloudException ex = CloudException.Create(httpRequest, null, httpResponse, await httpResponse.Content.ReadAsStringAsync().ConfigureAwait(false)); if (shouldTrace) { TracingAdapter.Error(invocationId, ex); } throw ex; } // Create Result TResponse result = null; // Deserialize Response cancellationToken.ThrowIfCancellationRequested(); string responseContent = await httpResponse.Content.ReadAsStringAsync().ConfigureAwait(false); result = new TResponse(); if (string.IsNullOrEmpty(responseContent) == false) { DocumentSuggestResponsePayload <TResult, TDoc> deserializedResult = deserialize(responseContent); result.Coverage = deserializedResult.Coverage; result.Results = deserializedResult.Documents; } result.StatusCode = statusCode; if (httpResponse.Headers.Contains("request-id")) { result.RequestId = httpResponse.Headers.GetValues("request-id").FirstOrDefault(); } if (shouldTrace) { TracingAdapter.Exit(invocationId, result); } return(result); } finally { if (httpResponse != null) { httpResponse.Dispose(); } } } finally { if (httpRequest != null) { httpRequest.Dispose(); } } }