Skip to content

Commit

Permalink
Merge pull request Azure#93 from navalev/feature/suggest-test-minimum…
Browse files Browse the repository at this point in the history
…-coverage

create test for suggest with minimum coverage
  • Loading branch information
LizaShak authored Sep 22, 2019
2 parents 7f55949 + 86a7c3f commit 68ab5da
Show file tree
Hide file tree
Showing 5 changed files with 150 additions and 48 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -284,9 +284,7 @@ public PagedFlux<SuggestResult> suggest(
SuggestRequest suggestRequest = createSuggestRequest(searchText, suggesterName, suggestParameters);
Mono<PagedResponse<SuggestResult>> first = restClient.documents()
.suggestPostWithRestResponseAsync(suggestRequest)
.map(res -> {
return new SuggestPagedResponse(res);
});
.map(SuggestPagedResponse::new);
return new PagedFlux<>(() -> first, nextLink -> Mono.empty());

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,10 @@
import com.azure.search.data.SearchIndexAsyncClient;
import com.azure.search.data.generated.models.SuggestParameters;
import com.azure.search.data.generated.models.SuggestResult;
import org.junit.Test;
import reactor.test.StepVerifier;

import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
Expand All @@ -28,67 +29,67 @@ protected void initializeClient() {
@Override
public void canSuggestDynamicDocuments() {
uploadDocumentsJson(client, HOTELS_INDEX_NAME, HOTELS_DATA_JSON);
SuggestParameters suggestParams = new SuggestParameters();
suggestParams.orderBy(new LinkedList<>(Arrays.asList("HotelId")));
SuggestParameters suggestParams = new SuggestParameters()
.orderBy(new LinkedList<>(Collections.singletonList("HotelId")));
PagedFlux<SuggestResult> suggestResult = client.suggest("more", "sg", suggestParams, null);

StepVerifier
.create(suggestResult.byPage())
.assertNext(result -> verifyDynamicDocumentSuggest(result))
.assertNext(this::verifyDynamicDocumentSuggest)
.verifyComplete();
}

@Override
public void searchFieldsExcludesFieldsFromSuggest() {
uploadDocumentsJson(client, HOTELS_INDEX_NAME, HOTELS_DATA_JSON);
SuggestParameters suggestParams = new SuggestParameters();
suggestParams.searchFields(new LinkedList<>(Arrays.asList("HotelName")));
SuggestParameters suggestParams = new SuggestParameters()
.searchFields(new LinkedList<>(Collections.singletonList("HotelName")));

PagedFlux<SuggestResult> suggestResult = client.suggest("luxury", "sg", suggestParams, null);

StepVerifier
.create(suggestResult.byPage())
.assertNext(result -> verifyFieldsExcludesFieldsSuggest(result))
.assertNext(this::verifyFieldsExcludesFieldsSuggest)
.verifyComplete();
}

@Override
public void canUseSuggestHitHighlighting() {
uploadDocumentsJson(client, HOTELS_INDEX_NAME, HOTELS_DATA_JSON);
SuggestParameters suggestParams = new SuggestParameters();
suggestParams.highlightPreTag("<b>");
suggestParams.highlightPostTag("</b>");
suggestParams.filter("Category eq 'Luxury'");
suggestParams.top(1);
SuggestParameters suggestParams = new SuggestParameters()
.highlightPreTag("<b>")
.highlightPostTag("</b>")
.filter("Category eq 'Luxury'")
.top(1);

PagedFlux<SuggestResult> suggestResult = client.suggest("hotel", "sg", suggestParams, null);

StepVerifier
.create(suggestResult.byPage())
.assertNext(result -> verifyHitHighlightingSuggest(result))
.assertNext(this::verifyHitHighlightingSuggest)
.verifyComplete();
}

@Override
public void canGetFuzzySuggestions() {
uploadDocumentsJson(client, HOTELS_INDEX_NAME, HOTELS_DATA_JSON);
SuggestParameters suggestParams = new SuggestParameters();
suggestParams.useFuzzyMatching(true);
SuggestParameters suggestParams = new SuggestParameters()
.useFuzzyMatching(true);

PagedFlux<SuggestResult> suggestResult = client.suggest("hitel", "sg", suggestParams, null);

StepVerifier
.create(suggestResult.byPage())
.assertNext(result -> verifyFuzzySuggest(result))
.assertNext(this::verifyFuzzySuggest)
.verifyComplete();
}

@Override
public void canSuggestStaticallyTypedDocuments() {
List<Map<String, Object>> hotels = uploadDocumentsJson(client, HOTELS_INDEX_NAME, HOTELS_DATA_JSON);
//arrange
SuggestParameters suggestParams = new SuggestParameters();
suggestParams.orderBy(new LinkedList<>(Arrays.asList("HotelId")));
SuggestParameters suggestParams = new SuggestParameters()
.orderBy(new LinkedList<>(Collections.singletonList("HotelId")));

//act
PagedFlux<SuggestResult> suggestResult = client.suggest("more", "sg", suggestParams, null);
Expand All @@ -100,7 +101,7 @@ public void canSuggestStaticallyTypedDocuments() {
}

@Override
public void canSuggestWithDateTimeInStaticModel() throws Exception {
public void canSuggestWithDateTimeInStaticModel() {
}

@Override
Expand All @@ -111,28 +112,48 @@ public void fuzzyIsOffByDefault() {

StepVerifier
.create(suggestResult.byPage())
.assertNext(result -> verifyFuzzyIsOffByDefault(result))
.assertNext(this::verifyFuzzyIsOffByDefault)
.verifyComplete();
}

@Override
public void suggestThrowsWhenGivenBadSuggesterName() throws Exception {
public void suggestThrowsWhenGivenBadSuggesterName() {
PagedFlux<SuggestResult> suggestResult = client.suggest("Hotel", "Suggester does not exist", null, null);

StepVerifier
.create(suggestResult.byPage())
.verifyErrorSatisfies(error -> verifySuggestThrowsWhenGivenBadSuggesterName(error));
.verifyErrorSatisfies(this::verifySuggestThrowsWhenGivenBadSuggesterName);
}

@Override
public void suggestThrowsWhenRequestIsMalformed() throws Exception {
public void suggestThrowsWhenRequestIsMalformed() {
uploadDocumentsJson(client, HOTELS_INDEX_NAME, HOTELS_DATA_JSON);
SuggestParameters suggestParams = new SuggestParameters();
suggestParams.orderBy(new LinkedList<>(Arrays.asList("This is not a valid orderby.")));
SuggestParameters suggestParams = new SuggestParameters()
.orderBy(new LinkedList<>(Collections.singletonList("This is not a valid orderby.")));

PagedFlux<SuggestResult> suggestResult = client.suggest("hotel", "sg", suggestParams, null);

StepVerifier
.create(suggestResult.byPage())
.verifyErrorSatisfies(error -> verifySuggestThrowsWhenRequestIsMalformed(error));
.verifyErrorSatisfies(this::verifySuggestThrowsWhenRequestIsMalformed);
}

@Test
@Override
public void testCanSuggestWithMinimumCoverage() {
uploadDocumentsJson(client, HOTELS_INDEX_NAME, HOTELS_DATA_JSON);

//arrange
SuggestParameters suggestParams = new SuggestParameters()
.orderBy(new LinkedList<>(Collections.singletonList("HotelId")))
.minimumCoverage(50.0);

//act
PagedFlux<SuggestResult> suggestResult = client.suggest("luxury", "sg", suggestParams, null);

StepVerifier
.create(suggestResult.byPage())
.assertNext(this::verifyMinimumCoverage)
.verifyComplete();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
import org.junit.Test;
import org.junit.rules.ExpectedException;

import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
Expand All @@ -37,8 +37,8 @@ protected void initializeClient() {
@Test
public void canSuggestDynamicDocuments() {
uploadDocumentsJson(client, HOTELS_INDEX_NAME, HOTELS_DATA_JSON);
SuggestParameters suggestParams = new SuggestParameters();
suggestParams.orderBy(new LinkedList<>(Arrays.asList("HotelId")));
SuggestParameters suggestParams = new SuggestParameters()
.orderBy(new LinkedList<>(Collections.singletonList("HotelId")));

PagedIterable<SuggestResult> suggestResult = client.suggest("more", "sg", suggestParams, null);
Iterator<PagedResponse<SuggestResult>> iterator = suggestResult.iterableByPage().iterator();
Expand All @@ -50,8 +50,8 @@ public void canSuggestDynamicDocuments() {
@Test
public void searchFieldsExcludesFieldsFromSuggest() {
uploadDocumentsJson(client, HOTELS_INDEX_NAME, HOTELS_DATA_JSON);
SuggestParameters suggestParams = new SuggestParameters();
suggestParams.searchFields(new LinkedList<>(Arrays.asList("HotelName")));
SuggestParameters suggestParams = new SuggestParameters()
.searchFields(new LinkedList<>(Collections.singletonList("HotelName")));

PagedIterable<SuggestResult> suggestResult = client.suggest("luxury", "sg", suggestParams, null);
Iterator<PagedResponse<SuggestResult>> iterator = suggestResult.iterableByPage().iterator();
Expand All @@ -63,11 +63,11 @@ public void searchFieldsExcludesFieldsFromSuggest() {
@Test
public void canUseSuggestHitHighlighting() {
uploadDocumentsJson(client, HOTELS_INDEX_NAME, HOTELS_DATA_JSON);
SuggestParameters suggestParams = new SuggestParameters();
suggestParams.highlightPreTag("<b>");
suggestParams.highlightPostTag("</b>");
suggestParams.filter("Category eq 'Luxury'");
suggestParams.top(1);
SuggestParameters suggestParams = new SuggestParameters()
.highlightPreTag("<b>")
.highlightPostTag("</b>")
.filter("Category eq 'Luxury'")
.top(1);

PagedIterable<SuggestResult> suggestResult = client.suggest("hotel", "sg", suggestParams, null);
Iterator<PagedResponse<SuggestResult>> iterator = suggestResult.iterableByPage().iterator();
Expand All @@ -79,8 +79,8 @@ public void canUseSuggestHitHighlighting() {
@Test
public void canGetFuzzySuggestions() {
uploadDocumentsJson(client, HOTELS_INDEX_NAME, HOTELS_DATA_JSON);
SuggestParameters suggestParams = new SuggestParameters();
suggestParams.useFuzzyMatching(true);
SuggestParameters suggestParams = new SuggestParameters()
.useFuzzyMatching(true);

PagedIterable<SuggestResult> suggestResult = client.suggest("hitel", "sg", suggestParams, null);
Iterator<PagedResponse<SuggestResult>> iterator = suggestResult.iterableByPage().iterator();
Expand All @@ -93,8 +93,8 @@ public void canGetFuzzySuggestions() {
public void canSuggestStaticallyTypedDocuments() {
List<Map<String, Object>> hotels = uploadDocumentsJson(client, HOTELS_INDEX_NAME, HOTELS_DATA_JSON);
//arrange
SuggestParameters suggestParams = new SuggestParameters();
suggestParams.orderBy(new LinkedList<>(Arrays.asList("HotelId")));
SuggestParameters suggestParams = new SuggestParameters()
.orderBy(new LinkedList<>(Collections.singletonList("HotelId")));

//act
PagedIterable<SuggestResult> suggestResult = client.suggest("more", "sg", suggestParams, null);
Expand All @@ -119,23 +119,45 @@ public void fuzzyIsOffByDefault() {
}

@Override
public void suggestThrowsWhenGivenBadSuggesterName() throws Exception {
public void suggestThrowsWhenGivenBadSuggesterName() {
thrown.expect(HttpResponseException.class);
thrown.expectMessage("The specified suggester name 'Suggester does not exist' does not exist in this index definition.");
thrown.expectMessage("The specified suggester name 'Suggester does not exist' "
+ "does not exist in this index definition.");

PagedIterable<SuggestResult> suggestResult = client.suggest("Hotel", "Suggester does not exist", null, null);
suggestResult.iterableByPage().iterator().next();
}

@Override
public void suggestThrowsWhenRequestIsMalformed() throws Exception {
public void suggestThrowsWhenRequestIsMalformed() {
thrown.expect(HttpResponseException.class);
thrown.expectMessage("Invalid expression: Syntax error at position 7 in 'This is not a valid orderby.'");

uploadDocumentsJson(client, HOTELS_INDEX_NAME, HOTELS_DATA_JSON);
SuggestParameters suggestParams = new SuggestParameters();
suggestParams.orderBy(new LinkedList<>(Arrays.asList("This is not a valid orderby.")));
SuggestParameters suggestParams = new SuggestParameters()
.orderBy(new LinkedList<>(Collections.singletonList("This is not a valid orderby.")));

PagedIterable<SuggestResult> suggestResult = client.suggest("hotel", "sg", suggestParams, null);
suggestResult.iterableByPage().iterator().next();
}

@Override
public void testCanSuggestWithMinimumCoverage() {
uploadDocumentsJson(client, HOTELS_INDEX_NAME, HOTELS_DATA_JSON);

//arrange
SuggestParameters suggestParams = new SuggestParameters()
.orderBy(new LinkedList<>(Collections.singletonList("HotelId")))
.minimumCoverage(50.0);

//act
PagedResponse<SuggestResult> suggestResult = client
.suggest("luxury", "sg", suggestParams, null)
.iterableByPage()
.iterator()
.next();

verifyMinimumCoverage(suggestResult);

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

import com.azure.core.exception.HttpResponseException;
import com.azure.core.http.rest.PagedResponse;
import com.azure.search.data.common.SuggestPagedResponse;
import com.azure.search.data.common.jsonwrapper.JsonWrapper;
import com.azure.search.data.common.jsonwrapper.api.JsonApi;
import com.azure.search.data.common.jsonwrapper.jacksonwrapper.JacksonDeserializer;
Expand Down Expand Up @@ -99,6 +100,12 @@ protected void verifySuggestThrowsWhenRequestIsMalformed(Throwable error) {
assertTrue(error.getMessage().contains("Invalid expression: Syntax error at position 7 in 'This is not a valid orderby.'"));
}

protected void verifyMinimumCoverage(PagedResponse<SuggestResult> suggestResultPagedResponse) {

Assert.assertNotNull(suggestResultPagedResponse);
Assert.assertEquals(new Double(100), ((SuggestPagedResponse) suggestResultPagedResponse).coverage());
}

@Test
public abstract void canSuggestDynamicDocuments() throws Exception;

Expand All @@ -125,4 +132,8 @@ protected void verifySuggestThrowsWhenRequestIsMalformed(Throwable error) {

@Test
public abstract void suggestThrowsWhenRequestIsMalformed() throws Exception;

@Test
public abstract void testCanSuggestWithMinimumCoverage() throws Exception;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
{
"networkCallRecords" : [ {
"Method" : "POST",
"Uri" : "https://azs-sdk8a1225780bf5.search.windows.net/indexes('hotels')/docs/search.index?api-version=2019-05-06",
"Headers" : {
"Content-Type" : "application/json; charset=utf-8"
},
"Response" : {
"Pragma" : "no-cache",
"retry-after" : "0",
"request-id" : "84487e79-1f69-4fab-bb21-0e3e98de141c",
"StatusCode" : "200",
"Date" : "Thu, 19 Sep 2019 12:52:03 GMT",
"Strict-Transport-Security" : "max-age=15724800; includeSubDomains",
"Cache-Control" : "no-cache",
"elapsed-time" : "282",
"OData-Version" : "4.0",
"Expires" : "-1",
"Content-Length" : "795",
"Body" : "{\"@odata.context\":\"https://azs-sdk8a1225780bf5.search.windows.net/indexes('hotels')/$metadata#Collection(Microsoft.Azure.Search.V2019_05_06.IndexResult)\",\"value\":[{\"key\":\"1\",\"status\":true,\"errorMessage\":null,\"statusCode\":201},{\"key\":\"2\",\"status\":true,\"errorMessage\":null,\"statusCode\":201},{\"key\":\"3\",\"status\":true,\"errorMessage\":null,\"statusCode\":201},{\"key\":\"4\",\"status\":true,\"errorMessage\":null,\"statusCode\":201},{\"key\":\"5\",\"status\":true,\"errorMessage\":null,\"statusCode\":201},{\"key\":\"6\",\"status\":true,\"errorMessage\":null,\"statusCode\":201},{\"key\":\"7\",\"status\":true,\"errorMessage\":null,\"statusCode\":201},{\"key\":\"8\",\"status\":true,\"errorMessage\":null,\"statusCode\":201},{\"key\":\"9\",\"status\":true,\"errorMessage\":null,\"statusCode\":201},{\"key\":\"10\",\"status\":true,\"errorMessage\":null,\"statusCode\":201}]}",
"Preference-Applied" : "odata.include-annotations=\"*\"",
"Content-Type" : "application/json; odata.metadata=minimal"
},
"Exception" : null
}, {
"Method" : "POST",
"Uri" : "https://azs-sdk8a1225780bf5.search.windows.net/indexes('hotels')/docs/search.post.suggest?api-version=2019-05-06",
"Headers" : {
"Content-Type" : "application/json; charset=utf-8"
},
"Response" : {
"Pragma" : "no-cache",
"retry-after" : "0",
"request-id" : "4204afa5-d06e-43cb-b857-5b5ff7312093",
"StatusCode" : "200",
"Date" : "Thu, 19 Sep 2019 12:52:05 GMT",
"Strict-Transport-Security" : "max-age=15724800; includeSubDomains",
"Cache-Control" : "no-cache",
"elapsed-time" : "30",
"OData-Version" : "4.0",
"Expires" : "-1",
"Content-Length" : "405",
"Body" : "{\"@odata.context\":\"https://azs-sdk8a1225780bf5.search.windows.net/indexes('hotels')/$metadata#docs(*)\",\"@search.coverage\":100.0,\"value\":[{\"@search.text\":\"Best hotel in town if you like luxury hotels. They have an amazing infinity pool, a spa, and a really helpful concierge. The location is perfect -- right downtown, close to all the tourist attractions. We highly recommend this hotel.\",\"HotelId\":\"1\"}]}",
"Preference-Applied" : "odata.include-annotations=\"*\"",
"Content-Type" : "application/json; odata.metadata=minimal"
},
"Exception" : null
} ],
"variables" : [ ]
}

0 comments on commit 68ab5da

Please sign in to comment.