Skip to content
Snippets Groups Projects
Commit c97f7b37 authored by OZGCloud's avatar OZGCloud
Browse files

OZG-2542 WIP ElasticsearchEventListener hinzugefügt

parent e7de3bbb
No related branches found
No related tags found
No related merge requests found
Showing with 291 additions and 0 deletions
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
<mongodb.testcontainer.version>1.15.3</mongodb.testcontainer.version> <mongodb.testcontainer.version>1.15.3</mongodb.testcontainer.version>
<solr.testcontainer.version>1.16.2</solr.testcontainer.version> <solr.testcontainer.version>1.16.2</solr.testcontainer.version>
<elasticsearch.testcontainer.version>1.17.3</elasticsearch.testcontainer.version>
</properties> </properties>
<dependencies> <dependencies>
...@@ -90,6 +91,11 @@ ...@@ -90,6 +91,11 @@
<artifactId>spring-security-core</artifactId> <artifactId>spring-security-core</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-elasticsearch</artifactId>
</dependency>
<!-- aspectJ --> <!-- aspectJ -->
<dependency> <dependency>
<groupId>org.aspectj</groupId> <groupId>org.aspectj</groupId>
...@@ -219,6 +225,12 @@ ...@@ -219,6 +225,12 @@
<version>${solr.testcontainer.version}</version> <version>${solr.testcontainer.version}</version>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>elasticsearch</artifactId>
<version>${elasticsearch.testcontainer.version}</version>
<scope>test</scope>
</dependency>
<!-- mongock --> <!-- mongock -->
<dependency> <dependency>
......
package de.itvsh.ozg.pluto.common.elastic;
import java.text.MessageFormat;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
import co.elastic.clients.elasticsearch.ElasticsearchClient;
import de.itvsh.ozg.pluto.command.Command;
import de.itvsh.ozg.pluto.command.CommandService;
import de.itvsh.ozg.pluto.command.VorgangCreatedEvent;
import de.itvsh.ozg.pluto.vorgang.StatusChangedEvent;
import de.itvsh.ozg.pluto.vorgang.VorgangAssignedEvent;
import de.itvsh.ozg.pluto.vorgang.VorgangService;
@Component
@ConditionalOnBean(ElasticsearchClient.class)
public class ElasticsearchEventListener {
@Autowired
private ElasticsearchService elasticsearchService;
@Autowired
private CommandService commandService;
@Autowired
private VorgangService vorgangService;
@EventListener
public void onNewVorgang(VorgangCreatedEvent vorgangCreatedEvent) {
elasticsearchService.addVorgang(vorgangService.getById(vorgangCreatedEvent.getSource()));
}
@EventListener
public void onVorgangAssigned(VorgangAssignedEvent vorgangAssignedEvent) {
updateVorgang(vorgangAssignedEvent.getCommand());
}
@EventListener
public void onVorgangStatusChanged(StatusChangedEvent event) {
updateVorgangById(event.getSource());
}
private void updateVorgangById(String commandId) {
commandService.findCommand(commandId).ifPresentOrElse(this::updateVorgang, () -> {
throw new IllegalStateException(MessageFormat.format("Kein Command mit der ID {0} gefunden", commandId));
});
}
void updateVorgang(Command command) {
elasticsearchService.updateVorgang(vorgangService.getById(command.getVorgangId()));
}
}
package de.itvsh.ozg.pluto.common.elastic;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import de.itvsh.ozg.pluto.vorgang.Vorgang;
@Service
public class ElasticsearchService {
@Autowired
private ElasticsearchVorgangRepostitory vorgangRepostitory;
public void addVorgang(Vorgang vorgang) {
vorgangRepostitory.save(vorgang);
}
public void updateVorgang(Vorgang vorgang) {
vorgangRepostitory.save(vorgang);
}
}
package de.itvsh.ozg.pluto.common.elastic;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import de.itvsh.ozg.pluto.vorgang.Vorgang;
interface ElasticsearchVorgangRepostitory extends ElasticsearchRepository<Vorgang, String> {
Page<Vorgang> findByAktenzeichen(String aktenzeichen, Pageable pageable);
}
package de.itvsh.ozg.pluto.common.elastic;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
import java.util.Optional;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import de.itvsh.ozg.pluto.command.Command;
import de.itvsh.ozg.pluto.command.CommandService;
import de.itvsh.ozg.pluto.command.CommandTestFactory;
import de.itvsh.ozg.pluto.command.VorgangCreatedEvent;
import de.itvsh.ozg.pluto.vorgang.StatusChangedEvent;
import de.itvsh.ozg.pluto.vorgang.Vorgang;
import de.itvsh.ozg.pluto.vorgang.VorgangAssignedEvent;
import de.itvsh.ozg.pluto.vorgang.VorgangService;
import de.itvsh.ozg.pluto.vorgang.VorgangTestFactory;
class ElasticsearchEventListenerTest {
@InjectMocks
private ElasticsearchEventListener eventListener;
@Mock
private ElasticsearchService elasticsearchService;
@Mock
private CommandService commandService;
@Mock
private VorgangService vorgangService;
private Vorgang vorgang;
@BeforeEach
void init() {
vorgang = VorgangTestFactory.create();
}
@Nested
class TestOnNewVorgang {
@Mock
private VorgangCreatedEvent vorgangCreatedEvent;
@Test
void onNewVorgangTest() {
when(vorgangCreatedEvent.getSource()).thenReturn(VorgangTestFactory.ID);
when(vorgangService.getById(anyString())).thenReturn(vorgang);
eventListener.onNewVorgang(vorgangCreatedEvent);
verify(elasticsearchService).addVorgang(any());
}
}
@Nested
class TestOnVorgangAssigned {
@Mock
private VorgangAssignedEvent vorgangAssignedEvent;
@BeforeEach
void init() {
Command command = CommandTestFactory.create();
when(vorgangAssignedEvent.getCommand()).thenReturn(command);
when(vorgangService.getById(anyString())).thenReturn(vorgang);
}
@Test
void shouldUpdateVorgang() {
eventListener.onVorgangAssigned(vorgangAssignedEvent);
verify(elasticsearchService).updateVorgang(any());
}
}
@Nested
class TestOnUpdatedVorgang {
@Mock
private StatusChangedEvent vorgangUpdatedEvent;
@BeforeEach
void init() {
when(vorgangUpdatedEvent.getSource()).thenReturn("commandId");
Command command = CommandTestFactory.create();
when(commandService.findCommand(anyString())).thenReturn(Optional.of(command));
when(vorgangService.getById(anyString())).thenReturn(vorgang);
}
@Test
void shouldUpdateVorgangInSolr() {
eventListener.onVorgangStatusChanged(vorgangUpdatedEvent);
verify(elasticsearchService).updateVorgang(any());
}
}
}
package de.itvsh.ozg.pluto.common.elastic;
import org.springframework.boot.test.util.TestPropertyValues;
import org.springframework.context.ConfigurableApplicationContext;
import org.testcontainers.elasticsearch.ElasticsearchContainer;
public class ElasticsearchIndexerEnabledInitializer extends ElasticsearchInitializer {
@Override
protected void setProperties(ElasticsearchContainer container, ConfigurableApplicationContext applicationContext) {
super.setProperties(container, applicationContext);
TestPropertyValues.of("kop.elasticsearch.initEnabled=true");
}
}
package de.itvsh.ozg.pluto.common.elastic;
import org.springframework.boot.test.util.TestPropertyValues;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.testcontainers.elasticsearch.ElasticsearchContainer;
import lombok.AccessLevel;
import lombok.Getter;
public class ElasticsearchInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
private static final String ELASTICSEARCH_VERSIION = "docker.elastic.co/elasticsearch/elasticsearch:8.3.2";
@Getter(value = AccessLevel.PROTECTED)
private ElasticsearchContainer elasticsearchContainer;
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
elasticsearchContainer = new ElasticsearchContainer(ELASTICSEARCH_VERSIION);
elasticsearchContainer.start();
setProperties(elasticsearchContainer, applicationContext);
}
protected void setProperties(ElasticsearchContainer container, ConfigurableApplicationContext applicationContext) {
TestPropertyValues.of(
"kop.elasticsearch.host=" + container.getHttpHostAddress(),
"kop.elasticsearch.initEnabled=false",
"kop.elasticsearch.collectionName=test");
}
}
package de.itvsh.ozg.pluto.common.elastic;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import de.itvsh.ozg.pluto.vorgang.VorgangTestFactory;
class ElasticsearchServiceTest {
@InjectMocks
private ElasticsearchService elasticsearchService;
@Mock
private ElasticsearchVorgangRepostitory repostitory;
@Nested
class TestAddVorgang {
@Test
void shouldCallRepository() {
elasticsearchService.addVorgang(VorgangTestFactory.create());
verify(repostitory).save(any());
}
}
@Nested
class TestUpdateVorgang {
@Test
void shouldCallRepository() {
elasticsearchService.updateVorgang(VorgangTestFactory.create());
verify(repostitory).save(any());
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment