Skip to content

Commit

Permalink
Added unit test to elasticsearchhelper (#26)
Browse files Browse the repository at this point in the history
* Added unittest to elasticsearch helper

* Added coverage for helper class

* Improve coverage and quality

* Improve coverage to max
  • Loading branch information
HarelM authored Feb 7, 2025
1 parent c82e72b commit bc261b4
Show file tree
Hide file tree
Showing 6 changed files with 124 additions and 3 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/CI.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
14 changes: 14 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,20 @@
<version>5.11.4</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>5.15.2</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-junit-jupiter</artifactId>
<version>5.15.2</version>
<scope>test</scope>
</dependency>
</dependencies>

<build>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/il/org/osm/israelhiking/MainClass.java
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 0 additions & 2 deletions src/test/java/il/org/osm/israelhiking/E2ETest.java
Original file line number Diff line number Diff line change
Expand Up @@ -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"});
}
}
98 changes: 98 additions & 0 deletions src/test/java/il/org/osm/israelhiking/ElasticsearchHelperTest.java
Original file line number Diff line number Diff line change
@@ -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.<Function<ExistsAliasRequest.Builder, ObjectBuilder<ExistsAliasRequest>>>any())).thenReturn(new BooleanResponse(false));
when(indicesClient.exists(ArgumentMatchers.<Function<ExistsRequest.Builder, ObjectBuilder<ExistsRequest>>>any())).thenReturn(new BooleanResponse(true));

var indexName = ElasticsearchHelper.createPointsIndex(esClient, indexAlias, supportedLanguages);

verify(indicesClient).delete(ArgumentMatchers.<Function<DeleteIndexRequest.Builder, ObjectBuilder<DeleteIndexRequest>>>any());
assertEquals(indexAlias + "1", indexName);
}

@Test
void testCreatePointIndexWhenOneExists_ShouldAddASecondOne() throws Exception {
when(indicesClient.existsAlias(ArgumentMatchers.<Function<ExistsAliasRequest.Builder, ObjectBuilder<ExistsAliasRequest>>>any())).thenReturn(new BooleanResponse(true));
when(indicesClient.exists(ArgumentMatchers.<Function<ExistsRequest.Builder, ObjectBuilder<ExistsRequest>>>any())).thenReturn(new BooleanResponse(true));
when(indicesClient.getAlias(ArgumentMatchers.<Function<GetAliasRequest.Builder, ObjectBuilder<GetAliasRequest>>>any()))
.thenReturn(GetAliasResponse.of(b -> b.result(new HashMap<String, IndexAliases>() {
{
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.<Function<ExistsAliasRequest.Builder, ObjectBuilder<ExistsAliasRequest>>>any())).thenReturn(new BooleanResponse(true));
when(indicesClient.exists(ArgumentMatchers.<Function<ExistsRequest.Builder, ObjectBuilder<ExistsRequest>>>any())).thenReturn(new BooleanResponse(true));
when(indicesClient.getAlias(ArgumentMatchers.<Function<GetAliasRequest.Builder, ObjectBuilder<GetAliasRequest>>>any()))
.thenReturn(GetAliasResponse.of(b -> b.result(new HashMap<String, IndexAliases>() {
{
put(indexAlias + "2", null);
}
})));

var indexName = ElasticsearchHelper.createPointsIndex(esClient, indexAlias, supportedLanguages);

assertEquals(indexAlias + "1", indexName);
verify(indicesClient).delete(ArgumentMatchers.<Function<DeleteIndexRequest.Builder, ObjectBuilder<DeleteIndexRequest>>>any());
}

@Test
void testCreateBboxIndexThatDoesntHaveAlias_DeleteIt() throws Exception {
when(indicesClient.existsAlias(ArgumentMatchers.<Function<ExistsAliasRequest.Builder, ObjectBuilder<ExistsAliasRequest>>>any())).thenReturn(new BooleanResponse(false));
when(indicesClient.exists(ArgumentMatchers.<Function<ExistsRequest.Builder, ObjectBuilder<ExistsRequest>>>any())).thenReturn(new BooleanResponse(true));

ElasticsearchHelper.createBBoxIndex(esClient, indexAlias, supportedLanguages);

verify(indicesClient).delete(ArgumentMatchers.<Function<DeleteIndexRequest.Builder, ObjectBuilder<DeleteIndexRequest>>>any());
}
}

0 comments on commit bc261b4

Please sign in to comment.