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

Merge pull request 'OZG-3303: Reihenfolge der Antragsdaten beim Laden eines...

Merge pull request 'OZG-3303: Reihenfolge der Antragsdaten beim Laden eines Vorganges behalten' (#103) from OZG-3302-keep_field_order_by_load into master

Reviewed-on: https://git.ozg-sh.de/mgm/pluto/pulls/103


Reviewed-by: default avatarOZGCloud <ozgcloud@mgm-tp.com>
parents c7beeca6 29099874
No related branches found
No related tags found
No related merge requests found
/*
* Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
*
* Lizenziert unter der EUPL, Version 1.2 oder - sobald
* diese von der Europäischen Kommission genehmigt wurden -
* Folgeversionen der EUPL ("Lizenz");
* Sie dürfen dieses Werk ausschließlich gemäß
* dieser Lizenz nutzen.
* Eine Kopie der Lizenz finden Sie hier:
*
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
*
* Sofern nicht durch anwendbare Rechtsvorschriften
* gefordert oder in schriftlicher Form vereinbart, wird
* die unter der Lizenz verbreitete Software "so wie sie
* ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
* ausdrücklich oder stillschweigend - verbreitet.
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
package de.itvsh.ozg.pluto.vorgang;
import static org.assertj.core.api.Assertions.*;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.security.test.context.support.WithMockUser;
import de.itvsh.kop.common.test.ITCase;
import de.itvsh.kop.pluto.common.grpc.GrpcFormDataTestFactory;
import de.itvsh.kop.pluto.common.grpc.GrpcFormFieldTestFactory;
import de.itvsh.kop.pluto.common.grpc.GrpcSubFormTestFactory;
import io.grpc.stub.StreamObserver;
@ITCase
class GrpcVorgangServiceITCase {
private static final String NAME_FIELD_1 = "field1";
private static final String VALUE_FIELD_1 = "value1";
private static final String NAME_FIELD_2 = "field2";
private static final String VALUE_FIELD_2 = "value2";
private static final String NAME_FIELD_3 = "field3";
private static final String VALUE_FIELD_3 = "value3";
private static final List<GrpcFormField> formFields = List.of(
createFormField(NAME_FIELD_1, VALUE_FIELD_1),
createFormField(NAME_FIELD_2, VALUE_FIELD_2),
createFormField(NAME_FIELD_3, VALUE_FIELD_3));
private static final String TITLE_SUBFORM_1 = "SUBFORM_1";
private static final String TITLE_SUBFORM_2 = "SUBFORM_2";
private static final String TITLE_SUBFORM_3 = "SUBFORM_3";
@Autowired
private GrpcVorgangService grpcVorgangService;
@MockBean
private VorgangService service;
@Nested
class TestCreateVorgang {
@Mock
private StreamObserver<GrpcCreateVorgangResponse> responseObserver;
@Captor
private ArgumentCaptor<Eingang> eingangCaptor;
@BeforeEach
void init() {
when(service.startCreation(any())).thenReturn(VorgangTestFactory.create());
}
@Test
void shouldKeepFieldsOrder() {
var grpcFormData = GrpcFormData.newBuilder().addAllField(formFields).build();
Map<String, Object> formData = startCreation(grpcFormData);
assertThat(formData).containsExactly(
entry(NAME_FIELD_1, VALUE_FIELD_1),
entry(NAME_FIELD_2, VALUE_FIELD_2),
entry(NAME_FIELD_3, VALUE_FIELD_3));
}
@Test
void shouldKeepSubFormOrder() {
var grpcFormData = GrpcFormData.newBuilder().addForm(GrpcSubFormTestFactory.createBuilder().setTitle(TITLE_SUBFORM_1))
.addForm(GrpcSubFormTestFactory.createBuilder().setTitle(TITLE_SUBFORM_2))
.addForm(GrpcSubFormTestFactory.createBuilder().setTitle(TITLE_SUBFORM_3)).build();
Map<String, Object> formData = startCreation(grpcFormData);
verifySubFormOrder(formData, TITLE_SUBFORM_1, TITLE_SUBFORM_2, TITLE_SUBFORM_3);
}
@Test
void shouldKeepFieldsOrderInSubForm() {
var grpcFormData = GrpcFormDataTestFactory.createBuilder().addForm(
GrpcSubFormTestFactory.createBuilder().clearField().clearSubForm().setTitle(TITLE_SUBFORM_1).addAllField(formFields))
.build();
@SuppressWarnings("unchecked")
var formData = (Map<String, Object>) startCreation(grpcFormData).get(TITLE_SUBFORM_1);
assertThat(formData).containsExactly(
entry(NAME_FIELD_1, VALUE_FIELD_1),
entry(NAME_FIELD_2, VALUE_FIELD_2),
entry(NAME_FIELD_3, VALUE_FIELD_3));
}
@Test
void shouldKeepOrderInSubForm() {
var grpcFormData = GrpcFormDataTestFactory.createBuilder().addForm(
GrpcSubFormTestFactory.createBuilder().setTitle(TITLE_SUBFORM_1).clearField().clearSubForm()
.addSubForm(GrpcSubFormTestFactory.createBuilder().setTitle(TITLE_SUBFORM_3))
.addSubForm(GrpcSubFormTestFactory.createBuilder().setTitle(TITLE_SUBFORM_2)))
.build();
@SuppressWarnings("unchecked")
var formData = (Map<String, Object>) startCreation(grpcFormData).get(TITLE_SUBFORM_1);
verifySubFormOrder(formData, TITLE_SUBFORM_3, TITLE_SUBFORM_2);
}
private static void verifySubFormOrder(Map<String, Object> formData, String... subFormTitle) {
var entries = new ArrayList<>(formData.entrySet());
for (int i = 0; i < subFormTitle.length; i++) {
var entry = entries.get(i);
assertThat(entry.getKey()).isEqualTo(subFormTitle[i]);
}
}
private Map<String, Object> startCreation(GrpcFormData grpcFormData) {
grpcVorgangService.startCreation(GrpcCreateVorgangRequestTestFactory.createWithFormData(grpcFormData), responseObserver);
Mockito.verify(service).startCreation(eingangCaptor.capture());
return eingangCaptor.getValue().getFormData();
}
}
private static GrpcFormField createFormField(String fieldName, String fieldValue) {
return GrpcFormFieldTestFactory.createBuilder().setName(fieldName).setValue(fieldValue).build();
}
@Nested
class TestLoadVorgang {
private static final String REQUEST_ID = "request_id";
@Mock
private StreamObserver<GrpcFindVorgangWithEingangResponse> streamObserver;
@Captor
private ArgumentCaptor<GrpcFindVorgangWithEingangResponse> findVorgangResponseCaptor;
@BeforeEach
void initVorgang() {
var formData = createFormData();
var eingang = EingangTestFactory.createBuilder().formData(formData).build();
var vorgang = VorgangTestFactory.createBuilder().clearEingangs().eingangs(List.of(eingang)).build();
when(service.getById(any(), any())).thenReturn(vorgang);
}
@Test
@WithMockUser
void shouldKeepFieldOrder() {
var grpcFormData = requestFormData();
assertThat(grpcFormData).isEqualTo(expectedFormData());
}
private static Map<String, Object> createFormData() {
Map<String, Object> formData = new LinkedHashMap<>();
formData.put(NAME_FIELD_1, VALUE_FIELD_1);
formData.put(NAME_FIELD_2, VALUE_FIELD_2);
formData.put(NAME_FIELD_3, VALUE_FIELD_3);
for (String subFormName : List.of(TITLE_SUBFORM_1, TITLE_SUBFORM_2, TITLE_SUBFORM_3)) {
var subForm = new LinkedHashMap<>();
formData.put(subFormName, subForm);
subForm.put(NAME_FIELD_1, VALUE_FIELD_1);
subForm.put(NAME_FIELD_2, VALUE_FIELD_2);
subForm.put(NAME_FIELD_3, VALUE_FIELD_3);
}
return formData;
}
private static GrpcFormData expectedFormData() {
var grpcFormData = GrpcFormDataTestFactory.createBuilder()
.clearField()
.addAllField(formFields);
for (String subFormName : List.of(TITLE_SUBFORM_1, TITLE_SUBFORM_2, TITLE_SUBFORM_3)) {
grpcFormData.addForm(GrpcSubForm.newBuilder()
.setTitle(subFormName)
.addAllField(formFields));
}
return grpcFormData.build();
}
private GrpcFormData requestFormData() {
grpcVorgangService.findVorgangWithEingang(GrpcFindVorgangWithEingangRequest.newBuilder().setId(REQUEST_ID).build(), streamObserver);
verify(streamObserver).onNext(findVorgangResponseCaptor.capture());
return findVorgangResponseCaptor.getValue().getVorgangWithEingang().getEingang().getFormData();
}
}
}
/*
* Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
*
* Lizenziert unter der EUPL, Version 1.2 oder - sobald
* diese von der Europäischen Kommission genehmigt wurden -
* Folgeversionen der EUPL ("Lizenz");
* Sie dürfen dieses Werk ausschließlich gemäß
* dieser Lizenz nutzen.
* Eine Kopie der Lizenz finden Sie hier:
*
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
*
* Sofern nicht durch anwendbare Rechtsvorschriften
* gefordert oder in schriftlicher Form vereinbart, wird
* die unter der Lizenz verbreitete Software "so wie sie
* ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
* ausdrücklich oder stillschweigend - verbreitet.
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
package de.itvsh.ozg.pluto.vorgang;
import de.itvsh.kop.common.test.ITCase;
import de.itvsh.kop.pluto.common.grpc.GrpcFormDataTestFactory;
import de.itvsh.kop.pluto.common.grpc.GrpcSubFormTestFactory;
import io.grpc.stub.StreamObserver;
import org.junit.jupiter.api.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.mock.mockito.MockBean;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import static org.assertj.core.api.Assertions.*;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
@ITCase
class KeepFieldsOrderITCase {
private static final String NAME_FIELD_1 = "field1";
private static final String VALUE_FIELD_1 = "value1";
private static final String NAME_FIELD_2 = "field2";
private static final String VALUE_FIELD_2 = "value2";
private static final String NAME_FIELD_3 = "field3";
private static final String VALUE_FIELD_3 = "value3";
private static final List<GrpcFormField> formFields = List.of(
createFormField(NAME_FIELD_1, VALUE_FIELD_1),
createFormField(NAME_FIELD_2, VALUE_FIELD_2),
createFormField(NAME_FIELD_3, VALUE_FIELD_3));
private static GrpcFormField createFormField(String fieldName, String fieldValue) {
return GrpcFormField.newBuilder().setName(fieldName).setValue(fieldValue).build();
}
private static final String TITLE_SUBFORM_1 = "SUBFORM_1";
private static final String TITLE_SUBFORM_2 = "SUBFORM_2";
private static final String TITLE_SUBFORM_3 = "SUBFORM_3";
@Autowired
private GrpcVorgangService grpcVorgangService;
@MockBean
private VorgangRepository vorgangRepository;
@Mock
private StreamObserver<GrpcCreateVorgangResponse> responseObserver;
@Captor
private ArgumentCaptor<Vorgang> vorgangCaptor;
private Vorgang vorgang = when(mock(Vorgang.class).getId()).thenReturn("id").getMock();
@Test
void shouldKeepFieldsOrder() {
when(vorgangRepository.save(any())).thenReturn(vorgang);
var grpcFormData = GrpcFormData.newBuilder().addAllField(formFields).addForm(GrpcSubFormTestFactory.createBuilder().setTitle(TITLE_SUBFORM_1))
.addForm(GrpcSubFormTestFactory.createBuilder().setTitle(TITLE_SUBFORM_2))
.addForm(GrpcSubFormTestFactory.createBuilder().setTitle(TITLE_SUBFORM_3)).build();
grpcVorgangService.startCreation(GrpcCreateVorgangRequestTestFactory.createWithFormData(grpcFormData), responseObserver);
Mockito.verify(vorgangRepository).save(vorgangCaptor.capture());
Map<String, Object> formData = vorgangCaptor.getValue().getEingangs().get(0).getFormData();
verifyFieldsOrder(formData);
verifySubFormOrder(formData, TITLE_SUBFORM_1, TITLE_SUBFORM_2, TITLE_SUBFORM_3);
}
@Test
void shouldKeepOrderInSubForm() {
when(vorgangRepository.save(any())).thenReturn(vorgang);
GrpcFormData grpcFormData = GrpcFormDataTestFactory.createBuilder().addForm(
GrpcSubFormTestFactory.createBuilder().setTitle(TITLE_SUBFORM_1).clearField().addAllField(formFields).clearSubForm()
.addSubForm(GrpcSubFormTestFactory.createBuilder().setTitle(TITLE_SUBFORM_3))
.addSubForm(GrpcSubFormTestFactory.createBuilder().setTitle(TITLE_SUBFORM_2))).build();
grpcVorgangService.startCreation(GrpcCreateVorgangRequestTestFactory.createWithFormData(grpcFormData), responseObserver);
Mockito.verify(vorgangRepository).save(vorgangCaptor.capture());
var formData = (Map<String, Object>) vorgangCaptor.getValue().getEingangs().get(0).getFormData().get(TITLE_SUBFORM_1);
verifyFieldsOrder(formData);
verifySubFormOrder(formData, TITLE_SUBFORM_3, TITLE_SUBFORM_2);
}
private static void verifyFieldsOrder(Map<String, Object> formData) {
var entries = new ArrayList<>(formData.entrySet());
var entry = entries.get(0);
assertThat(entry.getKey()).isEqualTo(NAME_FIELD_1);
assertThat(entry.getValue()).isEqualTo(VALUE_FIELD_1);
entry = entries.get(1);
assertThat(entry.getKey()).isEqualTo(NAME_FIELD_2);
assertThat(entry.getValue()).isEqualTo(VALUE_FIELD_2);
entry = entries.get(2);
assertThat(entry.getKey()).isEqualTo(NAME_FIELD_3);
assertThat(entry.getValue()).isEqualTo(VALUE_FIELD_3);
}
private static void verifySubFormOrder(Map<String, Object> formData, String... subFormTitle) {
var entries = new ArrayList<>(formData.entrySet());
for (int i = 0; i < subFormTitle.length; i++) {
var entry = entries.get(i + 3);
assertThat(entry.getKey()).isEqualTo(subFormTitle[i]);
}
}
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment