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

Merge branch 'master' into OZG-5842-Fehlermeldung-Bescheidwizard

parents fe15381e 5468e485
No related branches found
No related tags found
No related merge requests found
Showing
with 1751 additions and 1395 deletions
...@@ -659,6 +659,7 @@ String generateCypressConfig(String bezeichner, String testFolder, Integer dbPor ...@@ -659,6 +659,7 @@ String generateCypressConfig(String bezeichner, String testFolder, Integer dbPor
config.env.put("search", getElasticsearchEnv(namespace)) config.env.put("search", getElasticsearchEnv(namespace))
config.env.put("userManager", getUserManagerEnv(namespace, dbPort)) config.env.put("userManager", getUserManagerEnv(namespace, dbPort))
config.env.put("smocker", getSmockerEnv(namespace))
writeJSON file: configName, json: config writeJSON file: configName, json: config
...@@ -802,3 +803,9 @@ Map getElasticsearchSecret(String namespace) { ...@@ -802,3 +803,9 @@ Map getElasticsearchSecret(String namespace) {
Boolean hasNpmDebugLog() { Boolean hasNpmDebugLog() {
return sh (script: "ls -l /root/.npm/_logs/*-debug.log", returnStatus: true) == env.SH_SUCCESS_STATUS_CODE as Integer return sh (script: "ls -l /root/.npm/_logs/*-debug.log", returnStatus: true) == env.SH_SUCCESS_STATUS_CODE as Integer
} }
Map getSmockerEnv(String namespace) {
return [
"url": "https://${namespace}-smocker.dev.by.ozg-cloud.de".toString()
]
}
\ No newline at end of file
...@@ -15,6 +15,9 @@ ...@@ -15,6 +15,9 @@
"userManager": { "userManager": {
"dbUrl": "mongodb://localhost:27018", "dbUrl": "mongodb://localhost:27018",
"database": "usermanager" "database": "usermanager"
},
"smocker": {
"url": "http://localhost:7081"
} }
}, },
"fileServerFolder": ".", "fileServerFolder": ".",
......
...@@ -55,8 +55,11 @@ user_manager: ...@@ -55,8 +55,11 @@ user_manager:
use_staging_cert: true use_staging_cert: true
smocker: smocker:
enabled: false enabled: true
ingress:
enabled: true
use_staging_cert: true
mocks: mocks:
- request: - request:
method: POST method: POST
......
...@@ -40,7 +40,11 @@ user_manager: ...@@ -40,7 +40,11 @@ user_manager:
use_staging_cert: true use_staging_cert: true
smocker: smocker:
enabled: false enabled: true
ingress:
enabled: true
use_staging_cert: true
mocks: mocks:
- request: - request:
......
- request:
method: POST
path: /bspx-postkorb-okkomm-ws/bspservices/postkorbkomm
response:
staus: 200
headers:
Content-Type: text/xml
charset: UTF-8
body: >
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header/><SOAP-ENV:Body><ns2:sendBspNachrichtNativeOutput xmlns:ns2="urn:akdb:bsp:postkorb:komm:webservice"><bspQuittung>&lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&gt;&lt;BspQuittung version="1.5" fassung="2020-03-15" xmlns="http://www.akdb.de/egov/bsp/nachrichten"&gt;&lt;AnnahmeErfolgreich&gt;true&lt;/AnnahmeErfolgreich&gt;&lt;ErgebnisStatus&gt;&lt;Tabelle&gt;9006&lt;/Tabelle&gt;&lt;Schluessel&gt;0&lt;/Schluessel&gt;&lt;/ErgebnisStatus&gt;&lt;ErgaenzendeHinweise&gt;Nachricht wurde angenommen&lt;/ErgaenzendeHinweise&gt;&lt;/BspQuittung&gt;</bspQuittung></ns2:sendBspNachrichtNativeOutput></SOAP-ENV:Body></SOAP-ENV:Envelope>
\ No newline at end of file
- request:
method: POST
path: /externe-processor-failure
response:
status: 500
headers:
body: 'Da ist etwas schiefgelaufen'
\ No newline at end of file
- request:
method: POST
path: /externe-processor-success
response:
status: 200
headers:
Content-Type: application/json
body: >
{
"action": "CREATE_AKTENNOTIZ",
"body": {
"headline": "Eine neue Notiz",
"severity": "INFO",
"text": "Alles fein"
}
}
\ No newline at end of file
This diff is collapsed.
/*
* 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.
*/
export enum SmockerMocks {
BAYERNID_MOCK = 'bayernid-mock.yaml',
EXTERNE_PROCESSOR_FAILURE_MOCK = 'externe-processor-failure-mock.yaml',
EXTERNE_PROCESSOR_SUCCESS_MOCK = 'externe-processor-success-mock.yaml',
SMARTDOCUMENT_MOCK = 'smartdocument-mock.yaml',
}
\ No newline at end of file
...@@ -48,6 +48,7 @@ enum CypressEnv { ...@@ -48,6 +48,7 @@ enum CypressEnv {
KEYCLOAK_REALM = 'keycloakRealm', KEYCLOAK_REALM = 'keycloakRealm',
KEYCLOAK_URL = 'keycloakUrl', KEYCLOAK_URL = 'keycloakUrl',
SEARCH = 'search', SEARCH = 'search',
SMOCKER = 'smocker',
} }
const CONTENT_TYPE_HEADER_VALUE: string = 'application/x-www-form-urlencoded'; const CONTENT_TYPE_HEADER_VALUE: string = 'application/x-www-form-urlencoded';
...@@ -80,6 +81,8 @@ declare namespace Cypress { ...@@ -80,6 +81,8 @@ declare namespace Cypress {
getUserInfo(); getUserInfo();
addVorgangToSearchIndex(vorgang); addVorgangToSearchIndex(vorgang);
removeAllDocumentsFromSearchIndex(); removeAllDocumentsFromSearchIndex();
addMockToSmocker(mock);
resetSmocker();
} }
} }
...@@ -239,3 +242,32 @@ function buildSearchIndexRemoveAllBody(): any { ...@@ -239,3 +242,32 @@ function buildSearchIndexRemoveAllBody(): any {
}, },
}; };
} }
Cypress.Commands.add('addMockToSmocker', (mock) => {
cy.fixture(`smocker/${mock}`).then((mockFile) => {
cy.request({
method: HttpMethod.POST,
url: `${getSmockerUrl()}/mocks`,
body: mockFile,
headers: {
"Content-Type": "application/x-yaml"
}
});
});
});
Cypress.Commands.add('resetSmocker', () => {
cy.request({
method: HttpMethod.POST,
url: `${getSmockerUrl()}/reset`,
});
});
function getSmockerUrl(): string {
const smockerEnv: string = getSmockerEnv();
return smockerEnv['url'];
}
function getSmockerEnv(): string {
return Cypress.env(CypressEnv.SMOCKER);
}
\ No newline at end of file
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
import { Interception, RouteHandler, RouteMatcher } from 'cypress/types/net-stubbing'; import { Interception, RouteHandler, RouteMatcher } from 'cypress/types/net-stubbing';
import { GridFsChunkE2E, GridFsFileDataE2E, GridFsFileE2E } from '../model/binary-file'; import { GridFsChunkE2E, GridFsFileDataE2E, GridFsFileE2E } from '../model/binary-file';
import { CommandE2E } from '../model/command'; import { CommandE2E } from '../model/command';
import { SmockerMocks } from '../model/smocker';
import { UsermanagerUserE2E } from '../model/usermanager'; import { UsermanagerUserE2E } from '../model/usermanager';
import { VorgangE2E } from '../model/vorgang'; import { VorgangE2E } from '../model/vorgang';
import { VorgangAttachedItemE2E } from '../model/vorgang-attached-item'; import { VorgangAttachedItemE2E } from '../model/vorgang-attached-item';
...@@ -194,3 +195,11 @@ export function getBaseUrl(): string { ...@@ -194,3 +195,11 @@ export function getBaseUrl(): string {
export function getCypressEnv(value: string) { export function getCypressEnv(value: string) {
return Cypress.env(value); return Cypress.env(value);
} }
export function addSmockerMock(mock: SmockerMocks): void {
cy.addMockToSmocker(mock);
}
export function resetSmocker(): void {
cy.resetSmocker();
}
\ No newline at end of file
Source diff could not be displayed: it is too large. Options to address this: view the blob.
package de.ozgcloud.alfa.bescheid;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Comparator;
import org.springframework.stereotype.Component;
@Component
class BescheidByBeschiedenAmComparator implements Comparator<Bescheid> {
private static final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
@Override
public int compare(Bescheid bescheid1, Bescheid bescheid2) {
var dateCompareResult = compareByBeschiedenAm(bescheid1, bescheid2);
if (dateCompareResult != 0) {
return dateCompareResult;
}
return compareBySentAt(bescheid1, bescheid2);
}
int compareByBeschiedenAm(Bescheid bescheid1, Bescheid bescheid2) {
var date1 = LocalDate.parse(bescheid1.getBeschiedenAm(), dateTimeFormatter);
var date2 = LocalDate.parse(bescheid2.getBeschiedenAm(), dateTimeFormatter);
return date1.compareTo(date2);
}
int compareBySentAt(Bescheid bescheid1, Bescheid bescheid2) {
return bescheid1.getSentInfo().getSentAt()
.compareTo(bescheid2.getSentInfo().getSentAt());
}
}
...@@ -41,7 +41,8 @@ public class BescheidController { ...@@ -41,7 +41,8 @@ public class BescheidController {
} }
Bescheid getBescheid(String bescheidId, String vorgangId) { Bescheid getBescheid(String bescheidId, String vorgangId) {
var bescheid = bescheidService.findByVorgangId(vorgangId).filter(oneBescheid -> StringUtils.equals(oneBescheid.getId(), bescheidId)) var bescheid = bescheidService.findByVorgangId(vorgangId)
.filter(oneBescheid -> StringUtils.equals(oneBescheid.getId(), bescheidId))
.findFirst(); .findFirst();
return bescheid.orElseThrow(() -> new TechnicalException(String.format("No Bescheid exists for id %s.", bescheidId))); return bescheid.orElseThrow(() -> new TechnicalException(String.format("No Bescheid exists for id %s.", bescheidId)));
} }
...@@ -59,7 +60,7 @@ public class BescheidController { ...@@ -59,7 +60,7 @@ public class BescheidController {
@GetMapping("/{vorgangId}/bescheids") @GetMapping("/{vorgangId}/bescheids")
public CollectionModel<EntityModel<Bescheid>> getAll(@PathVariable String vorgangId) { public CollectionModel<EntityModel<Bescheid>> getAll(@PathVariable String vorgangId) {
var bescheids = service.findByVorgangId(vorgangId); var bescheids = service.findByVorgangIdSorted(vorgangId);
return modelAssembler.toCollectionModel(bescheids.toList()); return modelAssembler.toCollectionModel(bescheids.toList());
} }
} }
......
...@@ -13,13 +13,22 @@ import lombok.RequiredArgsConstructor; ...@@ -13,13 +13,22 @@ import lombok.RequiredArgsConstructor;
public class BescheidService { public class BescheidService {
private final BescheidRemoteService remoteService; private final BescheidRemoteService remoteService;
private final BescheidByBeschiedenAmComparator comparator;
public Optional<Bescheid> getBescheidDraft(String vorgangId) { public Optional<Bescheid> getBescheidDraft(String vorgangId) {
return remoteService.getBescheidDraft(vorgangId); return remoteService.getBescheidDraft(vorgangId);
} }
public Stream<Bescheid> findByVorgangId(String vorgangId) { public Stream<Bescheid> findByVorgangId(String vorgangId) {
return remoteService.findByVorgangId(vorgangId); return sortBescheids(remoteService.findByVorgangId(vorgangId));
}
public Stream<Bescheid> findByVorgangIdSorted(String vorgangId) {
return sortBescheids(remoteService.findByVorgangId(vorgangId));
}
Stream<Bescheid> sortBescheids(Stream<Bescheid> bescheids) {
return bescheids.sorted(comparator.reversed());
} }
public boolean canCreateBescheidDocumentAutomatically() { public boolean canCreateBescheidDocumentAutomatically() {
......
...@@ -45,6 +45,7 @@ public class Antragsteller { ...@@ -45,6 +45,7 @@ public class Antragsteller {
private String plz; private String plz;
private String ort; private String ort;
private String postfachId; private String postfachId;
private String firmaName;
private Map<String, Object> otherData; private Map<String, Object> otherData;
} }
\ No newline at end of file
package de.ozgcloud.alfa.bescheid;
import static org.assertj.core.api.Assertions.*;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.mockito.Spy;
class BescheidByBeschiedenAmComparatorTest {
@Spy
private BescheidByBeschiedenAmComparator comparator;
@Nested
class TestCompare {
int expectedResult = -1;
@Nested
class TestWithDifferentBeschiedenAm {
private final Bescheid olderBescheid = BescheidTestFactory.create();
private final Bescheid recentBescheid = BescheidTestFactory.create();
@BeforeEach
void setUpMock() {
doReturn(expectedResult).when(comparator).compareByBeschiedenAm(olderBescheid, recentBescheid);
}
@Test
void shouldCompareByBeschiedenAm() {
comparator.compare(olderBescheid, recentBescheid);
verify(comparator).compareByBeschiedenAm(olderBescheid, recentBescheid);
}
@Test
void shouldNotCompareBySentAt() {
comparator.compare(olderBescheid, recentBescheid);
verify(comparator, never()).compareBySentAt(any(), any());
}
@Test
void shouldReturnCompareByBeschiedenAmResult() {
var compareResult = comparator.compare(olderBescheid, recentBescheid);
assertThat(compareResult).isEqualTo(expectedResult);
}
}
@Nested
class TestWithSameBeschiedenAm {
private final Bescheid olderBescheid = BescheidTestFactory.create();
private final Bescheid recentBescheid = BescheidTestFactory.create();
@BeforeEach
void setUpMock() {
doReturn(0).when(comparator).compareByBeschiedenAm(olderBescheid, recentBescheid);
}
@Test
void shouldCompareByBeschiedenAm() {
comparator.compare(olderBescheid, recentBescheid);
verify(comparator).compareByBeschiedenAm(olderBescheid, recentBescheid);
}
@Test
void shouldCompareBySentAt() {
comparator.compare(olderBescheid, recentBescheid);
verify(comparator).compareBySentAt(any(), any());
}
@Test
void shouldReturnCompareBySentAtResult() {
doReturn(expectedResult).when(comparator).compareBySentAt(olderBescheid, recentBescheid);
var compareResult = comparator.compare(olderBescheid, recentBescheid);
assertThat(compareResult).isEqualTo(expectedResult);
}
}
}
@Nested
class TestCompareByBeschiedenAm {
private final Bescheid olderBescheid = BescheidTestFactory.createBuilder().beschiedenAm("2024-05-26").build();
private final Bescheid recentBescheid = BescheidTestFactory.createBuilder().beschiedenAm("2024-05-27").build();
@Test
void shouldReturnNegative() {
var result = comparator.compareByBeschiedenAm(olderBescheid, recentBescheid);
assertThat(result).isNegative();
}
@Test
void shouldReturnPositive() {
var result = comparator.compareByBeschiedenAm(recentBescheid, olderBescheid);
assertThat(result).isPositive();
}
@Test
void shouldReturnZero() {
var result = comparator.compareByBeschiedenAm(olderBescheid, olderBescheid);
assertThat(result).isZero();
}
}
@Nested
class TestComapreBySentAt {
private final Bescheid olderBescheid = BescheidTestFactory.createBuilder()
.sentInfo(SentInfoTestFactory.create())
.build();
private final Bescheid recentBescheid = BescheidTestFactory.createBuilder()
.sentInfo(SentInfoTestFactory.createBuilder().sentAt(SentInfoTestFactory.SENT_AT.plusHours(1)).build())
.build();
@Test
void shouldReturnNegative() {
var result = comparator.compareBySentAt(olderBescheid, recentBescheid);
assertThat(result).isNegative();
}
@Test
void shouldReturnPositive() {
var result = comparator.compareBySentAt(recentBescheid, olderBescheid);
assertThat(result).isPositive();
}
@Test
void shouldReturnZero() {
var result = comparator.compareBySentAt(olderBescheid, olderBescheid);
assertThat(result).isZero();
}
}
}
...@@ -47,7 +47,7 @@ class BescheidByVorgangControllerTest { ...@@ -47,7 +47,7 @@ class BescheidByVorgangControllerTest {
@BeforeEach @BeforeEach
void setUpMock() { void setUpMock() {
when(service.findByVorgangId(VorgangHeaderTestFactory.ID)).thenReturn(Stream.of(bescheid)); when(service.findByVorgangIdSorted(VorgangHeaderTestFactory.ID)).thenReturn(Stream.of(bescheid));
} }
@Test @Test
...@@ -63,7 +63,7 @@ class BescheidByVorgangControllerTest { ...@@ -63,7 +63,7 @@ class BescheidByVorgangControllerTest {
void shouldCallService() { void shouldCallService() {
callEndpoint(); callEndpoint();
verify(service).findByVorgangId(VorgangHeaderTestFactory.ID); verify(service).findByVorgangIdSorted(VorgangHeaderTestFactory.ID);
} }
@Test @Test
......
...@@ -4,6 +4,7 @@ import static org.assertj.core.api.Assertions.*; ...@@ -4,6 +4,7 @@ import static org.assertj.core.api.Assertions.*;
import static org.mockito.ArgumentMatchers.*; import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*; import static org.mockito.Mockito.*;
import java.util.Comparator;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Stream; import java.util.stream.Stream;
...@@ -26,6 +27,8 @@ class BescheidServiceTest { ...@@ -26,6 +27,8 @@ class BescheidServiceTest {
private BescheidService service; private BescheidService service;
@Mock @Mock
private BescheidRemoteService remoteService; private BescheidRemoteService remoteService;
@Mock
private BescheidByBeschiedenAmComparator comparator;
@Nested @Nested
class TestGetBescheidDraft { class TestGetBescheidDraft {
...@@ -50,11 +53,13 @@ class BescheidServiceTest { ...@@ -50,11 +53,13 @@ class BescheidServiceTest {
@Nested @Nested
class TestFindByVorgangId { class TestFindByVorgangId {
private final Bescheid bescheid = BescheidTestFactory.create(); private final Stream<Bescheid> bescheidsUnsorted = Stream.of(BescheidTestFactory.create());
private final Stream<Bescheid> bescheidsSorted = Stream.of(BescheidTestFactory.create());
@BeforeEach @BeforeEach
void mockRemoteService() { void setUpMocks() {
when(remoteService.findByVorgangId(VorgangHeaderTestFactory.ID)).thenReturn(Stream.of(bescheid)); when(remoteService.findByVorgangId(VorgangHeaderTestFactory.ID)).thenReturn(bescheidsUnsorted);
doReturn(bescheidsSorted).when(service).sortBescheids(bescheidsUnsorted);
} }
@Test @Test
...@@ -65,14 +70,52 @@ class BescheidServiceTest { ...@@ -65,14 +70,52 @@ class BescheidServiceTest {
} }
@Test @Test
void shouldReturnStream() { void shouldSortStream() {
callService();
verify(service).sortBescheids(bescheidsUnsorted);
}
@Test
void shouldReturnSortedStream() {
var resultStream = callService(); var resultStream = callService();
assertThat(resultStream).containsExactly(bescheid); assertThat(resultStream).isEqualTo(bescheidsSorted);
} }
private Stream<Bescheid> callService() { private Stream<Bescheid> callService() {
return remoteService.findByVorgangId(VorgangHeaderTestFactory.ID); return service.findByVorgangIdSorted(VorgangHeaderTestFactory.ID);
}
}
@Nested
class TestSortBescheids {
@Mock
private Stream<Bescheid> bescheids;
@Mock
private Comparator<Bescheid> reversedComparator;
@BeforeEach
void setUpMock() {
when(comparator.reversed()).thenReturn(reversedComparator);
}
@Test
void shouldSort() {
service.sortBescheids(bescheids);
verify(bescheids).sorted(reversedComparator);
}
@Test
void shouldReturnSortedStream() {
Stream<Bescheid> bescheidsSorted = Stream.of(BescheidTestFactory.create());
when(bescheids.sorted(reversedComparator)).thenReturn(bescheidsSorted);
var result = service.sortBescheids(bescheids);
assertThat(result).isEqualTo(bescheidsSorted);
} }
} }
......
...@@ -16,7 +16,7 @@ public class BescheidTestFactory { ...@@ -16,7 +16,7 @@ public class BescheidTestFactory {
public static final BescheidStatus STATUS = BescheidStatus.DRAFT; public static final BescheidStatus STATUS = BescheidStatus.DRAFT;
public static final long VERSION = 42; public static final long VERSION = 42;
public static final String VORGANG_ID = VorgangHeaderTestFactory.ID; public static final String VORGANG_ID = VorgangHeaderTestFactory.ID;
public static final String BESCHIEDEN_AM = "01.04.2024"; public static final String BESCHIEDEN_AM = "2024-05-27";
public static final boolean BEWILLIGT = true; public static final boolean BEWILLIGT = true;
public static final String BESCHEID_DOCUMENT = UUID.randomUUID().toString(); public static final String BESCHEID_DOCUMENT = UUID.randomUUID().toString();
public static final List<FileId> ATTACHMENTS = List.of(FileId.from(UUID.randomUUID().toString()), FileId.from(UUID.randomUUID().toString())); public static final List<FileId> ATTACHMENTS = List.of(FileId.from(UUID.randomUUID().toString()), FileId.from(UUID.randomUUID().toString()));
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment