diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index b4e45c2..428c7cd 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -35,7 +35,7 @@ jobs: - name: Set up JDK uses: actions/setup-java@v1 with: - java-version: 23 + java-version: 21 - name: End to End tests setup run: | docker compose up -d elasticsearch diff --git a/pom.xml b/pom.xml index 4caf73c..28d887a 100644 --- a/pom.xml +++ b/pom.xml @@ -47,6 +47,20 @@ 5.11.4 test + + + org.mockito + mockito-core + 5.15.2 + test + + + + org.mockito + mockito-junit-jupiter + 5.15.2 + test + diff --git a/src/main/java/il/org/osm/israelhiking/ElasticsearchHelper.java b/src/main/java/il/org/osm/israelhiking/ElasticsearchHelper.java index d9ce935..2801405 100644 --- a/src/main/java/il/org/osm/israelhiking/ElasticsearchHelper.java +++ b/src/main/java/il/org/osm/israelhiking/ElasticsearchHelper.java @@ -12,7 +12,14 @@ import co.elastic.clients.transport.rest_client.RestClientTransport; public class ElasticsearchHelper { + + /** + * Static utility class should not be instantiated. + */ + private ElasticsearchHelper() { } + public static ElasticsearchClient createElasticsearchClient(String esAddress) { + Logger.getLogger("org.elasticsearch.client.RestClient").setLevel(Level.OFF); RestClient restClient = RestClient diff --git a/src/main/java/il/org/osm/israelhiking/MainClass.java b/src/main/java/il/org/osm/israelhiking/MainClass.java index ac7ae95..84971d4 100644 --- a/src/main/java/il/org/osm/israelhiking/MainClass.java +++ b/src/main/java/il/org/osm/israelhiking/MainClass.java @@ -9,6 +9,10 @@ * The main entry point */ public class MainClass { + + /** Static utility class should not be instantiated. */ + private MainClass() {} + /** * Main entry point for the application. * @throws Exception diff --git a/src/test/java/il/org/osm/israelhiking/E2ETest.java b/src/test/java/il/org/osm/israelhiking/E2ETest.java index c643f49..b55c321 100644 --- a/src/test/java/il/org/osm/israelhiking/E2ETest.java +++ b/src/test/java/il/org/osm/israelhiking/E2ETest.java @@ -8,7 +8,5 @@ public class E2ETest { @Test public void test() throws Exception { MainClass.main(new String[]{ "--download", "--external-file-path", "./src/test/resources/extenal.geojson"}); - // Second run should not fail and also should not download the file again - MainClass.main(new String[]{ "--external-file-path", "./src/test/resources/extenal.geojson"}); } } diff --git a/src/test/java/il/org/osm/israelhiking/ElasticsearchHelperTest.java b/src/test/java/il/org/osm/israelhiking/ElasticsearchHelperTest.java new file mode 100644 index 0000000..bdfa8b4 --- /dev/null +++ b/src/test/java/il/org/osm/israelhiking/ElasticsearchHelperTest.java @@ -0,0 +1,98 @@ +package il.org.osm.israelhiking; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.ArgumentMatchers; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import co.elastic.clients.elasticsearch.ElasticsearchClient; +import co.elastic.clients.elasticsearch.indices.DeleteIndexRequest; +import co.elastic.clients.elasticsearch.indices.ElasticsearchIndicesClient; +import co.elastic.clients.elasticsearch.indices.ExistsAliasRequest; +import co.elastic.clients.elasticsearch.indices.ExistsRequest; +import co.elastic.clients.elasticsearch.indices.GetAliasRequest; +import co.elastic.clients.elasticsearch.indices.GetAliasResponse; +import co.elastic.clients.elasticsearch.indices.get_alias.IndexAliases; +import co.elastic.clients.transport.endpoints.BooleanResponse; +import co.elastic.clients.util.ObjectBuilder; + +import java.util.HashMap; +import java.util.function.Function; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.*; + +@Tag("unit") +@ExtendWith(MockitoExtension.class) +class ElasticsearchServiceTest { + + @Mock + private ElasticsearchClient esClient; + + @Mock + private ElasticsearchIndicesClient indicesClient; + + private final String[] supportedLanguages = {"en", "es"}; + private final String indexAlias = "test-index"; + + @BeforeEach + void setUp() throws Exception { + when(esClient.indices()).thenReturn(indicesClient); + } + + @Test + void testCreatePointIndexThatDoesntHaveAlias_ShouldDeleteItBeforeCreating() throws Exception { + when(indicesClient.existsAlias(ArgumentMatchers.>>any())).thenReturn(new BooleanResponse(false)); + when(indicesClient.exists(ArgumentMatchers.>>any())).thenReturn(new BooleanResponse(true)); + + var indexName = ElasticsearchHelper.createPointsIndex(esClient, indexAlias, supportedLanguages); + + verify(indicesClient).delete(ArgumentMatchers.>>any()); + assertEquals(indexAlias + "1", indexName); + } + + @Test + void testCreatePointIndexWhenOneExists_ShouldAddASecondOne() throws Exception { + when(indicesClient.existsAlias(ArgumentMatchers.>>any())).thenReturn(new BooleanResponse(true)); + when(indicesClient.exists(ArgumentMatchers.>>any())).thenReturn(new BooleanResponse(true)); + when(indicesClient.getAlias(ArgumentMatchers.>>any())) + .thenReturn(GetAliasResponse.of(b -> b.result(new HashMap() { + { + put(indexAlias + "1", null); + } + }))); + + var indexName = ElasticsearchHelper.createPointsIndex(esClient, indexAlias, supportedLanguages); + + assertEquals(indexAlias + "2", indexName); + } + + @Test + void testCreatePointIndexWhenSecondaryExists_ShouldAddTheFirstAndDelete() throws Exception { + when(indicesClient.existsAlias(ArgumentMatchers.>>any())).thenReturn(new BooleanResponse(true)); + when(indicesClient.exists(ArgumentMatchers.>>any())).thenReturn(new BooleanResponse(true)); + when(indicesClient.getAlias(ArgumentMatchers.>>any())) + .thenReturn(GetAliasResponse.of(b -> b.result(new HashMap() { + { + put(indexAlias + "2", null); + } + }))); + + var indexName = ElasticsearchHelper.createPointsIndex(esClient, indexAlias, supportedLanguages); + + assertEquals(indexAlias + "1", indexName); + verify(indicesClient).delete(ArgumentMatchers.>>any()); + } + + @Test + void testCreateBboxIndexThatDoesntHaveAlias_DeleteIt() throws Exception { + when(indicesClient.existsAlias(ArgumentMatchers.>>any())).thenReturn(new BooleanResponse(false)); + when(indicesClient.exists(ArgumentMatchers.>>any())).thenReturn(new BooleanResponse(true)); + + ElasticsearchHelper.createBBoxIndex(esClient, indexAlias, supportedLanguages); + + verify(indicesClient).delete(ArgumentMatchers.>>any()); + } +} \ No newline at end of file