diff --git a/.gitignore b/.gitignore index 3fc1d884b983db7cd48581b4198239e70ebc5119..4c1a41b2c5665e76dae6bd753ebdbe7fdfe74337 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,4 @@ target/ .idea *.iml *.orig +.vscode/settings.json diff --git a/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/CollaborationManagerConfiguration.java b/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/CollaborationManagerConfiguration.java index 80496bb8b53b809302bfb7d426be4dafcff80bda..331b155a60b7e4ca3fbd112ab4ad99e487d69e5f 100644 --- a/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/CollaborationManagerConfiguration.java +++ b/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/CollaborationManagerConfiguration.java @@ -64,6 +64,7 @@ public class CollaborationManagerConfiguration { public static final String TEMPLATE_HANDLER_NAME = "collaboration_TemplateHandler"; public static final String VORGANG_ATTACHED_ITEM_REMOTE_SERVICE_NAME = "collaboration_VorgangAttachedItemRemoteService"; public static final String VORGANG_ATTACHED_ITEM_SERVICE_NAME = "collaboration_VorgangAttachedItemService"; + public static final String VORGANG_MANAGER_PROPERTIES_NAME = "collaboration_vorgangManagerProperties"; public static final String CALL_CONTEXT_INTERCEPTOR_NAME = "collaboration_CallContextInterceptor"; public static final String CALL_CONTEXT_PROVIDER_NAME = "collaboration_CallContextProvider"; diff --git a/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/CollaborationService.java b/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/CollaborationService.java index 73e9da9cc2b1f19747150131cc73e71591495734..ba4460a230898252854fdf2a6087c36ad999bf1d 100644 --- a/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/CollaborationService.java +++ b/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/CollaborationService.java @@ -23,9 +23,9 @@ */ package de.ozgcloud.collaboration; -import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.Optional; import jakarta.validation.Valid; @@ -42,6 +42,7 @@ import de.ozgcloud.collaboration.common.freemarker.TemplateHandler; import de.ozgcloud.collaboration.common.user.UserProfileService; import de.ozgcloud.collaboration.vorgang.ServiceKonto; import de.ozgcloud.collaboration.vorgang.VorgangService; +import de.ozgcloud.common.errorhandling.TechnicalException; import lombok.RequiredArgsConstructor; @Service(CollaborationManagerConfiguration.COLLABORATION_SERVICE_NAME) // NOSONAR @@ -51,7 +52,7 @@ public class CollaborationService { static final String CREATE_ATTACHED_ITEM_ORDER = "CREATE_ATTACHED_ITEM"; static final String SUBCOMMANDS_EXECUTION_MODE = "PARALLEL"; - public static final String KEY_TEMPLATE_URL = "url"; + public static final String KEY_VORGANG_LINK = "linkToVorgang"; public static final String COLLABORATION_NACHRICHT_TEMPLATE = "collaboration.nachrichtTemplate.txt.ftlh"; static final String SEND_POSTFACH_NACHRICHT_ORDER = "SEND_POSTFACH_NACHRICHT"; @@ -81,6 +82,7 @@ public class CollaborationService { private final CommandMapper commandMapper; @Qualifier(CollaborationManagerConfiguration.TEMPLATE_HANDLER_NAME) // NOSONAR private final TemplateHandler templateHandler; + private final Optional<FachstelleVorgangUrlProvider> urlProvider; public void createCollaborationRequest(@Valid CollaborationRequest collaborationRequest) { var enrichedRequest = enrichCollaborationRequest(collaborationRequest, vorgangService.createCollaborationVorgang(collaborationRequest)); @@ -101,6 +103,9 @@ public class CollaborationService { } public void createFachstellenBeteiligungRequest(@Valid CollaborationRequest collaborationRequest) { + if (urlProvider.isEmpty()) { + throw new TechnicalException("Fachstelle not configured."); + } var vorgang = vorgangService.getVorgang(collaborationRequest.getVorgangId()); var enrichedRequest = enrichCollaborationRequest(collaborationRequest, vorgang.getId().toString()); var addSubCommandsRequest = buildCreateSubCommandsRequest(enrichedRequest, buildSubCommands(enrichedRequest)); @@ -127,7 +132,8 @@ public class CollaborationService { } OzgCloudCommand buildSendPostfachNachrichtCommand(CollaborationRequest collaborationRequest) { - var bodyObject = buildPostfachSendNachrichtCommandBody(buildMukPostfachAddress(collaborationRequest.getZustaendigeStelle())); + var bodyObject = buildPostfachSendNachrichtCommandBody(buildMukPostfachAddress(collaborationRequest.getZustaendigeStelle()), + collaborationRequest.getVorgangId()); return OzgCloudCommand.builder() .vorgangId(commandMapper.toOzgCloudVorgangId(collaborationRequest.getVorgangId())) .relationId(commandMapper.mapRelationId(collaborationRequest.getVorgangId())) @@ -149,19 +155,19 @@ public class CollaborationService { return Map.of(ServiceKonto.PostfachAddress.FIELD_IDENTIFIER_POSTFACH_ID, postfachId); } - Map<String, Object> buildPostfachSendNachrichtCommandBody(Map<String, Object> postfachAddress) { + Map<String, Object> buildPostfachSendNachrichtCommandBody(Map<String, Object> postfachAddress, String vorgangId) { return Map.of( FIELD_REPLY_OPTION, REPLY_OPTION, FIELD_SUBJECT, SUBJECT, - FIELD_MAIL_BODY, getAnfrageText(), + FIELD_MAIL_BODY, getAnfrageText(vorgangId), ServiceKonto.FIELD_POSTFACH_ADDRESS, postfachAddress); } - String getAnfrageText() { - return templateHandler.fillTemplate(COLLABORATION_NACHRICHT_TEMPLATE, getTemplateParameters()); + String getAnfrageText(String vorgangId) { + return templateHandler.fillTemplate(COLLABORATION_NACHRICHT_TEMPLATE, getTemplateParameters(vorgangId)); } - Map<String, Object> getTemplateParameters() { - return Collections.emptyMap(); + Map<String, Object> getTemplateParameters(String vorgangId) { + return Map.of(KEY_VORGANG_LINK, urlProvider.get().getUrl(vorgangId)); } } \ No newline at end of file diff --git a/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/FachstelleProperties.java b/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/FachstelleProperties.java new file mode 100644 index 0000000000000000000000000000000000000000..f2c4127dc1c7c1b367d2f1b08cff22736dacb712 --- /dev/null +++ b/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/FachstelleProperties.java @@ -0,0 +1,20 @@ +package de.ozgcloud.collaboration; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +import lombok.Getter; +import lombok.Setter; + +@Configuration +@ConfigurationProperties(prefix = FachstelleProperties.PREFIX) +@ConditionalOnProperty(prefix = FachstelleProperties.PREFIX, name = { "host" }) +@Getter +@Setter +class FachstelleProperties { + + static final String PREFIX = "ozgcloud.fachstelle"; + + private String host; +} diff --git a/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/FachstelleVorgangUrlProvider.java b/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/FachstelleVorgangUrlProvider.java new file mode 100644 index 0000000000000000000000000000000000000000..a4f624b13c37912889e932c5e359205a1368565a --- /dev/null +++ b/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/FachstelleVorgangUrlProvider.java @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2024 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.ozgcloud.collaboration; + +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; + +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.stereotype.Component; + +@Component +@ConditionalOnProperty(prefix = FachstelleProperties.PREFIX, name = { "host" }) +class FachstelleVorgangUrlProvider { + + static final String URL_PATH_RESOURCES = "/resources?"; // NOSONAR + static final String QUERY_PARAM_URI = "uri="; + static final String URI_PATH_TEMPLATE = "%s/vorgangs/"; + + private final String vorgangUrlPrefix; + + FachstelleVorgangUrlProvider(FachstelleProperties fachstelleProperties, + @Qualifier(CollaborationManagerConfiguration.VORGANG_MANAGER_PROPERTIES_NAME) VorgangManagerProperties vorgangManagerProperties) { + this.vorgangUrlPrefix = getFachstelleHost(fachstelleProperties) + URL_PATH_RESOURCES + buildUriQuery(vorgangManagerProperties); + } + + String getFachstelleHost(FachstelleProperties fachstelleProperties) { + return fachstelleProperties.getHost().startsWith("http") ? fachstelleProperties.getHost() : "https://" + fachstelleProperties.getHost(); + } + + private String buildUriQuery(VorgangManagerProperties vorgangManagerProperties) { + var uriPath = URI_PATH_TEMPLATE.formatted(getServiceName(vorgangManagerProperties)); + return QUERY_PARAM_URI + URLEncoder.encode(uriPath, StandardCharsets.UTF_8); + } + + String getServiceName(VorgangManagerProperties vorgangManagerProperties) { + return getDomainWithoutPort(getDomainWithoutProtocol(vorgangManagerProperties.getServiceAddress())); + } + + private String getDomainWithoutProtocol(String serviceAddress) { + var protocolEnd = serviceAddress.lastIndexOf("/"); + return protocolEnd == -1 ? serviceAddress : serviceAddress.substring(protocolEnd + 1); + } + + private String getDomainWithoutPort(String serviceAddress) { + var portStart = serviceAddress.lastIndexOf(":"); + return portStart == -1 ? serviceAddress : serviceAddress.substring(0, portStart); + } + + public String getUrl(String vorgangId) { + return vorgangUrlPrefix + vorgangId; + } +} diff --git a/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/VorgangManagerProperties.java b/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/VorgangManagerProperties.java new file mode 100644 index 0000000000000000000000000000000000000000..0057e9185929d7b765eddcc4dd1853683dc54e3e --- /dev/null +++ b/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/VorgangManagerProperties.java @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2024 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.ozgcloud.collaboration; + +import jakarta.validation.constraints.NotEmpty; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; +import org.springframework.validation.annotation.Validated; + +import lombok.Getter; +import lombok.Setter; + +@Configuration(CollaborationManagerConfiguration.VORGANG_MANAGER_PROPERTIES_NAME) // NOSONAR +@ConfigurationProperties(prefix = VorgangManagerProperties.PREFIX) +@Getter +@Setter +@Validated +class VorgangManagerProperties { + + static final String PREFIX = "ozgcloud.vorgang-manager"; + + @NotEmpty + private String serviceAddress; +} diff --git a/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/common/freemarker/TemplateHandler.java b/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/common/freemarker/TemplateHandler.java index cf2b56405377ea25bdadceb6124a62e71decfef7..6647808d2fb29a15e0ecdaf5d9ad271cacf29675 100644 --- a/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/common/freemarker/TemplateHandler.java +++ b/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/common/freemarker/TemplateHandler.java @@ -41,10 +41,6 @@ public class TemplateHandler { private final Configuration freemarkerConfig; - public String getRawTemplate(String templateName) { - return getTemplate(templateName).toString(); - } - public String fillTemplate(String templateName, Object dataModel) { try { var template = getTemplate(templateName); diff --git a/collaboration-manager-server/src/main/resources/templates/collaboration.nachrichtTemplate.txt.ftlh b/collaboration-manager-server/src/main/resources/templates/collaboration.nachrichtTemplate.txt.ftlh index 5874936fb45fd176e05cef6a7e888b4b6fb0379c..22a60d5b3a4ced7dfbe8771025a64e8ffc6c43cc 100644 --- a/collaboration-manager-server/src/main/resources/templates/collaboration.nachrichtTemplate.txt.ftlh +++ b/collaboration-manager-server/src/main/resources/templates/collaboration.nachrichtTemplate.txt.ftlh @@ -1,7 +1,7 @@ -Hallo Fachstelle, +Guten Tag, +Sie haben eine Zuarbeitsanfrage erhalten. Bitte klicken Sie auf folgenden Link, um zum Vorgang zu gelangen: -bitte bearbeiten: -${url!"http://www.host.local"} +${linkToVorgang} -Danke, -Verwaltung \ No newline at end of file +Mit freundlichen Grüßen +Ihre Verwaltung \ No newline at end of file diff --git a/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/CollaborationServiceITCase.java b/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/CollaborationServiceITCase.java index b5c9c52e92d34ba535e9563c7891d4a7d5c0a2b8..1d0867baad9d780b636d5421070b7f824fe0f11f 100644 --- a/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/CollaborationServiceITCase.java +++ b/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/CollaborationServiceITCase.java @@ -34,7 +34,6 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.NullAndEmptySource; import org.junit.jupiter.params.provider.ValueSource; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.annotation.DirtiesContext; import de.ozgcloud.common.test.ITCase; diff --git a/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/CollaborationServiceTest.java b/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/CollaborationServiceTest.java index 763ca620ebfd814b7e784a768f40436b20922d9e..7b65d713753f128862cde95d7529c4bc5ddfc243 100644 --- a/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/CollaborationServiceTest.java +++ b/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/CollaborationServiceTest.java @@ -24,11 +24,13 @@ package de.ozgcloud.collaboration; import static org.assertj.core.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; import java.util.List; import java.util.Map; +import java.util.Optional; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; @@ -37,6 +39,8 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Spy; +import com.thedeanda.lorem.LoremIpsum; + import de.ozgcloud.apilib.common.command.OzgCloudCommand; import de.ozgcloud.apilib.common.command.OzgCloudCommandService; import de.ozgcloud.apilib.common.command.OzgCloudCreateSubCommandsRequest; @@ -57,6 +61,7 @@ import de.ozgcloud.collaboration.vorgang.VorgangService; import de.ozgcloud.collaboration.vorgang.VorgangTestFactory; import de.ozgcloud.command.CommandTestFactory; import de.ozgcloud.common.datatype.StringBasedValue; +import de.ozgcloud.common.errorhandling.TechnicalException; class CollaborationServiceTest { @@ -76,6 +81,10 @@ class CollaborationServiceTest { private CommandMapper commandMapper; @Mock private TemplateHandler templateHandler; + @Mock + private FachstelleVorgangUrlProvider provider; + @Mock + private Optional<FachstelleVorgangUrlProvider> urlProvider; @Nested class TestCreateCollaborationRequest { @@ -248,57 +257,71 @@ class CollaborationServiceTest { @Nested class TestCreateFachstellenBeteiligungRequest { - private static final Vorgang VORGANG = VorgangTestFactory.create(); - private static final CollaborationRequest ENRICHED_REQUEST = CollaborationRequestTestFactory.create(); + @Nested + class TestCreateRequest { + private static final Vorgang VORGANG = VorgangTestFactory.create(); + private static final CollaborationRequest ENRICHED_REQUEST = CollaborationRequestTestFactory.create(); - @Mock - private OzgCloudCommand subCommand; + @Mock + private OzgCloudCommand subCommand; - @BeforeEach - void init() { - doReturn(List.of(subCommand)).when(service).buildSubCommands(any()); - when(vorgangService.getVorgang(any())).thenReturn(VORGANG); - doReturn(ENRICHED_REQUEST).when(service).enrichCollaborationRequest(any(), any()); - } + @BeforeEach + void init() { + doReturn(List.of(subCommand)).when(service).buildSubCommands(any()); + when(vorgangService.getVorgang(any())).thenReturn(VORGANG); + doReturn(ENRICHED_REQUEST).when(service).enrichCollaborationRequest(any(), any()); + } - @Test - void shouldCallGetVorgang() { - service.createFachstellenBeteiligungRequest(CollaborationRequestTestFactory.create()); + @Test + void shouldCallGetVorgang() { + createFachstellenBeteiligungRequest(); - verify(vorgangService).getVorgang(VorgangTestFactory.ID_STR); - } + verify(vorgangService).getVorgang(VorgangTestFactory.ID_STR); + } - @Test - void shouldCallEnrichCollaborationRequest() { - var collaborationRequest = CollaborationRequestTestFactory.create(); + @Test + void shouldCallEnrichCollaborationRequest() { + var collaborationRequest = CollaborationRequestTestFactory.create(); - service.createFachstellenBeteiligungRequest(collaborationRequest); + service.createFachstellenBeteiligungRequest(collaborationRequest); - verify(service).enrichCollaborationRequest(collaborationRequest, VorgangTestFactory.ID.toString()); - } + verify(service).enrichCollaborationRequest(collaborationRequest, VorgangTestFactory.ID.toString()); + } - @Test - void shouldCallBuildSubCommands() { - service.createFachstellenBeteiligungRequest(CollaborationRequestTestFactory.create()); + @Test + void shouldCallBuildSubCommands() { + createFachstellenBeteiligungRequest(); - verify(service).buildSubCommands(ENRICHED_REQUEST); - } + verify(service).buildSubCommands(ENRICHED_REQUEST); + } - @Test - void shouldCallBuildCreateSubCommandsRequest() { - service.createFachstellenBeteiligungRequest(CollaborationRequestTestFactory.create()); + @Test + void shouldCallBuildCreateSubCommandsRequest() { + createFachstellenBeteiligungRequest(); + + verify(service).buildCreateSubCommandsRequest(ENRICHED_REQUEST, List.of(subCommand)); + } + + @Test + void shouldCallAddSubCommands() { + var addSubCommandsRequest = OzgCloudCreateSubCommandsRequestTestFactory.create(); + doReturn(addSubCommandsRequest).when(service).buildCreateSubCommandsRequest(any(), any()); - verify(service).buildCreateSubCommandsRequest(ENRICHED_REQUEST, List.of(subCommand)); + createFachstellenBeteiligungRequest(); + + verify(commandService).addSubCommands(addSubCommandsRequest); + } } @Test - void shouldCallAddSubCommands() { - var addSubCommandsRequest = OzgCloudCreateSubCommandsRequestTestFactory.create(); - doReturn(addSubCommandsRequest).when(service).buildCreateSubCommandsRequest(any(), any()); + void shouldThrowExceptionIfFachstelleNotConfigured() { + when(urlProvider.isEmpty()).thenReturn(true); - service.createFachstellenBeteiligungRequest(CollaborationRequestTestFactory.create()); + assertThrows(TechnicalException.class, this::createFachstellenBeteiligungRequest); + } - verify(commandService).addSubCommands(addSubCommandsRequest); + private void createFachstellenBeteiligungRequest() { + service.createFachstellenBeteiligungRequest(CollaborationRequestTestFactory.create()); } } @@ -399,7 +422,7 @@ class CollaborationServiceTest { when(commandMapper.toOzgCloudVorgangId(anyString())).thenReturn(VORGANG_ID); when(commandMapper.mapRelationId(anyString())).thenReturn(RELATION_ID); when(commandMapper.toOzgCloudUserId(anyString())).thenReturn(OZG_CLOUD_ID); - doReturn(OBJECT_MAP).when(service).buildPostfachSendNachrichtCommandBody(any()); + doReturn(OBJECT_MAP).when(service).buildPostfachSendNachrichtCommandBody(any(), any()); } @Test @@ -416,7 +439,7 @@ class CollaborationServiceTest { buildSendPostfachNachrichtCommand(); - verify(service).buildPostfachSendNachrichtCommandBody(postfachAddressMap); + verify(service).buildPostfachSendNachrichtCommandBody(postfachAddressMap, VorgangTestFactory.ID_STR); } @Test @@ -524,7 +547,7 @@ class CollaborationServiceTest { @BeforeEach void init() { - doReturn(CollaborationRequestTestFactory.BESCHREIBUNG).when(service).getAnfrageText(); + doReturn(CollaborationRequestTestFactory.BESCHREIBUNG).when(service).getAnfrageText(any()); } @Test @@ -549,53 +572,79 @@ class CollaborationServiceTest { } private Map<String, Object> buildSendNachrichtCommandBody() { - return service.buildPostfachSendNachrichtCommandBody(POSTFACH_ADDRESS); + return service.buildPostfachSendNachrichtCommandBody(POSTFACH_ADDRESS, VorgangTestFactory.ID_STR); } } @Nested - class TestGetDefaultAnfrageText { + class TestGetAnfrageText { private static final String DEFAULT_MAIL_TEXT = "default mail text"; + private static final Map<String, Object> TEMPLATE_PARAMETERS = Map.of("key", "value "); + @BeforeEach void init() { when(templateHandler.fillTemplate(anyString(), any())).thenReturn(DEFAULT_MAIL_TEXT); + doReturn(TEMPLATE_PARAMETERS).when(service).getTemplateParameters(any()); } @Test void shouldCallGetTemplateParameters() { - service.getAnfrageText(); + getAnfrageText(); - verify(service).getTemplateParameters(); + verify(service).getTemplateParameters(VorgangTestFactory.ID_STR); } @Test void shouldCallTemplateHandler() { - var templateParameters = Map.<String, Object>of("key", "value "); - doReturn(templateParameters).when(service).getTemplateParameters(); + getAnfrageText(); - service.getAnfrageText(); - - verify(templateHandler).fillTemplate(CollaborationService.COLLABORATION_NACHRICHT_TEMPLATE, templateParameters); + verify(templateHandler).fillTemplate(CollaborationService.COLLABORATION_NACHRICHT_TEMPLATE, TEMPLATE_PARAMETERS); } @Test void shouldReturnDefaultMailText() { - var result = service.getAnfrageText(); + var result = getAnfrageText(); assertThat(result).isEqualTo(DEFAULT_MAIL_TEXT); } + + private String getAnfrageText() { + return service.getAnfrageText(VorgangTestFactory.ID_STR); + } } @Nested class TestGetTemplateParameters { + private final String linkToVorgang = LoremIpsum.getInstance().getUrl(); + + @BeforeEach + void init() { + when(urlProvider.get()).thenReturn(provider); + } + + @Test + void shouldCallUrlProvider() { + when(provider.getUrl(any())).thenReturn(linkToVorgang); + + getTemplateParameters(); + + verify(provider).getUrl(VorgangTestFactory.ID_STR); + } + @Test void shouldReturnTemplateParameters() { - var result = service.getTemplateParameters(); + when(provider.getUrl(any())).thenReturn(linkToVorgang); + + var result = getTemplateParameters(); + + assertThat(result).containsExactly(Map.entry(CollaborationService.KEY_VORGANG_LINK, linkToVorgang)); + } - assertThat(result).isEmpty(); + private Map<String, Object> getTemplateParameters() { + return service.getTemplateParameters(VorgangTestFactory.ID_STR); } } } \ No newline at end of file diff --git a/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/FachstelleVorgangUrlProviderTest.java b/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/FachstelleVorgangUrlProviderTest.java new file mode 100644 index 0000000000000000000000000000000000000000..99537c02b7e229c077f49ef6ec22034a4028e2d1 --- /dev/null +++ b/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/FachstelleVorgangUrlProviderTest.java @@ -0,0 +1,117 @@ +package de.ozgcloud.collaboration; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; + +import java.util.UUID; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; +import org.mockito.Mock; +import org.springframework.test.util.ReflectionTestUtils; + +import com.thedeanda.lorem.LoremIpsum; + +class FachstelleVorgangUrlProviderTest { + + private static final String FACHSTELLE_HOST = "https://" + LoremIpsum.getInstance().getWords(1); + private static final String VORGANG_MANAGER_SERVICE_ADDRESS = "vorgang-manager.test-namespace"; + + private FachstelleVorgangUrlProvider provider; + + @Mock + private FachstelleProperties fachstelleProperties; + @Mock + private VorgangManagerProperties vorgangManagerProperties; + + @BeforeEach + void init() { + when(fachstelleProperties.getHost()).thenReturn(FACHSTELLE_HOST); + when(vorgangManagerProperties.getServiceAddress()).thenReturn(VORGANG_MANAGER_SERVICE_ADDRESS); + provider = spy(new FachstelleVorgangUrlProvider(fachstelleProperties, vorgangManagerProperties)); + } + + @Nested + class TestSetVorgangUrlPrefix { + + @Test + void shouldBuildVorgangUrlPrefix() { + var encodedResourceUri = FachstelleVorgangUrlProvider.QUERY_PARAM_URI + VORGANG_MANAGER_SERVICE_ADDRESS + "%2Fvorgangs%2F"; + var vorgagUrlPrefix = FACHSTELLE_HOST + FachstelleVorgangUrlProvider.URL_PATH_RESOURCES + encodedResourceUri; + + var provider = createProvider(); + + assertThat(provider).extracting("vorgangUrlPrefix").isEqualTo(vorgagUrlPrefix); + } + + private FachstelleVorgangUrlProvider createProvider() { + return spy(new FachstelleVorgangUrlProvider(fachstelleProperties, vorgangManagerProperties)); + } + } + + @Nested + class TestGetFachstelleHost { + + @ParameterizedTest + @ValueSource(strings = { "http://localhost", "https://localhost" }) + void shouldReturnUnchanged(String fachstelleHost) { + when(fachstelleProperties.getHost()).thenReturn(fachstelleHost); + + var result = provider.getFachstelleHost(fachstelleProperties); + + assertThat(result).isEqualTo(fachstelleHost); + } + + @Test + void shouldAddHttps() { + when(fachstelleProperties.getHost()).thenReturn("localhost"); + + var result = provider.getFachstelleHost(fachstelleProperties); + + assertThat(result).isEqualTo("https://localhost"); + } + } + + @Nested + class TestExtractServiceDomainName { + + @ParameterizedTest + @ValueSource(strings = { + "dns:///vorgang-manager.by-kiel-dev:9090", + "dns:///vorgang-manager.by-kiel-dev", + "vorgang-manager.by-kiel-dev:9090", + "vorgang-manager.by-kiel-dev", + "dns://vorgang-manager.by-kiel-dev:9090", + "dns:/vorgang-manager.by-kiel-dev:9090", + "dns:/vorgang-manager.by-kiel-dev:", + "dns:/vorgang-manager.by-kiel-dev:1", + "abc:/vorgang-manager.by-kiel-dev:9090" }) + void shouldReturnDomainName(String serviceAddress) { + when(vorgangManagerProperties.getServiceAddress()).thenReturn(serviceAddress); + + var address = provider.getServiceName(vorgangManagerProperties); + + assertThat(address).isEqualTo("vorgang-manager.by-kiel-dev"); + } + } + + @Nested + class TestGetUrl { + + private static final String VORGANG_URL_PREFIX = LoremIpsum.getInstance().getUrl(); + + @Test + void shouldReturnUrl() { + ReflectionTestUtils.setField(provider, "vorgangUrlPrefix", VORGANG_URL_PREFIX); + var vorgangId = UUID.randomUUID().toString(); + + var url = provider.getUrl(vorgangId); + + assertThat(url).isEqualTo(VORGANG_URL_PREFIX + vorgangId); + } + } + +} diff --git a/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/common/freemarker/TemplateHandlerITCase.java b/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/common/freemarker/TemplateHandlerITCase.java index faac634359143e548636ed8bf0503c5719555ea3..c6490582c731313b487360957682c94664038215 100644 --- a/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/common/freemarker/TemplateHandlerITCase.java +++ b/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/common/freemarker/TemplateHandlerITCase.java @@ -28,12 +28,14 @@ import static org.assertj.core.api.Assertions.*; import java.util.Collections; import java.util.Map; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import de.ozgcloud.collaboration.CollaborationService; +import de.ozgcloud.common.errorhandling.TechnicalException; import de.ozgcloud.common.test.ITCase; @ITCase @@ -42,23 +44,6 @@ class TemplateHandlerITCase { @Autowired private TemplateHandler handler; - @DisplayName("Get raw template") - @Nested - class TestGetRawTemplate { - - @Test - void shouldReturnTemplateAsString() { - var content = handler.getRawTemplate(CollaborationService.COLLABORATION_NACHRICHT_TEMPLATE); - - assertThat(content) - .contains("Hallo Fachstelle,") - .contains("bitte bearbeiten:") - .contains("${url!\"http://www.host.local\"}") - .contains("Danke") - .contains("Verwaltung"); - } - } - @DisplayName("Fill template") @Nested class TestFillTemplate { @@ -67,26 +52,20 @@ class TemplateHandlerITCase { void shouldReturnFilledTemplate() { var value = "http://test.url"; var content = handler.fillTemplate(CollaborationService.COLLABORATION_NACHRICHT_TEMPLATE, - Map.of(CollaborationService.KEY_TEMPLATE_URL, value)); + Map.of(CollaborationService.KEY_VORGANG_LINK, value)); assertThat(content) - .contains("Hallo Fachstelle,") - .contains("bitte bearbeiten:") - .contains(value) - .contains("Danke") - .contains("Verwaltung"); + .contains("Guten Tag,") + .contains("Sie haben eine Zuarbeitsanfrage erhalten. Bitte klicken Sie auf folgenden Link, um zum Vorgang zu gelangen:") + .contains(value); } @Test - void shouldReturnWithDefaultValue() { - var content = handler.fillTemplate(CollaborationService.COLLABORATION_NACHRICHT_TEMPLATE, Collections.emptyMap()); + void shouldThrowException() { + var templateArguments = Collections.emptyMap(); - assertThat(content) - .contains("Hallo Fachstelle,") - .contains("bitte bearbeiten:") - .contains("http://www.host.local") - .contains("Danke") - .contains("Verwaltung"); + Assertions.assertThrows(TechnicalException.class, + () -> handler.fillTemplate(CollaborationService.COLLABORATION_NACHRICHT_TEMPLATE, templateArguments)); } } } diff --git a/collaboration-manager-server/src/test/resources/application-itcase.yml b/collaboration-manager-server/src/test/resources/application-itcase.yml index e8da334d49bb7daa2a6bb6f128c60ea187e09d5e..dbfa482da1647ade6cc46051cd43478a2b542c21 100644 --- a/collaboration-manager-server/src/test/resources/application-itcase.yml +++ b/collaboration-manager-server/src/test/resources/application-itcase.yml @@ -9,3 +9,6 @@ logging: grpc: server: port: -1 +ozgcloud: + vorgang-manager: + service-address: vorgang-manager