diff --git a/core-services/document-grounding/src/test/java/com/sap/ai/sdk/grounding/GroundingClientTest.java b/core-services/document-grounding/src/test/java/com/sap/ai/sdk/grounding/GroundingClientTest.java index 0b07655a4..496978b7f 100644 --- a/core-services/document-grounding/src/test/java/com/sap/ai/sdk/grounding/GroundingClientTest.java +++ b/core-services/document-grounding/src/test/java/com/sap/ai/sdk/grounding/GroundingClientTest.java @@ -2,9 +2,13 @@ import static com.github.tomakehurst.wiremock.client.WireMock.anyUrl; import static com.github.tomakehurst.wiremock.client.WireMock.equalTo; +import static com.github.tomakehurst.wiremock.client.WireMock.equalToJson; import static com.github.tomakehurst.wiremock.client.WireMock.get; import static com.github.tomakehurst.wiremock.client.WireMock.getRequestedFor; import static com.github.tomakehurst.wiremock.client.WireMock.okJson; +import static com.github.tomakehurst.wiremock.client.WireMock.post; +import static com.github.tomakehurst.wiremock.client.WireMock.postRequestedFor; +import static com.github.tomakehurst.wiremock.client.WireMock.urlPathEqualTo; import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig; import static org.assertj.core.api.Assertions.assertThat; @@ -21,8 +25,12 @@ import com.sap.ai.sdk.grounding.model.FilterMatchModeEnum; import com.sap.ai.sdk.grounding.model.GetPipelines; import com.sap.ai.sdk.grounding.model.RetrievalKeyValueListPair; +import com.sap.ai.sdk.grounding.model.TextSearchRequest; import com.sap.ai.sdk.grounding.model.VectorDocumentKeyValueListPair; import com.sap.ai.sdk.grounding.model.VectorKeyValueListPair; +import com.sap.ai.sdk.grounding.model.VectorSearchConfiguration; +import com.sap.ai.sdk.grounding.model.VectorSearchFilter; +import com.sap.ai.sdk.grounding.model.VectorSearchResults; import com.sap.cloud.sdk.cloudplatform.connectivity.DefaultHttpDestination; import com.sap.cloud.sdk.cloudplatform.connectivity.HttpDestination; import java.util.UUID; @@ -144,6 +152,59 @@ void testRetrieval() { }); } + @Test + void testVectorSearch() { + final String responseBody = + """ + {"results":[{"results":[{"documents":[{"chunks":[{"content":"Joule is the AI copilot."}]}]}]}]} + """; + + final String requestUri = "/v2/lm/document-grounding/vector/search"; + WM.stubFor(post(urlPathEqualTo(requestUri)).willReturn(okJson(responseBody))); + + final VectorSearchFilter filter = + VectorSearchFilter.create() + .id("filter-1") + .collectionIds("001766c1-05c7-41fe-a3d7-c1fb02fc1473") + ._configuration(VectorSearchConfiguration.create().maxChunkCount(5)); + + final TextSearchRequest request = + TextSearchRequest.create().query("What is Joule?").filters(filter); + + final VectorApi api = new GroundingClient(SERVICE).vector(); + final VectorSearchResults result = api.search("resourceGroup", request); + + assertThat(result).isNotNull(); + assertThat(result.getResults()).isNotNull().hasSize(1); + + WM.verify( + postRequestedFor(urlPathEqualTo(requestUri)) + .withHeader("AI-Resource-Group", equalTo("resourceGroup")) + .withHeader("Content-Type", equalTo("application/json; charset=UTF-8")) + .withHeader("Accept", equalTo("application/json")) + .withRequestBody( + equalToJson( + """ + { + "query" : "What is Joule?", + "filters" : [ { + "id" : "filter-1", + "collectionIds" : [ "001766c1-05c7-41fe-a3d7-c1fb02fc1473" ], + "configuration" : { + "maxChunkCount" : 5, + "maxDocumentCount" : null + }, + "collectionMetadata" : [ ], + "documentMetadata" : [ ], + "chunkMetadata" : [ ], + "filter" : null + } ] + } + """, + true /* ignore order */, + false /* ignore extra fields */))); + } + @Test void testCustomHeaders() { WM.stubFor(