From f7418b6f6c65fac6c805eba59364f50b03d9ee75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Mon, 2 Dec 2024 15:42:11 -0600 Subject: [PATCH] Use Testcontainers Typesense module Current tests depend on an running instance of Typesense. Adding Testcontainers, test will start and stop the Typesense instance as part of the test lifecycle. Enabling local and CI/CD executions to have the same environment. --- .github/workflows/test.yml | 12 ------------ build.gradle | 2 ++ gradle.properties | 1 + .../java/org/typesense/api/AliasesTest.java | 12 +++++++++--- .../org/typesense/api/AnalyticsEventsTest.java | 10 ++++++++-- .../org/typesense/api/AnalyticsRulesTest.java | 10 ++++++++-- .../java/org/typesense/api/CollectionsTest.java | 11 ++++++++--- .../java/org/typesense/api/DocumentsTest.java | 17 +++++++++++++++-- .../typesense/api/HealthAndOperationsTest.java | 10 ++++++++-- src/test/java/org/typesense/api/Helper.java | 10 +++++++--- src/test/java/org/typesense/api/KeysTest.java | 10 ++++++++-- .../java/org/typesense/api/MultiSearchTest.java | 11 ++++++++--- .../java/org/typesense/api/OverridesTest.java | 10 ++++++++-- .../java/org/typesense/api/StopwordsTest.java | 10 ++++++++-- .../java/org/typesense/api/SynonymsTest.java | 10 ++++++++-- 15 files changed, 106 insertions(+), 40 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 01b97d8..fb7a376 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -14,18 +14,6 @@ jobs: strategy: matrix: java: ['8', '11', '17'] - services: - typesense: - image: typesense/typesense:27.0 - ports: - - 8108:8108/tcp - volumes: - - /tmp/typesense-server-data:/data - env: - TYPESENSE_DATA_DIR: '/data' - TYPESENSE_API_KEY: 'xyz' - TYPESENSE_ENABLE_CORS: true - TYPESENSE_URL: 'http://localhost:8108' name: Java ${{ matrix.Java }} steps: - name: Checkout sources diff --git a/build.gradle b/build.gradle index 7e9ecef..84c9be5 100644 --- a/build.gradle +++ b/build.gradle @@ -110,6 +110,8 @@ dependencies { testImplementation "org.mockito:mockito-core:${mokitoVerion}" testImplementation "org.mockito:mockito-junit-jupiter:${mokitoVerion}" testImplementation "org.hamcrest:hamcrest-all:${hamcrestVersion}" + testImplementation "org.testcontainers:junit-jupiter:${testcontainersVersion}" + testImplementation "org.testcontainers:typesense:${testcontainersVersion}" testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:${junitJupiterVersion}" integrationTestImplementation "org.junit.jupiter:junit-jupiter-api:${junitJupiterVersion}" diff --git a/gradle.properties b/gradle.properties index 5d3b2d4..9b7965d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -11,3 +11,4 @@ mokitoVerion=4.11.0 okhttp3Version=4.10.0 slf4jVersion=2.0.5 swaggerCoreV3Version=2.0.0 +testcontainersVersion=1.20.4 diff --git a/src/test/java/org/typesense/api/AliasesTest.java b/src/test/java/org/typesense/api/AliasesTest.java index b116cb7..23a87a2 100644 --- a/src/test/java/org/typesense/api/AliasesTest.java +++ b/src/test/java/org/typesense/api/AliasesTest.java @@ -5,19 +5,25 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.typesense.TypesenseContainer; import org.typesense.model.CollectionAlias; import org.typesense.model.CollectionAliasSchema; import org.typesense.model.CollectionAliasesResponse; +@Testcontainers class AliasesTest { + + @Container + static TypesenseContainer typesense = new TypesenseContainer(Helper.IMAGE); private Client client; private Helper helper; @BeforeEach void setUp() throws Exception { - helper = new Helper(); - helper.teardown(); + helper = new Helper(typesense); client = helper.getClient(); helper.createTestAlias(); } @@ -41,7 +47,7 @@ void testUpsertWithURLEncodedName() throws Exception { collectionAliasSchema.collectionName("books_june11"); CollectionAlias res = client.aliases().upsert("books1 ~!@#$%^&*()_++-=/'", collectionAliasSchema); - assertEquals(res.getName(), "books1 ~!@#$%^&*()_++-=/'"); + assertEquals("books1 ~!@#$%^&*()_++-=/'", res.getName()); System.out.println(res); } diff --git a/src/test/java/org/typesense/api/AnalyticsEventsTest.java b/src/test/java/org/typesense/api/AnalyticsEventsTest.java index 2f88002..b2c0d47 100644 --- a/src/test/java/org/typesense/api/AnalyticsEventsTest.java +++ b/src/test/java/org/typesense/api/AnalyticsEventsTest.java @@ -7,19 +7,25 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.typesense.TypesenseContainer; import org.typesense.model.AnalyticsEventCreateResponse; import org.typesense.model.AnalyticsEventCreateSchema; +@Testcontainers public class AnalyticsEventsTest { + @Container + static TypesenseContainer typesense = new TypesenseContainer(Helper.IMAGE); + private Client client; private Helper helper; @BeforeEach void setUp() throws Exception { - helper = new Helper(); + helper = new Helper(typesense); client = helper.getClient(); - helper.teardown(); helper.createTestCollection(); helper.createTestQueryCollection(); helper.createTestAnalyticsRule(); diff --git a/src/test/java/org/typesense/api/AnalyticsRulesTest.java b/src/test/java/org/typesense/api/AnalyticsRulesTest.java index 34f5dd2..00c706d 100644 --- a/src/test/java/org/typesense/api/AnalyticsRulesTest.java +++ b/src/test/java/org/typesense/api/AnalyticsRulesTest.java @@ -7,6 +7,9 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.typesense.TypesenseContainer; import org.typesense.model.AnalyticsRuleDeleteResponse; import org.typesense.model.AnalyticsRuleParameters; import org.typesense.model.AnalyticsRuleParametersDestination; @@ -15,16 +18,19 @@ import org.typesense.model.AnalyticsRuleUpsertSchema; import org.typesense.model.AnalyticsRulesRetrieveSchema; +@Testcontainers public class AnalyticsRulesTest { + @Container + static TypesenseContainer typesense = new TypesenseContainer(Helper.IMAGE); + private Client client; private Helper helper; @BeforeEach void setUp() throws Exception { - helper = new Helper(); + helper = new Helper(typesense); client = helper.getClient(); - helper.teardown(); helper.createTestCollection(); helper.createTestQueryCollection(); } diff --git a/src/test/java/org/typesense/api/CollectionsTest.java b/src/test/java/org/typesense/api/CollectionsTest.java index 24e7fed..9be3538 100644 --- a/src/test/java/org/typesense/api/CollectionsTest.java +++ b/src/test/java/org/typesense/api/CollectionsTest.java @@ -3,20 +3,25 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.typesense.TypesenseContainer; import org.typesense.model.*; import java.util.ArrayList; - +@Testcontainers class CollectionsTest { + @Container + static TypesenseContainer typesense = new TypesenseContainer(Helper.IMAGE); + Client client; private Helper helper; @BeforeEach void setUp() throws Exception { - helper = new Helper(); - helper.teardown(); + helper = new Helper(typesense); this.client = helper.getClient(); } diff --git a/src/test/java/org/typesense/api/DocumentsTest.java b/src/test/java/org/typesense/api/DocumentsTest.java index 4a51319..229054d 100644 --- a/src/test/java/org/typesense/api/DocumentsTest.java +++ b/src/test/java/org/typesense/api/DocumentsTest.java @@ -10,8 +10,13 @@ import java.util.HashMap; import java.util.List; import java.util.Map; + +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.typesense.TypesenseContainer; import org.typesense.api.exceptions.ObjectNotFound; import org.typesense.model.CollectionSchema; import org.typesense.model.DeleteDocumentsParameters; @@ -24,19 +29,27 @@ import org.typesense.model.SearchResult; import org.typesense.model.UpdateDocumentsParameters; +@Testcontainers class DocumentsTest { + @Container + static TypesenseContainer typesense = new TypesenseContainer(Helper.IMAGE); + Client client; private Helper helper; @BeforeEach void setUp() throws Exception { - helper = new Helper(); + helper = new Helper(typesense); this.client = helper.getClient(); - helper.teardown(); helper.createTestCollection(); } + @AfterEach + void tearDown() throws Exception { + helper.teardown(); + } + @Test void testRetrieveDocument() throws Exception { helper.createTestDocument(); diff --git a/src/test/java/org/typesense/api/HealthAndOperationsTest.java b/src/test/java/org/typesense/api/HealthAndOperationsTest.java index d7b14ec..2d119e5 100644 --- a/src/test/java/org/typesense/api/HealthAndOperationsTest.java +++ b/src/test/java/org/typesense/api/HealthAndOperationsTest.java @@ -3,18 +3,24 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.typesense.TypesenseContainer; import java.util.HashMap; +@Testcontainers class HealthAndOperationsTest { + @Container + static TypesenseContainer typesense = new TypesenseContainer(Helper.IMAGE); + private Client client; private Helper helper; @BeforeEach void setUp() throws Exception { - helper = new Helper(); - helper.teardown(); + helper = new Helper(typesense); client = helper.getClient(); } diff --git a/src/test/java/org/typesense/api/Helper.java b/src/test/java/org/typesense/api/Helper.java index de910e3..c953bb0 100644 --- a/src/test/java/org/typesense/api/Helper.java +++ b/src/test/java/org/typesense/api/Helper.java @@ -6,6 +6,7 @@ import java.util.HashMap; import java.util.List; +import org.testcontainers.typesense.TypesenseContainer; import org.typesense.model.AnalyticsRuleParameters; import org.typesense.model.AnalyticsRuleParametersDestination; import org.typesense.model.AnalyticsRuleParametersSource; @@ -31,13 +32,16 @@ import org.typesense.resources.Node; public class Helper { + + final static String IMAGE = "typesense/typesense:27.0"; + private final Client client; - Helper() { + Helper(TypesenseContainer container) { List nodes = new ArrayList<>(); - nodes.add(new Node("http", "localhost", "8108")); + nodes.add(new Node("http", container.getHost(), container.getHttpPort())); - Configuration configuration = new Configuration(nodes, Duration.ofSeconds(3), "xyz"); + Configuration configuration = new Configuration(nodes, Duration.ofSeconds(3), container.getApiKey()); this.client = new Client(configuration); } diff --git a/src/test/java/org/typesense/api/KeysTest.java b/src/test/java/org/typesense/api/KeysTest.java index 8d60b60..6ca66c5 100644 --- a/src/test/java/org/typesense/api/KeysTest.java +++ b/src/test/java/org/typesense/api/KeysTest.java @@ -3,6 +3,9 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.typesense.TypesenseContainer; import org.typesense.model.ApiKey; import org.typesense.model.ApiKeySchema; @@ -10,8 +13,12 @@ import java.util.HashMap; import java.util.List; +@Testcontainers class KeysTest { + @Container + static TypesenseContainer typesense = new TypesenseContainer(Helper.IMAGE); + private Client client; private Helper helper; private String testKey; @@ -19,8 +26,7 @@ class KeysTest { @BeforeEach void setUp() throws Exception { - helper = new Helper(); - helper.teardown(); + helper = new Helper(typesense); client = helper.getClient(); ApiKey key = helper.createTestKey(); testKey = key.getValue(); diff --git a/src/test/java/org/typesense/api/MultiSearchTest.java b/src/test/java/org/typesense/api/MultiSearchTest.java index 9259cbe..20124ed 100644 --- a/src/test/java/org/typesense/api/MultiSearchTest.java +++ b/src/test/java/org/typesense/api/MultiSearchTest.java @@ -3,6 +3,9 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.typesense.TypesenseContainer; import org.typesense.model.CollectionSchema; import org.typesense.model.Field; import org.typesense.model.MultiSearchCollectionParameters; @@ -16,18 +19,20 @@ import static org.junit.jupiter.api.Assertions.assertEquals; +@Testcontainers class MultiSearchTest { + @Container + static TypesenseContainer typesense = new TypesenseContainer(Helper.IMAGE); + private Client client; private Helper helper; @BeforeEach void setUp() throws Exception { - helper = new Helper(); + helper = new Helper(typesense); client = helper.getClient(); - helper.teardown(); - // create a collection with 2 fields: title and vec to store embeddings List fields = new ArrayList<>(); fields.add(new Field().name("title").type(FieldTypes.STRING)); diff --git a/src/test/java/org/typesense/api/OverridesTest.java b/src/test/java/org/typesense/api/OverridesTest.java index b034679..47761ba 100644 --- a/src/test/java/org/typesense/api/OverridesTest.java +++ b/src/test/java/org/typesense/api/OverridesTest.java @@ -3,6 +3,9 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.typesense.TypesenseContainer; import org.typesense.model.SearchOverrideExclude; import org.typesense.model.SearchOverrideInclude; import org.typesense.model.SearchOverrideRule; @@ -11,15 +14,18 @@ import java.util.ArrayList; import java.util.List; +@Testcontainers class OverridesTest { + @Container + static TypesenseContainer typesense = new TypesenseContainer(Helper.IMAGE); + private Client client; private Helper helper; @BeforeEach void setUp() throws Exception { - helper = new Helper(); - helper.teardown(); + helper = new Helper(typesense); client = helper.getClient(); helper.createTestCollection(); helper.createTestOverrirde(); diff --git a/src/test/java/org/typesense/api/StopwordsTest.java b/src/test/java/org/typesense/api/StopwordsTest.java index 91aeb27..d1b4e7a 100644 --- a/src/test/java/org/typesense/api/StopwordsTest.java +++ b/src/test/java/org/typesense/api/StopwordsTest.java @@ -8,21 +8,27 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.typesense.TypesenseContainer; import org.typesense.model.StopwordsSetRetrieveSchema; import org.typesense.model.StopwordsSetSchema; import org.typesense.model.StopwordsSetUpsertSchema; import org.typesense.model.StopwordsSetsRetrieveAllSchema; +@Testcontainers public class StopwordsTest { + @Container + static TypesenseContainer typesense = new TypesenseContainer(Helper.IMAGE); + private Client client; private Helper helper; @BeforeEach void setUp() throws Exception { - helper = new Helper(); + helper = new Helper(typesense); client = helper.getClient(); - helper.teardown(); helper.createTestCollection(); } diff --git a/src/test/java/org/typesense/api/SynonymsTest.java b/src/test/java/org/typesense/api/SynonymsTest.java index 57da150..d9c6add 100644 --- a/src/test/java/org/typesense/api/SynonymsTest.java +++ b/src/test/java/org/typesense/api/SynonymsTest.java @@ -3,18 +3,24 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.typesense.TypesenseContainer; import org.typesense.model.SearchSynonymSchema; +@Testcontainers class SynonymsTest { + @Container + static TypesenseContainer typesense = new TypesenseContainer(Helper.IMAGE); + private Client client; private Helper helper; @BeforeEach void setUp() throws Exception { - helper = new Helper(); + helper = new Helper(typesense); client = helper.getClient(); - helper.teardown(); helper.createTestCollection(); helper.createTestSynonym(); }