Skip to content

Commit

Permalink
Merge pull request #448 from quarkiverse/#446
Browse files Browse the repository at this point in the history
Introduce the use of quarkus-wiremock
  • Loading branch information
geoand authored Apr 5, 2024
2 parents 99e36cd + 21aeed1 commit 82a13c1
Show file tree
Hide file tree
Showing 15 changed files with 131 additions and 108 deletions.
6 changes: 0 additions & 6 deletions cohere/deployment/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -34,12 +34,6 @@
<version>${assertj.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.wiremock</groupId>
<artifactId>wiremock-standalone</artifactId>
<version>${wiremock.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
Expand Down
2 changes: 1 addition & 1 deletion docs/modules/ROOT/pages/includes/attributes.adoc
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
:project-version: 0.10.3
:langchain4j-version: 0.29.1
:examples-dir: ./../examples/
:examples-dir: ./../examples/
6 changes: 0 additions & 6 deletions easy-rag/deployment/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,6 @@
<version>${assertj.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.wiremock</groupId>
<artifactId>wiremock-standalone</artifactId>
<version>${wiremock.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-embeddings-all-minilm-l6-v2-q</artifactId>
Expand Down
6 changes: 3 additions & 3 deletions hugging-face/deployment/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,9 @@
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.wiremock</groupId>
<artifactId>wiremock-standalone</artifactId>
<version>${wiremock.version}</version>
<groupId>io.quarkiverse.langchain4j</groupId>
<artifactId>quarkus-langchain4j-testing-internal</artifactId>
<version>${project.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,18 @@
import static com.github.tomakehurst.wiremock.client.WireMock.equalTo;
import static com.github.tomakehurst.wiremock.client.WireMock.post;
import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;
import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.options;
import static org.assertj.core.api.Assertions.assertThat;

import java.net.URI;
import java.net.URISyntaxException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;

import org.eclipse.microprofile.rest.client.RestClientBuilder;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;

import com.github.tomakehurst.wiremock.WireMockServer;

import dev.langchain4j.model.huggingface.HuggingFaceModelName;
import dev.langchain4j.model.huggingface.client.EmbeddingRequest;
import dev.langchain4j.model.huggingface.client.Options;
Expand All @@ -28,35 +24,22 @@
import dev.langchain4j.model.huggingface.client.TextGenerationResponse;
import io.quarkiverse.langchain4j.huggingface.HuggingFaceRestApi;
import io.quarkiverse.langchain4j.huggingface.QuarkusHuggingFaceClientFactory;
import io.quarkiverse.langchain4j.testing.internal.WiremockAware;
import io.quarkus.rest.client.reactive.QuarkusRestClientBuilder;
import io.quarkus.test.QuarkusUnitTest;

public class QuarkusHuggingFaceClientTest {
public class QuarkusHuggingFaceClientTest extends WiremockAware {

@RegisterExtension
static final QuarkusUnitTest unitTest = new QuarkusUnitTest()
.setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class));
private static final int WIREMOCK_PORT = 8089;
private static final String CHAT_MODEL_ID = HuggingFaceModelName.TII_UAE_FALCON_7B_INSTRUCT;
private static final String EMBED_MODEL_ID = HuggingFaceModelName.SENTENCE_TRANSFORMERS_ALL_MINI_LM_L6_V2;
private static final String API_KEY = "key";

static WireMockServer wireMockServer;

@BeforeAll
static void beforeAll() {
wireMockServer = new WireMockServer(options().port(WIREMOCK_PORT));
wireMockServer.start();
}

@AfterAll
static void afterAll() {
wireMockServer.stop();
}

@Test
void chat() {
wireMockServer.stubFor(
wiremock().register(
post(urlEqualTo("/models/" + sanitizeModelForUrl(CHAT_MODEL_ID)))
.withHeader("Authorization", equalTo("Bearer " + API_KEY))
.willReturn(aResponse()
Expand Down Expand Up @@ -87,7 +70,7 @@ void chat() {

@Test
void embed() {
wireMockServer.stubFor(
wiremock().register(
post(urlEqualTo("/models/" + sanitizeModelForUrl(EMBED_MODEL_ID)))
.withHeader("Authorization", equalTo("Bearer " + API_KEY))
.willReturn(aResponse()
Expand All @@ -108,21 +91,21 @@ private String sanitizeModelForUrl(String modelId) {
private QuarkusHuggingFaceClientFactory.QuarkusHuggingFaceClient createClient() {
try {
HuggingFaceRestApi restApi = QuarkusRestClientBuilder.newBuilder()
.baseUri(new URI("http://localhost:" + WIREMOCK_PORT + "/models/" + sanitizeModelForUrl(EMBED_MODEL_ID)))
.baseUrl(new URL(resolvedWiremockUrl("/models/" + sanitizeModelForUrl(EMBED_MODEL_ID))))
.build(HuggingFaceRestApi.class);
return new QuarkusHuggingFaceClientFactory.QuarkusHuggingFaceClient(restApi, API_KEY);
} catch (URISyntaxException e) {
} catch (MalformedURLException e) {
throw new RuntimeException(e);
}
}

private QuarkusHuggingFaceClientFactory.QuarkusHuggingFaceClient createClientForChat() {
try {
HuggingFaceRestApi restApi = QuarkusRestClientBuilder.newBuilder()
.baseUri(new URI("http://localhost:" + WIREMOCK_PORT + "/models/" + sanitizeModelForUrl(CHAT_MODEL_ID)))
HuggingFaceRestApi restApi = RestClientBuilder.newBuilder()
.baseUrl(new URL(resolvedWiremockUrl("/models/" + sanitizeModelForUrl(CHAT_MODEL_ID))))
.build(HuggingFaceRestApi.class);
return new QuarkusHuggingFaceClientFactory.QuarkusHuggingFaceClient(restApi, API_KEY);
} catch (URISyntaxException e) {
} catch (MalformedURLException e) {
throw new RuntimeException(e);
}
}
Expand Down
6 changes: 0 additions & 6 deletions infinispan/deployment/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -46,12 +46,6 @@
<version>${assertj.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.wiremock</groupId>
<artifactId>wiremock-standalone</artifactId>
<version>${wiremock.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-embeddings-all-minilm-l6-v2-q</artifactId>
Expand Down
6 changes: 3 additions & 3 deletions mistral/deployment/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,9 @@
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.wiremock</groupId>
<artifactId>wiremock-standalone</artifactId>
<version>${wiremock.version}</version>
<groupId>io.quarkiverse.langchain4j</groupId>
<artifactId>quarkus-langchain4j-testing-internal</artifactId>
<version>${project.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,57 +4,36 @@
import static com.github.tomakehurst.wiremock.client.WireMock.equalTo;
import static com.github.tomakehurst.wiremock.client.WireMock.post;
import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;
import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.options;
import static org.assertj.core.api.Assertions.assertThat;

import jakarta.inject.Inject;

import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;

import com.github.tomakehurst.wiremock.WireMockServer;
import com.github.tomakehurst.wiremock.stubbing.ServeEvent;
import com.github.tomakehurst.wiremock.verification.LoggedRequest;

import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.mistralai.MistralAiChatModel;
import io.quarkiverse.langchain4j.testing.internal.WiremockAware;
import io.quarkus.arc.ClientProxy;
import io.quarkus.test.QuarkusUnitTest;

class MistralAiChatLanguageModelSmokeTest {
private static final int WIREMOCK_PORT = 8089;
private static final String CHAT_MODEL_ID = "mistral-tiny";
class MistralAiChatLanguageModelSmokeTest extends WiremockAware {

private static final String API_KEY = "somekey";
private static final String CHAT_MODEL_ID = "mistral-tiny";

@RegisterExtension
static final QuarkusUnitTest unitTest = new QuarkusUnitTest()
.setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class))
.overrideRuntimeConfigKey("quarkus.langchain4j.mistralai.api-key", API_KEY)
.overrideRuntimeConfigKey("quarkus.langchain4j.mistralai.log-requests", "true")
.overrideRuntimeConfigKey("quarkus.langchain4j.mistralai.base-url", "http://localhost:" + WIREMOCK_PORT + "/v1");

static WireMockServer wireMockServer;

@BeforeAll
static void beforeAll() {
wireMockServer = new WireMockServer(options().port(WIREMOCK_PORT));
wireMockServer.start();
}

@AfterAll
static void afterAll() {
wireMockServer.stop();
}

@BeforeEach
void setup() {
wireMockServer.resetAll();
}
.overrideRuntimeConfigKey("quarkus.langchain4j.mistralai.base-url",
WiremockAware.wiremockUrlForConfig("/v1"));

@Inject
ChatLanguageModel chatLanguageModel;
Expand All @@ -63,7 +42,7 @@ void setup() {
void test() {
assertThat(ClientProxy.unwrap(chatLanguageModel)).isInstanceOf(MistralAiChatModel.class);

wireMockServer.stubFor(
wiremock().register(
post(urlEqualTo("/v1/chat/completions"))
.withHeader("Authorization", equalTo("Bearer " + API_KEY))
.willReturn(aResponse()
Expand Down Expand Up @@ -95,8 +74,8 @@ void test() {
String response = chatLanguageModel.generate("hello");
assertThat(response).isEqualTo("Nice to meet you");

assertThat(wireMockServer.getAllServeEvents()).hasSize(1);
ServeEvent serveEvent = wireMockServer.getAllServeEvents().get(0); // this works because we reset requests for Wiremock before each test
assertThat(wiremock().getServeEvents()).hasSize(1);
ServeEvent serveEvent = wiremock().getServeEvents().get(0); // this works because we reset requests for Wiremock before each test
LoggedRequest loggedRequest = serveEvent.getRequest();
assertThat(loggedRequest.getHeader("User-Agent")).isEqualTo("Resteasy Reactive Client");
String requestBody = new String(loggedRequest.getBody());
Expand Down
6 changes: 0 additions & 6 deletions ollama/deployment/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -42,12 +42,6 @@
<version>${assertj.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.wiremock</groupId>
<artifactId>wiremock-standalone</artifactId>
<version>${wiremock.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
Expand Down
6 changes: 0 additions & 6 deletions pgvector/deployment/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -54,12 +54,6 @@
<version>${assertj.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.wiremock</groupId>
<artifactId>wiremock-standalone</artifactId>
<version>${wiremock.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-embeddings-all-minilm-l6-v2-q</artifactId>
Expand Down
6 changes: 0 additions & 6 deletions pinecone/deployment/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -46,12 +46,6 @@
<version>${assertj.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.wiremock</groupId>
<artifactId>wiremock-standalone</artifactId>
<version>${wiremock.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-embeddings-all-minilm-l6-v2-q</artifactId>
Expand Down
2 changes: 2 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
<module>cohere</module>
<module>core</module>
<module>docs</module>
<module>testing-internal</module>
<module>easy-rag</module>
<module>hugging-face</module>
<module>infinispan</module>
Expand Down Expand Up @@ -48,6 +49,7 @@
<wiremock.version>3.5.2</wiremock.version>
<pgvector-java.version>0.1.4</pgvector-java.version>
<sundrio.version>0.103.1</sundrio.version>
<quarkus-wiremock.version>1.3.0</quarkus-wiremock.version>
</properties>
<dependencyManagement>
<dependencies>
Expand Down
6 changes: 0 additions & 6 deletions redis/deployment/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -50,12 +50,6 @@
<version>${assertj.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.wiremock</groupId>
<artifactId>wiremock-standalone</artifactId>
<version>${wiremock.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-embeddings-all-minilm-l6-v2-q</artifactId>
Expand Down
38 changes: 38 additions & 0 deletions testing-internal/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>io.quarkiverse.langchain4j</groupId>
<artifactId>quarkus-langchain4j-parent</artifactId>
<version>999-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>

<artifactId>quarkus-langchain4j-testing-internal</artifactId>
<name>Quarkus LangChain4j - Internal Testing</name>
<description>A module that provides testing utilities used by other modules</description>

<dependencies>
<dependency>
<groupId>io.quarkiverse.wiremock</groupId>
<artifactId>quarkus-wiremock-test</artifactId>
<version>${quarkus-wiremock.version}</version>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>


</project>
Loading

0 comments on commit 82a13c1

Please sign in to comment.