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

Merge remote-tracking branch 'origin/master' into OZG-2737_MigrationUserId

parents 2c205b9a 026a422a
Branches
Tags
No related merge requests found
Showing
with 32 additions and 262 deletions
package de.itvsh.kop.notification.user; package de.itvsh.kop.notification.user;
import static org.assertj.core.api.Assertions.*;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
import de.itvsh.kop.user.grpc.recipient.RecipientServiceGrpc.RecipientServiceBlockingStub; import de.itvsh.kop.user.grpc.recipient.RecipientServiceGrpc.RecipientServiceBlockingStub;
import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks; import org.mockito.InjectMocks;
import org.mockito.Mock; import org.mockito.Mock;
import static org.assertj.core.api.Assertions.*;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
class UserRemoteServiceTest { class UserRemoteServiceTest {
@InjectMocks @InjectMocks
......
...@@ -6,6 +6,7 @@ import static org.elasticsearch.index.query.QueryBuilders.*; ...@@ -6,6 +6,7 @@ import static org.elasticsearch.index.query.QueryBuilders.*;
import java.util.Arrays; import java.util.Arrays;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
...@@ -24,6 +25,8 @@ import de.itvsh.ozg.pluto.vorgang.VorgangHeader; ...@@ -24,6 +25,8 @@ import de.itvsh.ozg.pluto.vorgang.VorgangHeader;
@Repository @Repository
class SearchVorgangCustomRepositoryImpl implements SearchVorgangCustomRepostitory { class SearchVorgangCustomRepositoryImpl implements SearchVorgangCustomRepostitory {
private static final String JOIN_AND = " AND ";
private static final String WILDCARD_PATTERN = "(*%s*)";
private static final String KEYWORD = ".keyword"; private static final String KEYWORD = ".keyword";
private static final float HALF_BOOST = 0.5f; private static final float HALF_BOOST = 0.5f;
private static final float DOUBLE_BOOST = 2f; private static final float DOUBLE_BOOST = 2f;
...@@ -57,8 +60,10 @@ class SearchVorgangCustomRepositoryImpl implements SearchVorgangCustomRepostitor ...@@ -57,8 +60,10 @@ class SearchVorgangCustomRepositoryImpl implements SearchVorgangCustomRepostitor
setFilter(request, searchQueryBuilder); setFilter(request, searchQueryBuilder);
Arrays.stream(request.getQuery().strip().split(" ")).forEach(query -> searchQueryBuilder var queryString = Arrays.stream(request.getQuery().strip().split(StringUtils.SPACE)).map(
.withQuery(queryStringQuery("*" + query + "*").fields(SearchVorgangCustomRepositoryImpl.FIELD_MAP))); WILDCARD_PATTERN::formatted).collect(Collectors.joining(JOIN_AND));
searchQueryBuilder.withQuery(queryStringQuery(queryString).fields(SearchVorgangCustomRepositoryImpl.FIELD_MAP));
return searchQueryBuilder.withPageable(pageable).build(); return searchQueryBuilder.withPageable(pageable).build();
} }
......
...@@ -5,6 +5,4 @@ import org.springframework.data.domain.Page; ...@@ -5,6 +5,4 @@ import org.springframework.data.domain.Page;
interface CustomVorgangHeaderRepository { interface CustomVorgangHeaderRepository {
Page<VorgangHeader> findAll(FindVorgangRequest request); Page<VorgangHeader> findAll(FindVorgangRequest request);
Page<VorgangHeader> searchBy(FindVorgangRequest request);
} }
\ No newline at end of file
...@@ -42,11 +42,6 @@ class VorgangHeaderRepositoryImpl implements CustomVorgangHeaderRepository { ...@@ -42,11 +42,6 @@ class VorgangHeaderRepositoryImpl implements CustomVorgangHeaderRepository {
return checkAndExecuteRequest(request, buildFilterQuery(request.getFilterBy())); return checkAndExecuteRequest(request, buildFilterQuery(request.getFilterBy()));
} }
@Override
public Page<VorgangHeader> searchBy(FindVorgangRequest request) {
return checkAndExecuteRequest(request, buildFilterQuery(request.getFilterBy(), request.getSearchBy()));
}
private Page<VorgangHeader> checkAndExecuteRequest(FindVorgangRequest request, Query totalQuery) { private Page<VorgangHeader> checkAndExecuteRequest(FindVorgangRequest request, Query totalQuery) {
if (hasNoPermissionByOrganisationseinheitenId(request.getFilterBy())) { if (hasNoPermissionByOrganisationseinheitenId(request.getFilterBy())) {
return new PageImpl<>(Collections.emptyList()); return new PageImpl<>(Collections.emptyList());
...@@ -83,10 +78,6 @@ class VorgangHeaderRepositoryImpl implements CustomVorgangHeaderRepository { ...@@ -83,10 +78,6 @@ class VorgangHeaderRepositoryImpl implements CustomVorgangHeaderRepository {
return Query.query(filterToCriteria(filterCriteria)); return Query.query(filterToCriteria(filterCriteria));
} }
Query buildFilterQuery(FilterCriteria filterCriteria, String searchBy) {
return Query.query(new Criteria().andOperator(filterToCriteria(filterCriteria), CriteriaUtil.searchCriteria(searchBy)));
}
private Criteria filterToCriteria(FilterCriteria filterCriteria) { private Criteria filterToCriteria(FilterCriteria filterCriteria) {
var organisationseinheitenIdCriteria = buildOrganisationseinheitenCriteria(filterCriteria); var organisationseinheitenIdCriteria = buildOrganisationseinheitenCriteria(filterCriteria);
var assignedToCriteria = buildAssignedToCriteria(filterCriteria); var assignedToCriteria = buildAssignedToCriteria(filterCriteria);
......
package de.itvsh.ozg.pluto.vorgang; package de.itvsh.ozg.pluto.vorgang;
import java.util.Objects; import java.util.Objects;
import java.util.Optional;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.PageImpl;
...@@ -26,11 +24,8 @@ class VorgangHeaderService { ...@@ -26,11 +24,8 @@ class VorgangHeaderService {
public Page<VorgangHeader> findAll(FindVorgangRequest request) { public Page<VorgangHeader> findAll(FindVorgangRequest request) {
if (Objects.nonNull(searchService) && Objects.nonNull(request.getSearchBy())) { if (Objects.nonNull(searchService) && Objects.nonNull(request.getSearchBy())) {
return removeUnpermitted(searchService.find(request)); return removeUnpermitted(searchService.find(request));
} else {
return removeUnpermitted(Optional.ofNullable(StringUtils.trimToNull(request.getSearchBy()))
.map(searchString -> repository.searchBy(request))
.orElseGet(() -> repository.findAll(request)));
} }
return removeUnpermitted(repository.findAll(request));
} }
private Page<VorgangHeader> removeUnpermitted(Page<VorgangHeader> loaded) { private Page<VorgangHeader> removeUnpermitted(Page<VorgangHeader> loaded) {
......
...@@ -29,7 +29,7 @@ spring: ...@@ -29,7 +29,7 @@ spring:
properties: properties:
'[mail.smtp.starttls.enable]': true '[mail.smtp.starttls.enable]': true
elasticsearch: elasticsearch:
#uris: http://localhost:9200 uris: http://localhost:9200
username: elastic username: elastic
password: password password: password
......
...@@ -123,7 +123,7 @@ public class SearchServiceITCase { ...@@ -123,7 +123,7 @@ public class SearchServiceITCase {
void shouldFindByAntragstellerNameAndAktenzeichen() { void shouldFindByAntragstellerNameAndAktenzeichen() {
var res = searchService var res = searchService
.find(FindVorgangRequestTestFactory.createBuilder() .find(FindVorgangRequestTestFactory.createBuilder()
.searchBy(IndexedVorgangTestFactory.ANTRAGSTELLER_NAME + " test") .searchBy(IndexedVorgangTestFactory.ANTRAGSTELLER_NAME + " tes")
.filterBy(FilterCriteriaTestFactory.createBuilder().clearStatus().assignedTo(null).build()) .filterBy(FilterCriteriaTestFactory.createBuilder().clearStatus().assignedTo(null).build())
.build()); .build());
......
...@@ -81,12 +81,11 @@ class SearchVorgangCustomRepositoryImplTest { ...@@ -81,12 +81,11 @@ class SearchVorgangCustomRepositoryImplTest {
} }
@Test @Test
void shouldHaveQuery() { void shouldHaveFieldsWithWights() {
var request = SearchRequestTestFactory.create(); var request = SearchRequestTestFactory.create();
var query = searchRepostitory.createQuery(request, PageRequest.of(request.getOffSet(), request.getLimit())); var query = searchRepostitory.createQuery(request, PageRequest.of(request.getOffSet(), request.getLimit()));
assertThat(query.getQuery()).isNotNull(); assertThat(query.getQuery()).isNotNull();
assertThat(query.getQuery()).asString().contains("\"query\" : \"*vors*\"");
assertThat(query.getQuery()).asString().contains("aktenzeichen^2.0"); assertThat(query.getQuery()).asString().contains("aktenzeichen^2.0");
assertThat(query.getQuery()).asString().contains("antragstellerName^1.0"); assertThat(query.getQuery()).asString().contains("antragstellerName^1.0");
assertThat(query.getQuery()).asString().contains("antragstellerVorname^1.0"); assertThat(query.getQuery()).asString().contains("antragstellerVorname^1.0");
...@@ -94,6 +93,22 @@ class SearchVorgangCustomRepositoryImplTest { ...@@ -94,6 +93,22 @@ class SearchVorgangCustomRepositoryImplTest {
assertThat(query.getQuery()).asString().contains("vorgangNummer^2.0"); assertThat(query.getQuery()).asString().contains("vorgangNummer^2.0");
} }
@Test
void shouldHaveSimpleQuery() {
var request = SearchRequestTestFactory.create();
var query = searchRepostitory.createQuery(request, PageRequest.of(request.getOffSet(), request.getLimit()));
assertThat(query.getQuery()).asString().contains("\"query\" : \"(*vors*)\"");
}
@Test
void shouldHaveQuery() {
var request = SearchRequestTestFactory.createBuilder().query("vors test").build();
var query = searchRepostitory.createQuery(request, PageRequest.of(request.getOffSet(), request.getLimit()));
assertThat(query.getQuery()).asString().contains("\"query\" : \"(*vors*) AND (*test*)\"");
}
@Nested @Nested
class forRolePoststelle { class forRolePoststelle {
@Test @Test
......
...@@ -16,7 +16,6 @@ import org.junit.jupiter.api.DisplayName; ...@@ -16,7 +16,6 @@ import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.junit.jupiter.params.provider.EnumSource; import org.junit.jupiter.params.provider.EnumSource;
import org.junit.jupiter.params.provider.EnumSource.Mode; import org.junit.jupiter.params.provider.EnumSource.Mode;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -48,239 +47,6 @@ class VorgangHeaderRepositoryITCase { ...@@ -48,239 +47,6 @@ class VorgangHeaderRepositoryITCase {
mongoOperations.dropCollection(Vorgang.class); mongoOperations.dropCollection(Vorgang.class);
} }
@Nested
class TestSearchBy {
@ParameterizedTest
@CsvSource({ "test--", "--test", "-test-", "TEst--" })
void shouldFindByAktenzeichen(String aktenzeichen) {
mongoOperations.save(buildWithAktenzeichen(aktenzeichen));
var result = repository.searchBy(createRequestWithSearchBy("test")).getContent();
assertThat(result).hasSize(1);
}
@ParameterizedTest
@CsvSource({ "Paul", "Pauline", "testpauler", "PaULie" })
void shouldFindByVornamen(String vornamen) {
mongoOperations.save(buildVorgangWithVornamen(vornamen));
var result = repository.searchBy(createRequestWithSearchBy("Paul")).getContent();
assertThat(result).hasSize(1);
}
private Vorgang buildVorgangWithVornamen(String vornamen) {
return VorgangTestFactory.createBuilder()
.id(null)
.clearEingangs()
.eingang(EingangTestFactory.createBuilder()
.antragsteller(AntragstellerTestFactory.createBuilder()
.vorname(vornamen)
.build())
.build())
.build();
}
@ParameterizedTest
@CsvSource({ "Maier", "Biermaier", "Maiertest", "Testmaiertest" })
void shouldFindByNachnamen(String nachname) {
mongoOperations.save(buildWithNachname(nachname));
var result = repository.searchBy(createRequestWithSearchBy("Maier")).getContent();
assertThat(result).hasSize(1);
}
@ParameterizedTest
@CsvSource({ "Fischereischein", "Fischer", "AFischereischein", "xFischEreischEinx" })
void shouldFindByVorgangName(String name) {
mongoOperations.save(buildWithVorgangName(name));
var result = repository.searchBy(createRequestWithSearchBy("Fischer")).getContent();
assertThat(result).hasSize(1);
}
@ParameterizedTest
@CsvSource({ "32456 0815 34", "0815 123 456", "123 456 0815" })
void shouldFindByRequestId(String requestId) {
mongoOperations.save(buildVorgangWithRequestId(requestId));
var result = repository.searchBy(createRequestWithSearchBy("0815")).getContent();
assertThat(result).hasSize(1);
}
private Vorgang buildVorgangWithRequestId(String requestId) {
return VorgangTestFactory.createBuilder()
.eingang(EingangTestFactory.createBuilder()
.header(EingangHeaderTestFactory.createBuilder()
.requestId(requestId)
.build())
.build())
.build();
}
@ParameterizedTest
@CsvSource({ "Testaktenzeichen, Paultest, Testmaier, TEstvorgang", "Aktenzeichentest, Test-Marie, Meiertest, vorgangTEst" })
void shouldFindByInSomeFields(String aktenzeichen, String vorname, String nachname, String vorgangId) {
mongoOperations.save(buildWithAktenzeichen(aktenzeichen));
mongoOperations.save(buildVorgangWithVornamen(vorname));
mongoOperations.save(buildWithNachname(nachname));
mongoOperations.save(buildWithVorgangName(vorgangId));
var result = repository.searchBy(createRequestWithSearchBy("test")).getContent();
assertThat(result).hasSize(4);
}
@ParameterizedTest
@CsvSource({ "Testaktenzeichen, Pinguin, bla, bla-vorgang", "Aktenzeichentest, Pechbla, blub, vorgang-blub" })
void shouldNotFindMultipleWordsByInSomeFields(String aktenzeichen, String vorname, String nachname, String vorgangId) {
mongoOperations.save(buildWithAktenzeichen(aktenzeichen));
mongoOperations.save(buildWithVorgangName(vorname));
mongoOperations.save(buildWithNachname(nachname));
mongoOperations.save(buildWithVorgangName(vorgangId));
var result = repository.searchBy(createRequestWithSearchBy("test bla")).getContent();
assertThat(result).isEmpty();
}
private Vorgang buildWithAktenzeichen(String aktenzeichen) {
return VorgangTestFactory.createBuilder().id(null).aktenzeichen(aktenzeichen).status(Status.ANGENOMMEN).build();
}
private Vorgang buildWithVorgangName(String name) {
return VorgangTestFactory.createBuilder().id(null).name(name).build();
}
private Vorgang buildWithNachname(String nachname) {
return VorgangTestFactory.createBuilder().id(null)
.clearEingangs().eingang(EingangTestFactory.createBuilder()
.antragsteller(AntragstellerTestFactory.createBuilder()
.nachname(nachname)
.build())
.build())
.build();
}
@ParameterizedTest
@CsvSource({ "Testaktenzeichen, bla-vorgang", "Aktenzeichentest, vorgang-bla" })
void shouldFindMultipleWordsByInSomeFields(String aktenzeichen, String vorgangId) {
mongoOperations.save(buildWithAktenzeichenAndVorgangnamen(aktenzeichen, vorgangId));
mongoOperations.save(buildWithAktenzeichenAndVorgangnamen(aktenzeichen, vorgangId));
var result = repository.searchBy(createRequestWithSearchBy("test bla")).getContent();
assertThat(result).hasSize(2);
}
private Vorgang buildWithAktenzeichenAndVorgangnamen(String aktenzeichen, String name) {
return VorgangTestFactory.createBuilder()
.id(UUID.randomUUID().toString())
.name(name)
.aktenzeichen(aktenzeichen)
.build();
}
@ParameterizedTest
@CsvSource({ "vorgangNummer1234", "--Nummer1234", "-ngNu-", "VorgangNu--" })
void shouldFindByNummer(String nummer) {
mongoOperations.save(buildWithNummer(nummer));
var result = repository.searchBy(createRequestWithSearchBy("Nu")).getContent();
assertThat(result).hasSize(1);
}
private Vorgang buildWithNummer(String nummer) {
return VorgangTestFactory.createBuilder().id(null).nummer(nummer).build();
}
private FindVorgangRequest createRequestWithSearchBy(String searchTerm) {
return FindVorgangRequestTestFactory.createBuilder()
.searchBy(searchTerm).filterBy(null).limit(10).offset(0)
.build();
}
}
@Nested
class TestSearchByEingangsKennzeichen {
private final String NO_DEFAULT_MATCH = "no match";
private final String EINGANGSKENNZEICHEN = "0815";
@ParameterizedTest
@EnumSource
void shouldFindInAnyStatus(Status status) {
mongoOperations.save(buildWithEingangsKennzeichen(EINGANGSKENNZEICHEN, status));
mongoOperations.save(buildWithEingangsKennzeichen(NO_DEFAULT_MATCH, status));
var request = FindVorgangRequestTestFactory.createBuilder()
.searchBy(EINGANGSKENNZEICHEN).filterBy(null)
.build();
var result = repository.searchBy(request).getContent();
assertThat(result).hasSize(1);
}
@Test
void shouldHaveTotalByEingangskennzeichenAndOrganisationseinheitenId() {
mongoOperations.save(buildWithEingangsKennzeichen(EINGANGSKENNZEICHEN));
mongoOperations.save(buildWithEingangsKennzeichen(EINGANGSKENNZEICHEN));
mongoOperations.save(buildWithEingangsKennzeichen(EINGANGSKENNZEICHEN));
mongoOperations.save(buildWithEingangsKennzeichen(NO_DEFAULT_MATCH));
mongoOperations.save(buildWithEingangsKennzeichenAndOrganisationseinheitenId(NO_DEFAULT_MATCH, NO_DEFAULT_MATCH, Status.NEU));
var request = FindVorgangRequestTestFactory.createBuilder()
.searchBy(EINGANGSKENNZEICHEN).filterBy(FilterCriteriaTestFactory.create()).limit(1).offset(0)
.build();
var result = repository.searchBy(request);
assertThat(result.getTotalElements()).isEqualTo(3);
}
private Vorgang buildWithEingangsKennzeichen(String eingangskennzeichen) {
return buildWithEingangsKennzeichen(eingangskennzeichen, Status.NEU);
}
@Nested
class TestWithFilterByOrganisationseinheit {
@ParameterizedTest
@EnumSource
void shouldFindInAnyStatus(Status status) {
mongoOperations.save(buildWithEingangsKennzeichen(EINGANGSKENNZEICHEN, status));
mongoOperations.save(buildWithEingangsKennzeichen(NO_DEFAULT_MATCH, status));
mongoOperations.save(buildWithEingangsKennzeichenAndOrganisationseinheitenId(NO_DEFAULT_MATCH, NO_DEFAULT_MATCH, status));
var request = FindVorgangRequestTestFactory.createBuilder()
.searchBy(EINGANGSKENNZEICHEN).filterBy(FilterCriteriaTestFactory.createBuilder().clearStatus().assignedTo(null).build())
.build();
var result = repository.searchBy(request).getContent();
assertThat(result).hasSize(1);
}
}
private Vorgang buildWithEingangsKennzeichen(String kennz, Status status) {
var header = EingangHeaderTestFactory.createBuilder().requestId(kennz).build();
var eingang = EingangTestFactory.createBuilder().header(header).build();
return VorgangTestFactory.createBuilder().id(null).status(status).clearEingangs().eingang(eingang).build();
}
private Vorgang buildWithEingangsKennzeichenAndOrganisationseinheitenId(String kennz, String organisationseinheitenId, Status status) {
var header = EingangHeaderTestFactory.createBuilder().requestId(kennz).build();
var zustaendigeStelle = ZustaendigeStelleTestFactory.createBuilder().organisationseinheitenId(organisationseinheitenId)
.build();
var eingang = EingangTestFactory.createBuilder().header(header).zustaendigeStelle(zustaendigeStelle).build();
return VorgangTestFactory.createBuilder().id(null).status(status).clearEingangs().eingang(eingang).build();
}
}
@Nested @Nested
class TestSortByPriority { class TestSortByPriority {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment