diff --git a/.gitignore b/.gitignore index 671fb0fee4dba749bd6cb2b15d03422c8ea29976..b97206eaa9037206fb36f521f938d8c355afb4da 100644 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,8 @@ target/ # Client goofy-client/.vscode/ goofy-client/apps/coverage/ +goofy-client/node/* +goofy-client/temp/* .attach** -.factorypath \ No newline at end of file +.factorypath diff --git a/Jenkinsfile b/Jenkinsfile index 9bb5c357a99b1682b45602c5849f3c3416fb054d..b3c044e277709d224670dd322fc4d6eb05ec2d72 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -94,17 +94,23 @@ pipeline { sh 'mvn --version' sh "mvn -s $MAVEN_SETTINGS -pl -goofy-client clean install spring-boot:build-image -Dspring-boot.build-image.imageName=docker.ozg-sh.de/goofy:${IMAGE_TAG} -Dspring-boot.build-image.publish -Dmaven.wagon.http.retryHandler.count=3" - try { - if (isMasterBranch()) { - dir('goofy-server'){ - withSonarQubeEnv('sonarqube-ozg-sh'){ - sh 'mvn -s $MAVEN_SETTINGS sonar:sonar' - } - } + if (isMasterBranch()) { + try { + dir('alfa-service'){ + withSonarQubeEnv('sonarqube-ozg-sh'){ + sh 'mvn -s $MAVEN_SETTINGS sonar:sonar' + } + } + dir('alfa-xdomea'){ + withSonarQubeEnv('sonarqube-ozg-sh'){ + sh 'mvn -s $MAVEN_SETTINGS sonar:sonar' + } + } } - } catch (Exception e) { - unstable("SonarQube failed") - } + catch (Exception e) { + unstable("SonarQube failed") + } + } } } } diff --git a/alfa-service/pom.xml b/alfa-service/pom.xml index b28e9df32cc6244f0c27bfadcef451c7f3e50a72..525cf2e219bd65e3edfade89158b536bd1fc71d8 100644 --- a/alfa-service/pom.xml +++ b/alfa-service/pom.xml @@ -32,7 +32,7 @@ <parent> <groupId>de.itvsh.ozg</groupId> <artifactId>goofy</artifactId> - <version>1.15.0-SNAPSHOT</version> + <version>1.17.0-SNAPSHOT</version> </parent> <artifactId>alfa-service</artifactId> @@ -43,6 +43,9 @@ <properties> <maven.compiler.source>${java.version}</maven.compiler.source> <maven.compiler.target>${java.version}</maven.compiler.target> + + <!-- TODO: die Version über kop-common ziehen --> + <jjwt.version>0.11.5</jjwt.version> </properties> <dependencies> @@ -51,7 +54,6 @@ <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency> - <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> @@ -64,29 +66,25 @@ <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> - <dependency> <groupId>net.devh</groupId> <artifactId>grpc-client-spring-boot-starter</artifactId> </dependency> - <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> - <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> - <dependency> - <groupId>org.keycloak</groupId> - <artifactId>keycloak-spring-boot-starter</artifactId> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-oauth2-resource-server</artifactId> </dependency> <dependency> - <groupId>org.keycloak</groupId> - <artifactId>keycloak-admin-client</artifactId> + <groupId>com.jayway.jsonpath</groupId> + <artifactId>json-path</artifactId> </dependency> <!-- jwt --> @@ -96,7 +94,18 @@ </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> - <artifactId>jjwt</artifactId> + <artifactId>jjwt-api</artifactId> + </dependency> + <dependency> + <groupId>io.jsonwebtoken</groupId> + <artifactId>jjwt-impl</artifactId> + <version>${jjwt.version}</version> + </dependency> + <dependency> + <groupId>io.jsonwebtoken</groupId> + <artifactId>jjwt-jackson</artifactId> + <version>${jjwt.version}</version> + <scope>runtime</scope> </dependency> <!-- own projects --> diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/EnvironmentController.java b/alfa-service/src/main/java/de/ozgcloud/alfa/EnvironmentController.java index 0103a54760c7db79f34c0ab0980a0b569383108b..9dda134b2ea6580936e80d068055309175b645ce 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/EnvironmentController.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/EnvironmentController.java @@ -25,7 +25,6 @@ package de.ozgcloud.alfa; import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*; -import org.keycloak.adapters.springboot.KeycloakSpringBootProperties; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; @@ -37,23 +36,19 @@ import org.springframework.web.bind.annotation.RestController; public class EnvironmentController { @Autowired - private KeycloakSpringBootProperties kcProperties; + private OAuth2Properties oAuth2Properties; @Value("${goofy.production}") private boolean production = true; @GetMapping public FrontendEnvironment getFrontendEnvironment() { - return FrontendEnvironment.builder()// - .production(production)// - .remoteHost(apiRoot())// - .authServer(kcProperties.getAuthServerUrl())// - .clientId(kcProperties.getResource())// - .realm(kcProperties.getRealm()) + return FrontendEnvironment.builder() + .production(production) + .remoteHost(linkTo(RootController.class).toUri().toString()) + .authServer(oAuth2Properties.getAuthServerUrl()) + .clientId(oAuth2Properties.getResource()) + .realm(oAuth2Properties.getRealm()) .build(); } - - private String apiRoot() { - return linkTo(RootController.class).toUri().toString(); - } } \ No newline at end of file diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/GrpcConfiguration.java b/alfa-service/src/main/java/de/ozgcloud/alfa/GrpcConfiguration.java new file mode 100644 index 0000000000000000000000000000000000000000..97cac2f8ea30484287afa30ab96bf522d1034bd9 --- /dev/null +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/GrpcConfiguration.java @@ -0,0 +1,23 @@ +package de.ozgcloud.alfa; + +import org.springframework.boot.autoconfigure.ImportAutoConfiguration; +import org.springframework.context.annotation.Configuration; + +/** + * A workaround for @GrpcClient to work i.e. inject dependency until full Spring 3 support is available. + * https://github.com/yidongnan/grpc-spring-boot-starter/pull/775 + */ +@Configuration +@ImportAutoConfiguration({ + net.devh.boot.grpc.client.autoconfigure.GrpcClientAutoConfiguration.class, + net.devh.boot.grpc.client.autoconfigure.GrpcClientMetricAutoConfiguration.class, + net.devh.boot.grpc.client.autoconfigure.GrpcClientHealthAutoConfiguration.class, + net.devh.boot.grpc.client.autoconfigure.GrpcClientSecurityAutoConfiguration.class, + net.devh.boot.grpc.client.autoconfigure.GrpcClientTraceAutoConfiguration.class, + net.devh.boot.grpc.client.autoconfigure.GrpcDiscoveryClientAutoConfiguration.class, + + net.devh.boot.grpc.common.autoconfigure.GrpcCommonCodecAutoConfiguration.class, + net.devh.boot.grpc.common.autoconfigure.GrpcCommonTraceAutoConfiguration.class +}) +public class GrpcConfiguration { +} diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/JwtAuthConverter.java b/alfa-service/src/main/java/de/ozgcloud/alfa/JwtAuthConverter.java new file mode 100644 index 0000000000000000000000000000000000000000..70397ac1de728d4d94369b5b227b0228750c3897 --- /dev/null +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/JwtAuthConverter.java @@ -0,0 +1,85 @@ +package de.ozgcloud.alfa; + +import java.util.Collection; +import java.util.Collections; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.apache.commons.collections.MapUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.convert.converter.Converter; +import org.springframework.lang.NonNull; +import org.springframework.security.authentication.AbstractAuthenticationToken; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.oauth2.jwt.Jwt; +import org.springframework.security.oauth2.jwt.JwtClaimNames; +import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken; +import org.springframework.security.oauth2.server.resource.authentication.JwtGrantedAuthoritiesConverter; +import org.springframework.stereotype.Component; + +@Component +public class JwtAuthConverter implements Converter<Jwt, AbstractAuthenticationToken> { + + private final JwtGrantedAuthoritiesConverter jwtGrantedAuthoritiesConverter = new JwtGrantedAuthoritiesConverter(); + + private static final String SIMPLE_GRANT_AUTHORITY_PREFIX = "ROLE_"; + static final String RESOURCE_ACCESS_KEY = "resource_access"; + static final String ROLES_KEY = "roles"; + + @Autowired + private OAuth2Properties oAuth2Properties; + + @Override + public AbstractAuthenticationToken convert(@NonNull Jwt jwt) { + return new JwtAuthenticationToken(jwt, getAuthorities(jwt), getPrincipleClaimName(jwt)); + } + + String getPrincipleClaimName(Jwt jwt) { + return MapUtils.getString(jwt.getClaims(), getClaimName()); + } + + private String getClaimName() { + return Optional.ofNullable(oAuth2Properties.getPrincipleAttribute()).orElse(JwtClaimNames.SUB); + } + + Set<GrantedAuthority> getAuthorities(Jwt jwt) { + return Stream.concat(jwtGrantedAuthoritiesConverter.convert(jwt).stream(), extractResourceRoles(jwt).stream()).collect(Collectors.toSet()); + } + + Collection<SimpleGrantedAuthority> extractResourceRoles(Jwt jwt) { + var resourceAccess = getResourceAccess(jwt); + if (resourceAccess.isEmpty()) { + return Collections.emptySet(); + } + if (Objects.isNull(resourceAccess.get(oAuth2Properties.getResource()))) { + return Collections.emptySet(); + } + return extractRoles(getClaimMapFromMap(resourceAccess, oAuth2Properties.getResource())); + } + + private Map<String, Object> getResourceAccess(Jwt jwt) { + return jwt.getClaimAsMap(RESOURCE_ACCESS_KEY); + } + + @SuppressWarnings("unchecked") + private Map<String, Object> getClaimMapFromMap(Map<String, Object> claimMap, String claimName) { + return MapUtils.getMap(claimMap, claimName); + } + + Set<SimpleGrantedAuthority> extractRoles(Map<String, Object> resource) { + if (!resource.containsKey(ROLES_KEY)) { + return Collections.emptySet(); + } + return getRoles(resource).stream().map(role -> new SimpleGrantedAuthority(SIMPLE_GRANT_AUTHORITY_PREFIX + role)).collect(Collectors.toSet()); + } + + @SuppressWarnings("unchecked") + private Collection<String> getRoles(Map<String, Object> resource) { + return (Collection<String>) resource.get(ROLES_KEY); + } +} \ No newline at end of file diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/OAuth2Properties.java b/alfa-service/src/main/java/de/ozgcloud/alfa/OAuth2Properties.java new file mode 100644 index 0000000000000000000000000000000000000000..6a8d79d91213599bfcc0e9ff7213ff83a9ff53c2 --- /dev/null +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/OAuth2Properties.java @@ -0,0 +1,36 @@ +package de.ozgcloud.alfa; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +@Configuration +@ConfigurationProperties(prefix = OAuth2Properties.PREFIX) +public class OAuth2Properties { + + static final String PREFIX = "ozgcloud.oauth2"; + + /** + * OAuth2 auth server url + */ + private String authServerUrl; + + /** + * OAuth2 realm + */ + private String realm; + + /** + * OAuth2 resource + */ + private String resource; + + /** + * OAuth2 principle attribute + */ + private String principleAttribute; +} \ No newline at end of file diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/RequestIdFilter.java b/alfa-service/src/main/java/de/ozgcloud/alfa/RequestIdFilter.java index c99af4d374c060118ff2930849ef4eccf40d99dc..83b33e364ebd220e94962637bc6fedc545ad2efb 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/RequestIdFilter.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/RequestIdFilter.java @@ -25,10 +25,10 @@ package de.ozgcloud.alfa; import java.io.IOException; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.apache.logging.log4j.CloseableThreadContext; import org.springframework.beans.factory.annotation.Autowired; diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/SecurityConfiguration.java b/alfa-service/src/main/java/de/ozgcloud/alfa/SecurityConfiguration.java index ca8c0c09f524b0ad77df52c18d25d0451c331b69..42f7e4158e24894ebc33b10354c346c5efb3c8eb 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/SecurityConfiguration.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/SecurityConfiguration.java @@ -23,16 +23,20 @@ */ package de.ozgcloud.alfa; -import org.keycloak.adapters.springsecurity.KeycloakConfiguration; -import org.keycloak.adapters.springsecurity.authentication.KeycloakAuthenticationProvider; -import org.keycloak.adapters.springsecurity.config.KeycloakWebSecurityConfigurerAdapter; +import java.util.Optional; + import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpMethod; +import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; -import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configurers.oauth2.server.resource.OAuth2ResourceServerConfigurer; import org.springframework.security.config.http.SessionCreationPolicy; -import org.springframework.security.core.authority.mapping.SimpleAuthorityMapper; +import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import org.springframework.security.web.authentication.session.NullAuthenticatedSessionStrategy; import org.springframework.security.web.authentication.session.SessionAuthenticationStrategy; @@ -42,48 +46,57 @@ import org.springframework.security.web.header.writers.frameoptions.XFrameOption import de.ozgcloud.alfa.common.downloadtoken.DownloadTokenAuthenticationFilter; -@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true) -@KeycloakConfiguration -public class SecurityConfiguration extends KeycloakWebSecurityConfigurerAdapter { +@Configuration +@EnableWebSecurity +@EnableMethodSecurity(securedEnabled = true) +public class SecurityConfiguration { + + @Autowired + private JwtAuthConverter jwtAuthConverter; @Autowired - private DownloadTokenAuthenticationFilter downloadTokenFilter; + private SpringJwtProperties springJwtProperties; + + @Bean + SecurityFilterChain securityFilterChain(HttpSecurity http, DownloadTokenAuthenticationFilter downloadTokenFilter) throws Exception { + http.csrf(csrf -> csrf.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())); - @Override - protected void configure(HttpSecurity http) throws Exception { - super.configure(http); - http.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()); + http.sessionManagement(management -> management.sessionCreationPolicy(SessionCreationPolicy.STATELESS)); - http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) - .and().authorizeRequests()// - .antMatchers(HttpMethod.GET, "/api/environment").permitAll()// - .antMatchers(HttpMethod.GET, "/assets/**").permitAll()// - .antMatchers(HttpMethod.GET, "/vorgang/**").permitAll()// - .antMatchers(HttpMethod.GET, "/meine/**").permitAll()// - .antMatchers(HttpMethod.GET, "/alle/**").permitAll()// - .antMatchers(HttpMethod.GET, "/unassigned/**").permitAll()// - .antMatchers("/api").authenticated()// - .antMatchers("/api/**").authenticated()// - .antMatchers("/actuator").permitAll()// - .antMatchers("/actuator/**").permitAll()// - .antMatchers("/").permitAll()// - .antMatchers("/*").permitAll()// - .anyRequest().denyAll(); + http.authorizeHttpRequests(authorize -> authorize + .requestMatchers(HttpMethod.GET, "/api/environment").permitAll() + .requestMatchers(HttpMethod.GET, "/assets/**").permitAll() + .requestMatchers(HttpMethod.GET, "/vorgang/**").permitAll() + .requestMatchers(HttpMethod.GET, "/meine/**").permitAll() + .requestMatchers(HttpMethod.GET, "/alle/**").permitAll() + .requestMatchers(HttpMethod.GET, "/unassigned/**").permitAll() + .requestMatchers("/api").authenticated() + .requestMatchers("/api/**").authenticated() + .requestMatchers("/actuator").permitAll() + .requestMatchers("/actuator/**").permitAll() + .requestMatchers("/").permitAll() + .requestMatchers("/*").permitAll() + .anyRequest().denyAll()); - http.headers().addHeaderWriter(new XFrameOptionsHeaderWriter(XFrameOptionsMode.SAMEORIGIN)); + http.oauth2ResourceServer(this::setOAuth2ResourceServer); + http.headers(headers -> headers.addHeaderWriter(new XFrameOptionsHeaderWriter(XFrameOptionsMode.SAMEORIGIN))); http.addFilterBefore(downloadTokenFilter, UsernamePasswordAuthenticationFilter.class); + + return http.build(); } - @Autowired - public void configureGlobal(AuthenticationManagerBuilder auth) { - KeycloakAuthenticationProvider keyCloakAuthProvider = keycloakAuthenticationProvider(); - keyCloakAuthProvider.setGrantedAuthoritiesMapper(new SimpleAuthorityMapper()); - auth.authenticationProvider(keyCloakAuthProvider); + private void setOAuth2ResourceServer(OAuth2ResourceServerConfigurer<HttpSecurity> configurer) { + configurer.jwt().jwtAuthenticationConverter(jwtAuthConverter); + Optional.ofNullable(springJwtProperties.getJwkSetUri()).ifPresent(jwkSetUri -> configurer.jwt().jwkSetUri(jwkSetUri)); } - @Override + @Bean protected SessionAuthenticationStrategy sessionAuthenticationStrategy() { return new NullAuthenticatedSessionStrategy(); } + @Bean + AuthenticationManager authenticationManager(HttpSecurity http) throws Exception { + return http.getSharedObject(AuthenticationManagerBuilder.class).build(); + } } diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/SpringJwtProperties.java b/alfa-service/src/main/java/de/ozgcloud/alfa/SpringJwtProperties.java new file mode 100644 index 0000000000000000000000000000000000000000..9b81c0654242a2132f92ce8a1c2e509981951c00 --- /dev/null +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/SpringJwtProperties.java @@ -0,0 +1,21 @@ +package de.ozgcloud.alfa; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +@Configuration +@ConfigurationProperties(prefix = SpringJwtProperties.PREFIX) +public class SpringJwtProperties { + + static final String PREFIX = "spring.security.oauth2.resourceserver.jwt"; + + /** + * Jwt jwk set uri + */ + private String jwkSetUri = null; +} \ No newline at end of file diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/WebConfig.java b/alfa-service/src/main/java/de/ozgcloud/alfa/WebConfig.java index 2074b2e67f74c77f5b00ff6c9a8f6b6f8e0bd7ed..a0669a9539fecfa3fb4bb46020f5c85f9f133dde 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/WebConfig.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/WebConfig.java @@ -26,9 +26,6 @@ package de.ozgcloud.alfa; import java.io.IOException; import java.util.concurrent.TimeUnit; -import org.keycloak.adapters.KeycloakConfigResolver; -import org.keycloak.adapters.springboot.KeycloakSpringBootConfigResolver; -import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.Resource; import org.springframework.http.CacheControl; @@ -36,6 +33,8 @@ import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import org.springframework.web.servlet.resource.PathResourceResolver; +import lombok.NoArgsConstructor; + @Configuration public class WebConfig implements WebMvcConfigurer { @@ -43,7 +42,6 @@ public class WebConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { - registry.addResourceHandler("/*.js", "/*.css", "/*.ttf", "/*.woff", "/*.woff2", "/*.eot", "/**/*.svg", "/*.svf", "/*.otf", "/*.ico", "/**/*.png") .addResourceLocations(RESOURCE_LOCATION) @@ -56,18 +54,20 @@ public class WebConfig implements WebMvcConfigurer { .setCacheControl(CacheControl.noStore()) .setUseLastModified(false) .resourceChain(true) - .addResolver(new PathResourceResolver() { - @Override - protected Resource getResource(String resourcePath, Resource location) throws IOException { - Resource requestedResource = location.createRelative(resourcePath); - return requestedResource.exists() && requestedResource.isReadable() ? requestedResource - : super.getResource("index.html", location); - } - }); + .addResolver(new OzgCloudPathResourceResolver()); } - @Bean - public KeycloakConfigResolver keyCloakConfigResolver() { - return new KeycloakSpringBootConfigResolver(); + @NoArgsConstructor + static class OzgCloudPathResourceResolver extends PathResourceResolver { + + @Override + protected Resource getResource(String resourcePath, Resource location) throws IOException { + var requestedResource = location.createRelative(resourcePath); + + if (requestedResource.exists() && requestedResource.isReadable()) { + return requestedResource; + } + return super.getResource("index.html", location); + } } -} +} \ No newline at end of file diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/FeatureToggleProperties.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/FeatureToggleProperties.java index 1aaabfc98f32b49742f2f709b6a967f18799242d..f4f9ed3147666758a818a8e00a6ba3150b8d2263 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/FeatureToggleProperties.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/FeatureToggleProperties.java @@ -20,7 +20,7 @@ public class FeatureToggleProperties { private boolean vorgangExport = false; /** - * Enable/Disable Bescheid creation feature + * Enable/Disable Bescheid creation feature. */ private boolean createBescheid = false; } diff --git a/goofy-client/libs/ui/src/lib/ui/button-with-spinner/_button-with-spinner.theme.scss b/alfa-service/src/main/java/de/ozgcloud/alfa/common/GermanDateTimeFormatter.java similarity index 58% rename from goofy-client/libs/ui/src/lib/ui/button-with-spinner/_button-with-spinner.theme.scss rename to alfa-service/src/main/java/de/ozgcloud/alfa/common/GermanDateTimeFormatter.java index d1a8569431b12864c1c52fbaefa64dffe88e2cff..97dc0511e8c1d58ffd0de06b34820df0dfe23f03 100644 --- a/goofy-client/libs/ui/src/lib/ui/button-with-spinner/_button-with-spinner.theme.scss +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/GermanDateTimeFormatter.java @@ -1,4 +1,4 @@ -/** +/* * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den * Ministerpräsidenten des Landes Schleswig-Holstein * Staatskanzlei @@ -21,14 +21,26 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -@use 'sass:map'; -@use '@angular/material' as mat; +package de.ozgcloud.alfa.common; -@mixin button-with-spinner($theme) { - $color-config: mat.get-color-config($theme); - $primary: map.get($color-config, 'primary'); +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Locale; - goofy-client-button-with-spinner .mat-primary svg path { - fill: mat.get-color-from-palette($primary); +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import lombok.NonNull; + +@Component +public class GermanDateTimeFormatter { + + private static final DateTimeFormatter DATE_TIME_ZONE = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss z").withLocale(Locale.GERMANY); + + @Autowired + private SystemProperties systemProperties; + + public String formatZonedDateTime(@NonNull ZonedDateTime zonedDateTime) { + return DATE_TIME_ZONE.format(zonedDateTime.withZoneSameInstant(systemProperties.getTimeZone())); } } diff --git a/goofy-client/apps/goofy-e2e/src/support/pre-merge.ts b/alfa-service/src/main/java/de/ozgcloud/alfa/common/SystemProperties.java similarity index 64% rename from goofy-client/apps/goofy-e2e/src/support/pre-merge.ts rename to alfa-service/src/main/java/de/ozgcloud/alfa/common/SystemProperties.java index 710c4513d9884794cf3050d31326c01490336a34..d58bada4d2c41ca587bf689f646d4524134c8a86 100644 --- a/goofy-client/apps/goofy-e2e/src/support/pre-merge.ts +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/SystemProperties.java @@ -21,8 +21,26 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -const fs = require('fs') +package de.ozgcloud.alfa.common; -if (fs.existsSync(`apps/goofy-e2e/reports/${process.env.REPORT_FOLDER}/mochawesome-report/.jsons`)) { - fs.rename(`apps/goofy-e2e/reports/${process.env.REPORT_FOLDER}/mochawesome-report/.jsons`, `apps/goofy-e2e/reports/${process.env.REPORT_FOLDER}/mochawesome-report/jsons`, () => { }) -} \ No newline at end of file +import java.time.ZoneId; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +@Configuration +@ConfigurationProperties(prefix = SystemProperties.PREFIX) +public class SystemProperties { + + static final String PREFIX = "ozgcloud.system"; + + /** + * Timezone to be used in application. + */ + private ZoneId timeZone = ZoneId.of("Europe/Berlin"); +} diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/binaryfile/BinaryFileMaxSizeConstraint.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/binaryfile/BinaryFileMaxSizeConstraint.java index 0f252193a005ef714be422942761728f397165c5..4e2e344b837e957f0804d7cd7a48c2bdd607817e 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/binaryfile/BinaryFileMaxSizeConstraint.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/binaryfile/BinaryFileMaxSizeConstraint.java @@ -30,8 +30,8 @@ import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.Target; -import javax.validation.Constraint; -import javax.validation.Payload; +import jakarta.validation.Constraint; +import jakarta.validation.Payload; import de.ozgcloud.alfa.common.ValidationMessageCodes; diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/binaryfile/BinaryFileModelAssembler.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/binaryfile/BinaryFileModelAssembler.java index 46c008ecb1d6ea122f163eb50dce6d7cd5efa26e..c475c5c3262880ad20da74131e8940592c4a5ede 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/binaryfile/BinaryFileModelAssembler.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/binaryfile/BinaryFileModelAssembler.java @@ -25,7 +25,6 @@ package de.ozgcloud.alfa.common.binaryfile; import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*; -import java.util.stream.Collectors; import java.util.stream.Stream; import org.springframework.hateoas.CollectionModel; @@ -51,7 +50,6 @@ public class BinaryFileModelAssembler implements RepresentationModelAssembler<Oz } public CollectionModel<EntityModel<OzgFile>> toCollectionModel(Stream<OzgFile> entities) { - return CollectionModel.of(entities.map(this::toModel).collect(Collectors.toList()), - linkTo(BinaryFileController.class).withSelfRel()); + return CollectionModel.of(entities.map(this::toModel).toList(), linkTo(BinaryFileController.class).withSelfRel()); } } \ No newline at end of file diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/binaryfile/BinaryFileService.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/binaryfile/BinaryFileService.java index 74bfd67e7f22ec26d200d2c43e729a9c151cd54c..eebbd2caea67e481ca652f08743a50d023d09752 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/binaryfile/BinaryFileService.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/binaryfile/BinaryFileService.java @@ -28,7 +28,7 @@ import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.stream.Stream; -import javax.validation.Valid; +import jakarta.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/binaryfile/DownloadAuthenticationHandler.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/binaryfile/DownloadAuthenticationHandler.java index ad7639749de0b76fa04e88485ae985ba110f6718..ee46850a3953a45a759529e3ba3513766bfc62a8 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/binaryfile/DownloadAuthenticationHandler.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/binaryfile/DownloadAuthenticationHandler.java @@ -39,7 +39,7 @@ public class DownloadAuthenticationHandler { boolean check(FileId fileId, Authentication auth) { if (auth instanceof UsernamePasswordAuthenticationToken userPasswordToken) { - GoofyUserWithFileId user = (GoofyUserWithFileId) userPasswordToken.getPrincipal(); + var user = (GoofyUserWithFileId) userPasswordToken.getPrincipal(); return Objects.nonNull(fileId) && fileId.equals(user.getFileId()) && auth.isAuthenticated(); } diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/binaryfile/UploadBinaryFileSizeValidator.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/binaryfile/UploadBinaryFileSizeValidator.java index 6aa3dbce4860ce92368a052da6ecc0374b5ec821..1bef03838dd01d3f8da8b215395e119ea6d546a3 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/binaryfile/UploadBinaryFileSizeValidator.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/binaryfile/UploadBinaryFileSizeValidator.java @@ -26,8 +26,8 @@ package de.ozgcloud.alfa.common.binaryfile; import java.util.Map; import java.util.Optional; -import javax.validation.ConstraintValidator; -import javax.validation.ConstraintValidatorContext; +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; import org.hibernate.validator.constraintvalidation.HibernateConstraintValidatorContext; import org.springframework.beans.factory.annotation.Autowired; diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandHelper.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandHelper.java index 142c457fc85fa9686b15ccdbec16b14c11d9a268..deb37af64aa82dab029a84cfce1e2e864b80d756 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandHelper.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandHelper.java @@ -11,15 +11,12 @@ public class CommandHelper { static final Predicate<Command> IS_DONE = command -> command.getStatus() == CommandStatus.FINISHED || command.getStatus() == CommandStatus.REVOKED || command.getStatus() == CommandStatus.ERROR; - static final Predicate<Command> IS_PENDING = command -> { - return command.getStatus() == CommandStatus.PENDING - || command.getStatus() == CommandStatus.REVOKE_PENDING; - }; + static final Predicate<Command> IS_PENDING = command -> command.getStatus() == CommandStatus.PENDING + || command.getStatus() == CommandStatus.REVOKE_PENDING; public static final Predicate<Command> IS_REVOKEABLE = command -> command.getOrder().isRevokeable() && command.getStatus() == CommandStatus.FINISHED; public static final Predicate<Command> IS_LOESCHANFORDERUNG = command -> command.getOrder() == CommandOrder.VORGANG_ZUM_LOESCHEN_MARKIEREN || command.getOrder() == CommandOrder.LOESCH_ANFORDERUNG_ZURUECKNEHMEN; - } \ No newline at end of file diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandService.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandService.java index ea7534a4f95a24c47197ac3662ab60bd87362bb5..638a672caa20cd5268b4218db07f69e0e810182c 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandService.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandService.java @@ -26,7 +26,7 @@ package de.ozgcloud.alfa.common.command; import java.util.Optional; import java.util.stream.Stream; -import javax.validation.Valid; +import jakarta.validation.Valid; import org.apache.commons.collections.MapUtils; import org.springframework.beans.factory.annotation.Autowired; diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CreateCommand.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CreateCommand.java index 3cb5adcf3fcfa15f82dbd6228eeb607714691a85..0f8887ca869483fc91e817df3e986669cf29c940 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CreateCommand.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CreateCommand.java @@ -23,7 +23,7 @@ */ package de.ozgcloud.alfa.common.command; -import javax.validation.Valid; +import jakarta.validation.Valid; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonTypeInfo; diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/RequiredOrder.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/RequiredOrder.java index da13800709784f1a2c7906d3bfba20def3cd4a62..f998dfe648a4457c8247c56631934ea36eeed1ec 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/RequiredOrder.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/RequiredOrder.java @@ -7,8 +7,8 @@ import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.Target; -import javax.validation.Constraint; -import javax.validation.Payload; +import jakarta.validation.Constraint; +import jakarta.validation.Payload; @Constraint(validatedBy = { RequiredOrderValidator.class }) @Target({ FIELD, METHOD, PARAMETER, ANNOTATION_TYPE, TYPE_USE }) diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/RequiredOrderValidator.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/RequiredOrderValidator.java index 79c52429309481d71020d72bb26c3949e8bb0cc7..ef8a8897172582847e3cdc9377a5f5b4122a8342 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/RequiredOrderValidator.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/RequiredOrderValidator.java @@ -1,7 +1,7 @@ package de.ozgcloud.alfa.common.command; -import javax.validation.ConstraintValidator; -import javax.validation.ConstraintValidatorContext; +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; public class RequiredOrderValidator implements ConstraintValidator<RequiredOrder, CreateCommand> { diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/downloadtoken/DownloadTokenAuthenticationFilter.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/downloadtoken/DownloadTokenAuthenticationFilter.java index 297aa8e7a22308f54ca8a3781c92e3742eeb6adf..e2824c6edfb29aababf2e32ef78a04364acdb468 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/downloadtoken/DownloadTokenAuthenticationFilter.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/downloadtoken/DownloadTokenAuthenticationFilter.java @@ -25,13 +25,12 @@ package de.ozgcloud.alfa.common.downloadtoken; import java.io.IOException; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.apache.commons.lang3.StringUtils; -import org.apache.http.HttpStatus; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; @@ -52,7 +51,7 @@ public class DownloadTokenAuthenticationFilter extends OncePerRequestFilter { try { downloadTokenService.handleToken(request, getDownloadToken(request)); } catch (TechnicalException e) { - response.setStatus(HttpStatus.SC_UNAUTHORIZED); + response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); return; } diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/downloadtoken/DownloadTokenProperties.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/downloadtoken/DownloadTokenProperties.java index 8e63cd4b96fe65a1ef4b937c301c0f6b1ffd782a..d07c0a7956c415e8c80adeadd5205aa634e32ec3 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/downloadtoken/DownloadTokenProperties.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/downloadtoken/DownloadTokenProperties.java @@ -23,7 +23,7 @@ */ package de.ozgcloud.alfa.common.downloadtoken; -import javax.validation.constraints.NotNull; +import jakarta.validation.constraints.NotNull; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/downloadtoken/DownloadTokenService.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/downloadtoken/DownloadTokenService.java index fa4276a91aebf8d0fae0b1ea4ae5c7aa14a08442..466881c91649dc8b37de5ec46057b33d5e717c89 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/downloadtoken/DownloadTokenService.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/downloadtoken/DownloadTokenService.java @@ -27,7 +27,7 @@ import static de.ozgcloud.alfa.JwtTokenUtil.*; import java.util.Optional; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -90,12 +90,12 @@ class DownloadTokenService { Optional<Claims> claimsOptional = jwtTokenUtil.getAllClaimsFromToken(token); var downloadUserBuilder = GoofyUserWithFileId.builder(); claimsOptional.ifPresent(claims -> downloadUserBuilder.user( - UserProfile.builder() - .id(UserId.from(claims.get(USERID_CLAIM, String.class))) - .firstName(claims.get(FIRSTNAME_CLAIM, String.class)) - .lastName(claims.get(LASTNAME_CLAIM, String.class)) - .authorities(jwtTokenUtil.getRolesFromToken(token)) - .organisationseinheitIds(jwtTokenUtil.getOrganisationseinheitIdsFromToken(token)).build()) + UserProfile.builder() + .id(UserId.from(claims.get(USERID_CLAIM, String.class))) + .firstName(claims.get(FIRSTNAME_CLAIM, String.class)) + .lastName(claims.get(LASTNAME_CLAIM, String.class)) + .authorities(jwtTokenUtil.getRolesFromToken(token)) + .organisationseinheitIds(jwtTokenUtil.getOrganisationseinheitIdsFromToken(token)).build()) .fileId(FileId.from(claims.get(FILEID_CLAIM, String.class)))); return downloadUserBuilder.build(); diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/errorhandling/ExceptionController.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/errorhandling/ExceptionController.java index 0772ce937792cb74d362034fea4ea1e4d58792c0..018624fea26e30f86f059b898038ce02efdf0059 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/errorhandling/ExceptionController.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/errorhandling/ExceptionController.java @@ -33,10 +33,10 @@ import java.util.Set; import java.util.UUID; import java.util.stream.Stream; -import javax.validation.ConstraintViolation; -import javax.validation.ConstraintViolationException; -import javax.validation.Path; -import javax.validation.metadata.ConstraintDescriptor; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.ConstraintViolationException; +import jakarta.validation.Path; +import jakarta.validation.metadata.ConstraintDescriptor; import org.hibernate.validator.engine.HibernateConstraintViolation; import org.springframework.core.annotation.Order; diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/user/CurrentUserHelper.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/user/CurrentUserHelper.java index c3752745433b597fec75c1eea29995c7efda3075..b0414c8fc1f7a12e718c0a8aeec96ebeedd8468b 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/user/CurrentUserHelper.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/user/CurrentUserHelper.java @@ -34,26 +34,20 @@ import org.springframework.security.authentication.AuthenticationTrustResolverIm import org.springframework.security.core.Authentication; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.oauth2.jwt.Jwt; import lombok.AccessLevel; import lombok.NoArgsConstructor; @NoArgsConstructor(access = AccessLevel.PRIVATE) public class CurrentUserHelper { - static final String ROLE_PREFIX = "ROLE_"; - public static final Predicate<String> HAS_ROLE = CurrentUserHelper::hasRole; + static final String ROLE_PREFIX = "ROLE_"; + private static final String SUB_CLAIM_KEY = "sub"; private static final AuthenticationTrustResolver TRUST_RESOLVER = new AuthenticationTrustResolverImpl(); - private static final Predicate<Authentication> TRUSTED = auth -> !TRUST_RESOLVER.isAnonymous(auth); - - public static Authentication getAuthentication() { - return findAuthentication().orElseThrow(() -> new IllegalStateException("No authenticated User found")); - } - - public static Optional<Authentication> findAuthentication() { - return Optional.ofNullable(SecurityContextHolder.getContext().getAuthentication()).filter(TRUSTED); - } + private static final Predicate<Authentication> IS_TRUSTED = auth -> !TRUST_RESOLVER.isAnonymous(auth); + private static final Predicate<String> IS_ROLE_PREFIX_MISSING = role -> !role.startsWith(ROLE_PREFIX); public static boolean hasRole(String role) { var auth = getAuthentication(); @@ -61,46 +55,44 @@ public class CurrentUserHelper { if ((Objects.isNull(auth)) || (Objects.isNull(auth.getPrincipal()))) { return false; } - Collection<? extends GrantedAuthority> authorities = auth.getAuthorities(); - return containsRole(authorities, role); - + return containsRole(auth.getAuthorities(), role); } public static boolean containsRole(Collection<? extends GrantedAuthority> authorities, String role) { - String roleToCheck; - - if (Objects.nonNull(role) && !role.startsWith(ROLE_PREFIX)) { - roleToCheck = ROLE_PREFIX + role; - } else { - roleToCheck = role; - } - if (Objects.isNull(authorities)) { return false; } + return containsRole(prepareRoleForCheck(role), authorities); + } - return containsRole(roleToCheck, authorities); + static boolean containsRole(String role, Collection<? extends GrantedAuthority> authorities) { + return authorities.stream().anyMatch(a -> isAuthorityEquals(role, a.getAuthority())); } - public static String prepareRoleForCheck(String role) { - if ((Objects.nonNull(role)) && (!role.startsWith(ROLE_PREFIX))) { - return ROLE_PREFIX + role; - } else { - return role; - } + private static boolean isAuthorityEquals(String role, String authority) { + return StringUtils.equalsIgnoreCase(role, authority) || StringUtils.equalsIgnoreCase(prepareRoleForCheck(role), authority); } - public static boolean containsRole(String role, Collection<? extends GrantedAuthority> authorities) { - return authorities.stream().anyMatch(a -> isAuthorityEquals(role, a.getAuthority())); + static String prepareRoleForCheck(String roleToCheck) { + return Optional.ofNullable(roleToCheck) + .filter(IS_ROLE_PREFIX_MISSING) + .map(role -> String.format("%s%s", ROLE_PREFIX, role)) + .orElse(roleToCheck); } - private static boolean isAuthorityEquals(String role, String authority) { - String roleToCheck = prepareRoleForCheck(role); - return StringUtils.equalsIgnoreCase(role, authority) || StringUtils.equalsIgnoreCase(roleToCheck, authority); + public static UserId getCurrentUserId() { + return UserId.from(getSubClaim()); } - static UserId getCurrentUserId() { - return UserId.from(getAuthentication().getName()); + private static String getSubClaim() { + return ((Jwt) getAuthentication().getPrincipal()).getClaim(SUB_CLAIM_KEY); } + public static Authentication getAuthentication() { + return findAuthentication().orElseThrow(() -> new IllegalStateException("No authenticated User found")); + } + + private static Optional<Authentication> findAuthentication() { + return Optional.ofNullable(SecurityContextHolder.getContext().getAuthentication()).filter(IS_TRUSTED); + } } diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/user/CurrentUserService.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/user/CurrentUserService.java index 94b9c3900b2f7decee285d35e220fd28463a5fe5..6ba0fc106713431e94c8974c21f50b93b6ca03a6 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/user/CurrentUserService.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/user/CurrentUserService.java @@ -25,17 +25,14 @@ package de.ozgcloud.alfa.common.user; import java.util.Collection; import java.util.Collections; -import java.util.HashSet; import java.util.List; -import java.util.Map; import java.util.Objects; import java.util.Optional; -import org.keycloak.KeycloakPrincipal; -import org.keycloak.representations.AccessToken; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.hierarchicalroles.RoleHierarchy; import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.oauth2.jwt.Jwt; import org.springframework.stereotype.Service; import de.itvsh.kop.common.errorhandling.TechnicalException; @@ -50,6 +47,10 @@ public class CurrentUserService { static final String USER_ATTRIBUTE_ORGANISATIONSEINHEIT_ID = "organisationseinheitId"; + static final String KEYCLOAK_USER_PREFERRED_USERNAME = "preferred_username"; + static final String KEYCLOAK_USER_GIVEN_NAME = "given_name"; + static final String KEYCLOAK_USER_FAMILY_NAME = "family_name"; + @Autowired private UserService userService; @Autowired @@ -65,44 +66,47 @@ public class CurrentUserService { return CurrentUserHelper.containsRole(reachableRoles, role); } - public Collection<GrantedAuthority> getAuthorities() { - return Collections.unmodifiableCollection(new HashSet<GrantedAuthority>(CurrentUserHelper.getAuthentication().getAuthorities())); - } - public UserProfile getUser() { - var dlUser = getDownloadUser(); - if (dlUser.isPresent()) { - return dlUser.get(); - } - - Optional<AccessToken> token = getCurrentSecurityToken(); + return getDownloadUser().orElseGet(this::buildUserProfile); + } + private UserProfile buildUserProfile() { var userBuilder = UserProfile.builder() .id(getUserId()) .authorities(getAuthorities()); - token.ifPresent(t -> userBuilder.userName(t.getPreferredUsername()) - .firstName(t.getGivenName()) - .lastName(t.getFamilyName()) - .organisationseinheitIds(getOrganisationseinheitId(t.getOtherClaims()))); + getCurrentSecurityToken().ifPresent(token -> userBuilder + .userName(token.getClaimAsString(KEYCLOAK_USER_PREFERRED_USERNAME)) + .firstName(token.getClaimAsString(KEYCLOAK_USER_GIVEN_NAME)) + .lastName(token.getClaimAsString(KEYCLOAK_USER_FAMILY_NAME)) + .organisationseinheitIds(getOrganisationsEinheitIds(token))); return userBuilder.build(); } + public Collection<GrantedAuthority> getAuthorities() { + return Collections.unmodifiableCollection(CurrentUserHelper.getAuthentication().getAuthorities()); + } + public UserId getUserId() { return findUserId() .orElseThrow(() -> new TechnicalException("Cannot find internal UserId. Check sync with UserManager or Token Mapper in keycloak.")); } public Optional<UserId> findUserId() { - return Optional.ofNullable( - getSingleClaimValue(ATTRIBUTE_NAME_USER_ID).map(UserId::from) - .orElseGet(() -> userService.getInternalId(CurrentUserHelper.getCurrentUserId()).orElse(null))) + return Optional.ofNullable(getSingleClaimValue(ATTRIBUTE_NAME_USER_ID) + .map(UserId::from) + .orElseGet(this::getInternalId)) .filter(Objects::nonNull); } - List<String> getOrganisationseinheitId(Map<String, Object> claims) { - return Optional.ofNullable(claims.get(USER_ATTRIBUTE_ORGANISATIONSEINHEIT_ID)) + private UserId getInternalId() { + return userService.getInternalId(CurrentUserHelper.getCurrentUserId()).orElse(null); + } + + List<String> getOrganisationsEinheitIds(Jwt jwt) { + return Optional.ofNullable(jwt) + .map(token -> token.getClaim(USER_ATTRIBUTE_ORGANISATIONSEINHEIT_ID)) .map(col -> (Collection<?>) col).orElse(Collections.emptyList()) // NOSONAR - Collection.class::cast has type-safty issue .stream().map(Object::toString).toList(); } @@ -114,19 +118,19 @@ public class CurrentUserService { .map(GoofyUserWithFileId::getUser); } - Optional<AccessToken> getCurrentSecurityToken() { - Object principal = CurrentUserHelper.getAuthentication().getPrincipal(); + Optional<String> getSingleClaimValue(String attributeName) { + return getCurrentSecurityToken() + .map(token -> token.getClaim(attributeName)) + .map(String.class::cast); + } + + Optional<Jwt> getCurrentSecurityToken() { + var principal = CurrentUserHelper.getAuthentication().getPrincipal(); - if (principal instanceof KeycloakPrincipal<?> kcPrincipal) { - return Optional.of(kcPrincipal.getKeycloakSecurityContext().getToken()); + if (principal instanceof Jwt kcPrincipal) { + return Optional.of(kcPrincipal); } return Optional.empty(); } - - Optional<String> getSingleClaimValue(String attributeName) { - return getCurrentSecurityToken() - .map(token -> token.getOtherClaims().get(attributeName)) - .map(String.class::cast); - } } \ No newline at end of file diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/historie/HistorieCommandHandler.java b/alfa-service/src/main/java/de/ozgcloud/alfa/historie/HistorieCommandHandler.java index dc735be8bf8f3da848fd631fa28612ff23a444fb..fe54b77f7a60a44ac005f05864c7819587701b36 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/historie/HistorieCommandHandler.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/historie/HistorieCommandHandler.java @@ -27,8 +27,8 @@ import java.util.Map; import java.util.Optional; import java.util.function.Predicate; -import org.apache.commons.codec.binary.StringUtils; import org.apache.commons.collections.MapUtils; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/kommentar/Kommentar.java b/alfa-service/src/main/java/de/ozgcloud/alfa/kommentar/Kommentar.java index a522e29cf9e9fd05ca47cc1b663b835235d2a5b0..1dde8e3c04207e104bddf8f3a5986879e6dbc666 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/kommentar/Kommentar.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/kommentar/Kommentar.java @@ -28,8 +28,8 @@ import static de.ozgcloud.alfa.common.ValidationMessageCodes.*; import java.time.ZonedDateTime; import java.util.List; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/kommentar/KommentarCommand.java b/alfa-service/src/main/java/de/ozgcloud/alfa/kommentar/KommentarCommand.java index a6945fac38dcd6aec6466cb2649f248a8e38801b..7f6e99db26f4255bc06827e0f0ccfd64545b77f4 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/kommentar/KommentarCommand.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/kommentar/KommentarCommand.java @@ -23,7 +23,7 @@ */ package de.ozgcloud.alfa.kommentar; -import javax.validation.Valid; +import jakarta.validation.Valid; import com.fasterxml.jackson.annotation.JsonIgnore; diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/kommentar/KommentarService.java b/alfa-service/src/main/java/de/ozgcloud/alfa/kommentar/KommentarService.java index 8edacd2a909f462b4bd23b20707318bb44acb1f0..4bd41879a07fffedf0e715c4d3adb65ca36575db 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/kommentar/KommentarService.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/kommentar/KommentarService.java @@ -26,7 +26,7 @@ package de.ozgcloud.alfa.kommentar; import java.time.ZonedDateTime; import java.util.stream.Stream; -import javax.validation.Valid; +import jakarta.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungService.java b/alfa-service/src/main/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungService.java index d215118ece078659764cff242d4a87101a9bf4a1..d478b7f56b218436f5c30404ad132c4261b331ae 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungService.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungService.java @@ -3,7 +3,7 @@ package de.ozgcloud.alfa.loeschanforderung; import java.util.List; import java.util.Optional; -import javax.validation.Valid; +import jakarta.validation.Valid; import org.apache.commons.collections.MapUtils; import org.springframework.beans.factory.annotation.Autowired; diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/postfach/PostfachMail.java b/alfa-service/src/main/java/de/ozgcloud/alfa/postfach/PostfachMail.java index 722d7f5b9f2b4e96daa4f228ab42101371d04bb9..0b5a606b86e6ab51a6cd027b4e8caecf8f4320e0 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/postfach/PostfachMail.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/postfach/PostfachMail.java @@ -29,8 +29,8 @@ import java.time.ZonedDateTime; import java.util.List; import java.util.Map; -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.Size; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.Size; import com.fasterxml.jackson.annotation.JsonIgnore; diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/postfach/PostfachNachrichtPdfModel.java b/alfa-service/src/main/java/de/ozgcloud/alfa/postfach/PostfachNachrichtPdfModel.java index 011cfc7be512df6257e987a66cc80c8a0926e952..47457f9b4040d2c3a47f01843b797a1131e227d2 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/postfach/PostfachNachrichtPdfModel.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/postfach/PostfachNachrichtPdfModel.java @@ -25,9 +25,9 @@ package de.ozgcloud.alfa.postfach; import java.util.List; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlElementWrapper; -import javax.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlElement; +import jakarta.xml.bind.annotation.XmlElementWrapper; +import jakarta.xml.bind.annotation.XmlRootElement; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -76,7 +76,7 @@ class PostfachNachrichtPdfModel { @Getter @Builder static class Nachricht { - + @XmlElement private boolean isFirst; diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/postfach/PostfachNachrichtPdfService.java b/alfa-service/src/main/java/de/ozgcloud/alfa/postfach/PostfachNachrichtPdfService.java index 6a71d24ad93dd318d8064f7692b2e81f70a339f3..1ab1d3efdd79fd8b6e2790f6329efcda55278dff 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/postfach/PostfachNachrichtPdfService.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/postfach/PostfachNachrichtPdfService.java @@ -26,8 +26,6 @@ package de.ozgcloud.alfa.postfach; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import java.time.format.DateTimeFormatter; -import java.util.Locale; import java.util.Objects; import java.util.Optional; import java.util.stream.Stream; @@ -40,6 +38,7 @@ import org.springframework.stereotype.Service; import de.itvsh.kop.common.errorhandling.TechnicalException; import de.itvsh.kop.common.pdf.PdfService; +import de.ozgcloud.alfa.common.GermanDateTimeFormatter; import de.ozgcloud.alfa.common.user.UserManagerUrlProvider; import de.ozgcloud.alfa.common.user.UserProfile; import de.ozgcloud.alfa.postfach.PostfachMail.Direction; @@ -56,11 +55,12 @@ class PostfachNachrichtPdfService { static final String FALLBACK_ANTRAGSTELLER_NAME = "Antragsteller"; - private static final DateTimeFormatter CREATED_AT_FORMATTER = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss O").withLocale(Locale.GERMANY); - @Autowired private PdfService pdfService; + @Autowired + private GermanDateTimeFormatter germanDateTimeFormatter; + private boolean isFirstNachricht; @Value(PostfachNachrichtPdfService.PDF_TEMPLATE_PATH) @@ -111,7 +111,7 @@ class PostfachNachrichtPdfService { .isFirst(isFirstNachricht()) .subject(postfachMail.getSubject()) .mailBody(postfachMail.getMailBody()) - .createdAt(CREATED_AT_FORMATTER.format(postfachMail.getCreatedAt())) + .createdAt(germanDateTimeFormatter.formatZonedDateTime(postfachMail.getCreatedAt())) .createdBy(buildAbsenderName(postfachMail, antragsteller)) .attachments(postfachMail.getAttachmentNames()) .build(); diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/system/SystemStatusService.java b/alfa-service/src/main/java/de/ozgcloud/alfa/system/SystemStatusService.java index 2659fe7ee8dfa9ae928f6d8b4ef645454b827c38..b188e77aade4147f71521677815a9c569c6bc5d1 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/system/SystemStatusService.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/system/SystemStatusService.java @@ -43,4 +43,5 @@ public class SystemStatusService { return false; } } -} + +} \ No newline at end of file diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/EingangHeader.java b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/EingangHeader.java index 9b701e231c2108190bd93c7ac969ab7a80cc89e0..2a52a44273b9131774cdeab95bf968d1948c8678 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/EingangHeader.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/EingangHeader.java @@ -41,4 +41,5 @@ public class EingangHeader { private String customerId; private String client; private String clientId; + private String formEngineName; } diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangController.java b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangController.java index 4d20537f80561f22639956d9ec43f3c69f4cbb09..b4baa520ea36698f124cd3259fc29c8e8902aa2b 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangController.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangController.java @@ -25,7 +25,7 @@ package de.ozgcloud.alfa.vorgang; import java.util.Optional; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletResponse; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangProperties.java b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangProperties.java new file mode 100644 index 0000000000000000000000000000000000000000..b0413eb8dacc873c3cdeb3d98ba2ae1532b0302a --- /dev/null +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangProperties.java @@ -0,0 +1,36 @@ +package de.ozgcloud.alfa.vorgang; + +import java.util.Collections; +import java.util.List; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@Configuration +@ConfigurationProperties(prefix = VorgangProperties.PREFIX) +class VorgangProperties { + + public static final String PREFIX = "ozgcloud.vorgang"; + + /** + * Konfiguriert für welche Art von Anträgen der Button zur Erstellung von Bescheiden angezeigt wird. Der Art eines Antrags wird basierend auf form + * id und form engine name bestimmt. + */ + private List<VorgangProperty> bescheid = Collections.emptyList(); + + @Builder + @Setter + @Getter + static class VorgangProperty { + + private String formId; + private String formEngineName; + + } +} diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangWithEingangProzessor.java b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangWithEingangProzessor.java index 7d0a94767df5b81c01c7392cc13e4159dd9bb069..d3fcfa918b4198653bf1f71b27dad7f3d037e09e 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangWithEingangProzessor.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangWithEingangProzessor.java @@ -23,12 +23,14 @@ */ package de.ozgcloud.alfa.vorgang; +import static java.util.Optional.*; import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*; import java.util.Objects; import java.util.Optional; import java.util.function.Predicate; +import org.apache.commons.lang3.ObjectUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.Link; @@ -37,7 +39,9 @@ import org.springframework.hateoas.server.RepresentationModelProcessor; import org.springframework.stereotype.Component; import de.ozgcloud.alfa.attachment.AttachmentController; +import de.ozgcloud.alfa.common.FeatureToggleProperties; import de.ozgcloud.alfa.common.ModelBuilderFactory; +import de.ozgcloud.alfa.common.command.CommandController.CommandByRelationController; import de.ozgcloud.alfa.common.user.CurrentUserService; import de.ozgcloud.alfa.common.user.UserManagerUrlProvider; import de.ozgcloud.alfa.common.user.UserRole; @@ -45,6 +49,7 @@ import de.ozgcloud.alfa.historie.HistorieController; import de.ozgcloud.alfa.kommentar.KommentarController.KommentarByVorgangController; import de.ozgcloud.alfa.postfach.PostfachMailController; import de.ozgcloud.alfa.representation.RepresentationController; +import de.ozgcloud.alfa.vorgang.VorgangProperties.VorgangProperty; import de.ozgcloud.alfa.vorgang.forwarding.ForwardingController; @Component @@ -56,11 +61,15 @@ class VorgangWithEingangProzessor implements RepresentationModelProcessor<Entity static final LinkRelation REL_POSTFACH_MAILS = LinkRelation.of("postfachMails"); static final LinkRelation REL_VORGANG_FORWARDING = LinkRelation.of("forwarding"); static final LinkRelation REL_HISTORIE = LinkRelation.of("historie"); + static final LinkRelation REL_BESCHEID = LinkRelation.of("createBescheid"); static final String REL_SEARCH_USER = "search-user-profiles"; static final String USER_PROFILE_SEARCH_DELETED_PARAM = "deleted"; static final String USER_PROFILE_SEARCH_ORGANISATIONS_EINHEIT_ID_PARAM = "organisationsEinheitId"; + private static final Predicate<EingangHeader> HAS_FORM_ID_WITH_ENGINE_NAME = eingangHeader -> ObjectUtils + .allNotNull(eingangHeader.getFormEngineName(), eingangHeader.getFormId()); + @Autowired private PostfachMailController postfachMailController; @Autowired @@ -70,6 +79,11 @@ class VorgangWithEingangProzessor implements RepresentationModelProcessor<Entity @Autowired private UserManagerUrlProvider userManagerUrlProvider; + @Autowired + private FeatureToggleProperties featureToggleProperties; + @Autowired + private VorgangProperties vorgangProperties; + private static final Predicate<VorgangWithEingang> HAS_ATTACHMENTS = vorgangWithEingang -> vorgangWithEingang.getEingang() .getNumberOfAttachments() > 0; @@ -99,6 +113,9 @@ class VorgangWithEingangProzessor implements RepresentationModelProcessor<Entity .addLink(linkTo(methodOn(HistorieController.class).getAll(vorgang.getId())).withRel(REL_HISTORIE)) .ifMatch(() -> userManagerUrlProvider.isConfiguredForSearchUserProfile() && hasOrganisationsEinheitId(vorgang)) .addLink(() -> buildSearchUserProfilesLink(vorgang)) + .ifMatch(() -> isCreateBescheidEnabled(vorgang)) + .addLink(linkTo(methodOn(CommandByRelationController.class).createCommand(vorgang.getId(), vorgang.getId(), vorgang.getVersion(), + null)).withRel(REL_BESCHEID)) .buildModel(); } @@ -124,4 +141,24 @@ class VorgangWithEingangProzessor implements RepresentationModelProcessor<Entity private String getOrganisationsEinheitId(VorgangWithEingang vorgang) { return vorgang.getEingang().getZustaendigeStelle().getOrganisationseinheitenId(); } + + boolean isCreateBescheidEnabled(VorgangWithEingang vorgang) { + return featureToggleProperties.isCreateBescheid() && hasVorgangCreateBescheidEnabled(vorgang); + } + + boolean hasVorgangCreateBescheidEnabled(VorgangWithEingang vorgang) { + return ofNullable(vorgang.getEingang()) + .map(Eingang::getHeader) + .filter(HAS_FORM_ID_WITH_ENGINE_NAME) + .map(this::isCreateBescheidEnabled) + .orElse(false); + } + + private boolean isCreateBescheidEnabled(EingangHeader eingangHeader) { + return vorgangProperties.getBescheid().stream().filter(prop -> isFormIdAndFormEngineNameMatching(eingangHeader, prop)).count() > 0; + } + + private boolean isFormIdAndFormEngineNameMatching(EingangHeader eingangHeader, VorgangProperty prop) { + return prop.getFormId().equals(eingangHeader.getFormId()) && prop.getFormEngineName().equals(eingangHeader.getFormEngineName()); + } } \ No newline at end of file diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/command/VorgangWithEingangCommandProzessor.java b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/command/VorgangWithEingangCommandProzessor.java index cc435d9a3aa02dab51ee9977b0fb512a98c8d7a3..4cec547359805d66ef6ffb1e63f005e34c941f96 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/command/VorgangWithEingangCommandProzessor.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/command/VorgangWithEingangCommandProzessor.java @@ -33,7 +33,6 @@ import org.springframework.hateoas.LinkRelation; import org.springframework.hateoas.server.RepresentationModelProcessor; import org.springframework.stereotype.Component; -import de.ozgcloud.alfa.common.FeatureToggleProperties; import de.ozgcloud.alfa.common.ModelBuilderFactory; import de.ozgcloud.alfa.common.command.CommandController; import de.ozgcloud.alfa.common.command.CommandController.CommandByRelationController; @@ -48,7 +47,6 @@ public class VorgangWithEingangCommandProzessor implements RepresentationModelPr static final LinkRelation REL_VORGANG_FORWARD = LinkRelation.of("forward"); static final LinkRelation REL_PENDING_COMMANDS = LinkRelation.of("pending-commands"); - static final LinkRelation REL_BESCHEID = LinkRelation.of("createBescheid"); @Autowired private CurrentUserService userService; @@ -59,9 +57,6 @@ public class VorgangWithEingangCommandProzessor implements RepresentationModelPr @Autowired private ModelBuilderFactory<VorgangWithEingang> modelBuilderFactory; - @Autowired - private FeatureToggleProperties featureToggle; - @Override public EntityModel<VorgangWithEingang> process(EntityModel<VorgangWithEingang> model) { var vorgang = model.getContent(); @@ -75,9 +70,6 @@ public class VorgangWithEingangCommandProzessor implements RepresentationModelPr null)).withRel(REL_VORGANG_FORWARD)) .ifMatch(this::existsPendingCommands) .addLink(linkTo(methodOn(CommandController.class).getPendingCommands(true, vorgang.getId())).withRel(REL_PENDING_COMMANDS)) - .ifMatch(() -> featureToggle.isCreateBescheid()) - .addLink(linkTo(methodOn(CommandByRelationController.class).createCommand(vorgang.getId(), vorgang.getId(), vorgang.getVersion(), - null)).withRel(REL_BESCHEID)) .buildModel(); } diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/forwarding/ForwardingController.java b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/forwarding/ForwardingController.java index 3bdb5f803bd644ba90d4680c2bfc97e4e6650d52..6748c2b4b8a62eaf4b145fae0c37082a05ca7e07 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/forwarding/ForwardingController.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/forwarding/ForwardingController.java @@ -24,7 +24,7 @@ package de.ozgcloud.alfa.vorgang.forwarding; import java.util.List; -import java.util.stream.Collectors; +import java.util.function.Predicate; import java.util.stream.Stream; import org.springframework.beans.factory.annotation.Autowired; @@ -45,6 +45,9 @@ public class ForwardingController { static final String PARAM_VORGANG_ID = "vorgangId"; + static final Predicate<Forwarding> IS_FAILED_FORWARDING = forwarding -> forwarding.getStatus() == Status.FAILED + || forwarding.getStatus() == Status.SEND_ERROR; + @Autowired private ForwardingService service; @Autowired @@ -56,9 +59,7 @@ public class ForwardingController { } public List<Forwarding> findFailedForwardings(String vorgangId) { - return findByVorgang(vorgangId) - .filter(forwarding -> forwarding.getStatus() == Status.FAILED || forwarding.getStatus() == Status.SEND_ERROR) - .collect(Collectors.toList()); + return findByVorgang(vorgangId).filter(IS_FAILED_FORWARDING).toList(); } public Stream<Forwarding> findByVorgang(String vorgangId) { diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/forwarding/ForwardingLandesnetzInfoService.java b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/forwarding/ForwardingLandesnetzInfoService.java index 2221f8b9ccb32f3a468b398151be6722d152a568..0f011886bd0a3faf917b2119476b283b8949e5e2 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/forwarding/ForwardingLandesnetzInfoService.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/forwarding/ForwardingLandesnetzInfoService.java @@ -27,7 +27,7 @@ import java.util.Collections; import java.util.Objects; import java.util.Set; -import javax.annotation.PostConstruct; +import jakarta.annotation.PostConstruct; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/forwarding/ForwardingModelAssembler.java b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/forwarding/ForwardingModelAssembler.java index f4efb25b9dbd5a7e197af6ac832fa7f7ef1700d7..95690e00bc8ec35baea0aff9f99f85540de0d322 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/forwarding/ForwardingModelAssembler.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/forwarding/ForwardingModelAssembler.java @@ -25,7 +25,7 @@ package de.ozgcloud.alfa.vorgang.forwarding; import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*; -import java.util.stream.Collectors; +import java.util.function.Predicate; import java.util.stream.Stream; import org.springframework.hateoas.CollectionModel; @@ -50,28 +50,34 @@ class ForwardingModelAssembler implements RepresentationModelAssembler<Forwardin static final LinkRelation REL_ERROR = LinkRelation.of("error"); + static final Predicate<Forwarding> IS_SENT = forwarding -> forwarding.getStatus() == Status.SENT; + static final Predicate<Forwarding> IS_SUCCESSFULL = forwarding -> forwarding.getStatus() == Status.SUCCESSFULL; + static final Predicate<Forwarding> IS_SENT_OR_SUCCESSFULL = forwarding -> forwarding.getStatus() == Status.SENT + || forwarding.getStatus() == Status.SUCCESSFULL; + static final Predicate<Forwarding> IS_FAILED = forwarding -> forwarding.getStatus() == Status.FAILED; + static final Predicate<Forwarding> IS_SEND_ERROR = forwarding -> forwarding.getStatus() == Status.SEND_ERROR; + @Override public EntityModel<Forwarding> toModel(Forwarding entity) { var selfLink = linkTo(ForwardingController.class).slash(entity.getId()); return ModelBuilder.fromEntity(entity) .addLink(linkTo(ForwardingController.class).slash(entity.getId()).withSelfRel()) - .ifMatch(forwarding -> forwarding.getStatus() == Status.SENT) + .ifMatch(IS_SENT) .addLinks(buildMarkAsSuccessLink(entity)) - .ifMatch(forwarding -> forwarding.getStatus() == Status.SENT || forwarding.getStatus() == Status.SUCCESSFULL) + .ifMatch(IS_SENT_OR_SUCCESSFULL) .addLinks(buildMarkAsFailLink(entity)) - .ifMatch(forwarding -> forwarding.getStatus() == Status.FAILED) + .ifMatch(IS_FAILED) .addLink(selfLink.withRel(REL_FAILED)) - .ifMatch(forwarding -> forwarding.getStatus() == Status.SUCCESSFULL) + .ifMatch(IS_SUCCESSFULL) .addLink(selfLink.withRel(REL_SUCCESSFULL)) - .ifMatch(forwarding -> forwarding.getStatus() == Status.SEND_ERROR) + .ifMatch(IS_SEND_ERROR) .addLink(selfLink.withRel(REL_ERROR)) .buildModel(); } public CollectionModel<EntityModel<Forwarding>> toCollectionModel(Stream<Forwarding> entities) { - return CollectionModel.of(entities.map(this::toModel).collect(Collectors.toList()), - linkTo(ForwardingController.class).withSelfRel()); + return CollectionModel.of(entities.map(this::toModel).toList(), linkTo(ForwardingController.class).withSelfRel()); } public Link buildMarkAsSuccessLink(Forwarding forwarding) { diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/forwarding/ForwardingPasswordSizeConstraint.java b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/forwarding/ForwardingPasswordSizeConstraint.java index 7a09abea36f1a4233b26f4487885a884b56dbc26..5910b2d2754dead2289ec19ea5869df79d28ea31 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/forwarding/ForwardingPasswordSizeConstraint.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/forwarding/ForwardingPasswordSizeConstraint.java @@ -30,8 +30,8 @@ import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.Target; -import javax.validation.Constraint; -import javax.validation.Payload; +import jakarta.validation.Constraint; +import jakarta.validation.Payload; import de.ozgcloud.alfa.common.ValidationMessageCodes; diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/forwarding/ForwardingPasswordValidator.java b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/forwarding/ForwardingPasswordValidator.java index 30ee0e6cb971cd815b9ab4aeba9a626cfe2572c9..38ffb406bb2bd60125442acfb55734510a99fd2e 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/forwarding/ForwardingPasswordValidator.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/forwarding/ForwardingPasswordValidator.java @@ -23,8 +23,8 @@ */ package de.ozgcloud.alfa.vorgang.forwarding; -import javax.validation.ConstraintValidator; -import javax.validation.ConstraintValidatorContext; +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/forwarding/RedirectRequest.java b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/forwarding/RedirectRequest.java index 832f4b088c63a02a1f7d8a3eb5a10ad1a0489d1a..8ffde941d1a0a2f2747f5eace6246448131c43b0 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/forwarding/RedirectRequest.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/forwarding/RedirectRequest.java @@ -25,8 +25,8 @@ package de.ozgcloud.alfa.vorgang.forwarding; import static de.ozgcloud.alfa.common.ValidationMessageCodes.*; -import javax.validation.constraints.Email; -import javax.validation.constraints.NotEmpty; +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotEmpty; import org.springframework.validation.annotation.Validated; diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/wiedervorlage/Wiedervorlage.java b/alfa-service/src/main/java/de/ozgcloud/alfa/wiedervorlage/Wiedervorlage.java index bcb6b368af74344e0d18efe48f7bdb20a12cb6e3..08871f86e4d81489b0589e0caba54435c6a6f263 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/wiedervorlage/Wiedervorlage.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/wiedervorlage/Wiedervorlage.java @@ -29,9 +29,9 @@ import java.time.LocalDate; import java.time.ZonedDateTime; import java.util.List; -import javax.validation.constraints.FutureOrPresent; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; +import jakarta.validation.constraints.FutureOrPresent; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageCommand.java b/alfa-service/src/main/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageCommand.java index f44964506366e8a82b60939dd1493db4393b0d79..398f2b6e0905fa5bcae4d27cc9a0703ab569a0dc 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageCommand.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageCommand.java @@ -23,7 +23,7 @@ */ package de.ozgcloud.alfa.wiedervorlage; -import javax.validation.Valid; +import jakarta.validation.Valid; import com.fasterxml.jackson.annotation.JsonIgnore; diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageService.java b/alfa-service/src/main/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageService.java index 9c496fa1f0b95ab94b73be62dec0d9a05a5f3fe2..660aeefbe8e6a5d1425fd04d4d3b9cedee1a6e8a 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageService.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageService.java @@ -31,7 +31,7 @@ import java.util.Optional; import java.util.function.Predicate; import java.util.stream.Stream; -import javax.validation.Valid; +import jakarta.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Async; diff --git a/alfa-service/src/main/resources/fop/postfach-nachrichten.xsl b/alfa-service/src/main/resources/fop/postfach-nachrichten.xsl index b030aacd5e9d4f8127ce23fe7a65b7cf5402da04..7442f94c340789ee9a8929ce29d935df370fcac8 100644 --- a/alfa-service/src/main/resources/fop/postfach-nachrichten.xsl +++ b/alfa-service/src/main/resources/fop/postfach-nachrichten.xsl @@ -75,7 +75,7 @@ <xsl:template name="nachricht"> - <fo:block font-size="11pt" margin-bottom="2mm"> + <fo:block font-size="11pt" margin-bottom="2mm" linefeed-treatment="preserve"> <xsl:if test="isFirst='false'"> <fo:leader leader-pattern="rule" leader-length="175mm" rule-style="solid" rule-thickness="1pt"/> </xsl:if> diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/EnvironmentControllerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/EnvironmentControllerTest.java index 145d1e512f80ce0538074b74fde6272c7269e12a..7ef79567ddc28f389673dc545eab8832d6f26916 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/EnvironmentControllerTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/EnvironmentControllerTest.java @@ -29,12 +29,14 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.keycloak.adapters.springboot.KeycloakSpringBootProperties; import org.mockito.InjectMocks; import org.mockito.Mock; import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.ResultActions; import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import lombok.SneakyThrows; + class EnvironmentControllerTest { private final String PATH = "/api/environment"; @@ -42,7 +44,7 @@ class EnvironmentControllerTest { @InjectMocks private EnvironmentController controller; @Mock - private KeycloakSpringBootProperties kcProperties; + private OAuth2Properties oAuth2Properties; private MockMvc mockMvc; @@ -52,22 +54,30 @@ class EnvironmentControllerTest { } @Test - void loadEnvironment() throws Exception { - mockMvc.perform(get(PATH)).andExpect(status().isOk()); + void shouldReturnOk() throws Exception { + var response = doRequest(); + + response.andExpect(status().isOk()); } @Test void shouldHaveProductionTrueAsDefault() throws Exception { - mockMvc.perform(get(PATH)).andExpect(status().is2xxSuccessful())// - .andExpect(jsonPath("$.production").value(true)); + var response = doRequest(); + + response.andExpect(jsonPath("$.production").value(true)); } @Test void shouldHaveClientId() throws Exception { var client = "goofy"; + when(oAuth2Properties.getResource()).thenReturn(client); + var response = doRequest(); - when(kcProperties.getResource()).thenReturn(client); + response.andExpect(jsonPath("$.clientId").value(client)); + } - mockMvc.perform(get(PATH)).andExpect(jsonPath("$.clientId").value(client)); + @SneakyThrows + private ResultActions doRequest() { + return mockMvc.perform(get(PATH)); } } \ No newline at end of file diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/JwtAuthConverterTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/JwtAuthConverterTest.java new file mode 100644 index 0000000000000000000000000000000000000000..273deca7fae29bbefd8ffaa6f9f1aec98e7a56af --- /dev/null +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/JwtAuthConverterTest.java @@ -0,0 +1,232 @@ +package de.ozgcloud.alfa; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.*; + +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import org.apache.commons.lang3.StringUtils; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Spy; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.oauth2.jwt.Jwt; +import org.springframework.security.oauth2.jwt.JwtClaimNames; +import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken; + +import com.thedeanda.lorem.LoremIpsum; + +class JwtAuthConverterTest { + + @Spy + @InjectMocks + private final JwtAuthConverter converter = new JwtAuthConverter(); + @Mock + private OAuth2Properties oAuth2Properties; + + @DisplayName("Convert") + @Nested + class TestConvert { + + @Mock + private Jwt jwt; + + @BeforeEach + void mock() { + doReturn(StringUtils.EMPTY).when(converter).getPrincipleClaimName(any()); + doReturn(Collections.emptySet()).when(converter).getAuthorities(any()); + } + + @Test + void shouldGetAuthrorities() { + converter.convert(jwt); + + verify(converter).getAuthorities(jwt); + } + + @Test + void shouldGetPrincipleClaimName() { + converter.convert(jwt); + + verify(converter).getPrincipleClaimName(jwt); + } + + @Test + void shouldReturnJwtAuthenticationToken() { + var token = converter.convert(jwt); + + assertThat(token).isInstanceOf(JwtAuthenticationToken.class); + } + } + + @DisplayName("Get principle claim name") + @Nested + class TestGetPrincipleClaimName { + + private final String subClaimValue = LoremIpsum.getInstance().getWords(1); + private final String principleClaimKey = LoremIpsum.getInstance().getWords(1); + private final String principleClaimValue = LoremIpsum.getInstance().getWords(1); + private final Map<String, Object> claimMap = Map.of(JwtClaimNames.SUB, subClaimValue, principleClaimKey, principleClaimValue); + private final Jwt jwt = JwtTestFactory.create(claimMap); + + @DisplayName("if principle attribute is set") + @Nested + class TestIfPrincipleAttributeIsSet { + + @BeforeEach + void mock() { + when(oAuth2Properties.getPrincipleAttribute()).thenReturn(null); + } + + @Test + void shouleReturnPrincipleAttributeClaimValue() { + var principleClaimName = converter.getPrincipleClaimName(jwt); + + assertThat(principleClaimName).isEqualTo(subClaimValue); + } + } + + @DisplayName("if principle attribute is not set") + @Nested + class TestIfPrincipleAttributeNotSet { + + @BeforeEach + void mock() { + when(oAuth2Properties.getPrincipleAttribute()).thenReturn(principleClaimKey); + } + + @Test + void shouldReturnSubClaimValue() { + var principleClaimName = converter.getPrincipleClaimName(jwt); + + assertThat(principleClaimName).isEqualTo(principleClaimValue); + } + } + } + + @DisplayName("Get authorities") + @Nested + class TestGetAuthorities { + + private final static String SCOPE_CLAIM_KEY = "scope"; + private final static String SCOPE_CLAIM_VALUE = "dummyClaimValue"; + private final Jwt jwt = JwtTestFactory.create(Map.of(SCOPE_CLAIM_KEY, SCOPE_CLAIM_VALUE)); + + @BeforeEach + void mock() { + doReturn(Collections.emptyList()).when(converter).extractResourceRoles(any()); + } + + @Test + void shouldConvertJwt() { + var authorities = converter.getAuthorities(jwt); + + assertThat(authorities).extracting(GrantedAuthority::toString) + .contains(String.format("%s_%s", SCOPE_CLAIM_KEY.toUpperCase(), SCOPE_CLAIM_VALUE)); + } + + @Test + void shouldExtractRoles() { + converter.getAuthorities(jwt); + + verify(converter).extractResourceRoles(jwt); + } + } + + @DisplayName("Extract resource roles") + @Nested + class TestExtractResourceRoles { + + private final Map<String, Object> claimsMap = Map.of(JwtAuthConverter.RESOURCE_ACCESS_KEY, Map.of("dummyKey", "dummyValue")); + private final Jwt jwt = JwtTestFactory.create(claimsMap); + + @Test + void shouldReturnEmptySetOnMissingResourceAccess() { + var claimsMap = Map.<String, Object>of(JwtAuthConverter.RESOURCE_ACCESS_KEY, Collections.emptyMap()); + var jwt = JwtTestFactory.create(claimsMap); + + var resourceRoles = converter.extractResourceRoles(jwt); + + assertThat(resourceRoles).isEmpty(); + } + + @DisplayName("on existing resource access") + @Nested + class TestOnExistingResourceAccess { + + @Test + void shouldCallProperties() { + converter.extractResourceRoles(jwt); + + verify(oAuth2Properties).getResource(); + } + + @Test + void shouldReturnEmptySetOnMissingResourceId() { + when(oAuth2Properties.getResource()).thenReturn(null); + + var resourceRoles = converter.extractResourceRoles(jwt); + + assertThat(resourceRoles).isEmpty(); + } + + @DisplayName("and existing resourceId") + @Nested + class TestAndExistingResourceId { + + private final static String RESOURCE_ID = "dummyResourceId"; + private final Map<String, Object> authoritiesMap = Map.of(JwtAuthConverter.RESOURCE_ACCESS_KEY, + Map.of(RESOURCE_ID, Collections.emptyMap())); + private final Jwt jwt = JwtTestFactory.create(authoritiesMap); + + @BeforeEach + void mock() { + doReturn(Collections.emptySet()).when(converter).extractRoles(any()); + when(oAuth2Properties.getResource()).thenReturn(RESOURCE_ID); + } + + @Test + void shouldExtractRoles() { + converter.extractResourceRoles(jwt); + + verify(converter).extractRoles(any()); + } + } + + } + } + + @DisplayName("Extract roles") + @Nested + class TestExtractRoles { + + @Test + void shouldReturnMappedRoleIfRolesExist() { + var authorities = converter.extractRoles(Map.of(JwtAuthConverter.ROLES_KEY, List.of("dummy"))); + + assertThat(authorities).extracting(SimpleGrantedAuthority::toString).containsExactly("ROLE_dummy"); + } + + @Test + void shouldReturnEmptySetIfNoRoleExists() { + var authorities = converter.extractRoles(Map.of(JwtAuthConverter.ROLES_KEY, Collections.emptyList())); + + assertThat(authorities).isEmpty(); + } + + @Test + void shouldReturnEmptySetIfRolesEntryNotExists() { + var authorities = converter.extractRoles(Collections.emptyMap()); + + assertThat(authorities).isEmpty(); + } + } +} diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/JwtTestFactory.java b/alfa-service/src/test/java/de/ozgcloud/alfa/JwtTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..b3f4ea31829b65c243d3349c2837fe29a3b18aa0 --- /dev/null +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/JwtTestFactory.java @@ -0,0 +1,23 @@ +package de.ozgcloud.alfa; + +import java.time.Instant; +import java.util.Map; + +import org.springframework.security.oauth2.jwt.Jwt; + +import com.thedeanda.lorem.LoremIpsum; + +public class JwtTestFactory { + + public static final String TOKEN_VALUE = LoremIpsum.getInstance().getWords(1); + private static final Instant ISSUE_AT = Instant.now(); + private static final Instant EXPIRES_AT = Instant.now(); + + public static final String DUMMY_HEADER_KEY = "dummyHeaderKey"; + private static final String DUMMY_HEADER_VALUE = "dummyHeaderValue"; + private static final Map<String, Object> HEADERS = Map.of(DUMMY_HEADER_KEY, DUMMY_HEADER_VALUE); + + public static Jwt create(Map<String, Object> claims) { + return new Jwt(TOKEN_VALUE, ISSUE_AT, EXPIRES_AT, HEADERS, claims); + } +} diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/JwtTokenUtilTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/JwtTokenUtilTest.java index b9105b305f4a32c1ff3820116743cd3a478903ce..3f1cec61922fc4b62939c88a165ad734fe72a023 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/JwtTokenUtilTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/JwtTokenUtilTest.java @@ -59,7 +59,7 @@ class JwtTokenUtilTest { @Mock private DownloadTokenProperties downloadTokenProperties; - private static final String TOKEN_SECRET = "t0pS3cr3t"; + private static final String TOKEN_SECRET = "t0pS3cr3t".repeat(8); private static final int TOKEN_VALIDITY = 60000; @BeforeEach @@ -121,7 +121,7 @@ class JwtTokenUtilTest { @Test void shouldThrowExceptionOnInvalidToken() { - var token = buildToken(UUID.randomUUID().toString(), "invalid_token", TOKEN_VALIDITY); + var token = buildToken(UUID.randomUUID().toString(), "invalid_token".repeat(5), TOKEN_VALIDITY); assertThrows(JWTVerificationException.class, () -> jwtTokenUtil.verifyToken(token)); } diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/RequestIdFilterTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/RequestIdFilterTest.java index bfaf794ff0962158e404c7af8d1f89720bc384a4..fbcb5735ea29412d836659128ecbcb8505f35fa5 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/RequestIdFilterTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/RequestIdFilterTest.java @@ -29,10 +29,10 @@ import static org.mockito.Mockito.*; import java.io.IOException; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/TestSecurityConfiguration.java b/alfa-service/src/test/java/de/ozgcloud/alfa/TestSecurityConfiguration.java deleted file mode 100644 index 9ea7dbf43b0ffb08b194e501e39bdd26da99d539..0000000000000000000000000000000000000000 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/TestSecurityConfiguration.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * 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.ozgcloud.alfa; - -import org.springframework.context.annotation.Configuration; -import org.springframework.core.annotation.Order; -import org.springframework.security.config.annotation.web.WebSecurityConfigurer; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.builders.WebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; - -@Configuration -@Order(50) -public class TestSecurityConfiguration extends WebSecurityConfigurerAdapter implements WebSecurityConfigurer<WebSecurity> { - - @Override - protected void configure(HttpSecurity http) throws Exception { - super.configure(http); - - http.csrf().disable(); - } -} diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/attachment/AttachmentMapperTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/attachment/AttachmentMapperTest.java index edbb0974441a4e7cd7e7cb6195e99ba967be05a6..52a761ef966ccc1fd29f2340975353fb0bc063f6 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/attachment/AttachmentMapperTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/attachment/AttachmentMapperTest.java @@ -1,26 +1,33 @@ package de.ozgcloud.alfa.attachment; -import org.assertj.core.api.Assertions; +import static org.assertj.core.api.Assertions.*; + import org.junit.jupiter.api.Test; import com.google.common.collect.Lists; import de.ozgcloud.alfa.common.binaryfile.FileId; -public class AttachmentMapperTest { +class AttachmentMapperTest { @Test void shouldMapAttachmentsToEmptyList() { - Assertions.assertThat(AttachmentMapper.mapAttachments(null)).isEmpty(); + var attachments = AttachmentMapper.mapAttachments(null); + + assertThat(attachments).isEmpty(); } @Test void shouldMapAttachmentsToList() { - Assertions.assertThat(AttachmentMapper.mapAttachments(Lists.newArrayList("a1", "a2"))).containsExactly(FileId.from("a1"), FileId.from("a2")); + var attachments = AttachmentMapper.mapAttachments(Lists.newArrayList("a1", "a2")); + + assertThat(attachments).containsExactly(FileId.from("a1"), FileId.from("a2")); } @Test void shouldMapOneElementToList() { - Assertions.assertThat(AttachmentMapper.mapAttachments("a1")).containsExactly(FileId.from("a1")); + var attachments = AttachmentMapper.mapAttachments("a1"); + + assertThat(attachments).containsExactly(FileId.from("a1")); } } diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/GermanDateTimeFormatterTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/GermanDateTimeFormatterTest.java new file mode 100644 index 0000000000000000000000000000000000000000..0c4b738d8cefe6f0d736c870827df8c44d7d6ded --- /dev/null +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/GermanDateTimeFormatterTest.java @@ -0,0 +1,70 @@ +/* + * 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.ozgcloud.alfa.common; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; + +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.util.stream.Stream; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.InjectMocks; +import org.mockito.Mock; + +class GermanDateTimeFormatterTest { + + @Mock + private SystemProperties properties; + + @InjectMocks + private GermanDateTimeFormatter germanDateTimeFormatter; + + @ParameterizedTest + @MethodSource("provideDataForFormatZonedDateTime") + void shouldFormatZonedDateTime(ZonedDateTime date, String zoneId, String expected) { + when(properties.getTimeZone()).thenReturn(ZoneId.of(zoneId)); + + assertThat(germanDateTimeFormatter.formatZonedDateTime(date)).isEqualTo(expected); + } + + private static Stream<Arguments> provideDataForFormatZonedDateTime() { + return Stream.of( + Arguments.of(zonedDateTime(2023, 9, 25, 10, "UTC"), "Europe/Berlin", "25.09.2023 12:00:00 MESZ"), + Arguments.of(zonedDateTime(2023, 9, 25, 23, "UTC"), "Europe/Berlin", "26.09.2023 01:00:00 MESZ"), + Arguments.of(zonedDateTime(2023, 12, 1, 10, "UTC"), "Europe/Berlin", "01.12.2023 11:00:00 MEZ"), + Arguments.of(zonedDateTime(2023, 9, 25, 10, "UTC"), "America/Los_Angeles", "25.09.2023 03:00:00 PDT"), + Arguments.of(zonedDateTime(2023, 9, 25, 4, "UTC"), "America/Los_Angeles", "24.09.2023 21:00:00 PDT"), + Arguments.of(zonedDateTime(2023, 12, 1, 10, "UTC"), "America/Los_Angeles", "01.12.2023 02:00:00 PST"), + Arguments.of(zonedDateTime(2023, 12, 1, 10, "America/Los_Angeles"), "Europe/Berlin", "01.12.2023 19:00:00 MEZ") + ); + } + + private static ZonedDateTime zonedDateTime(int year, int month, int dayOfMonth, int hour, String zoneID) { + return ZonedDateTime.of(year, month, dayOfMonth, hour, 0, 0, 0, ZoneId.of(zoneID)); + } +} diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/binaryfile/BinaryFileControllerITCase.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/binaryfile/BinaryFileControllerITCase.java index e3a8457b6e01b8680b547ed55596152657b3afa6..b83901c79d420a68c3ebd4741782e0f22b0c7a36 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/binaryfile/BinaryFileControllerITCase.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/binaryfile/BinaryFileControllerITCase.java @@ -26,6 +26,7 @@ package de.ozgcloud.alfa.common.binaryfile; import static de.ozgcloud.alfa.JwtTokenUtil.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; @@ -112,7 +113,8 @@ class BinaryFileControllerITCase { } void setTokenToSecuriyContext(String token) throws Exception { - mockMvc.perform(get(DownloadTokenController.DOWNLOAD_TOKEN_PATH + "?" + DownloadTokenController.PARAM_TOKEN + "=" + token)) + mockMvc.perform(get(DownloadTokenController.DOWNLOAD_TOKEN_PATH + "?" + DownloadTokenController.PARAM_TOKEN + "=" + token) + .with(csrf())) .andExpect(status().isOk()); } } @@ -130,10 +132,10 @@ class BinaryFileControllerITCase { } @Test - void shouldGet401WhenUnautorised() throws Exception { + void shouldGet403WhenUnautorised() throws Exception { when(authentication.isAuthenticated()).thenReturn(Boolean.FALSE); - performRequest().andExpect(status().isUnauthorized()); + performRequest().andExpect(status().isForbidden()); } @Test @@ -145,7 +147,7 @@ class BinaryFileControllerITCase { } ResultActions performRequest() throws Exception { - return mockMvc.perform(get(BinaryFileController.PATH + "/" + fileId.toString())); + return mockMvc.perform(get(BinaryFileController.PATH + "/" + fileId.toString()).with(csrf())); } } diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/binaryfile/BinaryFileITCase.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/binaryfile/BinaryFileITCase.java index 5d090e6c206eb25921d3bec103a9da73aa23eb3c..6a10133bb7a092eeae2289d4fe9002a4f608820c 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/binaryfile/BinaryFileITCase.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/binaryfile/BinaryFileITCase.java @@ -25,6 +25,7 @@ package de.ozgcloud.alfa.common.binaryfile; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; @@ -116,7 +117,7 @@ class BinaryFileITCase { } private ResultActions callEndpoint(MockMultipartFile file, String field) throws Exception { - return mockMvc.perform(multipart(SINGLE_PATH, VorgangHeaderTestFactory.ID, field).file(file)); + return mockMvc.perform(multipart(SINGLE_PATH, VorgangHeaderTestFactory.ID, field).file(file).with(csrf())); } } } \ No newline at end of file diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/binaryfile/DownloadAuthenticationHandlerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/binaryfile/DownloadAuthenticationHandlerTest.java index 155ac009c8fc0b9604f993dd188a71fde2ed1355..d9cc748ca8211b95706ca0ad8af73fea013a1693 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/binaryfile/DownloadAuthenticationHandlerTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/binaryfile/DownloadAuthenticationHandlerTest.java @@ -29,9 +29,10 @@ 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.keycloak.adapters.springsecurity.token.KeycloakAuthenticationToken; +import org.mockito.Mock; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; +import org.springframework.security.oauth2.jwt.Jwt; class DownloadAuthenticationHandlerTest { @@ -40,18 +41,22 @@ class DownloadAuthenticationHandlerTest { @Nested class TestAuthorizationKeycloak { + @Mock + private Jwt jwt; + private Authentication authentication = mock(Authentication.class); @BeforeEach void init() { when(authentication.isAuthenticated()).thenReturn(Boolean.TRUE); - KeycloakAuthenticationToken keycloakToken = mock(KeycloakAuthenticationToken.class); - when(authentication.getPrincipal()).thenReturn(keycloakToken); + when(authentication.getPrincipal()).thenReturn(jwt); } @Test void shouldAuthenticate() { - assertThat(downloadAuthorizationHandler.check(FileId.createNew(), authentication)).isTrue(); + var check = downloadAuthorizationHandler.check(FileId.createNew(), authentication); + + assertThat(check).isTrue(); } } @@ -69,23 +74,32 @@ class DownloadAuthenticationHandlerTest { @Test void shouldAuthenticate() { - assertThat(downloadAuthorizationHandler.check(fileId, authentication)).isTrue(); + var check = downloadAuthorizationHandler.check(fileId, authentication); + + assertThat(check).isTrue(); } @Test void shouldNotAuthenticateWrongFileId() { - assertThat(downloadAuthorizationHandler.check(FileId.createNew(), authentication)).isFalse(); + var check = downloadAuthorizationHandler.check(FileId.createNew(), authentication); + + assertThat(check).isFalse(); } @Test void shouldNotAuthenticateNoFileId() { - assertThat(downloadAuthorizationHandler.check(null, authentication)).isFalse(); + var check = downloadAuthorizationHandler.check(null, authentication); + + assertThat(check).isFalse(); } @Test void shouldNotAuthenticate() { when(authentication.isAuthenticated()).thenReturn(Boolean.FALSE); - assertThat(downloadAuthorizationHandler.check(fileId, authentication)).isFalse(); + + var check = downloadAuthorizationHandler.check(fileId, authentication); + + assertThat(check).isFalse(); } } } diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/binaryfile/UploadBinaryFileSizeValidatorTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/binaryfile/UploadBinaryFileSizeValidatorTest.java index 4ffb8a1e0758d81027e2160f48c8617b3d187a75..ad74b10d3b54551e3cf1171d5e1093f1148957e1 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/binaryfile/UploadBinaryFileSizeValidatorTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/binaryfile/UploadBinaryFileSizeValidatorTest.java @@ -30,7 +30,7 @@ import static org.mockito.Mockito.*; import java.util.Collections; import java.util.Map; -import javax.validation.ConstraintValidatorContext; +import jakarta.validation.ConstraintValidatorContext; import org.hibernate.validator.constraintvalidation.HibernateConstraintValidatorContext; import org.junit.jupiter.api.BeforeEach; diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/CommandITCase.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/CommandITCase.java index 6720703ad4c10512df430355ae65a52841d97e7e..301aa043ce57a76ace03a859b7e79b7c3be90f8a 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/CommandITCase.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/CommandITCase.java @@ -26,6 +26,7 @@ package de.ozgcloud.alfa.common.command; import static org.assertj.core.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; @@ -88,7 +89,7 @@ public class CommandITCase { } private void createCommand() throws Exception { - mockMvc.perform(post(buildUrl()).content(createContent()).contentType(MediaType.APPLICATION_JSON)) + mockMvc.perform(post(buildUrl()).with(csrf()).content(createContent()).contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isCreated()); } @@ -298,6 +299,7 @@ public class CommandITCase { ResultActions doRequest(String content) throws Exception { return mockMvc.perform(post("/api/vorgangs/" + CommandTestFactory.VORGANG_ID + "/relations/" + CommandTestFactory.RELATION_ID + "/" + CommandTestFactory.RELATION_VERSION + "/commands") + .with(csrf()) .contentType(MediaType.APPLICATION_JSON) .content(content)); } diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/RequiredOrderValidatorTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/RequiredOrderValidatorTest.java index 58c1d44963fd8fa89d42943b42b601ae900550b5..6319e02a44ff12556ba1c5be98143fb13476d430 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/RequiredOrderValidatorTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/RequiredOrderValidatorTest.java @@ -3,7 +3,7 @@ package de.ozgcloud.alfa.common.command; import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; -import javax.validation.ConstraintValidatorContext; +import jakarta.validation.ConstraintValidatorContext; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/downloadtoken/DownloadTokenAuthenticationFilterITCase.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/downloadtoken/DownloadTokenAuthenticationFilterITCase.java index d4754cd7b9f14b02c81f64b645509b9404e9f8d2..d2647b285fc74570cee9c0448eae40b7c37f13ab 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/downloadtoken/DownloadTokenAuthenticationFilterITCase.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/downloadtoken/DownloadTokenAuthenticationFilterITCase.java @@ -81,7 +81,7 @@ class DownloadTokenAuthenticationFilterITCase { @Test void shouldReturnUnauthorised() throws Exception { - String token = DownloadTokenTestFactory.createToken("badSecret", downloadTokenProperties.getValidity()); + String token = DownloadTokenTestFactory.createToken("badSecret".repeat(8), downloadTokenProperties.getValidity()); performRequest(DownloadTokenController.DOWNLOAD_TOKEN_PATH + "?" + DownloadTokenController.PARAM_TOKEN + "=" + token) .andExpect(status().isUnauthorized()); diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/downloadtoken/DownloadTokenAuthenticationFilterTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/downloadtoken/DownloadTokenAuthenticationFilterTest.java index 4a8a712a21b6fad31ecd2a78ca3b68042946ed02..1d3e7c76ea1c13c1364338baf4d0839c39b7c223 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/downloadtoken/DownloadTokenAuthenticationFilterTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/downloadtoken/DownloadTokenAuthenticationFilterTest.java @@ -29,10 +29,10 @@ import static org.mockito.Mockito.*; import java.io.IOException; import java.util.UUID; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/downloadtoken/DownloadTokenServiceTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/downloadtoken/DownloadTokenServiceTest.java index b8fa3484dac7c506414fc628c6682dffdddef280..24bf8ab7f626e0e52f8d6a89b164e3dccb2e7934 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/downloadtoken/DownloadTokenServiceTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/downloadtoken/DownloadTokenServiceTest.java @@ -33,8 +33,8 @@ import java.util.Collection; import java.util.List; import java.util.Optional; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/errorhandling/ExceptionControllerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/errorhandling/ExceptionControllerTest.java index 376bfbc299b60769cfe5231ce72b01ef67133d79..53fcd7d7e86047df2a8a4450c903de8c652bcb19 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/errorhandling/ExceptionControllerTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/errorhandling/ExceptionControllerTest.java @@ -29,7 +29,7 @@ import static org.mockito.Mockito.*; import java.util.Collections; import java.util.Map; -import javax.validation.ConstraintViolationException; +import jakarta.validation.ConstraintViolationException; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/errorhandling/ExceptionTestFactory.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/errorhandling/ExceptionTestFactory.java index 3f3af3bc7782ad9930753a12d7ab7c3a6d6c52e1..d96c42787390b1b99df6bd412efce278c3dd7335 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/errorhandling/ExceptionTestFactory.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/errorhandling/ExceptionTestFactory.java @@ -29,9 +29,9 @@ import static org.mockito.Mockito.*; import java.util.Map; import java.util.UUID; -import javax.validation.ConstraintViolation; -import javax.validation.Path; -import javax.validation.metadata.ConstraintDescriptor; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Path; +import jakarta.validation.metadata.ConstraintDescriptor; import org.hibernate.validator.engine.HibernateConstraintViolation; diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/user/CurrentUserHelperTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/user/CurrentUserHelperTest.java new file mode 100644 index 0000000000000000000000000000000000000000..c3ceac882e23c0f86a8dfb20d11131808060ab4a --- /dev/null +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/user/CurrentUserHelperTest.java @@ -0,0 +1,40 @@ +package de.ozgcloud.alfa.common.user; + +import static org.assertj.core.api.Assertions.*; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +class CurrentUserHelperTest { + + @DisplayName("Prepare role for check") + @Nested + class TestPrepareRoleForCheck { + + @Test + void shouldAddPrefixIfMissing() { + var roleWithoutPrefix = UserRole.VERWALTUNG_USER; + + var role = CurrentUserHelper.prepareRoleForCheck(roleWithoutPrefix); + + assertThat(role).isEqualTo(String.format("%s%s", CurrentUserHelper.ROLE_PREFIX, UserRole.VERWALTUNG_USER)); + } + + @Test + void shouldReturnRoleIfPrefixAlreadyExists() { + var roleWithPrefix = String.format("ROLE_%s", UserRole.VERWALTUNG_USER); + + var role = CurrentUserHelper.prepareRoleForCheck(roleWithPrefix); + + assertThat(role).isEqualTo(roleWithPrefix); + } + + @Test + void shouldReturnPassingRoleIfNonNull() { + var role = CurrentUserHelper.prepareRoleForCheck(null); + + assertThat(role).isNull(); + } + } +} diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/user/CurrentUserServiceTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/user/CurrentUserServiceTest.java index f22c42b6cb253d3b2a1956e9f741d1aaa7c6a076..e363dc185c06592f6e7e11e35f25c131bd6a83d6 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/user/CurrentUserServiceTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/user/CurrentUserServiceTest.java @@ -32,10 +32,14 @@ import java.util.List; import java.util.Map; import java.util.Optional; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; -import org.keycloak.representations.AccessToken; +import org.mockito.Mock; import org.mockito.Spy; +import org.springframework.security.oauth2.jwt.Jwt; + +import de.ozgcloud.alfa.JwtTestFactory; class CurrentUserServiceTest { @@ -45,34 +49,39 @@ class CurrentUserServiceTest { @Nested class TestGetOrganisationseinheit { + @Mock + private Jwt jwt; + @Test void shouldReturnOrganisationseinheitIdsFromMap() { - Map<String, Object> claims = Map.of(CurrentUserService.USER_ATTRIBUTE_ORGANISATIONSEINHEIT_ID, List.of("1", "2")); + when(jwt.getClaim(CurrentUserService.USER_ATTRIBUTE_ORGANISATIONSEINHEIT_ID)).thenReturn(List.of("1", "2")); - var result = service.getOrganisationseinheitId(claims); + var result = service.getOrganisationsEinheitIds(jwt); - assertThat(result).contains("1").contains("2"); + assertThat(result).containsExactly("1", "2"); } @Test void shouldReturnOrgaIdAsString() { - var result = service.getOrganisationseinheitId(Map.of(CurrentUserService.USER_ATTRIBUTE_ORGANISATIONSEINHEIT_ID, List.of("1", 2))); + when(jwt.getClaim(CurrentUserService.USER_ATTRIBUTE_ORGANISATIONSEINHEIT_ID)).thenReturn(List.of("1", 2)); + + var result = service.getOrganisationsEinheitIds(jwt); - assertThat(result).contains("1").contains("2"); + assertThat(result).containsExactly("1", "2"); } @Test void shouldReturnEmptyList() { - Map<String, Object> claims = Map.of(CurrentUserService.USER_ATTRIBUTE_ORGANISATIONSEINHEIT_ID, Collections.emptyList()); + when(jwt.getClaim(CurrentUserService.USER_ATTRIBUTE_ORGANISATIONSEINHEIT_ID)).thenReturn(Collections.emptyList()); - var result = service.getOrganisationseinheitId(claims); + var result = service.getOrganisationsEinheitIds(jwt); assertThat(result).isEmpty(); } @Test void shouldReturnEmptyListIfNotExists() { - var result = service.getOrganisationseinheitId(Collections.emptyMap()); + var result = service.getOrganisationsEinheitIds(null); assertThat(result).isEmpty(); } @@ -80,6 +89,7 @@ class CurrentUserServiceTest { @Nested class TestGetUserId { + @Test void shouldReturnValueFromClaim() { doReturn(Optional.of(UserProfileTestFactory.ID.toString())).when(service).getSingleClaimValue(any()); @@ -90,31 +100,43 @@ class CurrentUserServiceTest { } } + @DisplayName("Get single claim value") @Nested class TestGetSingleClaimValue { - private static final String ATTRIBUTE_NAME = "userId"; - private static final String ATTRIBUTE_VALUE = "deadbeef"; + @DisplayName("on existing claim") + @Nested + class TestOnExistingClaim { - @Test - void shouldReturnUserAttribute() { - var token = new AccessToken(); - token.setOtherClaims(ATTRIBUTE_NAME, ATTRIBUTE_VALUE); - doReturn(Optional.of(token)).when(service).getCurrentSecurityToken(); + private static final String ATTRIBUTE_NAME = "userId"; + private static final String ATTRIBUTE_VALUE = "deadbeef"; + private static final Map<String, Object> CLAIMS = Map.of(ATTRIBUTE_NAME, ATTRIBUTE_VALUE); - var attribute = service.getSingleClaimValue(ATTRIBUTE_NAME); + @Test + void shouldReturnUserAttribute() { + doReturn(Optional.of(JwtTestFactory.create(CLAIMS))).when(service).getCurrentSecurityToken(); - assertThat(attribute).isPresent().hasValue(ATTRIBUTE_VALUE); + var attribute = service.getSingleClaimValue(ATTRIBUTE_NAME); + + assertThat(attribute).isPresent().hasValue(ATTRIBUTE_VALUE); + } } - @Test - void shouldReturnEmpty() { - var token = new AccessToken(); - doReturn(Optional.of(token)).when(service).getCurrentSecurityToken(); + @DisplayName("on missing claim") + @Nested + class TestOnMissingClaim { + + private static final String ATTRIBUTE_NAME = "non_existing_claim"; + private static final Map<String, Object> CLAIMS = Collections.<String, Object>singletonMap("dummyClaim", "DummyClaimValue"); + + @Test + void shouldReturnEmpty() { + doReturn(Optional.of(JwtTestFactory.create(CLAIMS))).when(service).getCurrentSecurityToken(); - var attribute = service.getSingleClaimValue(ATTRIBUTE_NAME); + var attribute = service.getSingleClaimValue(ATTRIBUTE_NAME); - assertThat(attribute).isEmpty(); + assertThat(attribute).isEmpty(); + } } } } \ No newline at end of file diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/kommentar/KommentarCommandITCase.java b/alfa-service/src/test/java/de/ozgcloud/alfa/kommentar/KommentarCommandITCase.java index deff95fefd19822253e20a1cd819b4bb594af93d..426a7478778d7515642180f96a63bfcbd775db45 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/kommentar/KommentarCommandITCase.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/kommentar/KommentarCommandITCase.java @@ -26,6 +26,7 @@ package de.ozgcloud.alfa.kommentar; import static de.ozgcloud.alfa.kommentar.KommentarCommandTestFactory.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; @@ -129,9 +130,10 @@ class KommentarCommandITCase { } private ResultActions doRequestByKommentarId(String content) throws Exception { - return mockMvc.perform(post(KommentarCommandController.KOMMENTAR_COMMANDS, KommentarTestFactory.ID, KommentarTestFactory.VERSION) - .contentType(MediaType.APPLICATION_JSON) - .content(content)); + return mockMvc + .perform(post(KommentarCommandController.KOMMENTAR_COMMANDS, KommentarTestFactory.ID, KommentarTestFactory.VERSION).with(csrf()) + .contentType(MediaType.APPLICATION_JSON) + .content(content)); } } @@ -145,7 +147,7 @@ class KommentarCommandITCase { void initTest() { when(remoteService.getById(any())).thenReturn(KommentarTestFactory.create()); when(commandRemoteService.createCommand(any())).thenReturn(CommandTestFactory.create()); - + doReturn(UserProfileTestFactory.ID).when(userService).getUserId(); } @@ -201,7 +203,7 @@ class KommentarCommandITCase { private ResultActions doRequestByVorgangId(String content) throws Exception { return mockMvc.perform(post(KommentarCommandByVorgangController.KOMMENTAR_COMMANDS_BY_VORGANG, VorgangHeaderTestFactory.ID, - RELATION_ID_ON_CREATE) + RELATION_ID_ON_CREATE).with(csrf()) .contentType(MediaType.APPLICATION_JSON) .content(content)); } diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungCommandControllerITCase.java b/alfa-service/src/test/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungCommandControllerITCase.java index 4ab04b7ef7a132ff4be843f5a8dacf7291e3ebbf..ad33e02b65e595b745d94a65b9f1ede29f7449fe 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungCommandControllerITCase.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/loeschanforderung/LoeschAnforderungCommandControllerITCase.java @@ -2,6 +2,7 @@ package de.ozgcloud.alfa.loeschanforderung; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; @@ -124,6 +125,7 @@ class LoeschAnforderungCommandControllerITCase { commandOrder.name()); return mockMvc.perform(post(LoeschAnforderungCommandController.BASE_PATH, LoeschAnforderungTestFactory.ID) + .with(csrf()) .content(requestBody).contentType(MediaType.APPLICATION_JSON).characterEncoding(StandardCharsets.UTF_8.name())); } } \ No newline at end of file diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/postfach/PostfachNachrichtPdfServiceITCase.java b/alfa-service/src/test/java/de/ozgcloud/alfa/postfach/PostfachNachrichtPdfServiceITCase.java index 6788d51ca049d5cbf99a15cfcc6c3670f0857ce1..74d9ef6eda8bc319a8fd7dabdfad2065bbb0d109 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/postfach/PostfachNachrichtPdfServiceITCase.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/postfach/PostfachNachrichtPdfServiceITCase.java @@ -30,6 +30,8 @@ import static org.mockito.Mockito.*; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; +import java.time.ZoneId; +import java.time.ZonedDateTime; import java.util.Collections; import java.util.List; import java.util.stream.Stream; @@ -45,6 +47,7 @@ import org.springframework.boot.test.mock.mockito.MockBean; import de.ozgcloud.alfa.common.user.UserId; import de.ozgcloud.alfa.common.user.UserProfileTestFactory; import de.ozgcloud.alfa.common.user.UserService; +import de.ozgcloud.alfa.vorgang.AntragstellerTestFactory; import de.ozgcloud.alfa.vorgang.EingangTestFactory; import de.ozgcloud.alfa.vorgang.VorgangWithEingang; import de.ozgcloud.alfa.vorgang.VorgangWithEingangTestFactory; @@ -118,6 +121,21 @@ class PostfachNachrichtPdfServiceITCase { } } + @DisplayName("Map Postfach-Nachricht") + @Nested + class TestMapPostfachNachricht { + + private final ZonedDateTime createdAt = ZonedDateTime.of(2023, 9, 25, 10, 0, 0, 0, ZoneId.of("UTC")); + private final PostfachNachrichtPdfData pdfData = PostfachNachrichtPdfDataTestFactory.createBuilder().createdAt(createdAt).build(); + + @Test + void shouldMapCreatedAtWithCorrectTimezoneAndFormatting() { + var nachricht = service.mapPostfachNachricht(pdfData, AntragstellerTestFactory.create()); + + assertThat(nachricht.getCreatedAt()).isEqualTo("25.09.2023 12:00:00 MESZ"); + } + } + private VorgangWithEingang buildVorgangAntragstellerNotSet() { return VorgangWithEingangTestFactory.createBuilder().eingang(EingangTestFactory.createBuilder().antragsteller(null).build()).build(); } diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/postfach/PostfachNachrichtPdfServiceTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/postfach/PostfachNachrichtPdfServiceTest.java index 454c45619a589c2481f4ea86688ef005cbd3d83a..e470d8adc1fdde352d4baaf6e11e2a7bec5ed3b5 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/postfach/PostfachNachrichtPdfServiceTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/postfach/PostfachNachrichtPdfServiceTest.java @@ -30,7 +30,6 @@ import static org.mockito.Mockito.*; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import java.time.ZonedDateTime; import java.util.stream.Stream; import org.apache.commons.lang3.StringUtils; @@ -46,6 +45,7 @@ import org.springframework.test.util.ReflectionTestUtils; import de.itvsh.kop.common.errorhandling.TechnicalException; import de.itvsh.kop.common.pdf.PdfService; +import de.ozgcloud.alfa.common.GermanDateTimeFormatter; import de.ozgcloud.alfa.common.binaryfile.BinaryFileTestFactory; import de.ozgcloud.alfa.common.user.UserProfileTestFactory; import de.ozgcloud.alfa.postfach.PostfachMail.Direction; @@ -62,6 +62,8 @@ class PostfachNachrichtPdfServiceTest { private PostfachNachrichtPdfService service; @Mock private PdfService pdfService; + @Mock + private GermanDateTimeFormatter germanDateTimeFormatter; @DisplayName("Get all as pdf") @Nested @@ -239,17 +241,19 @@ class PostfachNachrichtPdfServiceTest { @Test void shouldMapNachrichtCreatedAt() { + var expected = "formatted date"; + when(germanDateTimeFormatter.formatZonedDateTime(PostfachMailTestFactory.CREATED_AT)).thenReturn(expected); + var nachricht = mapNachricht(); - assertThat(nachricht.getCreatedAt()).isEqualTo("01.01.2000 01:00:00 GMT"); + assertThat(nachricht.getCreatedAt()).isEqualTo(expected); } @Test - void shouldFormatTimeIn24hFormat() { - var pdfNachricht = mapNachricht( - PostfachNachrichtPdfDataTestFactory.createBuilder().createdAt(ZonedDateTime.parse("2019-12-31T13:00:00Z")).build()); + void shouldCallDateFormatter() { + mapNachricht(); - assertThat(pdfNachricht.getCreatedAt()).isEqualTo("31.12.2019 13:00:00 GMT"); + verify(germanDateTimeFormatter).formatZonedDateTime(PostfachMailTestFactory.CREATED_AT); } @Test diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/EingangHeaderMapperTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/EingangHeaderMapperTest.java index a046aa542c3610d65ecd1cf7b27121e5f078e5d6..343dcaf5ce9b50d92c72d67721a6d465aae719ee 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/EingangHeaderMapperTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/EingangHeaderMapperTest.java @@ -50,6 +50,13 @@ class EingangHeaderMapperTest { assertThat(eingang.getRequestId()).isEqualTo(GrpcEingangHeaderTestFactory.REQUEST_ID); } + @Test + void shouldMapFormEngineName() { + var eingang = callMapper(); + + assertThat(eingang.getFormEngineName()).isEqualTo(GrpcEingangHeaderTestFactory.FORM_ENGINE_NAME); + } + private EingangHeader callMapper() { return mapper.toEingangHeader(GrpcEingangHeaderTestFactory.create()); } diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/EingangHeaderTestFactory.java b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/EingangHeaderTestFactory.java index 0ddbf2ebebda91c5f0ecc570d4ebf90084c953ba..12e4e885ceaaedd594d36bdbc5181e48bfe61fe6 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/EingangHeaderTestFactory.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/EingangHeaderTestFactory.java @@ -29,12 +29,14 @@ public class EingangHeaderTestFactory { public static final String CREATED_AT_STR = "2020-01-10T10:30:00Z"; public static final ZonedDateTime CREATED_AT = ZonedDateTime.parse(CREATED_AT_STR); + public static final String FORM_ENGINE_NAME = "AFM"; + public static final String FORM_ID = "test-form-id"; public static EingangHeader create() { return createBuilder().build(); } public static EingangHeader.EingangHeaderBuilder createBuilder() { - return EingangHeader.builder().createdAt(CREATED_AT); + return EingangHeader.builder().createdAt(CREATED_AT).formEngineName(FORM_ENGINE_NAME).formId(FORM_ID); } } \ No newline at end of file diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/GrpcAntragstellerTestFactory.java b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/GrpcAntragstellerTestFactory.java index cf104ab5b8253e561da74e000b3f60f2131240a9..019daf75b2e632d7755af94667a76015a9bd2f0b 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/GrpcAntragstellerTestFactory.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/GrpcAntragstellerTestFactory.java @@ -36,7 +36,7 @@ public class GrpcAntragstellerTestFactory { public final static String ANREDE = "HERR/FRAU"; public final static String NACHNAME = LoremIpsum.getInstance().getLastName(); public final static String VORNAME = LoremIpsum.getInstance().getFirstName(); - public final static String GEBURTSDATUM_STR = "1995-03-21"; + public final static String GEBURTSDATUM_STR = "21.03.1995"; public final static String GEBURTSORT = LoremIpsum.getInstance().getCountry(); public final static String GEBURTSNAME = LoremIpsum.getInstance().getFirstName(); public final static String EMAIL = LoremIpsum.getInstance().getEmail(); diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/GrpcEingangHeaderTestFactory.java b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/GrpcEingangHeaderTestFactory.java index ffb62f0b4e0b5465c7c45bf8dc1223d297e03386..3f19726f0c68a31b94efe606aff29d9d08c6bad6 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/GrpcEingangHeaderTestFactory.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/GrpcEingangHeaderTestFactory.java @@ -42,6 +42,7 @@ public class GrpcEingangHeaderTestFactory { private final static String CUSTOMER_ID = UUID.randomUUID().toString(); private final static String CLIENT = LoremIpsum.getInstance().getName(); private final static String CLIENT_ID = UUID.randomUUID().toString(); + public final static String FORM_ENGINE_NAME = "AFM"; public static GrpcEingangHeader create() { return createBuilder().build(); @@ -57,6 +58,7 @@ public class GrpcEingangHeaderTestFactory { .setCustomer(CUSTOMER) .setCustomerId(CUSTOMER_ID) .setClient(CLIENT) - .setClientId(CLIENT_ID); + .setClientId(CLIENT_ID) + .setFormEngineName(FORM_ENGINE_NAME); } } \ No newline at end of file diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangControllerITCase.java b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangControllerITCase.java index 473a8024ca56fb58511cc4ba6687a52144144332..73ec41f37345ef2368d37163b748d3efbfaf0e1d 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangControllerITCase.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangControllerITCase.java @@ -25,6 +25,7 @@ package de.ozgcloud.alfa.vorgang; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; @@ -52,6 +53,7 @@ import de.ozgcloud.alfa.common.attacheditem.VorgangAttachedItemTestFactory; import de.ozgcloud.alfa.common.clientattribute.ClientAttributeService; import de.ozgcloud.alfa.common.command.CommandController; import de.ozgcloud.alfa.common.errorhandling.ResourceNotFoundException; +import de.ozgcloud.alfa.common.user.CurrentUserService; import de.ozgcloud.alfa.common.user.UserProfileTestFactory; import de.ozgcloud.alfa.common.user.UserService; import de.ozgcloud.alfa.postfach.PostfachMailController; @@ -81,29 +83,23 @@ class VorgangControllerITCase { @MockBean private VorgangAttachedItemService vorgangAttachedItemService; - @Autowired - private MockMvc mockMvc; - + @MockBean + private CurrentUserService currentUserService; @MockBean private UserService userService; - @BeforeEach - void prepareUserService() { - when(userService.getInternalId(any())).thenReturn(Optional.of(UserProfileTestFactory.INTERNAL_ID)); - } + @Autowired + private MockMvc mockMvc; @BeforeEach - void prepareStatisticController() { + void mock() { + when(currentUserService.getUser()).thenReturn(UserProfileTestFactory.create()); + when(userService.getInternalId(any())).thenReturn(Optional.of(UserProfileTestFactory.INTERNAL_ID)); when(statisticController.getVorgaengeStatistic()).thenReturn(StatisticTestFactory.create()); - } - - @BeforeEach - void prepareVorgangAttachedItemService() { when(vorgangAttachedItemService.findLoeschAnforderung(anyString())).thenReturn(Stream.of(VorgangAttachedItemTestFactory.create())); } @DisplayName("Vorganglist by page and limit") - @WithMockUser @Nested class TestVorgangListByPage { @@ -119,12 +115,16 @@ class VorgangControllerITCase { @Test void shouldReturnResult() throws Exception { - doRequest().andExpect(jsonPath("$._embedded.vorgangHeaderList[0].nextFrist").value(WiedervorlageTestFactory.FRIST_STR)); + var response = doRequest(); + + response.andExpect(jsonPath("$._embedded.vorgangHeaderList[0].nextFrist").value(WiedervorlageTestFactory.FRIST_STR)); } @Test void shouldReturnStatusOk() throws Exception { - doRequest().andExpect(status().isOk()); + var response = doRequest(); + + response.andExpect(status().isOk()); } private ResultActions doRequest() throws Exception { @@ -143,43 +143,56 @@ class VorgangControllerITCase { @Test void shouldContainsNeu() throws Exception { - doRequest().andExpect(jsonPath(BY_STATUS_PATH + "neu").value(ByStatusTestFactory.NEU_COUNT)); + var response = doRequest(); + + response.andExpect(jsonPath(BY_STATUS_PATH + "neu").value(ByStatusTestFactory.NEU_COUNT)); } @Test void shouldContainsAngenommen() throws Exception { - doRequest().andExpect(jsonPath(BY_STATUS_PATH + "angenommen").value(ByStatusTestFactory.ANGENOMMEN_COUNT)); + var response = doRequest(); + + response.andExpect(jsonPath(BY_STATUS_PATH + "angenommen").value(ByStatusTestFactory.ANGENOMMEN_COUNT)); } @Test void shouldContainsInBearbeitung() throws Exception { - doRequest().andExpect(jsonPath(BY_STATUS_PATH + "inBearbeitung").value(ByStatusTestFactory.IN_BEARBEITUNG_COUNT)); + var response = doRequest(); + + response.andExpect(jsonPath(BY_STATUS_PATH + "inBearbeitung").value(ByStatusTestFactory.IN_BEARBEITUNG_COUNT)); } @Test void shouldContainsBeschieden() throws Exception { - doRequest().andExpect(jsonPath(BY_STATUS_PATH + "beschieden").value(ByStatusTestFactory.BESCHIEDEN_COUNT)); + var response = doRequest(); + + response.andExpect(jsonPath(BY_STATUS_PATH + "beschieden").value(ByStatusTestFactory.BESCHIEDEN_COUNT)); } @Test void shouldContainsAbgeschlossen() throws Exception { - doRequest().andExpect(jsonPath(BY_STATUS_PATH + "abgeschlossen").value(ByStatusTestFactory.ABGESCHLOSSEN_COUNT)); + var response = doRequest(); + + response.andExpect(jsonPath(BY_STATUS_PATH + "abgeschlossen").value(ByStatusTestFactory.ABGESCHLOSSEN_COUNT)); } @Test void shouldContainsVerworfen() throws Exception { - doRequest().andExpect(jsonPath(BY_STATUS_PATH + "verworfen").value(ByStatusTestFactory.VERWORFEN_COUNT)); + var response = doRequest(); + + response.andExpect(jsonPath(BY_STATUS_PATH + "verworfen").value(ByStatusTestFactory.VERWORFEN_COUNT)); } } @Test void shouldContainsWiedervorlagen() throws Exception { - doRequest().andExpect(jsonPath("$.statistic.wiedervorlagen").value(StatisticTestFactory.COUNT_WIEDERVORLAGEN)); + var response = doRequest(); + + response.andExpect(jsonPath("$.statistic.wiedervorlagen").value(StatisticTestFactory.COUNT_WIEDERVORLAGEN)); } } } - @WithMockUser @Nested class TestGetSingleVorgang { @@ -189,26 +202,31 @@ class VorgangControllerITCase { void shouldReturnNotFound() throws Exception { when(remoteService.findVorgangWithEingang(anyString(), any())).thenThrow(new ResourceNotFoundException(Vorgang.class, StringUtils.EMPTY)); - doRequest().andExpect(status().isNotFound()); + var response = doRequest(); + + response.andExpect(status().isNotFound()); } @Test void shouldFormatDateTime() throws Exception { when(remoteService.findVorgangWithEingang(anyString(), any())).thenReturn(VorgangWithEingangTestFactory.create()); - doRequest().andExpect(status().isOk()).andExpect(jsonPath("$.createdAt").value(VorgangHeaderTestFactory.CREATED_AT_STR)); + var response = doRequest(); + + response.andExpect(status().isOk()).andExpect(jsonPath("$.createdAt").value(VorgangHeaderTestFactory.CREATED_AT_STR)); } @Test void shouldHaveAnnehmenLink() throws Exception { when(remoteService.findVorgangWithEingang(anyString(), any())).thenReturn(VorgangWithEingangTestFactory.create()); - doRequest().andExpect(jsonPath("$._links.annehmen.href") + var response = doRequest(); + + response.andExpect(jsonPath("$._links.annehmen.href") .value("http://localhost/api/vorgangs/" + VorgangHeaderTestFactory.ID + "/relations/" + VorgangHeaderTestFactory.ID + "/" + VorgangHeaderTestFactory.VERSION + "/commands")); } - @WithMockUser @Nested class TestLinkToAssignedUser { @@ -216,7 +234,9 @@ class VorgangControllerITCase { void shouldReturnStatusOk() throws Exception { when(remoteService.findVorgangWithEingang(anyString(), any())).thenReturn(VorgangWithEingangTestFactory.create()); - doRequest().andExpect(status().is2xxSuccessful()); + var response = doRequest(); + + response.andExpect(status().is2xxSuccessful()); } // FIXME @@ -224,9 +244,10 @@ class VorgangControllerITCase { void shouldBePresentIfAssigned() throws Exception { when(remoteService.findVorgangWithEingang(anyString(), any())).thenReturn(VorgangWithEingangTestFactory.create()); - doRequest() - .andExpect(jsonPath("$._links.assignedTo.href") - .value(StringEndsWith.endsWith("/api/userProfiles/" + UserProfileTestFactory.ID))); + var response = doRequest(); + + response.andExpect(jsonPath("$._links.assignedTo.href") + .value(StringEndsWith.endsWith("/api/userProfiles/" + UserProfileTestFactory.ID))); } @Test @@ -234,33 +255,42 @@ class VorgangControllerITCase { when(remoteService.findVorgangWithEingang(anyString(), any())) .thenReturn(VorgangWithEingangTestFactory.createBuilder().assignedTo(null).build()); - doRequest().andExpect(jsonPath("$._links.assignedTo.href").doesNotExist()); + var response = doRequest(); + + response.andExpect(jsonPath("$._links.assignedTo.href").doesNotExist()); } } private ResultActions doRequest() throws Exception { - return mockMvc.perform(get(PATH, VorgangHeaderTestFactory.ID)); + return mockMvc.perform(get(PATH, VorgangHeaderTestFactory.ID).with(csrf())); } } @Nested class TestClientAttribute { + @Test void shouldReturnNoContent() throws Exception { - mockMvc - .perform(put("http://localhost/api/vorgangs/{0}/hasNewPostfachNachricht", VorgangHeaderTestFactory.ID) - .contentType(MediaType.APPLICATION_JSON) - .content("{\"hasNewPostfachNachricht\":false}")) - .andExpect(status().isNoContent()); + var content = VorgangHeaderTestFactory.createHasNewPostfachNachrichtContent(false); + + var response = doRequest(content); + + response.andExpect(status().isNoContent()); } @Test void shouldReturnUnprocessableEntity() throws Exception { - mockMvc - .perform(put("http://localhost/api/vorgangs/{0}/hasNewPostfachNachricht", VorgangHeaderTestFactory.ID) - .contentType(MediaType.APPLICATION_JSON) - .content("{\"hasNewPostfachNachricht\":true}")) - .andExpect(status().isUnprocessableEntity()); + var content = VorgangHeaderTestFactory.createHasNewPostfachNachrichtContent(true); + + var response = doRequest(content); + + response.andExpect(status().isUnprocessableEntity()); + } + + private ResultActions doRequest(String content) throws Exception { + return mockMvc.perform(put("/api/vorgangs/{0}/hasNewPostfachNachricht", VorgangHeaderTestFactory.ID).with(csrf()) + .contentType(MediaType.APPLICATION_JSON) + .content(content)); } } } \ No newline at end of file diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangHeaderTestFactory.java b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangHeaderTestFactory.java index e60afed35c82377a91797c6bad99867691bff275..2eb1d65bc814907ccc77bbf9e645c64e69f9b005 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangHeaderTestFactory.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangHeaderTestFactory.java @@ -28,6 +28,7 @@ import java.util.UUID; import com.thedeanda.lorem.LoremIpsum; +import de.itvsh.kop.common.test.TestUtils; import de.ozgcloud.alfa.common.user.UserProfileTestFactory; import de.ozgcloud.alfa.vorgang.Vorgang.VorgangStatus; @@ -57,4 +58,8 @@ public class VorgangHeaderTestFactory { .createdAt(CREATED_AT) .assignedTo(UserProfileTestFactory.ID); } + + public static String createHasNewPostfachNachrichtContent(boolean hasNewPostfachNachricht) { + return TestUtils.loadTextFile("jsonTemplates/command/hasNewPostfachNachricht.json.tmpl", String.valueOf(hasNewPostfachNachricht)); + } } \ No newline at end of file diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangPropertyTestFactory.java b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangPropertyTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..4886c79aceafd2b31cfc686644538322b85d50c7 --- /dev/null +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangPropertyTestFactory.java @@ -0,0 +1,17 @@ +package de.ozgcloud.alfa.vorgang; + +import de.ozgcloud.alfa.vorgang.VorgangProperties.VorgangProperty; + +public class VorgangPropertyTestFactory { + + public static VorgangProperty create() { + return createBuilder().build(); + } + + public static VorgangProperty.VorgangPropertyBuilder createBuilder() { + return VorgangProperty.builder() + .formEngineName(EingangHeaderTestFactory.FORM_ENGINE_NAME) + .formId(EingangHeaderTestFactory.FORM_ID); + } + +} diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangWithEingangProzessorTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangWithEingangProzessorTest.java index 39d5c24c9007f0bed116a63adf55717c23c403b9..4f8a572126d5ed91c75b0a2662e7a285e8183030 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangWithEingangProzessorTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/VorgangWithEingangProzessorTest.java @@ -27,6 +27,9 @@ import static org.assertj.core.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; +import java.util.Collections; +import java.util.List; + import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; @@ -35,11 +38,13 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.EnumSource; import org.mockito.InjectMocks; import org.mockito.Mock; +import org.mockito.Spy; import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.Link; import org.springframework.hateoas.LinkRelation; import org.springframework.web.util.UriComponentsBuilder; +import de.ozgcloud.alfa.common.FeatureToggleProperties; import de.ozgcloud.alfa.common.ModelBuilder; import de.ozgcloud.alfa.common.ModelBuilderFactory; import de.ozgcloud.alfa.common.user.CurrentUserService; @@ -50,6 +55,7 @@ import de.ozgcloud.alfa.vorgang.Vorgang.VorgangStatus; class VorgangWithEingangProzessorTest { + @Spy @InjectMocks private VorgangWithEingangProzessor processor; @Mock @@ -60,6 +66,10 @@ class VorgangWithEingangProzessorTest { private ModelBuilderFactory<EntityModel<VorgangWithEingang>> modelBuilderFactory; @Mock private UserManagerUrlProvider userManagerUrlProvider; + @Mock + private FeatureToggleProperties featureToggleProperties; + @Mock + private VorgangProperties vorgangProperties; private final String userManagerUrlTemplate = "UserManagerUrlTemplate/%s"; @@ -278,4 +288,213 @@ class VorgangWithEingangProzessorTest { return VorgangWithEingangTestFactory.createBuilder().eingang(eingang).build(); } } + + @Nested + class TestHasVorgangCreateBescheidEnabled { + + @Nested + class TestOnEmptyBescheidProperties { + + @BeforeEach + void setUp() { + when(vorgangProperties.getBescheid()).thenReturn(Collections.emptyList()); + } + + @Test + void shouldReturnFalse() { + var hasEnabled = callProcessor(VorgangWithEingangTestFactory.create()); + + assertThat(hasEnabled).isFalse(); + } + + } + + @Nested + class TestOnBescheidPropertiesSet { + + @BeforeEach + void setUp() { + when(vorgangProperties.getBescheid()).thenReturn(List.of(VorgangPropertyTestFactory.create())); + } + + @Test + void shouldReturnFalseIfFormEngineNameNotEquals() { + var vorgang = createVorgang(EingangTestFactory.createBuilder() + .header(EingangHeaderTestFactory.createBuilder() + .formEngineName("different").build()) + .build()); + + var hasEnabled = callProcessor(vorgang); + + assertThat(hasEnabled).isFalse(); + } + + @Test + void shouldReturnTrue() { + var hasEnabled = callProcessor(VorgangWithEingangTestFactory.create()); + + assertThat(hasEnabled).isTrue(); + } + } + + @Test + void shouldReturnFalseOnEmptyEingang() { + var vorgangWithEmptyEingang = createVorgang(null); + + var hasEnabled = callProcessor(vorgangWithEmptyEingang); + + assertThat(hasEnabled).isFalse(); + } + + @Test + void shouldReturnFalseOnEmptyEingangHeader() { + var vorgangWithEmptyEingangHeader = EingangTestFactory.createBuilder().header(null).build(); + + var hasEnabled = callProcessor(createVorgang(vorgangWithEmptyEingangHeader)); + + assertThat(hasEnabled).isFalse(); + } + + @Test + void shouldReturnFalseOnEmptyFormEngineName() { + var vorgangWithEmptyFormEngineName = createVorgang( + EingangTestFactory.createBuilder().header(EingangHeaderTestFactory.createBuilder().formEngineName(null).build()).build()); + + var hasEnabled = callProcessor(vorgangWithEmptyFormEngineName); + + assertThat(hasEnabled).isFalse(); + } + + @Test + void shouldReturnFalseOnEmptyFormId() { + var vorgangWithEmptyFormId = createVorgang( + EingangTestFactory.createBuilder().header(EingangHeaderTestFactory.createBuilder().formId(null).build()).build()); + + var hasEnabled = callProcessor(vorgangWithEmptyFormId); + + assertThat(hasEnabled).isFalse(); + } + + private boolean callProcessor(VorgangWithEingang vorgang) { + return processor.hasVorgangCreateBescheidEnabled(vorgang); + } + + private VorgangWithEingang createVorgang(Eingang eingang) { + return VorgangWithEingangTestFactory.createBuilder().eingang(eingang).build(); + } + + } + + @Nested + class TestIsCreateBescheidEnabled { + + @Nested + class TestFeatureToggleDisabled { + + @BeforeEach + void setUp() { + when(featureToggleProperties.isCreateBescheid()).thenReturn(false); + } + + @Test + void shouldCallFeatureToggleProperties() { + callProcessor(VorgangWithEingangTestFactory.create()); + + verify(featureToggleProperties).isCreateBescheid(); + } + + @Test + void shouldNotCallHasVorgangCreateBescheidEnabled() { + var vorgang = VorgangWithEingangTestFactory.create(); + + callProcessor(vorgang); + + verify(processor, never()).hasVorgangCreateBescheidEnabled(vorgang); + } + + @Test + void shouldReturnFalse() { + var isEnabled = callProcessor(VorgangWithEingangTestFactory.create()); + + assertThat(isEnabled).isFalse(); + } + } + + @Nested + class TestFeatureToggleEnabled { + + private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create(); + + @BeforeEach + void setUp() { + when(featureToggleProperties.isCreateBescheid()).thenReturn(true); + } + + @Test + void shouldCallFeatureToggleProperties() { + callProcessor(vorgang); + + verify(featureToggleProperties).isCreateBescheid(); + } + + @Test + void shouldCallHasVorgangCreateBescheidEnabled() { + callProcessor(vorgang); + + verify(processor).hasVorgangCreateBescheidEnabled(vorgang); + } + + @Test + void shouldReturnTrue() { + doReturn(true).when(processor).hasVorgangCreateBescheidEnabled(vorgang); + + var isEnabled = callProcessor(vorgang); + + assertThat(isEnabled).isTrue(); + } + + @Test + void shouldReturnFalse() { + doReturn(false).when(processor).hasVorgangCreateBescheidEnabled(vorgang); + + var isEnabled = callProcessor(vorgang); + + assertThat(isEnabled).isFalse(); + } + } + + private boolean callProcessor(VorgangWithEingang vorgang) { + return processor.isCreateBescheidEnabled(vorgang); + } + + } + + @Nested + class TestCreateBescheidLink { + + private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create(); + private final EntityModel<VorgangWithEingang> vorgangEntityModel = EntityModel.of(vorgang); + + @Test + void shouldHaveCreateBescheidLink() { + doReturn(true).when(processor).isCreateBescheidEnabled(vorgang); + + var processed = processor.process(vorgangEntityModel); + + assertThat(processed.getLink(VorgangWithEingangProzessor.REL_BESCHEID)).isPresent().get() + .extracting(Link::getHref) + .isEqualTo("/api/vorgangs/" + VorgangHeaderTestFactory.ID + "/relations/" + VorgangHeaderTestFactory.ID + "/" + + VorgangHeaderTestFactory.VERSION + "/commands"); + } + + @Test + void shouldHaveNoLinkIfDisabled() { + doReturn(false).when(processor).isCreateBescheidEnabled(vorgang); + + var processed = processor.process(vorgangEntityModel); + + assertThat(processed.getLink(VorgangWithEingangProzessor.REL_BESCHEID)).isEmpty(); + } + } + } \ No newline at end of file diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/command/VorgangWithEingangCommandProzessorTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/command/VorgangWithEingangCommandProzessorTest.java index 05c47ac3c9b646deefa33bc01322ef722b5ceda9..c26d538bfd416f1cebaf9ea37d160ef27101138e 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/command/VorgangWithEingangCommandProzessorTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/command/VorgangWithEingangCommandProzessorTest.java @@ -69,7 +69,6 @@ class VorgangWithEingangCommandProzessorTest { private ForwardingController forwardingController; @Mock private ModelBuilderFactory<EntityModel<VorgangWithEingang>> modelBuilderFactory; - @Mock private FeatureToggleProperties featureToggle; @@ -235,36 +234,5 @@ class VorgangWithEingangCommandProzessorTest { .thenAnswer( vorgangWithEingang -> ModelBuilder.fromModel(vorgangWithEingang.getArgument(0)) .withUserManagerUrl(userManagerUrlTemplate)); - - } - - @Nested - class TestCreateBescheidLink { - - @BeforeEach - void activateFeature() { - when(featureToggle.isCreateBescheid()).thenReturn(true); - - mockModelBuilderFactory(); - } - - @Test - void shouldHaveCreateBescheidLink() { - var processed = processor.process(vorgangEntityModel); - - assertThat(processed.getLink(VorgangWithEingangCommandProzessor.REL_BESCHEID)).isPresent().get() - .extracting(Link::getHref) - .isEqualTo("/api/vorgangs/" + VorgangHeaderTestFactory.ID + "/relations/" + VorgangHeaderTestFactory.ID + "/" - + VorgangHeaderTestFactory.VERSION + "/commands"); - } - - @Test - void shouldHaveNoLinkIfDisabled() { - when(featureToggle.isCreateBescheid()).thenReturn(false); - - var processed = processor.process(vorgangEntityModel); - - assertThat(processed.getLink(VorgangWithEingangCommandProzessor.REL_BESCHEID)).isEmpty(); - } } } \ No newline at end of file diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/forwarding/ForwardingPasswordValidatorTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/forwarding/ForwardingPasswordValidatorTest.java index 1899552eb91bc8feb8b42996b09aacec84dbfa0b..1a5a0a2227b498f3c2360fcacaae5af12f7ac7f3 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/forwarding/ForwardingPasswordValidatorTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/vorgang/forwarding/ForwardingPasswordValidatorTest.java @@ -27,8 +27,8 @@ import static org.assertj.core.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; -import javax.validation.ConstraintValidatorContext; -import javax.validation.ConstraintValidatorContext.ConstraintViolationBuilder; +import jakarta.validation.ConstraintValidatorContext; +import jakarta.validation.ConstraintValidatorContext.ConstraintViolationBuilder; import org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.StringUtils; diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageCommandITCase.java b/alfa-service/src/test/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageCommandITCase.java index b2948594597319e749674a7af63ece47d55d6ffc..c47e51a4d16204d0e660a16d8f93df57b612655c 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageCommandITCase.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/wiedervorlage/WiedervorlageCommandITCase.java @@ -26,12 +26,13 @@ package de.ozgcloud.alfa.wiedervorlage; import static de.ozgcloud.alfa.wiedervorlage.WiedervorlageCommandTestFactory.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; import java.time.LocalDate; -import org.assertj.core.internal.bytebuddy.utility.RandomString; +import org.apache.commons.lang3.RandomStringUtils; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; @@ -125,7 +126,7 @@ class WiedervorlageCommandITCase { @DisplayName("for 41 character in Betreff") @Test void createCommandWithLongBetreff() throws Exception { - var content = buildContentWithBetreff(RandomString.make(41)); + var content = buildContentWithBetreff(RandomStringUtils.random(41)); doRequest(content).andExpect(status().isUnprocessableEntity()); } @@ -165,6 +166,7 @@ class WiedervorlageCommandITCase { private ResultActions doRequest(String content) throws Exception { return mockMvc.perform( post(WiedervorlageCommandController.WIEDERVORLAGE_COMMANDS, WiedervorlageTestFactory.ID, WiedervorlageTestFactory.VERSION) + .with(csrf()) .contentType(MediaType.APPLICATION_JSON) .content(content)); } @@ -181,7 +183,7 @@ class WiedervorlageCommandITCase { void initTest() { when(commandRemoteService.createCommand(any())).thenReturn(CommandTestFactory.create()); when(wiedervorlageRemoteService.getById(anyString())).thenReturn(WiedervorlageTestFactory.create()); - + doReturn(UserProfileTestFactory.ID).when(userService).getUserId(); } @@ -229,7 +231,7 @@ class WiedervorlageCommandITCase { @DisplayName("for 41 character in Betreff") @Test void createCommandWithLongBetreff() throws Exception { - var content = buildContentWithBetreff(RandomString.make(41)); + var content = buildContentWithBetreff(RandomStringUtils.random(41)); doRequest(content).andExpect(status().isUnprocessableEntity()); } @@ -267,8 +269,9 @@ class WiedervorlageCommandITCase { private ResultActions doRequest(String content) throws Exception { return mockMvc.perform(post(WiedervorlageCommandByVorgangController.WIEDERVORLAGE_COMMANDS_BY_VORGANG, VorgangHeaderTestFactory.ID, RELATION_ID_ON_CREATE) - .contentType(MediaType.APPLICATION_JSON) - .content(content)); + .with(csrf()) + .contentType(MediaType.APPLICATION_JSON) + .content(content)); } } } \ No newline at end of file diff --git a/alfa-service/src/test/resources/application.yml b/alfa-service/src/test/resources/application.yml index a46d7989678c79a6f2338deb269565b88e026824..90b792d47554dae05fae77dd26ed00e58bf90ed2 100644 --- a/alfa-service/src/test/resources/application.yml +++ b/alfa-service/src/test/resources/application.yml @@ -4,7 +4,19 @@ logging: '[de.itvsh]': INFO '[de.ozgcloud]': INFO, '[org.springframework.security]': WARN - '[org.keycloak.adapters]': WARN + + +ozgcloud: + keycloak: + auth-server-url: https://sso.dev.by.ozg-cloud.de + realm: by-kiel-dev + resource: ${jwt.auth.converter.resource-id} + +jwt: + auth: + converter: + resource-id: alfa + principle-attribute: preferred_username spring: mvc: @@ -19,7 +31,13 @@ spring: multipart: max-file-size: 2GB max-request-size: 2GB - + security: + oauth2: + resourceserver: + jwt: + issuer-uri: ${ozgcloud.keycloak.auth-server-url}/realms/${ozgcloud.keycloak.realm} + jwk-set-uri: ${spring.security.oauth2.resourceserver.jwt.issuer-uri}/protocol/openid-connect/certs + server: http2: enabled: true @@ -51,14 +69,7 @@ management: goofy: production: true - -keycloak: - auth-server-url: http://localhost:8088 - realm: sh-kiel-dev - resource: sh-kiel-dev-goofy - public-client: true - use-resource-role-mappings: true - + grpc: client: pluto: @@ -71,7 +82,7 @@ grpc: kop: auth: token: - secret: XPPWagXn3rDwKG6Ywoir + secret: XPPWagXn3rDwKG6YwoirXPPWagXn3rDwKG6YwoirXPPWagXn3rDwKG6YwoirXPPWagXn3rDwKG6Ywoir validity: 60000 upload: maxFileSize: diff --git a/alfa-service/src/test/resources/jsonTemplates/command/hasNewPostfachNachricht.json.tmpl b/alfa-service/src/test/resources/jsonTemplates/command/hasNewPostfachNachricht.json.tmpl new file mode 100644 index 0000000000000000000000000000000000000000..419bb5bcbb5a8951482425d305d39aa40a9dd9e0 --- /dev/null +++ b/alfa-service/src/test/resources/jsonTemplates/command/hasNewPostfachNachricht.json.tmpl @@ -0,0 +1,3 @@ +{ + "hasNewPostfachNachricht": %s +} \ No newline at end of file diff --git a/alfa-xdomea/pom.xml b/alfa-xdomea/pom.xml index 5f3125ca788e8e8fed9fda3bf0a355e89c5b3b0e..a9cd7ff41b85e50447fadb03e0535b1adca8ae52 100644 --- a/alfa-xdomea/pom.xml +++ b/alfa-xdomea/pom.xml @@ -32,18 +32,18 @@ <parent> <groupId>de.itvsh.ozg</groupId> <artifactId>goofy</artifactId> - <version>1.15.0-SNAPSHOT</version> + <version>1.17.0-SNAPSHOT</version> </parent> <artifactId>alfa-xdomea</artifactId> - <name>XDomea</name> + <name>Alfa XDomea</name> + <description>Alfa XDomea implementation</description> <packaging>jar</packaging> <properties> <maven.compiler.source>${java.version}</maven.compiler.source> <maven.compiler.target>${java.version}</maven.compiler.target> - <jaxb2-maven-plugin.version>2.5.0</jaxb2-maven-plugin.version> - + <jaxb2-maven-plugin.version>3.1.0</jaxb2-maven-plugin.version> </properties> <dependencies> @@ -105,6 +105,25 @@ <skip>true</skip> </configuration> </plugin> + <plugin> + <groupId>org.jacoco</groupId> + <artifactId>jacoco-maven-plugin</artifactId> + </plugin> + + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-surefire-plugin</artifactId> + </plugin> + + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-failsafe-plugin</artifactId> + </plugin> + + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + </plugin> </plugins> <resources> <resource> diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/AbgabeAbgabe0401Creator.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/AbgabeAbgabe0401Creator.java new file mode 100644 index 0000000000000000000000000000000000000000..5cd4aff65c9effe27e31907215043143e2123e5b --- /dev/null +++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/AbgabeAbgabe0401Creator.java @@ -0,0 +1,26 @@ +package de.ozgcloud.alfa.export; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import de.ozgcloud.alfa.vorgang.VorgangWithEingang; +import de.xoev.xdomea.AbgabeAbgabe0401; + +@Component +class AbgabeAbgabe0401Creator { + + @Autowired + private SchriftgutobjektCreator schriftgutobjektCreator; + + @Autowired + private AnwendungsspezifischeErweiterungTypeCreator anwendungsspezifischeErweiterungTypeCreator; + + public AbgabeAbgabe0401 create(VorgangWithEingang vorgang) { + var erweiterung = anwendungsspezifischeErweiterungTypeCreator.create(vorgang); + + var abgabe = new AbgabeAbgabe0401(); + abgabe.getSchriftgutobjekt().add(schriftgutobjektCreator.create(vorgang, erweiterung)); + return abgabe; + } + +} diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/AnwendungsspezifischeErweiterungMapper.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/AnwendungsspezifischeErweiterungMapper.java deleted file mode 100644 index d5ee46e846d26ad3e68a75b8c3f10363f0b3caa7..0000000000000000000000000000000000000000 --- a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/AnwendungsspezifischeErweiterungMapper.java +++ /dev/null @@ -1,28 +0,0 @@ -package de.ozgcloud.alfa.export; - -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.ReportingPolicy; -import org.springframework.beans.factory.annotation.Autowired; - -import de.ozgcloud.alfa.vorgang.VorgangWithEingang; -import de.xoev.xdomea.AnwendungsspezifischeErweiterungType; - -@Mapper(unmappedTargetPolicy = ReportingPolicy.WARN) -abstract class AnwendungsspezifischeErweiterungMapper { - - @Autowired - FeldGruppeMapper feldGruppeMapper; - - static final String KENNUNG = "IDOZGCloud1234567"; - static final String NAME = "Anwendungsspezifische Erweiterung OZGCloud Basis"; - - @Mapping(target = "beschreibung", ignore = true) - @Mapping(target = "versionsdatum", ignore = true) - @Mapping(target = "versionsnummer", ignore = true) - @Mapping(target = "feld", ignore = true) - @Mapping(target = "kennung", constant = KENNUNG) - @Mapping(target = "name", constant = NAME) - @Mapping(target = "feldgruppe", expression = "java(List.of(feldGruppeMapper.map(vorgang)))") - abstract AnwendungsspezifischeErweiterungType map(VorgangWithEingang vorgang); -} diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/AnwendungsspezifischeErweiterungTypeCreator.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/AnwendungsspezifischeErweiterungTypeCreator.java new file mode 100644 index 0000000000000000000000000000000000000000..d981a15c7542d2ba1e5a46c4094d43bb8e7b9223 --- /dev/null +++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/AnwendungsspezifischeErweiterungTypeCreator.java @@ -0,0 +1,27 @@ +package de.ozgcloud.alfa.export; + +import java.util.Collections; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import de.ozgcloud.alfa.vorgang.VorgangWithEingang; +import de.xoev.xdomea.AnwendungsspezifischeErweiterungType; + +@Component +class AnwendungsspezifischeErweiterungTypeCreator { + + static final String KENNUNG = "IDOZGCloud1234567"; + static final String NAME = "Anwendungsspezifische Erweiterung OZGCloud Basis"; + + @Autowired + private FeldGruppeTypeCreator feldGruppeTypeCreator; + + public AnwendungsspezifischeErweiterungType create(VorgangWithEingang vorgang) { + var anwendungsspezifischeErweiterung = new AnwendungsspezifischeErweiterungType(); + anwendungsspezifischeErweiterung.setKennung(KENNUNG); + anwendungsspezifischeErweiterung.setName(NAME); + anwendungsspezifischeErweiterung.getFeldgruppe().addAll(Collections.singleton(feldGruppeTypeCreator.create(vorgang))); + return anwendungsspezifischeErweiterung; + } +} diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/DateConverter.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/DateConverter.java new file mode 100644 index 0000000000000000000000000000000000000000..b41173ea1bcc9246309dce3ca752d24dc4dbb715 --- /dev/null +++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/DateConverter.java @@ -0,0 +1,30 @@ +package de.ozgcloud.alfa.export; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.Locale; +import java.util.Optional; + +import javax.xml.datatype.DatatypeConfigurationException; +import javax.xml.datatype.DatatypeFactory; +import javax.xml.datatype.XMLGregorianCalendar; + +import org.springframework.stereotype.Component; + +import de.itvsh.kop.common.errorhandling.TechnicalException; + +@Component +class DateConverter { + + private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("dd.MM.yyyy", Locale.GERMAN); + + public Optional<XMLGregorianCalendar> convertGermanFormatToISO(String dateStr) { + try { + return Optional.of(DatatypeFactory.newInstance().newXMLGregorianCalendar(LocalDate.parse(dateStr, DATE_TIME_FORMATTER).toString())); + } catch (DatatypeConfigurationException e) { + throw new TechnicalException(String.format("Error converting date %s to ISO.", dateStr), e); + } catch (Exception e) { + return Optional.empty(); + } + } +} diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/DateiformatCode.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/DateiformatCode.java new file mode 100644 index 0000000000000000000000000000000000000000..c7f4b8f86717fb9646e9a32f8b1b28318297c278 --- /dev/null +++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/DateiformatCode.java @@ -0,0 +1,24 @@ +package de.ozgcloud.alfa.export; + +import de.xoev.xdomea.DateiformatCodeType; + +enum DateiformatCode { + PDF("vCBzR", "018"); + + static final String LIST_URI = "urn:xoev-de:xdomea:codeliste:dateiformat"; + final String listVersionID; + final String code; + + DateiformatCode(String listVersionID, String code) { + this.listVersionID = listVersionID; + this.code = code; + } + + public DateiformatCodeType createDateiformatCodeType() { + var dateiformatCode = new DateiformatCodeType(); + dateiformatCode.setCode(code); + dateiformatCode.setListURI(LIST_URI); + dateiformatCode.setListVersionID(listVersionID); + return dateiformatCode; + } +} diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/DokumentTypeCreator.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/DokumentTypeCreator.java new file mode 100644 index 0000000000000000000000000000000000000000..a44e9a8383bdf6088410d5131356b11d739230f2 --- /dev/null +++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/DokumentTypeCreator.java @@ -0,0 +1,74 @@ +package de.ozgcloud.alfa.export; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import java.util.stream.Stream; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import de.ozgcloud.alfa.common.file.OzgFile; +import de.ozgcloud.alfa.vorgang.Eingang; +import de.ozgcloud.alfa.vorgang.VorgangWithEingang; +import de.xoev.xdomea.AllgemeineMetadatenType; +import de.xoev.xdomea.DokumentType; +import de.xoev.xdomea.IdentifikationObjektType; +import de.xoev.xdomea.MediumCodeType; + +@Component +class DokumentTypeCreator { + + static final String ALLGEMEINE_METADATEN_MEDIUM_CODE = "001"; + + @Autowired + private ExportFileService exportFileService; + + @Autowired + private UUIDConverter uuidConverter; + + @Autowired + private VersionTypeCreator versionTypeCreator; + + public Stream<DokumentType> create(VorgangWithEingang vorgang) { + var ozgFiles = Optional.ofNullable(vorgang.getEingang()).map(Eingang::getId).map(exportFileService::getAllPdfs).map(Stream::toList) + .orElse(Collections.emptyList()); + List<DokumentType> dokumenten = new ArrayList<>(ozgFiles.size()); + for (var i = 0; i < ozgFiles.size(); i++) { + dokumenten.add(createDokumentType(i + 1, vorgang, ozgFiles.get(i))); + } + return dokumenten.stream(); + } + + DokumentType createDokumentType(int dokumentOrdinalNumber, VorgangWithEingang vorgang, OzgFile ozgFile) { + var dokument = new DokumentType(); + dokument.setIdentifikation(createIdentifikation(dokumentOrdinalNumber, ozgFile.getId().toString())); + dokument.setAllgemeineMetadaten(createAllgemeineMetadaten(ozgFile)); + dokument.getVersion().add(versionTypeCreator.create(vorgang, ozgFile)); + return dokument; + } + + IdentifikationObjektType createIdentifikation(int dokumentOrdinalNumber, String fileId) { + var identifikation = new IdentifikationObjektType(); + identifikation.setID(uuidConverter.fromObjectId(fileId)); + identifikation.setNummerImUebergeordnetenContainer(Long.valueOf(dokumentOrdinalNumber)); + return identifikation; + } + + AllgemeineMetadatenType createAllgemeineMetadaten(OzgFile ozgFile) { + var allgemeineMetadaten = new AllgemeineMetadatenType(); + allgemeineMetadaten.setBetreff(ozgFile.getName()); + allgemeineMetadaten.setKennzeichen(StringUtils.EMPTY); + allgemeineMetadaten.setBemerkung(StringUtils.EMPTY); + allgemeineMetadaten.setMedium(createMediumCode()); + return allgemeineMetadaten; + } + + private MediumCodeType createMediumCode() { + var mediumCode = new MediumCodeType(); + mediumCode.setCode(ALLGEMEINE_METADATEN_MEDIUM_CODE); + return mediumCode; + } +} diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/ExportData.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/ExportData.java new file mode 100644 index 0000000000000000000000000000000000000000..c6e4888c0865072a025a6cf2ecf2729c408dd078 --- /dev/null +++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/ExportData.java @@ -0,0 +1,22 @@ +package de.ozgcloud.alfa.export; + +import java.util.stream.Stream; + +import de.ozgcloud.alfa.common.file.OzgFile; +import de.ozgcloud.alfa.vorgang.VorgangWithEingang; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +@Builder +@AllArgsConstructor(access = AccessLevel.PRIVATE) +@Getter +class ExportData { + + private VorgangWithEingang vorgang; + private String exportFilename; + private String xmlFileContent; + private Stream<OzgFile> exportFiles; + +} diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/ExportFileService.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/ExportFileService.java new file mode 100644 index 0000000000000000000000000000000000000000..31a4a322a44b9b086bd3cc29b27e4746e99446c5 --- /dev/null +++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/ExportFileService.java @@ -0,0 +1,37 @@ +package de.ozgcloud.alfa.export; + +import java.io.OutputStream; +import java.util.function.Predicate; +import java.util.stream.Stream; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Service; + +import de.ozgcloud.alfa.common.binaryfile.BinaryFileService; +import de.ozgcloud.alfa.common.binaryfile.FileId; +import de.ozgcloud.alfa.common.file.OzgFile; +import de.ozgcloud.alfa.common.file.OzgFileService; + +@Service +class ExportFileService { + + private static final Predicate<OzgFile> IS_PDF_FILE = file -> file.getContentType().equals(MediaType.APPLICATION_PDF_VALUE); + + @Autowired + private OzgFileService ozgFileService; + + @Autowired + private BinaryFileService binaryFileService; + + public Stream<OzgFile> getAllPdfs(String eingangId) { + var representations = ozgFileService.getRepresentationsByEingang(eingangId); + var attachments = ozgFileService.getAttachmentsByEingang(eingangId); + return Stream.concat(representations, attachments).filter(IS_PDF_FILE); + } + + public void writeOzgFile(FileId fileId, OutputStream outputStream) { + binaryFileService.writeFileContent(fileId, outputStream); + } + +} diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/ExportFilenameGenerator.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/ExportFilenameGenerator.java new file mode 100644 index 0000000000000000000000000000000000000000..13471e6d59b8ffd385aad5532c1c9bd982172c04 --- /dev/null +++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/ExportFilenameGenerator.java @@ -0,0 +1,17 @@ +package de.ozgcloud.alfa.export; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import de.ozgcloud.alfa.common.file.OzgFile; + +@Component +class ExportFilenameGenerator { + + @Autowired + private UUIDConverter uuidConverter; + + public String generateExportFilename(OzgFile ozgFile) { + return String.format("%s_%s", uuidConverter.fromObjectId(ozgFile.getId().toString()), ozgFile.getName()); + } +} diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/FeldGruppeMapper.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/FeldGruppeMapper.java deleted file mode 100644 index af8ec2274178f59b9d24397b25496830a6b17a12..0000000000000000000000000000000000000000 --- a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/FeldGruppeMapper.java +++ /dev/null @@ -1,36 +0,0 @@ -package de.ozgcloud.alfa.export; - -import java.time.format.DateTimeFormatter; -import java.util.List; - -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.ReportingPolicy; - -import de.ozgcloud.alfa.vorgang.VorgangWithEingang; -import de.xoev.xdomea.FeldType; -import de.xoev.xdomea.FeldgruppeType; - -@Mapper(unmappedTargetPolicy = ReportingPolicy.WARN) -abstract class FeldGruppeMapper { - - static final String NAME = "FeldgruppeOZGCloudBasis"; - static final String BESCHREIBUNG = "Feldgruppe für OZGCloud Basis"; - - @Mapping(target = "unterfeldgruppe", ignore = true) - @Mapping(target = "name", constant = NAME) - @Mapping(target = "beschreibung", constant = BESCHREIBUNG) - @Mapping(target = "feld", expression = "java(mapToFelder(vorgang))") - abstract FeldgruppeType map(VorgangWithEingang vorgang); - - List<FeldType> mapToFelder(VorgangWithEingang vorgang) { - return List.of( - ExportFelder.LEIKA_ID.createFeld(), - ExportFelder.DATUM_ANTRAGSEINGANG.createFeld(DateTimeFormatter.ISO_DATE_TIME.format(vorgang.getCreatedAt())), - ExportFelder.NAME.createFeld(vorgang.getEingang().getAntragsteller().getNachname()), - ExportFelder.VORNAME.createFeld(vorgang.getEingang().getAntragsteller().getVorname()), - ExportFelder.GEBURTSDATUM.createFeld(vorgang.getEingang().getAntragsteller().getGeburtsdatum()), - ExportFelder.PLZ.createFeld(vorgang.getEingang().getAntragsteller().getPlz())); - } - -} diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/FeldGruppeTypeCreator.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/FeldGruppeTypeCreator.java new file mode 100644 index 0000000000000000000000000000000000000000..e47cc16c6db59f270bade24eb4389ab91190ba0e --- /dev/null +++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/FeldGruppeTypeCreator.java @@ -0,0 +1,40 @@ +package de.ozgcloud.alfa.export; + +import static java.util.Optional.*; + +import java.time.format.DateTimeFormatter; +import java.util.List; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Component; + +import de.ozgcloud.alfa.vorgang.VorgangWithEingang; +import de.xoev.xdomea.FeldType; +import de.xoev.xdomea.FeldgruppeType; + +@Component +class FeldGruppeTypeCreator { + + static final String NAME = "FeldgruppeOZGCloudBasis"; + static final String BESCHREIBUNG = "Feldgruppe für OZGCloud Basis"; + + public FeldgruppeType create(VorgangWithEingang vorgang) { + var feldgruppe = new FeldgruppeType(); + feldgruppe.setName(NAME); + feldgruppe.setBeschreibung(BESCHREIBUNG); + feldgruppe.getFeld().addAll(createFeldType(vorgang)); + return feldgruppe; + } + + List<FeldType> createFeldType(VorgangWithEingang vorgang) { + var antragsteller = ofNullable(vorgang.getEingang()).flatMap(eingang -> ofNullable(eingang.getAntragsteller())); + return List.of( + ExportFelder.LEIKA_ID.createFeld(), + ExportFelder.DATUM_ANTRAGSEINGANG.createFeld(DateTimeFormatter.ISO_DATE_TIME.format(vorgang.getCreatedAt())), + ExportFelder.NAME.createFeld(antragsteller.flatMap(a -> ofNullable(a.getNachname())).orElse(StringUtils.EMPTY)), + ExportFelder.VORNAME.createFeld(antragsteller.flatMap(a -> ofNullable(a.getVorname())).orElse(StringUtils.EMPTY)), + ExportFelder.GEBURTSDATUM.createFeld(antragsteller.flatMap(a -> ofNullable(a.getGeburtsdatum())).orElse(StringUtils.EMPTY)), + ExportFelder.PLZ.createFeld(antragsteller.flatMap(a -> ofNullable(a.getPlz())).orElse(StringUtils.EMPTY))); + } + +} diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/FormatTypeCreator.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/FormatTypeCreator.java new file mode 100644 index 0000000000000000000000000000000000000000..c3d9deb3c1f34c36abc1824ab918ac8b12260d4e --- /dev/null +++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/FormatTypeCreator.java @@ -0,0 +1,25 @@ +package de.ozgcloud.alfa.export; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import de.ozgcloud.alfa.common.file.OzgFile; +import de.ozgcloud.alfa.vorgang.VorgangWithEingang; +import de.xoev.xdomea.FormatType; + +@Component +class FormatTypeCreator { + + @Autowired + private PrimaerdokumentTypeCreator primaerdokumentTypeCreator; + + public FormatType create(VorgangWithEingang vorgang, OzgFile ozgFile) { + var format = new FormatType(); + format.setPrimaerdokument(primaerdokumentTypeCreator.create(vorgang, ozgFile)); + format.setName(DateiformatCode.PDF.createDateiformatCodeType()); + format.setSonstigerName(StringUtils.EMPTY); + format.setVersion(StringUtils.EMPTY); + return format; + } +} diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/KontaktTypeCreator.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/KontaktTypeCreator.java new file mode 100644 index 0000000000000000000000000000000000000000..0f13079a7a8acba8763844ca936ee785c27ba62e --- /dev/null +++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/KontaktTypeCreator.java @@ -0,0 +1,62 @@ +package de.ozgcloud.alfa.export; + +import java.util.Optional; +import java.util.function.Predicate; + +import javax.xml.datatype.XMLGregorianCalendar; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import de.ozgcloud.alfa.vorgang.Antragsteller; +import de.ozgcloud.alfa.vorgang.VorgangWithEingang; +import de.xoev.xdomea.GeburtType; +import de.xoev.xdomea.KontaktType; + +@Component +class KontaktTypeCreator { + + private final Predicate<Antragsteller> HAS_VORNAME = antragsteller -> StringUtils.isNotBlank(antragsteller.getVorname()); + private final Predicate<Antragsteller> HAS_NACHNAME = antragsteller -> StringUtils.isNotBlank(antragsteller.getNachname()); + private final Predicate<Antragsteller> HAS_ANREDE = antragsteller -> StringUtils.isNotBlank(antragsteller.getAnrede()); + private final Predicate<Antragsteller> HAS_VALID_GEBURTSDATUM = this::hasValidGeburtsdatum; + + @Autowired + private NameNatuerlichePersonTypeCreator nameNatuerlichePersonTypeCreator; + + @Autowired + private DateConverter dateConverter; + + public Optional<KontaktType> create(VorgangWithEingang vorgang) { + return getAntragstellerIfHasRequiredData(vorgang).map(this::toKontaktType); + } + + Optional<Antragsteller> getAntragstellerIfHasRequiredData(VorgangWithEingang vorgang) { + return Optional.ofNullable(vorgang.getEingang().getAntragsteller()) + .filter(HAS_VORNAME.or(HAS_NACHNAME).or(HAS_ANREDE).or(HAS_VALID_GEBURTSDATUM)); + } + + KontaktType toKontaktType(Antragsteller antragsteller) { + var kontakt = new KontaktType(); + kontakt.setName(nameNatuerlichePersonTypeCreator.create(antragsteller)); + var geburtsdatumIso = dateConverter.convertGermanFormatToISO(antragsteller.getGeburtsdatum()); + kontakt.setGeburt(createGeburtType(geburtsdatumIso)); + return kontakt; + } + + GeburtType createGeburtType(Optional<XMLGregorianCalendar> geburtsdatum) { + return geburtsdatum.map(this::createGeburtType).orElseGet(GeburtType::new); + } + + private GeburtType createGeburtType(XMLGregorianCalendar datum) { + var geburtType = new GeburtType(); + geburtType.setDatum(datum); + return geburtType; + } + + private boolean hasValidGeburtsdatum(Antragsteller antragsteller) { + return dateConverter.convertGermanFormatToISO(antragsteller.getGeburtsdatum()).isPresent(); + } + +} diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/NameNatuerlichePersonTypeCreator.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/NameNatuerlichePersonTypeCreator.java new file mode 100644 index 0000000000000000000000000000000000000000..285854614408573b9f9238c000e7943ed94800e9 --- /dev/null +++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/NameNatuerlichePersonTypeCreator.java @@ -0,0 +1,30 @@ +package de.ozgcloud.alfa.export; + +import static java.util.Optional.*; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Component; + +import de.ozgcloud.alfa.vorgang.Antragsteller; +import de.xoev.xdomea.AllgemeinerNameType; +import de.xoev.xdomea.NameNatuerlichePersonType; + +@Component +class NameNatuerlichePersonTypeCreator { + + public NameNatuerlichePersonType create(Antragsteller antragsteller) { + var nameNatuerlichPerson = new NameNatuerlichePersonType(); + nameNatuerlichPerson.setAnrede(ofNullable(antragsteller).map(Antragsteller::getAnrede).orElse(StringUtils.EMPTY)); + nameNatuerlichPerson.setVorname( + createAllgemeinerNameType(ofNullable(antragsteller).map(Antragsteller::getVorname).orElse(StringUtils.EMPTY))); + nameNatuerlichPerson.setFamilienname( + createAllgemeinerNameType(ofNullable(antragsteller).map(Antragsteller::getNachname).orElse(StringUtils.EMPTY))); + return nameNatuerlichPerson; + } + + private AllgemeinerNameType createAllgemeinerNameType(String name) { + var allgemeinerName = new AllgemeinerNameType(); + allgemeinerName.setName(name); + return allgemeinerName; + } +} diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/PrimaerdokumentTypeCreator.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/PrimaerdokumentTypeCreator.java new file mode 100644 index 0000000000000000000000000000000000000000..593e0ef8195aed2d85c3d8290317e80f5efadf5c --- /dev/null +++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/PrimaerdokumentTypeCreator.java @@ -0,0 +1,23 @@ +package de.ozgcloud.alfa.export; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import de.ozgcloud.alfa.common.file.OzgFile; +import de.ozgcloud.alfa.vorgang.VorgangWithEingang; +import de.xoev.xdomea.PrimaerdokumentType; + +@Component +class PrimaerdokumentTypeCreator { + + @Autowired + private ExportFilenameGenerator exportFilenameGenerator; + + public PrimaerdokumentType create(VorgangWithEingang vorgang, OzgFile ozgFile) { + var primaerdokument = new PrimaerdokumentType(); + primaerdokument.setDateiname(exportFilenameGenerator.generateExportFilename(ozgFile)); + primaerdokument.setDateinameOriginal(ozgFile.getName()); + primaerdokument.setErsteller(vorgang.getEingang().getHeader().getFormEngineName()); + return primaerdokument; + } +} diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/SchriftgutobjektCreator.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/SchriftgutobjektCreator.java new file mode 100644 index 0000000000000000000000000000000000000000..2ba904f2ceb9027f3d14d96736d0219242361b3f --- /dev/null +++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/SchriftgutobjektCreator.java @@ -0,0 +1,22 @@ +package de.ozgcloud.alfa.export; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import de.ozgcloud.alfa.vorgang.VorgangWithEingang; +import de.xoev.xdomea.AbgabeAbgabe0401.Schriftgutobjekt; +import de.xoev.xdomea.AnwendungsspezifischeErweiterungType; + +@Component +class SchriftgutobjektCreator { + + @Autowired + private VorgangTypeCreator vorgangTypeCreator; + + public Schriftgutobjekt create(VorgangWithEingang vorgang, AnwendungsspezifischeErweiterungType erweiterung) { + var schritftgutobjekt = new Schriftgutobjekt(); + schritftgutobjekt.setVorgang(vorgangTypeCreator.create(vorgang, erweiterung)); + return schritftgutobjekt; + } + +} diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/UUIDConverter.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/UUIDConverter.java new file mode 100644 index 0000000000000000000000000000000000000000..ad28c0ea96923a9567330fed9fa1bea30cc3f15c --- /dev/null +++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/UUIDConverter.java @@ -0,0 +1,23 @@ +package de.ozgcloud.alfa.export; + +import java.util.regex.Pattern; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Component; + +@Component +class UUIDConverter { + + private static final Pattern UUID_SPLIT_PATTERN = Pattern.compile( + "^([a-fA-F0-9]{8})([a-fA-F0-9]{4})([a-fA-F0-9]{4})([a-fA-F0-9]{4})([a-fA-F0-9]+)$"); + + public String fromObjectId(String objectId) { + var matcher = UUID_SPLIT_PATTERN.matcher(objectId); + if (matcher.find()) { + var lastGroup = StringUtils.leftPad(matcher.group(5), 12, "0"); + return String.format("%s-%s-%s-%s-%s", matcher.group(1), matcher.group(2), matcher.group(3), matcher.group(4), lastGroup); + } + throw new IllegalArgumentException(String.format("Invalid object id %s", objectId)); + } + +} diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/VersionTypeCreator.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/VersionTypeCreator.java new file mode 100644 index 0000000000000000000000000000000000000000..7ce323a415aa2181efcd27795de794d256f61b41 --- /dev/null +++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/VersionTypeCreator.java @@ -0,0 +1,24 @@ +package de.ozgcloud.alfa.export; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import de.ozgcloud.alfa.common.file.OzgFile; +import de.ozgcloud.alfa.vorgang.VorgangWithEingang; +import de.xoev.xdomea.VersionType; + +@Component +class VersionTypeCreator { + + static final String NUMMER = "1"; + + @Autowired + private FormatTypeCreator formatTypeCreator; + + public VersionType create(VorgangWithEingang vorgang, OzgFile ozgFile) { + var version = new VersionType(); + version.setNummer(NUMMER); + version.getFormat().add(formatTypeCreator.create(vorgang, ozgFile)); + return version; + } +} diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/VorgangTypeCreator.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/VorgangTypeCreator.java new file mode 100644 index 0000000000000000000000000000000000000000..792143b96e0074e5ffdbcd1c48a204759d8d710e --- /dev/null +++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/VorgangTypeCreator.java @@ -0,0 +1,60 @@ +package de.ozgcloud.alfa.export; + +import java.util.UUID; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import de.ozgcloud.alfa.vorgang.VorgangWithEingang; +import de.xoev.xdomea.AllgemeineMetadatenType; +import de.xoev.xdomea.AnwendungsspezifischeErweiterungType; +import de.xoev.xdomea.IdentifikationObjektType; +import de.xoev.xdomea.MediumCodeType; +import de.xoev.xdomea.VorgangType; + +@Component +class VorgangTypeCreator { + + static final Long NUMMER_IM_UEBERGEORDNETEN_CONTAINER = 1L; + static final String ALLGEMEINE_METADATEN_MEDIUM_CODE = "001"; + + @Autowired + private DokumentTypeCreator dokumentTypeCreator; + + @Autowired + private KontaktTypeCreator kontaktTypeCreator; + + public VorgangType create(VorgangWithEingang vorgangWithEingang, AnwendungsspezifischeErweiterungType erweiterung) { + var vorgang = new VorgangType(); + vorgang.setAnwendungsspezifischeErweiterung(erweiterung); + vorgang.setIdentifikation(createIdentifikation()); + vorgang.setAllgemeineMetadaten(createAllgemeineMetadaten(vorgangWithEingang)); + vorgang.getDokument().addAll(dokumentTypeCreator.create(vorgangWithEingang).toList()); + kontaktTypeCreator.create(vorgangWithEingang).ifPresent(vorgang.getKontakt()::add); + return vorgang; + } + + IdentifikationObjektType createIdentifikation() { + var identifikation = new IdentifikationObjektType(); + identifikation.setID(UUID.randomUUID().toString()); + identifikation.setNummerImUebergeordnetenContainer(NUMMER_IM_UEBERGEORDNETEN_CONTAINER); + return identifikation; + } + + AllgemeineMetadatenType createAllgemeineMetadaten(VorgangWithEingang vorgang) { + var allgemeineMetadaten = new AllgemeineMetadatenType(); + allgemeineMetadaten.setBetreff(vorgang.getName()); + allgemeineMetadaten.setKennzeichen(vorgang.getNummer()); + allgemeineMetadaten.setBemerkung(StringUtils.EMPTY); + allgemeineMetadaten.setMedium(createMediumCode()); + return allgemeineMetadaten; + } + + private MediumCodeType createMediumCode() { + var mediumCode = new MediumCodeType(); + mediumCode.setCode(ALLGEMEINE_METADATEN_MEDIUM_CODE); + return mediumCode; + } + +} diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/XDomeaMedienart.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/XDomeaMedienart.java new file mode 100644 index 0000000000000000000000000000000000000000..12c1500798df429f6d2619c35c16a4bce54e532d --- /dev/null +++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/XDomeaMedienart.java @@ -0,0 +1,16 @@ +package de.ozgcloud.alfa.export; + +enum XDomeaMedienart { + + ELEKTRONISCHES_DOKUMENT("001"); + + private String code; + + XDomeaMedienart(String code) { + this.code = code; + } + + public String getCode() { + return code; + } +} diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/XDomeaNamespacePrefixMapper.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/XDomeaNamespacePrefixMapper.java index 4730cee16db3ad6c5819946deb8e87ebc5389672..81bb3fd6a3188265b05f3d731bd096a6a78ae8b8 100644 --- a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/XDomeaNamespacePrefixMapper.java +++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/XDomeaNamespacePrefixMapper.java @@ -2,10 +2,9 @@ package de.ozgcloud.alfa.export; import java.util.Map; +import org.glassfish.jaxb.runtime.marshaller.NamespacePrefixMapper; import org.springframework.stereotype.Component; -import com.sun.xml.bind.marshaller.NamespacePrefixMapper; - @Component class XDomeaNamespacePrefixMapper extends NamespacePrefixMapper { diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/XDomeaService.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/XDomeaService.java index ad611978adb188d30b09eba5f6aba06126fad8fb..ae924df290489e4851084caec61c45654da41d89 100644 --- a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/XDomeaService.java +++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/XDomeaService.java @@ -1,21 +1,23 @@ package de.ozgcloud.alfa.export; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.nio.charset.StandardCharsets; +import java.util.stream.Stream; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import de.itvsh.kop.common.binaryfile.TempFileUtils; import de.itvsh.kop.common.errorhandling.TechnicalException; +import de.ozgcloud.alfa.common.file.OzgFile; import de.ozgcloud.alfa.vorgang.VorgangController; import de.ozgcloud.alfa.vorgang.VorgangWithEingang; -import de.xoev.xdomea.AbgabeAbgabe0401; -import de.xoev.xdomea.AbgabeAbgabe0401.Schriftgutobjekt; -import de.xoev.xdomea.AnwendungsspezifischeErweiterungType; -import de.xoev.xdomea.VorgangType; @Service class XDomeaService { @@ -24,29 +26,33 @@ class XDomeaService { private static final String EXPORT_FILENAME_TEMPLATE = "%s" + EXPORT_FILENAME_SUFFIX; - @Autowired - private AnwendungsspezifischeErweiterungMapper anwendungsspezifischeErweiterungMapper; - @Autowired private XDomeaXmlMarshaller xDomeaXmlMarshaller; @Autowired private VorgangController vorgangController; + @Autowired + private AbgabeAbgabe0401Creator abgabeCreator; + + @Autowired + private ExportFileService exportFileService; + + @Autowired + private ExportFilenameGenerator exportFilenameGenerator; + public void writeExport(String vorgangId, String filenameId, OutputStream out) { - var vorgang = vorgangController.getVorgang(vorgangId); - try (var zipOutputStream = new ZipOutputStream(out)) { - putZipEntry(buildXmlFilename(filenameId), createXmlContent(vorgang), zipOutputStream); - } catch (IOException ioe) { - throw new TechnicalException("Error creating XDomea zip file", ioe); - } + var exportData = collectExportData(vorgangId, filenameId); + var zipFile = createZipFile(exportData); + writeZipFileContent(zipFile, out); } - void putZipEntry(String fileName, String fileData, ZipOutputStream zipOutputStream) throws IOException { - var entry = new ZipEntry(fileName); - zipOutputStream.putNextEntry(entry); - zipOutputStream.write(fileData.getBytes(StandardCharsets.UTF_8)); - zipOutputStream.closeEntry(); + ExportData collectExportData(String vorgangId, String filenameId) { + var vorgang = vorgangController.getVorgang(vorgangId); + var xmlContent = createXmlContent(vorgang); + var filename = buildXmlFilename(filenameId); + var ozgFiles = exportFileService.getAllPdfs(vorgang.getEingang().getId()); + return ExportData.builder().vorgang(vorgang).xmlFileContent(xmlContent).exportFilename(filename).exportFiles(ozgFiles).build(); } String buildXmlFilename(String filenameId) { @@ -54,26 +60,45 @@ class XDomeaService { } String createXmlContent(VorgangWithEingang vorgang) { - var erweiterung = anwendungsspezifischeErweiterungMapper.map(vorgang); - var abgabe = buildAbgabe(erweiterung); - return xDomeaXmlMarshaller.marshal(abgabe); + return xDomeaXmlMarshaller.marshal(abgabeCreator.create(vorgang)); } - AbgabeAbgabe0401 buildAbgabe(AnwendungsspezifischeErweiterungType erweiterung) { - var root = new AbgabeAbgabe0401(); - root.getSchriftgutobjekt().add(buildSchriftgutobjekt(erweiterung)); - return root; + File createZipFile(ExportData exportData) { + var file = TempFileUtils.createTmpFile().toFile(); + try (var zipOutputStream = new ZipOutputStream(new FileOutputStream(file))) { + putZipEntry(exportData.getExportFilename(), exportData.getXmlFileContent(), zipOutputStream); + putFilesIntoZip(exportData.getExportFiles(), zipOutputStream); + return file; + } catch (Exception e) { + throw new TechnicalException("Error creating XDomea zip file", e); + } } - Schriftgutobjekt buildSchriftgutobjekt(AnwendungsspezifischeErweiterungType erweiterung) { - var schritftgutobjekt = new Schriftgutobjekt(); - schritftgutobjekt.setVorgang(buildVorgangType(erweiterung)); - return schritftgutobjekt; + void putZipEntry(String fileName, String fileData, ZipOutputStream zipOutputStream) throws IOException { + var entry = new ZipEntry(fileName); + zipOutputStream.putNextEntry(entry); + zipOutputStream.write(fileData.getBytes(StandardCharsets.UTF_8)); + zipOutputStream.closeEntry(); } - VorgangType buildVorgangType(AnwendungsspezifischeErweiterungType erweiterung) { - var vorgang = new VorgangType(); - vorgang.setAnwendungsspezifischeErweiterung(erweiterung); - return vorgang; + private void putFilesIntoZip(Stream<OzgFile> ozgFiles, ZipOutputStream zipOutputStream) throws IOException { + for (var ozgFile : ozgFiles.toList()) { + putOzgFileIntoZip(ozgFile, zipOutputStream); + } + } + + void putOzgFileIntoZip(OzgFile ozgFile, ZipOutputStream zipOutputStream) throws IOException { + var entry = new ZipEntry(exportFilenameGenerator.generateExportFilename(ozgFile)); + zipOutputStream.putNextEntry(entry); + exportFileService.writeOzgFile(ozgFile.getId(), zipOutputStream); + zipOutputStream.closeEntry(); + } + + void writeZipFileContent(File file, OutputStream outputStream) { + try (var fileInputStream = new FileInputStream(file)) { + fileInputStream.transferTo(outputStream); + } catch (Exception e) { + throw new TechnicalException("Error writting XDomea zip file to output stream", e); + } } } diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/XDomeaXmlMarshallerConfiguration.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/XDomeaXmlMarshallerConfiguration.java index 964d431c324c4e4af2a063a8dce2d2b473cab7ad..b6b8bd1a0dd4ae9d91e6a8442cb1dc9828da3e4f 100644 --- a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/XDomeaXmlMarshallerConfiguration.java +++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/export/XDomeaXmlMarshallerConfiguration.java @@ -3,7 +3,7 @@ package de.ozgcloud.alfa.export; import java.util.HashMap; import java.util.Map; -import javax.xml.bind.Marshaller; +import jakarta.xml.bind.Marshaller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; @@ -14,7 +14,7 @@ import org.springframework.oxm.jaxb.Jaxb2Marshaller; class XDomeaXmlMarshallerConfiguration { static final boolean JAXB_FORMATTED_OUTPUT = true; - static final String PROPERTY_NAMESPACE_PREFIX_MAPPER = "com.sun.xml.bind.namespacePrefixMapper"; + static final String PROPERTY_NAMESPACE_PREFIX_MAPPER = "org.glassfish.jaxb.namespacePrefixMapper"; static final String CONTEXT_PATH = "de.xoev.xdomea"; @Autowired diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/AbgabeAbgabe0401CreatorTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/AbgabeAbgabe0401CreatorTest.java new file mode 100644 index 0000000000000000000000000000000000000000..f34a7d3b963dfdcecd235f52e49cbf94d6de6bb9 --- /dev/null +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/AbgabeAbgabe0401CreatorTest.java @@ -0,0 +1,66 @@ +package de.ozgcloud.alfa.export; + +import static org.assertj.core.api.Assertions.*; +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.InjectMocks; +import org.mockito.Mock; + +import de.ozgcloud.alfa.vorgang.VorgangWithEingang; +import de.ozgcloud.alfa.vorgang.VorgangWithEingangTestFactory; +import de.xoev.xdomea.AbgabeAbgabe0401.Schriftgutobjekt; +import de.xoev.xdomea.AnwendungsspezifischeErweiterungType; + +class AbgabeAbgabe0401CreatorTest { + + @InjectMocks + private AbgabeAbgabe0401Creator creator; + + @Mock + private SchriftgutobjektCreator schriftgutobjektCreator; + + @Mock + private AnwendungsspezifischeErweiterungTypeCreator anwendungsspezifischeErweiterungTypeCreator; + + @Nested + class TestCreate { + + private final VorgangWithEingang vorgangWithEingang = VorgangWithEingangTestFactory.create(); + + private final AnwendungsspezifischeErweiterungType anwendungsspezifischeErweiterung = AnwendungsspezifischeErweiterungTypeTestFactory.create(); + private final Schriftgutobjekt schriftgutobjekt = SchriftgutobjektTestFactory.create(); + + @BeforeEach + void init() { + when(anwendungsspezifischeErweiterungTypeCreator.create(vorgangWithEingang)).thenReturn( + anwendungsspezifischeErweiterung); + } + + @Test + void shouldCallMapper() { + creator.create(vorgangWithEingang); + + verify(anwendungsspezifischeErweiterungTypeCreator).create(vorgangWithEingang); + } + + @Test + void shouldCreateSchriftgutobjekt() { + creator.create(vorgangWithEingang); + + verify(schriftgutobjektCreator).create(vorgangWithEingang, anwendungsspezifischeErweiterung); + } + + @Test + void shouldHaveSchriftgutobjekt() { + doReturn(schriftgutobjekt).when(schriftgutobjektCreator).create(vorgangWithEingang, anwendungsspezifischeErweiterung); + + var abgabe = creator.create(vorgangWithEingang); + + assertThat(abgabe.getSchriftgutobjekt().get(0)).isEqualTo(schriftgutobjekt); + } + } + +} \ No newline at end of file diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/AllgemeineMetadatenTypeTestFactory.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/AllgemeineMetadatenTypeTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..380ee3058d81429d22396a87b9d0f5948623419a --- /dev/null +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/AllgemeineMetadatenTypeTestFactory.java @@ -0,0 +1,10 @@ +package de.ozgcloud.alfa.export; + +import de.xoev.xdomea.AllgemeineMetadatenType; + +public class AllgemeineMetadatenTypeTestFactory { + + public static AllgemeineMetadatenType create() { + return new AllgemeineMetadatenType(); + } +} diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/AnwendungsspezifischeErweiterungMapperTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/AnwendungsspezifischeErweiterungMapperTest.java deleted file mode 100644 index b8678afc8b4cd313b334831f1d42d8ce1ddf070f..0000000000000000000000000000000000000000 --- a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/AnwendungsspezifischeErweiterungMapperTest.java +++ /dev/null @@ -1,73 +0,0 @@ -package de.ozgcloud.alfa.export; - -import static org.assertj.core.api.Assertions.*; -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.mapstruct.factory.Mappers; -import org.mockito.InjectMocks; -import org.mockito.Mock; - -import de.ozgcloud.alfa.export.AnwendungsspezifischeErweiterungMapper; -import de.ozgcloud.alfa.export.FeldGruppeMapper; -import de.ozgcloud.alfa.vorgang.VorgangWithEingang; -import de.ozgcloud.alfa.vorgang.VorgangWithEingangTestFactory; -import de.xoev.xdomea.AnwendungsspezifischeErweiterungType; -import de.xoev.xdomea.FeldgruppeType; - -class AnwendungsspezifischeErweiterungMapperTest { - - @InjectMocks - private AnwendungsspezifischeErweiterungMapper mapper = Mappers.getMapper(AnwendungsspezifischeErweiterungMapper.class); - - @Mock - private FeldGruppeMapper feldGruppeMapper; - - @Nested - class TestMap { - - private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create(); - private FeldgruppeType feldgruppeType; - - @BeforeEach - void init() { - feldgruppeType = new FeldgruppeType(); - when(feldGruppeMapper.map(vorgang)).thenReturn(feldgruppeType); - } - - @Test - void shouldHaveKennung() { - var mapped = callMapper(); - - assertThat(mapped.getKennung()).isEqualTo(AnwendungsspezifischeErweiterungMapper.KENNUNG); - } - - @Test - void shouldHaveName() { - var mapped = callMapper(); - - assertThat(mapped.getName()).isEqualTo(AnwendungsspezifischeErweiterungMapper.NAME); - } - - @Test - void shouldCallFeldgrupperMapper() { - callMapper(); - - verify(feldGruppeMapper).map(vorgang); - } - - @Test - void shouldHaveFeldGruppe() { - var mapped = callMapper(); - - assertThat(mapped.getFeldgruppe()).hasSize(1).first().isEqualTo(feldgruppeType); - } - - private AnwendungsspezifischeErweiterungType callMapper() { - return mapper.map(vorgang); - } - } - -} \ No newline at end of file diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/AnwendungsspezifischeErweiterungTypeCreatorTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/AnwendungsspezifischeErweiterungTypeCreatorTest.java new file mode 100644 index 0000000000000000000000000000000000000000..db766c5063ef4154d736187bad2d8326211b6483 --- /dev/null +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/AnwendungsspezifischeErweiterungTypeCreatorTest.java @@ -0,0 +1,71 @@ +package de.ozgcloud.alfa.export; + +import static org.assertj.core.api.Assertions.*; +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.InjectMocks; +import org.mockito.Mock; +import org.mockito.Spy; + +import de.ozgcloud.alfa.vorgang.VorgangWithEingang; +import de.ozgcloud.alfa.vorgang.VorgangWithEingangTestFactory; +import de.xoev.xdomea.AnwendungsspezifischeErweiterungType; +import de.xoev.xdomea.FeldgruppeType; + +class AnwendungsspezifischeErweiterungTypeCreatorTest { + + @Spy + @InjectMocks + private AnwendungsspezifischeErweiterungTypeCreator creator; + + @Mock + private FeldGruppeTypeCreator feldGruppeTypeCreator; + + @Nested + class TestCreate { + + private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create(); + private final FeldgruppeType feldgruppeType = new FeldgruppeType(); + + @BeforeEach + void init() { + when(feldGruppeTypeCreator.create(vorgang)).thenReturn(feldgruppeType); + } + + @Test + void shouldHaveKennung() { + var anwendungsspezifischeErweiterung = create(); + + assertThat(anwendungsspezifischeErweiterung.getKennung()).isEqualTo(AnwendungsspezifischeErweiterungTypeCreator.KENNUNG); + } + + @Test + void shouldHaveName() { + var anwendungsspezifischeErweiterung = create(); + + assertThat(anwendungsspezifischeErweiterung.getName()).isEqualTo(AnwendungsspezifischeErweiterungTypeCreator.NAME); + } + + @Test + void shouldCallFeldgrupperMapper() { + create(); + + verify(feldGruppeTypeCreator).create(vorgang); + } + + @Test + void shouldHaveFeldGruppe() { + var anwendungsspezifischeErweiterung = create(); + + assertThat(anwendungsspezifischeErweiterung.getFeldgruppe()).hasSize(1).first().isEqualTo(feldgruppeType); + } + + private AnwendungsspezifischeErweiterungType create() { + return creator.create(vorgang); + } + } + +} \ No newline at end of file diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/DateConverterTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/DateConverterTest.java new file mode 100644 index 0000000000000000000000000000000000000000..c296eff263a96f41fe254f6fdfe07e8520766a16 --- /dev/null +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/DateConverterTest.java @@ -0,0 +1,72 @@ +package de.ozgcloud.alfa.export; + +import static org.assertj.core.api.Assertions.*; + +import java.util.Optional; + +import javax.xml.datatype.DatatypeConfigurationException; +import javax.xml.datatype.DatatypeFactory; +import javax.xml.datatype.XMLGregorianCalendar; + +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.InjectMocks; +import org.mockito.MockedStatic; +import org.mockito.Mockito; + +import de.itvsh.kop.common.errorhandling.TechnicalException; + +class DateConverterTest { + + @InjectMocks + private DateConverter converter; + + @Nested + class TestConvertGermanFormatToISO { + + private static final int YEAR = 2023; + private static final int MONTH = 2; + private static final int DAY = 14; + + private static final String DATE = String.format("%s.%s%s.%s", DAY, 0, MONTH, YEAR); + + @Test + void shouldConvert() { + var converted = callConverter(DATE); + + assertThat(converted).get().extracting(XMLGregorianCalendar::getYear, XMLGregorianCalendar::getMonth, XMLGregorianCalendar::getDay) + .containsExactly(YEAR, MONTH, DAY); + } + + @ParameterizedTest + @ValueSource(strings = { "2005-10-10", "abc", "19. February 1970", " ", "" }) + void shouldReturnEmpty(String dateStr) { + var converted = callConverter(dateStr); + + assertThat(converted).isEmpty(); + } + + @Test + void shouldReturnEmptyIfDateIsNull() { + var converted = callConverter(null); + + assertThat(converted).isEmpty(); + } + + @Test + void shouldThrowTechnicalException() { + try (MockedStatic<DatatypeFactory> datatypeFactory = Mockito.mockStatic(DatatypeFactory.class)) { + datatypeFactory.when(DatatypeFactory::newInstance).thenThrow(DatatypeConfigurationException.class); + + assertThatThrownBy(() -> callConverter(DATE)).isInstanceOf(TechnicalException.class); + } + } + + private Optional<XMLGregorianCalendar> callConverter(String dateStr) { + return converter.convertGermanFormatToISO(dateStr); + } + } + +} \ No newline at end of file diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/DateiformatCodeTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/DateiformatCodeTest.java new file mode 100644 index 0000000000000000000000000000000000000000..8fefefe8e4ae869abfc6a4242d233accb64cdef4 --- /dev/null +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/DateiformatCodeTest.java @@ -0,0 +1,35 @@ +package de.ozgcloud.alfa.export; + +import static org.assertj.core.api.Assertions.*; + +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +class DateiformatCodeTest { + + @Nested + class TestCreateDateiformatCodeType { + + @Test + void shouldHaveCode() { + var dateiformatCode = DateiformatCode.PDF.createDateiformatCodeType(); + + assertThat(dateiformatCode.getCode()).isEqualTo(DateiformatCode.PDF.code); + } + + @Test + void shouldHaveListURI() { + var dateiformatCode = DateiformatCode.PDF.createDateiformatCodeType(); + + assertThat(dateiformatCode.getListURI()).isEqualTo(DateiformatCode.LIST_URI); + } + + @Test + void shouldHaveListVersionID() { + var dateiformatCode = DateiformatCode.PDF.createDateiformatCodeType(); + + assertThat(dateiformatCode.getListVersionID()).isEqualTo(DateiformatCode.PDF.listVersionID); + } + } + +} \ No newline at end of file diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/DokumentTypeCreatorTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/DokumentTypeCreatorTest.java new file mode 100644 index 0000000000000000000000000000000000000000..45015d4e9a5f95dd66bf6bc57c7e4f3970067425 --- /dev/null +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/DokumentTypeCreatorTest.java @@ -0,0 +1,228 @@ +package de.ozgcloud.alfa.export; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; + +import java.util.stream.Stream; + +import org.apache.commons.lang3.StringUtils; +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 org.mockito.Spy; + +import de.ozgcloud.alfa.common.TestUtils; +import de.ozgcloud.alfa.common.file.OzgFile; +import de.ozgcloud.alfa.common.file.OzgFileTestFactory; +import de.ozgcloud.alfa.vorgang.EingangTestFactory; +import de.ozgcloud.alfa.vorgang.VorgangWithEingang; +import de.ozgcloud.alfa.vorgang.VorgangWithEingangTestFactory; +import de.xoev.xdomea.AllgemeineMetadatenType; +import de.xoev.xdomea.DokumentType; +import de.xoev.xdomea.IdentifikationObjektType; +import de.xoev.xdomea.VersionType; + +class DokumentTypeCreatorTest { + + @Spy + @InjectMocks + private DokumentTypeCreator creator; + + @Mock + private ExportFileService exportFileService; + + @Mock + private UUIDConverter uuidConverter; + + @Mock + private VersionTypeCreator versionTypeCreator; + + @Nested + class TestCreate { + + @Nested + class WhenAllVorgangDataAvailable { + private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create(); + private final OzgFile ozgFile = OzgFileTestFactory.create(); + + @BeforeEach + void init() { + when(exportFileService.getAllPdfs(EingangTestFactory.ID)).thenReturn(Stream.of(ozgFile)); + } + + @Test + void shouldLoadlAllPdfs() { + creator.create(vorgang); + + verify(exportFileService).getAllPdfs(EingangTestFactory.ID); + } + + @Test + void shouldCreateDokumentType() { + creator.create(vorgang); + + verify(creator).createDokumentType(1, vorgang, ozgFile); + } + } + + @Nested + class WhenEingangIsNull { + + @Test + void shouldNotLoadAnyPdf() { + creator.create(VorgangWithEingang.builder().eingang(null).build()); + + verify(exportFileService, never()).getAllPdfs(EingangTestFactory.ID); + } + + @Test + void shouldReturnEmptyStreamIfEingangNull() { + var result = creator.create(VorgangWithEingang.builder().eingang(null).build()); + + assertThat(result).isEmpty(); + } + } + + } + + @Nested + class CreateDokumentType { + + private final IdentifikationObjektType identifikationObjekt = IdentifikationObjektTypeTestFactory.create(); + private final AllgemeineMetadatenType allgemeineMetadaten = AllgemeineMetadatenTypeTestFactory.create(); + private final OzgFile ozgFile = OzgFileTestFactory.create(); + private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create(); + private final VersionType version = VersionTypeTestFactory.create(); + private final int DOKUMENT_ORDINAL_NUMBER = 1; + + @BeforeEach + void init() { + doReturn(identifikationObjekt).when(creator).createIdentifikation(DOKUMENT_ORDINAL_NUMBER, OzgFileTestFactory.ID.toString()); + doReturn(allgemeineMetadaten).when(creator).createAllgemeineMetadaten(ozgFile); + + when(versionTypeCreator.create(vorgang, ozgFile)).thenReturn(version); + } + + @Test + void shouldCreateIdentifikation() { + create(); + + verify(creator).createIdentifikation(DOKUMENT_ORDINAL_NUMBER, OzgFileTestFactory.ID.toString()); + } + + @Test + void shouldHaveIdentifikation() { + var dokument = create(); + + assertThat(dokument.getIdentifikation()).isEqualTo(identifikationObjekt); + } + + @Test + void shouldCreateAllgemeineMetadaten() { + create(); + + verify(creator).createAllgemeineMetadaten(ozgFile); + } + + @Test + void shouldHaveAllgemeineMetadaten() { + var dokument = create(); + + assertThat(dokument.getAllgemeineMetadaten()).isEqualTo(allgemeineMetadaten); + } + + @Test + void shouldCreateVersion() { + create(); + + verify(versionTypeCreator).create(vorgang, ozgFile); + } + + @Test + void shouldHaveVersion() { + var dokument = create(); + + assertThat(dokument.getVersion()).containsExactly(version); + } + + private DokumentType create() { + return creator.createDokumentType(DOKUMENT_ORDINAL_NUMBER, vorgang, ozgFile); + } + } + + @Nested + class TestCreateIdentifikation { + + private final String FILE_ID = "64a820d36285172ac02826d0"; + private final String FILE_UUID = "64a820d3-6285-172a-c028-0000000026d0"; + private final int DOKUMENT_ORDINAL_NUMBER = 1; + + @BeforeEach + void init() { + when(uuidConverter.fromObjectId(FILE_ID)).thenReturn(FILE_UUID); + } + + @Test + void shouldConvertObjectId() { + create(); + + verify(uuidConverter).fromObjectId(FILE_ID); + } + + @Test + void shouldHaveId() { + var identifikation = create(); + + assertThat(identifikation.getID()).matches(TestUtils.UUID_REGEX).isEqualTo(FILE_UUID); + } + + @Test + void shouldHaveNummerImUebergeordnetenContainer() { + var identifikation = create(); + + assertThat(identifikation.getNummerImUebergeordnetenContainer()).isEqualTo(DOKUMENT_ORDINAL_NUMBER); + } + + private IdentifikationObjektType create() { + return creator.createIdentifikation(DOKUMENT_ORDINAL_NUMBER, FILE_ID); + } + } + + @Nested + class TestCreateAllgemeineMetadaten { + + private final OzgFile ozgFile = OzgFileTestFactory.create(); + + @Test + void shouldHaveBetreff() { + var allgemeineMetadaten = creator.createAllgemeineMetadaten(ozgFile); + + assertThat(allgemeineMetadaten.getBetreff()).isEqualTo(OzgFileTestFactory.NAME); + } + + @Test + void shouldHaveKennzeichen() { + var allgemeineMetadaten = creator.createAllgemeineMetadaten(ozgFile); + + assertThat(allgemeineMetadaten.getKennzeichen()).isEmpty(); + } + + @Test + void shouldHaveBemerkung() { + var allgemeineMetadaten = creator.createAllgemeineMetadaten(ozgFile); + + assertThat(allgemeineMetadaten.getBemerkung()).isEmpty(); + } + + @Test + void shouldHaveMedium() { + var allgemeineMetadaten = creator.createAllgemeineMetadaten(ozgFile); + + assertThat(allgemeineMetadaten.getMedium().getCode()).isEqualTo(VorgangTypeCreator.ALLGEMEINE_METADATEN_MEDIUM_CODE); + } + + } + +} \ No newline at end of file diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/DokumentTypeTestFactory.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/DokumentTypeTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..8de8ed3e01318e4883481d704d6db97012b0c708 --- /dev/null +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/DokumentTypeTestFactory.java @@ -0,0 +1,11 @@ +package de.ozgcloud.alfa.export; + +import de.xoev.xdomea.DokumentType; + +public class DokumentTypeTestFactory { + + public static DokumentType create() { + var dokument = new DokumentType(); + return dokument; + } +} diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/ExportDataTestFactory.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/ExportDataTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..2be3ee462e90de9997dff74f5b9d145cbb873256 --- /dev/null +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/ExportDataTestFactory.java @@ -0,0 +1,25 @@ +package de.ozgcloud.alfa.export; + +import java.util.stream.Stream; + +import de.ozgcloud.alfa.common.file.OzgFile; +import de.ozgcloud.alfa.common.file.OzgFileTestFactory; +import de.ozgcloud.alfa.vorgang.VorgangWithEingang; +import de.ozgcloud.alfa.vorgang.VorgangWithEingangTestFactory; + +class ExportDataTestFactory { + + public static final String EXPORT_FILENAME = "file.zip"; + public static final String XML_FILE_CONTENT = "<xml></xml>"; + public static final OzgFile OZG_FILE = OzgFileTestFactory.create(); + public static final VorgangWithEingang VORGANG = VorgangWithEingangTestFactory.create(); + + public static ExportData create() { + return createBuilder().build(); + } + + public static ExportData.ExportDataBuilder createBuilder() { + return ExportData.builder().exportFilename(EXPORT_FILENAME).xmlFileContent(XML_FILE_CONTENT).vorgang(VORGANG) + .exportFiles(Stream.of(OZG_FILE)); + } +} diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/ExportFileServiceTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/ExportFileServiceTest.java new file mode 100644 index 0000000000000000000000000000000000000000..45d3e64f283d9140299ec72e58659f7e1a743fa9 --- /dev/null +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/ExportFileServiceTest.java @@ -0,0 +1,87 @@ +package de.ozgcloud.alfa.export; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; + +import java.io.OutputStream; +import java.util.stream.Stream; + +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 org.springframework.http.MediaType; + +import de.ozgcloud.alfa.common.binaryfile.BinaryFileService; +import de.ozgcloud.alfa.common.binaryfile.FileId; +import de.ozgcloud.alfa.common.file.OzgFile; +import de.ozgcloud.alfa.common.file.OzgFileService; +import de.ozgcloud.alfa.common.file.OzgFileTestFactory; +import de.ozgcloud.alfa.vorgang.EingangTestFactory; + +class ExportFileServiceTest { + + @InjectMocks + private ExportFileService service; + + @Mock + private OzgFileService ozgFileService; + + @Mock + private BinaryFileService binaryFileService; + + @Nested + class TestGetAllPdfs { + + private final OzgFile representationPdfFile = OzgFileTestFactory.createBuilder().contentType(MediaType.APPLICATION_PDF_VALUE).build(); + private final OzgFile representationXmlFile = OzgFileTestFactory.createBuilder().contentType(MediaType.TEXT_XML_VALUE).build(); + private final OzgFile attachmentPdfFile = OzgFileTestFactory.createBuilder().contentType(MediaType.APPLICATION_PDF_VALUE).build(); + private final OzgFile attachmentXmlFile = OzgFileTestFactory.createBuilder().contentType(MediaType.TEXT_XML_VALUE).build(); + + @BeforeEach + void init() { + when(ozgFileService.getRepresentationsByEingang(EingangTestFactory.ID)).thenReturn( + Stream.of(representationPdfFile, representationXmlFile)); + when(ozgFileService.getAttachmentsByEingang(EingangTestFactory.ID)).thenReturn(Stream.of(attachmentXmlFile, attachmentPdfFile)); + } + + @Test + void shouldLoadRepresentations() { + service.getAllPdfs(EingangTestFactory.ID); + + verify(ozgFileService).getRepresentationsByEingang(EingangTestFactory.ID); + } + + @Test + void shouldLoadAttachments() { + service.getAllPdfs(EingangTestFactory.ID); + + verify(ozgFileService).getAttachmentsByEingang(EingangTestFactory.ID); + } + + @Test + void shouldReturnPdfs() { + var ozgFiles = service.getAllPdfs(EingangTestFactory.ID); + + assertThat(ozgFiles).hasSize(2).containsExactlyInAnyOrder(attachmentPdfFile, representationPdfFile); + } + } + + @Nested + class TestWriteOzgFile { + + private final FileId fileId = OzgFileTestFactory.ID; + + @Mock + private OutputStream outputStream; + + @Test + void shouldCallBinaryFileService() { + service.writeOzgFile(fileId, outputStream); + + verify(binaryFileService).writeFileContent(fileId, outputStream); + } + } + +} \ No newline at end of file diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/ExportFilenameGeneratorTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/ExportFilenameGeneratorTest.java new file mode 100644 index 0000000000000000000000000000000000000000..66d6480e708665d465935f20010c1bdc5cba38f6 --- /dev/null +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/ExportFilenameGeneratorTest.java @@ -0,0 +1,55 @@ +package de.ozgcloud.alfa.export; + +import static org.assertj.core.api.Assertions.*; +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.InjectMocks; +import org.mockito.Mock; + +import de.ozgcloud.alfa.common.TestUtils; +import de.ozgcloud.alfa.common.file.OzgFile; +import de.ozgcloud.alfa.common.file.OzgFileTestFactory; + +class ExportFilenameGeneratorTest { + + @InjectMocks + private ExportFilenameGenerator generator; + + @Mock + private UUIDConverter uuidConverter; + + @Nested + class TestGenerateExportFilename { + + private static final String UUID = "64a820d3-6285-172a-c028-0000000026d0"; + + private final OzgFile ozgFile = OzgFileTestFactory.create(); + + @BeforeEach + void init() { + when(uuidConverter.fromObjectId(ozgFile.getId().toString())).thenReturn(UUID); + } + + @Test + void shouldConvertObjectId() { + callGenerator(); + + verify(uuidConverter).fromObjectId(ozgFile.getId().toString()); + } + + @Test + void shouldGenerate() { + var filename = callGenerator(); + + assertThat(filename).matches(String.format("^%s_%s$", TestUtils.UUID_REGEX, ozgFile.getName())); + } + + private String callGenerator() { + return generator.generateExportFilename(ozgFile); + } + } + +} \ No newline at end of file diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/FeldGruppeMapperTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/FeldGruppeMapperTest.java deleted file mode 100644 index 615b82eb51b1200c527e58d7838419e423a1c17b..0000000000000000000000000000000000000000 --- a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/FeldGruppeMapperTest.java +++ /dev/null @@ -1,415 +0,0 @@ -package de.ozgcloud.alfa.export; - -import static org.assertj.core.api.Assertions.*; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mapstruct.factory.Mappers; - -import de.ozgcloud.alfa.export.DatentypCode; -import de.ozgcloud.alfa.export.ExportFelder; -import de.ozgcloud.alfa.export.FeldGruppeMapper; -import de.ozgcloud.alfa.vorgang.AntragstellerTestFactory; -import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory; -import de.ozgcloud.alfa.vorgang.VorgangWithEingang; -import de.ozgcloud.alfa.vorgang.VorgangWithEingangTestFactory; -import de.xoev.xdomea.DatentypCodeType; -import de.xoev.xdomea.FeldType; - -class FeldGruppeMapperTest { - - private FeldGruppeMapper mapper = Mappers.getMapper(FeldGruppeMapper.class); - - @DisplayName("Map") - @Nested - class TestMap { - - private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create(); - - @Test - void shouldHaveName() { - var mapped = mapper.map(vorgang); - - assertThat(mapped.getName()).isEqualTo("FeldgruppeOZGCloudBasis"); - } - - @Test - void shouldHaveBeschreibung() { - var mapped = mapper.map(vorgang); - - assertThat(mapped.getBeschreibung()).isEqualTo("Feldgruppe für OZGCloud Basis"); - } - } - - @DisplayName("Map to felder") - @Nested - class TestMapToFelder { - - private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create(); - - @DisplayName("LeikaId") - @Nested - class TestLeikaId { - - @Test - void shouldHaveName() { - var mapped = mapLeikaID(); - - assertThat(mapped).extracting(FeldType::getName).isEqualTo("LeikaID"); - } - - @Test - void shouldHaveBeschreibung() { - var mapped = mapLeikaID(); - - assertThat(mapped).extracting(FeldType::getBeschreibung).isEqualTo("ID einer Leistung aus dem OZG-Leistungskatalog"); - } - - @Test - void shouldHaveWert() { - var mapped = mapLeikaID(); - - assertThat(mapped).extracting(FeldType::getWert).isNull(); - } - - @DisplayName("DatentypCode") - @Nested - class TestDatentypCode { - - @Test - void shouldHaveCode() { - var mapped = mapLeikaID(); - - assertThat(mapped).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getCode) - .isEqualTo(DatentypCode.STRING.getCode()); - } - - @Test - void shouldHaveListURI() { - var mapped = mapLeikaID(); - - assertThat(mapped).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getListURI) - .isEqualTo("urn:xoev-de:xdomea:codeliste:datentyp"); - } - - @Test - void shouldHaveListVersionID() { - var mapped = mapLeikaID(); - - assertThat(mapped).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getListVersionID).isEqualTo("1.1"); - } - - } - - private FeldType mapLeikaID() { - return mapper.mapToFelder(vorgang).stream() - .filter(feldType -> feldType.getName().equals(ExportFelder.LEIKA_ID.getName())) - .toList().get(0); - } - } - - @DisplayName("Datum Antragseingang") - @Nested - class TestDatumAntragseingang { - - @Test - void shouldHaveName() { - var mapped = mapDatumAntragseingang(); - - assertThat(mapped).extracting(FeldType::getName).isEqualTo("DatumAntragseingang"); - } - - @Test - void shouldHaveBeschreibung() { - var mapped = mapDatumAntragseingang(); - - assertThat(mapped).extracting(FeldType::getBeschreibung).isEqualTo("Das Datum des Antragseingangs"); - } - - @Test - void shouldHaveWert() { - var mapped = mapDatumAntragseingang(); - - assertThat(mapped).extracting(FeldType::getWert).isEqualTo(VorgangHeaderTestFactory.CREATED_AT_STR); - } - - @DisplayName("DatentypCode") - @Nested - class TestDatentypCode { - - @Test - void shouldHaveCode() { - var mapped = mapDatumAntragseingang(); - - assertThat(mapped).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getCode).isEqualTo(DatentypCode.DATE.getCode()); - } - - @Test - void shouldHaveListURI() { - var mapped = mapDatumAntragseingang(); - - assertThat(mapped).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getListURI) - .isEqualTo("urn:xoev-de:xdomea:codeliste:datentyp"); - } - - @Test - void shouldHaveListVersionID() { - var mapped = mapDatumAntragseingang(); - - assertThat(mapped).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getListVersionID).isEqualTo("1.1"); - } - - } - - private FeldType mapDatumAntragseingang() { - return mapper.mapToFelder(vorgang).stream() - .filter(feldType -> feldType.getName().equals(ExportFelder.DATUM_ANTRAGSEINGANG.getName())) - .toList().get(0); - } - } - - @DisplayName("Name") - @Nested - class TestName { - - @Test - void shouldHaveName() { - var mapped = mapName(); - - assertThat(mapped).extracting(FeldType::getName).isEqualTo("Name"); - } - - @Test - void shouldNotHaveBeschreibung() { - var mapped = mapName(); - - assertThat(mapped).extracting(FeldType::getBeschreibung).isNull(); - } - - @Test - void shouldHaveWert() { - var mapped = mapName(); - - assertThat(mapped).extracting(FeldType::getWert).isEqualTo(AntragstellerTestFactory.NACHNAME); - } - - @DisplayName("DatentypCode") - @Nested - class TestDatentypCode { - - @Test - void shouldHaveCode() { - var mapped = mapName(); - - assertThat(mapped).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getCode) - .isEqualTo(DatentypCode.STRING.getCode()); - } - - @Test - void shouldHaveListURI() { - var mapped = mapName(); - - assertThat(mapped).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getListURI) - .isEqualTo("urn:xoev-de:xdomea:codeliste:datentyp"); - } - - @Test - void shouldHaveListVersionID() { - var mapped = mapName(); - - assertThat(mapped).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getListVersionID).isEqualTo("1.1"); - } - - } - - private FeldType mapName() { - return mapper.mapToFelder(vorgang).stream() - .filter(feldType -> feldType.getName().equals(ExportFelder.NAME.getName())) - .toList().get(0); - } - } - - @DisplayName("Vorname") - @Nested - class TestVorname { - - @Test - void shouldHaveName() { - var mapped = mapVorname(); - - assertThat(mapped).extracting(FeldType::getName).isEqualTo("Vorname"); - } - - @Test - void shouldHaveNotHaveBeschreibung() { - var mapped = mapVorname(); - - assertThat(mapped).extracting(FeldType::getBeschreibung).isNull(); - } - - @Test - void shouldHaveWert() { - var mapped = mapVorname(); - - assertThat(mapped).extracting(FeldType::getWert).isEqualTo(AntragstellerTestFactory.VORNAME); - } - - @DisplayName("DatentypCode") - @Nested - class TestDatentypCode { - - @Test - void shouldHaveCode() { - var mapped = mapVorname(); - - assertThat(mapped).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getCode) - .isEqualTo(DatentypCode.STRING.getCode()); - } - - @Test - void shouldHaveListURI() { - var mapped = mapVorname(); - - assertThat(mapped).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getListURI) - .isEqualTo("urn:xoev-de:xdomea:codeliste:datentyp"); - } - - @Test - void shouldHaveListVersionID() { - var mapped = mapVorname(); - - assertThat(mapped).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getListVersionID).isEqualTo("1.1"); - } - - } - - private FeldType mapVorname() { - return mapper.mapToFelder(vorgang).stream() - .filter(feldType -> feldType.getName().equals(ExportFelder.VORNAME.getName())) - .toList().get(0); - } - } - - @DisplayName("Geburtsdatum") - @Nested - class TestGeburtsdatum { - - @Test - void shouldHaveName() { - var mapped = mapGeburtsdatum(); - - assertThat(mapped).extracting(FeldType::getName).isEqualTo("Geburtsdatum"); - } - - @Test - void shouldHaveNotHaveBeschreibung() { - var mapped = mapGeburtsdatum(); - - assertThat(mapped).extracting(FeldType::getBeschreibung).isNull(); - } - - @Test - void shouldHaveWert() { - var mapped = mapGeburtsdatum(); - - assertThat(mapped).extracting(FeldType::getWert).isEqualTo(AntragstellerTestFactory.GEBURTSDATUM_STR); - } - - @DisplayName("DatentypCode") - @Nested - class TestDatentypCode { - - @Test - void shouldHaveCode() { - var mapped = mapGeburtsdatum(); - - assertThat(mapped).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getCode).isEqualTo(DatentypCode.DATE.getCode()); - } - - @Test - void shouldHaveListURI() { - var mapped = mapGeburtsdatum(); - - assertThat(mapped).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getListURI) - .isEqualTo("urn:xoev-de:xdomea:codeliste:datentyp"); - } - - @Test - void shouldHaveListVersionID() { - var mapped = mapGeburtsdatum(); - - assertThat(mapped).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getListVersionID).isEqualTo("1.1"); - } - - } - - private FeldType mapGeburtsdatum() { - return mapper.mapToFelder(vorgang).stream() - .filter(feldType -> feldType.getName().equals(ExportFelder.GEBURTSDATUM.getName())) - .toList().get(0); - } - } - - @DisplayName("Plz") - @Nested - class TestPlz { - - @Test - void shouldHaveName() { - var mapped = mapPlz(); - - assertThat(mapped).extracting(FeldType::getName).isEqualTo("PLZAntragsteller"); - } - - @Test - void shouldHaveNotHaveBeschreibung() { - var mapped = mapPlz(); - - assertThat(mapped).extracting(FeldType::getBeschreibung).isNull(); - } - - @Test - void shouldHaveWert() { - var mapped = mapPlz(); - - assertThat(mapped).extracting(FeldType::getWert).isEqualTo(AntragstellerTestFactory.PLZ); - } - - @DisplayName("DatentypCode") - @Nested - class TestDatentypCode { - - @Test - void shouldHaveCode() { - var mapped = mapPlz(); - - assertThat(mapped).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getCode) - .isEqualTo(DatentypCode.STRING.getCode()); - } - - @Test - void shouldHaveListURI() { - var mapped = mapPlz(); - - assertThat(mapped).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getListURI) - .isEqualTo("urn:xoev-de:xdomea:codeliste:datentyp"); - } - - @Test - void shouldHaveListVersionID() { - var mapped = mapPlz(); - - assertThat(mapped).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getListVersionID).isEqualTo("1.1"); - } - - } - - private FeldType mapPlz() { - return mapper.mapToFelder(vorgang).stream() - .filter(feldType -> feldType.getName().equals(ExportFelder.PLZ.getName())) - .toList().get(0); - } - } - } -} \ No newline at end of file diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/FeldGruppeTypeCreatorTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/FeldGruppeTypeCreatorTest.java new file mode 100644 index 0000000000000000000000000000000000000000..2ca1494a2bd482efb4d3fd9a3deb931ad8ec1b8b --- /dev/null +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/FeldGruppeTypeCreatorTest.java @@ -0,0 +1,531 @@ +package de.ozgcloud.alfa.export; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; + +import org.apache.commons.lang3.StringUtils; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.mockito.Spy; + +import de.ozgcloud.alfa.vorgang.AntragstellerTestFactory; +import de.ozgcloud.alfa.vorgang.EingangTestFactory; +import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory; +import de.ozgcloud.alfa.vorgang.VorgangWithEingang; +import de.ozgcloud.alfa.vorgang.VorgangWithEingangTestFactory; +import de.xoev.xdomea.DatentypCodeType; +import de.xoev.xdomea.FeldType; + +class FeldGruppeTypeCreatorTest { + + @Spy + private FeldGruppeTypeCreator creator; + + @Nested + class TestCreate { + + private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create(); + + @Test + void shouldHaveName() { + var created = creator.create(vorgang); + + assertThat(created.getName()).isEqualTo("FeldgruppeOZGCloudBasis"); + } + + @Test + void shouldHaveBeschreibung() { + var created = creator.create(vorgang); + + assertThat(created.getBeschreibung()).isEqualTo("Feldgruppe für OZGCloud Basis"); + } + + @Test + void shouldCreateFeldType() { + creator.create(vorgang); + + verify(creator).createFeldType(vorgang); + } + } + + @Nested + class TestCreateFeldType { + + private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create(); + + @DisplayName("LeikaId") + @Nested + class TestLeikaId { + + @Test + void shouldHaveName() { + var created = create(); + + assertThat(created).extracting(FeldType::getName).isEqualTo("LeikaID"); + } + + @Test + void shouldHaveBeschreibung() { + var created = create(); + + assertThat(created).extracting(FeldType::getBeschreibung).isEqualTo("ID einer Leistung aus dem OZG-Leistungskatalog"); + } + + @Test + void shouldHaveWert() { + var created = create(); + + assertThat(created).extracting(FeldType::getWert).isNull(); + } + + @DisplayName("DatentypCode") + @Nested + class TestDatentypCode { + + @Test + void shouldHaveCode() { + var created = create(); + + assertThat(created).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getCode) + .isEqualTo(DatentypCode.STRING.getCode()); + } + + @Test + void shouldHaveListURI() { + var created = create(); + + assertThat(created).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getListURI) + .isEqualTo("urn:xoev-de:xdomea:codeliste:datentyp"); + } + + @Test + void shouldHaveListVersionID() { + var created = create(); + + assertThat(created).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getListVersionID).isEqualTo("1.1"); + } + + } + + private FeldType create() { + return creator.createFeldType(vorgang).stream() + .filter(feldType -> feldType.getName().equals(ExportFelder.LEIKA_ID.getName())) + .toList().get(0); + } + } + + @DisplayName("Datum Antragseingang") + @Nested + class TestDatumAntragseingang { + + @Test + void shouldHaveName() { + var created = create(); + + assertThat(created).extracting(FeldType::getName).isEqualTo("DatumAntragseingang"); + } + + @Test + void shouldHaveBeschreibung() { + var created = create(); + + assertThat(created).extracting(FeldType::getBeschreibung).isEqualTo("Das Datum des Antragseingangs"); + } + + @Test + void shouldHaveWert() { + var created = create(); + + assertThat(created).extracting(FeldType::getWert).isEqualTo(VorgangHeaderTestFactory.CREATED_AT_STR); + } + + @DisplayName("DatentypCode") + @Nested + class TestDatentypCode { + + @Test + void shouldHaveCode() { + var created = create(); + + assertThat(created).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getCode) + .isEqualTo(DatentypCode.DATE.getCode()); + } + + @Test + void shouldHaveListURI() { + var created = create(); + + assertThat(created).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getListURI) + .isEqualTo("urn:xoev-de:xdomea:codeliste:datentyp"); + } + + @Test + void shouldHaveListVersionID() { + var created = create(); + + assertThat(created).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getListVersionID).isEqualTo("1.1"); + } + + } + + private FeldType create() { + return creator.createFeldType(vorgang).stream() + .filter(feldType -> feldType.getName().equals(ExportFelder.DATUM_ANTRAGSEINGANG.getName())) + .toList().get(0); + } + } + + @DisplayName("Name") + @Nested + class TestName { + + @Test + void shouldHaveName() { + var created = create(vorgang); + + assertThat(created).extracting(FeldType::getName).isEqualTo("Name"); + } + + @Test + void shouldNotHaveBeschreibung() { + var created = create(vorgang); + + assertThat(created).extracting(FeldType::getBeschreibung).isNull(); + } + + @Test + void shouldHaveWert() { + var created = create(vorgang); + + assertThat(created).extracting(FeldType::getWert).isEqualTo(AntragstellerTestFactory.NACHNAME); + } + + @Test + void shouldBeEmptyStringForNullEingang() { + var created = create(VorgangWithEingangTestFactory.createBuilder().eingang(null).build()); + + assertThat(created.getWert()).isEmpty(); + } + + @Test + void shouldBeEmptyStringForNullAntragsteller() { + var created = create( + VorgangWithEingangTestFactory.createBuilder().eingang(EingangTestFactory.createBuilder().antragsteller(null).build()) + .build()); + + assertThat(created.getWert()).isEmpty(); + } + + @Test + void shouldBeEmptyStringForNullNachname() { + var created = create( + VorgangWithEingangTestFactory.createBuilder().eingang( + EingangTestFactory.createBuilder().antragsteller(AntragstellerTestFactory.createBuilder().nachname(null).build()) + .build()) + .build()); + + assertThat(created.getWert()).isEmpty(); + } + + @DisplayName("DatentypCode") + @Nested + class TestDatentypCode { + + @Test + void shouldHaveCode() { + var created = create(vorgang); + + assertThat(created).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getCode) + .isEqualTo(DatentypCode.STRING.getCode()); + } + + @Test + void shouldHaveListURI() { + var created = create(vorgang); + + assertThat(created).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getListURI) + .isEqualTo("urn:xoev-de:xdomea:codeliste:datentyp"); + } + + @Test + void shouldHaveListVersionID() { + var created = create(vorgang); + + assertThat(created).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getListVersionID).isEqualTo("1.1"); + } + + } + + private FeldType create(VorgangWithEingang vorgang) { + return creator.createFeldType(vorgang).stream() + .filter(feldType -> feldType.getName().equals(ExportFelder.NAME.getName())) + .toList().get(0); + } + } + + @DisplayName("Vorname") + @Nested + class TestVorname { + + @Test + void shouldHaveName() { + var created = create(vorgang); + + assertThat(created).extracting(FeldType::getName).isEqualTo("Vorname"); + } + + @Test + void shouldHaveNotHaveBeschreibung() { + var created = create(vorgang); + + assertThat(created).extracting(FeldType::getBeschreibung).isNull(); + } + + @Test + void shouldHaveWert() { + var created = create(vorgang); + + assertThat(created).extracting(FeldType::getWert).isEqualTo(AntragstellerTestFactory.VORNAME); + } + + @Test + void shouldBeEmptyStringForNullEingang() { + var created = create(VorgangWithEingangTestFactory.createBuilder().eingang(null).build()); + + assertThat(created.getWert()).isEmpty(); + } + + @Test + void shouldBeEmptyStringForNullAntragsteller() { + var created = create( + VorgangWithEingangTestFactory.createBuilder().eingang(EingangTestFactory.createBuilder().antragsteller(null).build()) + .build()); + + assertThat(created.getWert()).isEmpty(); + } + + @Test + void shouldBeEmptyStringForNullVorname() { + var created = create( + VorgangWithEingangTestFactory.createBuilder().eingang( + EingangTestFactory.createBuilder().antragsteller(AntragstellerTestFactory.createBuilder().vorname(null).build()) + .build()) + .build()); + + assertThat(created.getWert()).isEmpty(); + } + + @DisplayName("DatentypCode") + @Nested + class TestDatentypCode { + + @Test + void shouldHaveCode() { + var created = create(vorgang); + + assertThat(created).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getCode) + .isEqualTo(DatentypCode.STRING.getCode()); + } + + @Test + void shouldHaveListURI() { + var created = create(vorgang); + + assertThat(created).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getListURI) + .isEqualTo("urn:xoev-de:xdomea:codeliste:datentyp"); + } + + @Test + void shouldHaveListVersionID() { + var created = create(vorgang); + + assertThat(created).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getListVersionID).isEqualTo("1.1"); + } + + } + + private FeldType create(VorgangWithEingang vorgang) { + return creator.createFeldType(vorgang).stream() + .filter(feldType -> feldType.getName().equals(ExportFelder.VORNAME.getName())) + .toList().get(0); + } + } + + @DisplayName("Geburtsdatum") + @Nested + class TestGeburtsdatum { + + @Test + void shouldHaveName() { + var created = create(vorgang); + + assertThat(created).extracting(FeldType::getName).isEqualTo("Geburtsdatum"); + } + + @Test + void shouldHaveNotHaveBeschreibung() { + var created = create(vorgang); + + assertThat(created).extracting(FeldType::getBeschreibung).isNull(); + } + + @Test + void shouldHaveWert() { + var created = create(vorgang); + + assertThat(created).extracting(FeldType::getWert).isEqualTo(AntragstellerTestFactory.GEBURTSDATUM_STR); + } + + @Test + void shouldBeEmptyStringForNullEingang() { + var created = create(VorgangWithEingangTestFactory.createBuilder().eingang(null).build()); + + assertThat(created.getWert()).isEmpty(); + } + + @Test + void shouldBeEmptyStringForNullAntragsteller() { + var created = create( + VorgangWithEingangTestFactory.createBuilder().eingang(EingangTestFactory.createBuilder().antragsteller(null).build()) + .build()); + + assertThat(created.getWert()).isEmpty(); + } + + @Test + void shouldBeEmptyStringForNullGeburtsdatum() { + var created = create( + VorgangWithEingangTestFactory.createBuilder().eingang( + EingangTestFactory.createBuilder().antragsteller(AntragstellerTestFactory.createBuilder().geburtsdatum(null).build()) + .build()) + .build()); + + assertThat(created.getWert()).isEmpty(); + } + + @DisplayName("DatentypCode") + @Nested + class TestDatentypCode { + + @Test + void shouldHaveCode() { + var created = create(vorgang); + + assertThat(created).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getCode) + .isEqualTo(DatentypCode.DATE.getCode()); + } + + @Test + void shouldHaveListURI() { + var created = create(vorgang); + + assertThat(created).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getListURI) + .isEqualTo("urn:xoev-de:xdomea:codeliste:datentyp"); + } + + @Test + void shouldHaveListVersionID() { + var created = create(vorgang); + + assertThat(created).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getListVersionID).isEqualTo("1.1"); + } + + } + + private FeldType create(VorgangWithEingang vorgang) { + return creator.createFeldType(vorgang).stream() + .filter(feldType -> feldType.getName().equals(ExportFelder.GEBURTSDATUM.getName())) + .toList().get(0); + } + } + + @DisplayName("Plz") + @Nested + class TestPlz { + + @Test + void shouldHaveName() { + var created = create(vorgang); + + assertThat(created).extracting(FeldType::getName).isEqualTo("PLZAntragsteller"); + } + + @Test + void shouldHaveNotHaveBeschreibung() { + var created = create(vorgang); + + assertThat(created).extracting(FeldType::getBeschreibung).isNull(); + } + + @Test + void shouldHaveWert() { + var created = create(vorgang); + + assertThat(created).extracting(FeldType::getWert).isEqualTo(AntragstellerTestFactory.PLZ); + } + + @Test + void shouldBeEmptyStringForNullEingang() { + var created = create(VorgangWithEingangTestFactory.createBuilder().eingang(null).build()); + + assertThat(created.getWert()).isEmpty(); + } + + @Test + void shouldBeEmptyStringForNullAntragsteller() { + var created = create( + VorgangWithEingangTestFactory.createBuilder().eingang(EingangTestFactory.createBuilder().antragsteller(null).build()) + .build()); + + assertThat(created.getWert()).isEmpty(); + } + + @Test + void shouldBeEmptyStringForNullPlz() { + var created = create( + VorgangWithEingangTestFactory.createBuilder().eingang( + EingangTestFactory.createBuilder().antragsteller(AntragstellerTestFactory.createBuilder().plz(null).build()) + .build()) + .build()); + + assertThat(created.getWert()).isEmpty(); + } + + @DisplayName("DatentypCode") + @Nested + class TestDatentypCode { + + @Test + void shouldHaveCode() { + var created = create(vorgang); + + assertThat(created).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getCode) + .isEqualTo(DatentypCode.STRING.getCode()); + } + + @Test + void shouldHaveListURI() { + var created = create(vorgang); + + assertThat(created).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getListURI) + .isEqualTo("urn:xoev-de:xdomea:codeliste:datentyp"); + } + + @Test + void shouldHaveListVersionID() { + var created = create(vorgang); + + assertThat(created).extracting(FeldType::getDatentyp).extracting(DatentypCodeType::getListVersionID).isEqualTo("1.1"); + } + + } + + private FeldType create(VorgangWithEingang vorgang) { + return creator.createFeldType(vorgang).stream() + .filter(feldType -> feldType.getName().equals(ExportFelder.PLZ.getName())) + .toList().get(0); + } + } + } +} \ No newline at end of file diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/FormaTypeTestFactory.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/FormaTypeTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..b4c5902e19925829e206e4f3c6cd6d0e19098c3c --- /dev/null +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/FormaTypeTestFactory.java @@ -0,0 +1,10 @@ +package de.ozgcloud.alfa.export; + +import de.xoev.xdomea.FormatType; + +class FormaTypeTestFactory { + + public static FormatType create() { + return new FormatType(); + } +} diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/FormatTypeCreatorTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/FormatTypeCreatorTest.java new file mode 100644 index 0000000000000000000000000000000000000000..a15c43215ff5d4ebfd44461fc74a75d44fb70010 --- /dev/null +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/FormatTypeCreatorTest.java @@ -0,0 +1,78 @@ +package de.ozgcloud.alfa.export; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; + +import org.apache.commons.lang3.StringUtils; +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 org.mockito.Spy; + +import de.ozgcloud.alfa.common.file.OzgFile; +import de.ozgcloud.alfa.common.file.OzgFileTestFactory; +import de.ozgcloud.alfa.vorgang.VorgangWithEingang; +import de.ozgcloud.alfa.vorgang.VorgangWithEingangTestFactory; +import de.xoev.xdomea.PrimaerdokumentType; + +class FormatTypeCreatorTest { + + @Spy + @InjectMocks + private FormatTypeCreator creator; + + @Mock + private PrimaerdokumentTypeCreator primaerdokumentTypeCreator; + + @Nested + class TestCreate { + + private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create(); + private final OzgFile ozgFile = OzgFileTestFactory.create(); + + private final PrimaerdokumentType primaerdokument = PrimaerdokumentTypeTestFactory.create(); + + @BeforeEach + void init() { + when(primaerdokumentTypeCreator.create(vorgang, ozgFile)).thenReturn(primaerdokument); + } + + @Test + void shouldCreatePrimaerdokument() { + creator.create(vorgang, ozgFile); + + verify(primaerdokumentTypeCreator).create(vorgang, ozgFile); + } + + @Test + void shouldHavePrimaerdokumentType() { + var format = creator.create(vorgang, ozgFile); + + assertThat(format.getPrimaerdokument()).isEqualTo(primaerdokument); + } + + @Test + void shouldHaveName() { + var format = creator.create(vorgang, ozgFile); + + assertThat(format.getName()).usingRecursiveComparison().isEqualTo(DateiformatCode.PDF.createDateiformatCodeType()); + } + + @Test + void shouldHaveSonstigerName() { + var format = creator.create(vorgang, ozgFile); + + assertThat(format.getSonstigerName()).isEmpty(); + } + + @Test + void shouldHaveVersion() { + var format = creator.create(vorgang, ozgFile); + + assertThat(format.getVersion()).isEmpty(); + } + } + +} \ No newline at end of file diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/GeburtTypeTestFactory.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/GeburtTypeTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..34c8fef41b03a4f5c1c31c51a0c23735f1d61522 --- /dev/null +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/GeburtTypeTestFactory.java @@ -0,0 +1,10 @@ +package de.ozgcloud.alfa.export; + +import de.xoev.xdomea.GeburtType; + +public class GeburtTypeTestFactory { + + public static GeburtType create() { + return new GeburtType(); + } +} diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/IdentifikationObjektTypeTestFactory.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/IdentifikationObjektTypeTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..84353f13e976b9de5d5bf24aed2483a0ff4142e6 --- /dev/null +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/IdentifikationObjektTypeTestFactory.java @@ -0,0 +1,10 @@ +package de.ozgcloud.alfa.export; + +import de.xoev.xdomea.IdentifikationObjektType; + +public class IdentifikationObjektTypeTestFactory { + + public static IdentifikationObjektType create() { + return new IdentifikationObjektType(); + } +} diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/KontaktTypeCreatorTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/KontaktTypeCreatorTest.java new file mode 100644 index 0000000000000000000000000000000000000000..e9a7d11824af1db52a8e6c21031f132194149b68 --- /dev/null +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/KontaktTypeCreatorTest.java @@ -0,0 +1,244 @@ +package de.ozgcloud.alfa.export; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; + +import java.util.Optional; + +import javax.xml.datatype.XMLGregorianCalendar; + +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 org.mockito.Spy; + +import de.ozgcloud.alfa.vorgang.Antragsteller; +import de.ozgcloud.alfa.vorgang.AntragstellerTestFactory; +import de.ozgcloud.alfa.vorgang.EingangTestFactory; +import de.ozgcloud.alfa.vorgang.VorgangWithEingang; +import de.ozgcloud.alfa.vorgang.VorgangWithEingangTestFactory; +import de.xoev.xdomea.GeburtType; +import de.xoev.xdomea.KontaktType; +import de.xoev.xdomea.NameNatuerlichePersonType; + +class KontaktTypeCreatorTest { + + @Spy + @InjectMocks + private KontaktTypeCreator creator; + + @Mock + private NameNatuerlichePersonTypeCreator nameNatuerlichePersonTypeCreator; + + @Mock + private DateConverter dateConverter; + + @Nested + class TestCreate { + + @Nested + class TestWithAntragsteller { + + private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create(); + private final KontaktType kontaktType = KontaktTypeTestFactory.create(); + + @BeforeEach + void setUp() { + doReturn(Optional.of(vorgang.getEingang().getAntragsteller())).when(creator).getAntragstellerIfHasRequiredData(vorgang); + doReturn(kontaktType).when(creator).toKontaktType(vorgang.getEingang().getAntragsteller()); + } + + @Test + void shouldGetAntragsteller() { + callCreator(vorgang); + + verify(creator).getAntragstellerIfHasRequiredData(vorgang); + } + + @Test + void shouldMapToKontaktType() { + callCreator(vorgang); + + verify(creator).toKontaktType(vorgang.getEingang().getAntragsteller()); + } + + @Test + void shouldReturnKontakt() { + var kontakt = callCreator(vorgang); + + assertThat(kontakt).get().isEqualTo(kontaktType); + } + } + + @Nested + class TestWithoutAntragsteller { + + private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.createBuilder() + .eingang(EingangTestFactory.createBuilder().antragsteller(null).build()) + .build(); + + @BeforeEach + void setUp() { + doReturn(Optional.empty()).when(creator).getAntragstellerIfHasRequiredData(vorgang); + } + + @Test + void shouldBeEmpty() { + var kontakt = callCreator(vorgang); + + assertThat(kontakt).isEmpty(); + } + } + + private Optional<KontaktType> callCreator(VorgangWithEingang vorgang) { + return creator.create(vorgang); + } + } + + @Nested + class TestToKontaktType { + + @Mock + private XMLGregorianCalendar geburtsdatum; + + private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create(); + private final NameNatuerlichePersonType nameNatuerlichePerson = NameNatuerlichePersonTypeTestFactory.create(); + private final GeburtType geburtType = GeburtTypeTestFactory.create(); + + @BeforeEach + void setUp() { + when(nameNatuerlichePersonTypeCreator.create(vorgang.getEingang().getAntragsteller())).thenReturn(nameNatuerlichePerson); + when(dateConverter.convertGermanFormatToISO(AntragstellerTestFactory.GEBURTSDATUM_STR)).thenReturn(Optional.of(geburtsdatum)); + doReturn(geburtType).when(creator).createGeburtType(Optional.of(geburtsdatum)); + } + + @Test + void shouldCreateNameNatuerlichePerson() { + callCreator(vorgang); + + verify(nameNatuerlichePersonTypeCreator).create(vorgang.getEingang().getAntragsteller()); + } + + @Test + void shouldHaveNameNatuerlichePerson() { + var kontakt = callCreator(vorgang); + + assertThat(kontakt.getName()).isEqualTo(nameNatuerlichePerson); + } + + @Test + void shouldCallDateConverter() { + callCreator(vorgang); + + verify(dateConverter).convertGermanFormatToISO(AntragstellerTestFactory.GEBURTSDATUM_STR); + } + + @Test + void shouldCreateGeburtType() { + callCreator(vorgang); + + verify(creator).createGeburtType(Optional.of(geburtsdatum)); + } + + @Test + void shouldHaveGeburtType() { + var kontakt = callCreator(vorgang); + + assertThat(kontakt.getGeburt()).isEqualTo(geburtType); + } + + private KontaktType callCreator(VorgangWithEingang vorgang) { + return creator.toKontaktType(vorgang.getEingang().getAntragsteller()); + } + } + + @Nested + class TestCreateGeburtType { + + @Mock + private XMLGregorianCalendar geburtsdatum; + + @Test + void shouldCreate() { + var geburtType = callCreator(Optional.of(geburtsdatum)); + + assertThat(geburtType.getDatum()).isEqualTo(geburtsdatum); + } + + @Test + void shouldCreateEmptyGeburt() { + var geburtType = callCreator(Optional.empty()); + + assertThat(geburtType.getDatum()).isNull(); + } + + private GeburtType callCreator(Optional<XMLGregorianCalendar> geburtsdatum) { + return creator.createGeburtType(geburtsdatum); + } + } + + @Nested + class TestGetAntragstellerIfHasRequiredData { + + @Mock + private XMLGregorianCalendar geburtsdatum; + + @Test + void shouldBeEmptyIfAntragstellerNull() { + var antragsteller = callCreator(buildVorgang(null)); + + assertThat(antragsteller).isEmpty(); + } + + @Test + void shouldBeEmptyIfNoneOfRequiredDataExists() { + when(dateConverter.convertGermanFormatToISO(null)).thenReturn(Optional.empty()); + + var antragsteller = callCreator(buildVorgang(Antragsteller.builder().build())); + + assertThat(antragsteller).isEmpty(); + } + + @Test + void shouldNotBeEmptyIfHasVorname() { + var antragsteller = callCreator(buildVorgang(Antragsteller.builder().vorname(AntragstellerTestFactory.VORNAME).build())); + + assertThat(antragsteller).isNotEmpty(); + } + + @Test + void shouldNotBeEmptyIfHasNachname() { + var antragsteller = callCreator(buildVorgang(Antragsteller.builder().nachname(AntragstellerTestFactory.NACHNAME).build())); + + assertThat(antragsteller).isNotEmpty(); + } + + @Test + void shouldNotBeEmptyIfHasAnrede() { + var antragsteller = callCreator(buildVorgang(Antragsteller.builder().anrede(AntragstellerTestFactory.ANREDE).build())); + + assertThat(antragsteller).isNotEmpty(); + } + + @Test + void shouldNotBeEmptyIfHasGeburtsdatum() { + when(dateConverter.convertGermanFormatToISO(AntragstellerTestFactory.GEBURTSDATUM_STR)).thenReturn(Optional.of(geburtsdatum)); + + var antragsteller = callCreator(buildVorgang(Antragsteller.builder().geburtsdatum(AntragstellerTestFactory.GEBURTSDATUM_STR).build())); + + assertThat(antragsteller).isNotEmpty(); + } + + private Optional<Antragsteller> callCreator(VorgangWithEingang vorgang) { + return creator.getAntragstellerIfHasRequiredData(vorgang); + } + + private VorgangWithEingang buildVorgang(Antragsteller antragsteller) { + return VorgangWithEingangTestFactory.createBuilder().eingang(EingangTestFactory.createBuilder().antragsteller(antragsteller).build()) + .build(); + } + } + +} \ No newline at end of file diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/KontaktTypeTestFactory.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/KontaktTypeTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..3daad690a0d408df23c9e0b75dbee73720a128cd --- /dev/null +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/KontaktTypeTestFactory.java @@ -0,0 +1,10 @@ +package de.ozgcloud.alfa.export; + +import de.xoev.xdomea.KontaktType; + +public class KontaktTypeTestFactory { + + public static KontaktType create() { + return new KontaktType(); + } +} diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/NameNatuerlichePersonTypeCreatorTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/NameNatuerlichePersonTypeCreatorTest.java new file mode 100644 index 0000000000000000000000000000000000000000..7124b6f846a1cd545df3a71c4567f2f42c166f70 --- /dev/null +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/NameNatuerlichePersonTypeCreatorTest.java @@ -0,0 +1,93 @@ +package de.ozgcloud.alfa.export; + +import static org.assertj.core.api.Assertions.*; + +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; + +import de.ozgcloud.alfa.vorgang.Antragsteller; +import de.ozgcloud.alfa.vorgang.AntragstellerTestFactory; +import de.xoev.xdomea.NameNatuerlichePersonType; + +class NameNatuerlichePersonTypeCreatorTest { + + @InjectMocks + private NameNatuerlichePersonTypeCreator creator; + + @Nested + class TestCreate { + + @Test + void shouldHaveAnrede() { + var nameNatuerlichePerson = callCreator(AntragstellerTestFactory.create()); + + assertThat(nameNatuerlichePerson.getAnrede()).isEqualTo(AntragstellerTestFactory.ANREDE); + } + + @Test + void shouldHaveEmptyAnrede() { + var nameNatuerlichePerson = callCreator(AntragstellerTestFactory.createBuilder().anrede(null).build()); + + assertThat(nameNatuerlichePerson.getAnrede()).isEmpty(); + } + + @Test + void shouldHaveVorname() { + var nameNatuerlichePerson = callCreator(AntragstellerTestFactory.create()); + + assertThat(nameNatuerlichePerson.getVorname().getName()).isEqualTo(AntragstellerTestFactory.VORNAME); + } + + @Test + void shouldHaveEmptyVorname() { + var nameNatuerlichePerson = callCreator(AntragstellerTestFactory.createBuilder().vorname(null).build()); + + assertThat(nameNatuerlichePerson.getVorname().getName()).isEmpty(); + } + + @Test + void shouldHaveFamilienname() { + var nameNatuerlichePerson = callCreator(AntragstellerTestFactory.create()); + + assertThat(nameNatuerlichePerson.getFamilienname().getName()).isEqualTo(AntragstellerTestFactory.NACHNAME); + } + + @Test + void shouldHaveEmptyFamilienname() { + var nameNatuerlichePerson = callCreator(AntragstellerTestFactory.createBuilder().nachname(null).build()); + + assertThat(nameNatuerlichePerson.getFamilienname().getName()).isEmpty(); + } + + @Nested + class TestWhenNullAntragsteller { + + @Test + void shouldHaveEmptyAnrede() { + var nameNatuerlichePerson = callCreator(null); + + assertThat(nameNatuerlichePerson.getAnrede()).isEmpty(); + } + + @Test + void shouldHaveEmptyVorname() { + var nameNatuerlichePerson = callCreator(null); + + assertThat(nameNatuerlichePerson.getVorname().getName()).isEmpty(); + } + + @Test + void shouldHaveEmptyFamilienname() { + var nameNatuerlichePerson = callCreator(null); + + assertThat(nameNatuerlichePerson.getFamilienname().getName()).isEmpty(); + } + } + + private NameNatuerlichePersonType callCreator(Antragsteller antragsteller) { + return creator.create(antragsteller); + } + } + +} \ No newline at end of file diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/NameNatuerlichePersonTypeTestFactory.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/NameNatuerlichePersonTypeTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..79abd234311aa7c864b7b146f932aa9197c5d980 --- /dev/null +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/NameNatuerlichePersonTypeTestFactory.java @@ -0,0 +1,10 @@ +package de.ozgcloud.alfa.export; + +import de.xoev.xdomea.NameNatuerlichePersonType; + +public class NameNatuerlichePersonTypeTestFactory { + + public static NameNatuerlichePersonType create() { + return new NameNatuerlichePersonType(); + } +} diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/PrimaerdokumentTypeCreatorTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/PrimaerdokumentTypeCreatorTest.java new file mode 100644 index 0000000000000000000000000000000000000000..db307b1e5da896283a48d60c7e31da70ecba26d9 --- /dev/null +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/PrimaerdokumentTypeCreatorTest.java @@ -0,0 +1,67 @@ +package de.ozgcloud.alfa.export; + +import static org.assertj.core.api.Assertions.*; +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.InjectMocks; +import org.mockito.Mock; +import org.mockito.Spy; + +import de.ozgcloud.alfa.common.file.OzgFile; +import de.ozgcloud.alfa.common.file.OzgFileTestFactory; +import de.ozgcloud.alfa.vorgang.EingangHeaderTestFactory; +import de.ozgcloud.alfa.vorgang.VorgangWithEingang; +import de.ozgcloud.alfa.vorgang.VorgangWithEingangTestFactory; + +class PrimaerdokumentTypeCreatorTest { + + @Spy + @InjectMocks + private PrimaerdokumentTypeCreator creator; + + @Mock + private ExportFilenameGenerator exportFilenameGenerator; + + @Nested + class TestCreate { + + private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create(); + private final OzgFile ozgFile = OzgFileTestFactory.create(); + + @BeforeEach + void init() { + when(exportFilenameGenerator.generateExportFilename(ozgFile)).thenReturn(ozgFile.getName()); + } + + @Test + void shouldGenerateExportFilename() { + creator.create(vorgang, ozgFile); + + verify(exportFilenameGenerator).generateExportFilename(ozgFile); + } + + @Test + void shouldHaveDateiname() { + var primaerdokument = creator.create(vorgang, ozgFile); + + assertThat(primaerdokument.getDateiname()).isEqualTo(ozgFile.getName()); + } + + @Test + void shouldHaveDateinameOriginal() { + var primaerdokument = creator.create(vorgang, ozgFile); + + assertThat(primaerdokument.getDateinameOriginal()).isEqualTo(ozgFile.getName()); + } + + @Test + void shouldHaveErsteller() { + var primaerdokument = creator.create(vorgang, ozgFile); + + assertThat(primaerdokument.getErsteller()).isEqualTo(EingangHeaderTestFactory.FORM_ENGINE_NAME); + } + } +} \ No newline at end of file diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/PrimaerdokumentTypeTestFactory.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/PrimaerdokumentTypeTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..f0ae78aaf77d4af8219bc90e920e504bc53f553b --- /dev/null +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/PrimaerdokumentTypeTestFactory.java @@ -0,0 +1,10 @@ +package de.ozgcloud.alfa.export; + +import de.xoev.xdomea.PrimaerdokumentType; + +class PrimaerdokumentTypeTestFactory { + + public static PrimaerdokumentType create() { + return new PrimaerdokumentType(); + } +} diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/SchriftgutobjektCreatorTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/SchriftgutobjektCreatorTest.java new file mode 100644 index 0000000000000000000000000000000000000000..1ea75ceee7e8b37bf123339fd9fc0ee60503e722 --- /dev/null +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/SchriftgutobjektCreatorTest.java @@ -0,0 +1,50 @@ +package de.ozgcloud.alfa.export; + +import static org.assertj.core.api.Assertions.*; +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.ozgcloud.alfa.vorgang.VorgangWithEingang; +import de.ozgcloud.alfa.vorgang.VorgangWithEingangTestFactory; +import de.xoev.xdomea.AnwendungsspezifischeErweiterungType; +import de.xoev.xdomea.VorgangType; + +class SchriftgutobjektCreatorTest { + + @InjectMocks + private SchriftgutobjektCreator creator; + + @Mock + private VorgangTypeCreator vorgangTypeCreator; + + @Nested + class TestCreate { + + private final VorgangWithEingang vorgangWithEingang = VorgangWithEingangTestFactory.create(); + + private final VorgangType vorgang = VorgangTypeTestFactory.create(); + private final AnwendungsspezifischeErweiterungType anwendungsspezifischeErweiterung = AnwendungsspezifischeErweiterungTypeTestFactory.create(); + + @Test + void shouldCreateVorgangType() { + creator.create(vorgangWithEingang, anwendungsspezifischeErweiterung); + + verify(vorgangTypeCreator).create(vorgangWithEingang, anwendungsspezifischeErweiterung); + } + + @Test + void shouldHaveVorgangType() { + doReturn(vorgang).when(vorgangTypeCreator).create(vorgangWithEingang, anwendungsspezifischeErweiterung); + + var schriftgutobjekt = creator.create(vorgangWithEingang, anwendungsspezifischeErweiterung); + + assertThat(schriftgutobjekt.getVorgang()).isEqualTo(vorgang); + } + + } + +} \ No newline at end of file diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/UUIDConverterTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/UUIDConverterTest.java new file mode 100644 index 0000000000000000000000000000000000000000..9d6e44fb53c75d36b71fcfd4e8e66ea90f07f188 --- /dev/null +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/UUIDConverterTest.java @@ -0,0 +1,32 @@ +package de.ozgcloud.alfa.export; + +import static org.assertj.core.api.Assertions.*; + +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; + +import de.ozgcloud.alfa.common.TestUtils; + +class UUIDConverterTest { + + @InjectMocks + private UUIDConverter converter; + + @Nested + class TestFromObjectId { + + @Test + void shouldReturnUUID() { + var result = converter.fromObjectId("64a820d36285172ac02826d0"); + + assertThat(result).isEqualTo("64a820d3-6285-172a-c028-0000000026d0").matches(TestUtils.UUID_REGEX); + } + + @Test + void shouldThrowIllegalArgumentException() { + assertThatThrownBy(() -> converter.fromObjectId("abc")).isInstanceOf(IllegalArgumentException.class); + } + } + +} \ No newline at end of file diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/VersionTypeCreatorTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/VersionTypeCreatorTest.java new file mode 100644 index 0000000000000000000000000000000000000000..bd1f17cb080e3fbc887dbd4cc9cdb6b9dec16f1c --- /dev/null +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/VersionTypeCreatorTest.java @@ -0,0 +1,60 @@ +package de.ozgcloud.alfa.export; + +import static org.assertj.core.api.Assertions.*; +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.InjectMocks; +import org.mockito.Mock; + +import de.ozgcloud.alfa.common.file.OzgFile; +import de.ozgcloud.alfa.common.file.OzgFileTestFactory; +import de.ozgcloud.alfa.vorgang.VorgangWithEingang; +import de.ozgcloud.alfa.vorgang.VorgangWithEingangTestFactory; +import de.xoev.xdomea.FormatType; + +class VersionTypeCreatorTest { + + @InjectMocks + private VersionTypeCreator creator; + + @Mock + private FormatTypeCreator formatTypeCreator; + + @Nested + class TestCreate { + + private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create(); + private final OzgFile ozgFile = OzgFileTestFactory.create(); + private final FormatType formatType = FormaTypeTestFactory.create(); + + @BeforeEach + void init() { + when(formatTypeCreator.create(vorgang, ozgFile)).thenReturn(formatType); + } + + @Test + void shouldHaveNummer() { + var version = creator.create(vorgang, ozgFile); + + assertThat(version.getNummer()).isEqualTo(VersionTypeCreator.NUMMER); + } + + @Test + void shouldCreateFormatType() { + creator.create(vorgang, ozgFile); + + verify(formatTypeCreator).create(vorgang, ozgFile); + } + + @Test + void shouldHaveFormatType() { + var version = creator.create(vorgang, ozgFile); + + assertThat(version.getFormat()).containsExactly(formatType); + } + } + +} \ No newline at end of file diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/VersionTypeTestFactory.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/VersionTypeTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..b2ee1d70ad1e31e7d6f08e1ff589de41054987e2 --- /dev/null +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/VersionTypeTestFactory.java @@ -0,0 +1,10 @@ +package de.ozgcloud.alfa.export; + +import de.xoev.xdomea.VersionType; + +class VersionTypeTestFactory { + + public static VersionType create() { + return new VersionType(); + } +} diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/VorgangTypeCreatorTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/VorgangTypeCreatorTest.java new file mode 100644 index 0000000000000000000000000000000000000000..f97c9906d1eaa1c8cfe8414b2b574c95983e8c5b --- /dev/null +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/VorgangTypeCreatorTest.java @@ -0,0 +1,182 @@ +package de.ozgcloud.alfa.export; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; + +import java.util.Optional; +import java.util.stream.Stream; + +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 org.mockito.Spy; + +import de.ozgcloud.alfa.common.TestUtils; +import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory; +import de.ozgcloud.alfa.vorgang.VorgangWithEingang; +import de.ozgcloud.alfa.vorgang.VorgangWithEingangTestFactory; +import de.xoev.xdomea.AllgemeineMetadatenType; +import de.xoev.xdomea.AnwendungsspezifischeErweiterungType; +import de.xoev.xdomea.DokumentType; +import de.xoev.xdomea.IdentifikationObjektType; +import de.xoev.xdomea.KontaktType; +import de.xoev.xdomea.VorgangType; + +class VorgangTypeCreatorTest { + + @Spy + @InjectMocks + private VorgangTypeCreator creator; + + @Mock + private DokumentTypeCreator dokumentTypeCreator; + + @Mock + private KontaktTypeCreator kontaktTypeCreator; + + @Nested + class TestCreate { + + private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create(); + + private final IdentifikationObjektType identifikationObjekt = IdentifikationObjektTypeTestFactory.create(); + private final AllgemeineMetadatenType allgemeineMetadaten = AllgemeineMetadatenTypeTestFactory.create(); + private final AnwendungsspezifischeErweiterungType anwendungsspezifischeErweiterung = AnwendungsspezifischeErweiterungTypeTestFactory.create(); + private final DokumentType dokument = DokumentTypeTestFactory.create(); + private final KontaktType kontakt = KontaktTypeTestFactory.create(); + + @BeforeEach + void init() { + doReturn(identifikationObjekt).when(creator).createIdentifikation(); + doReturn(allgemeineMetadaten).when(creator).createAllgemeineMetadaten(vorgang); + + when(dokumentTypeCreator.create(vorgang)).thenReturn(Stream.of(dokument)); + when(kontaktTypeCreator.create(vorgang)).thenReturn(Optional.of(kontakt)); + } + + @Test + void shouldHaveAnwendungsspezifischeErweiterungType() { + var vorgangType = callCreator(); + + assertThat(vorgangType.getAnwendungsspezifischeErweiterung()).isEqualTo(anwendungsspezifischeErweiterung); + } + + @Test + void shouldCallCreateIdentifikation() { + callCreator(); + + verify(creator).createIdentifikation(); + } + + @Test + void shouldHaveIdentifikation() { + var vorgangType = callCreator(); + + assertThat(vorgangType.getIdentifikation()).isEqualTo(identifikationObjekt); + } + + @Test + void shouldCallCreateAllgemeineMetadaten() { + callCreator(); + + verify(creator).createAllgemeineMetadaten(vorgang); + } + + @Test + void shouldHaveAllgemeineMetadaten() { + var vorgangType = callCreator(); + + assertThat(vorgangType.getAllgemeineMetadaten()).isEqualTo(allgemeineMetadaten); + } + + @Test + void shouldCreateDokumenType() { + var vorgangType = callCreator(); + + verify(dokumentTypeCreator).create(vorgang); + assertThat(vorgangType.getDokument()).hasSize(1).containsExactly(dokument); + } + + @Test + void shouldCallKontaktTypeCreator() { + callCreator(); + + verify(kontaktTypeCreator).create(vorgang); + } + + @Test + void shouldHaveKontakt() { + var vorgangType = callCreator(); + + assertThat(vorgangType.getKontakt()).containsExactly(kontakt); + } + + @Test + void shouldNotHaveKontakt() { + when(kontaktTypeCreator.create(vorgang)).thenReturn(Optional.empty()); + var vorgangType = callCreator(); + + assertThat(vorgangType.getKontakt()).isEmpty(); + } + + private VorgangType callCreator() { + return creator.create(vorgang, anwendungsspezifischeErweiterung); + } + } + + @Nested + class TestCreateAllgemeineMetadaten { + + private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create(); + + @Test + void shouldHaveBetreff() { + var allgemeineMetadaten = creator.createAllgemeineMetadaten(vorgang); + + assertThat(allgemeineMetadaten.getBetreff()).isEqualTo(VorgangHeaderTestFactory.NAME); + } + + @Test + void shouldHaveKennzeichen() { + var allgemeineMetadaten = creator.createAllgemeineMetadaten(vorgang); + + assertThat(allgemeineMetadaten.getKennzeichen()).isEqualTo(VorgangHeaderTestFactory.NUMMER); + } + + @Test + void shouldHaveBemerkung() { + var allgemeineMetadaten = creator.createAllgemeineMetadaten(vorgang); + + assertThat(allgemeineMetadaten.getBemerkung()).isEmpty(); + } + + @Test + void shouldHaveMedium() { + var allgemeineMetadaten = creator.createAllgemeineMetadaten(vorgang); + + assertThat(allgemeineMetadaten.getMedium().getCode()).isEqualTo(VorgangTypeCreator.ALLGEMEINE_METADATEN_MEDIUM_CODE); + } + + } + + @Nested + class TestCreateIdentifikation { + + @Test + void shouldHaveId() { + var identifikation = creator.createIdentifikation(); + + assertThat(identifikation.getID()).matches(TestUtils.UUID_REGEX); + } + + @Test + void shouldHaveNummerImUebergeordnetenContainer() { + var identifikation = creator.createIdentifikation(); + + assertThat(identifikation.getNummerImUebergeordnetenContainer()).isEqualTo(VorgangTypeCreator.NUMMER_IM_UEBERGEORDNETEN_CONTAINER); + } + } + +} \ No newline at end of file diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/XDomeaServiceTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/XDomeaServiceTest.java index cf6c1653d9db58aa17000b9d43515b68e56edcfd..f2471d907ae8b11e38264726ff7fb1245c72435d 100644 --- a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/XDomeaServiceTest.java +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/XDomeaServiceTest.java @@ -6,28 +6,35 @@ import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; import java.io.ByteArrayOutputStream; +import java.io.File; import java.io.IOException; +import java.nio.charset.StandardCharsets; import java.util.UUID; +import java.util.stream.Stream; +import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Spy; import de.itvsh.kop.common.errorhandling.TechnicalException; import de.ozgcloud.alfa.common.TestUtils; +import de.ozgcloud.alfa.common.file.OzgFile; +import de.ozgcloud.alfa.common.file.OzgFileTestFactory; +import de.ozgcloud.alfa.vorgang.EingangTestFactory; import de.ozgcloud.alfa.vorgang.VorgangController; import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory; import de.ozgcloud.alfa.vorgang.VorgangWithEingang; import de.ozgcloud.alfa.vorgang.VorgangWithEingangTestFactory; import de.xoev.xdomea.AbgabeAbgabe0401; -import de.xoev.xdomea.AbgabeAbgabe0401.Schriftgutobjekt; -import de.xoev.xdomea.AnwendungsspezifischeErweiterungType; -import de.xoev.xdomea.VorgangType; +import lombok.SneakyThrows; class XDomeaServiceTest { @@ -35,34 +42,85 @@ class XDomeaServiceTest { @InjectMocks private XDomeaService service; - @Mock - private AnwendungsspezifischeErweiterungMapper anwendungsspezifischeErweiterungMapper; - @Mock private XDomeaXmlMarshaller XDomeaXmlMarshaller; @Mock private VorgangController vorgangController; + @Mock + private AbgabeAbgabe0401Creator abgabeCreator; + + @Mock + private ExportFileService exportFileService; + + @Mock + private ExportFilenameGenerator exportFilenameGenerator; + @DisplayName("Write exportToXdomea") @Nested class TestWriteExport { - private static final String XML_STRING = "<xml>"; private static final String FILENAME_ID = UUID.randomUUID().toString(); + private final ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + private final ExportData exportData = ExportDataTestFactory.create(); + + @Mock + private File zipFile; + + @BeforeEach + void setUp() { + doReturn(exportData).when(service).collectExportData(VorgangHeaderTestFactory.ID, FILENAME_ID); + doReturn(zipFile).when(service).createZipFile(exportData); + doNothing().when(service).writeZipFileContent(zipFile, outputStream); + } + + @Test + void shouldCollectExportData() { + callService(); + + verify(service).collectExportData(VorgangHeaderTestFactory.ID, FILENAME_ID); + } + @Test + void shouldCreateZipFile() { + callService(); + + verify(service).createZipFile(exportData); + } + + @Test + void shouldWriteZipFileContentToOutputStream() { + callService(); + + verify(service).writeZipFileContent(zipFile, outputStream); + } + + private void callService() { + service.writeExport(VorgangHeaderTestFactory.ID, FILENAME_ID, outputStream); + } + } + + @Nested + class TestCollectExportData { + + private static final String FILENAME_ID = UUID.randomUUID().toString(); + private static final String FILE_NAME = "file.zip"; + private static final String XML_STRING = "<xml>"; private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create(); - private final ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + private final Stream<OzgFile> ozgFiles = Stream.of(OzgFileTestFactory.create()); @BeforeEach - void init() { + void setUp() { + when(exportFileService.getAllPdfs(EingangTestFactory.ID)).thenReturn(ozgFiles); when(vorgangController.getVorgang(VorgangHeaderTestFactory.ID)).thenReturn(vorgang); doReturn(XML_STRING).when(service).createXmlContent(vorgang); + doReturn(FILE_NAME).when(service).buildXmlFilename(FILENAME_ID); } @Test void shouldLoadVorgang() { - service.writeExport(VorgangHeaderTestFactory.ID, FILENAME_ID, outputStream); + callService(); verify(vorgangController).getVorgang(VorgangHeaderTestFactory.ID); } @@ -75,36 +133,49 @@ class XDomeaServiceTest { } @Test - void shouldCreateZipEntry() throws IOException { + void shouldGenerateXmlFilename() { callService(); - verify(service).putZipEntry(anyString(), eq(XML_STRING), any(ZipOutputStream.class)); + verify(service).buildXmlFilename(FILENAME_ID); } @Test - void shouldGenerateXmlFilename() { + void shouldGetPdfFiles() { callService(); - verify(service).buildXmlFilename(FILENAME_ID); + verify(exportFileService).getAllPdfs(EingangTestFactory.ID); } @Test - void shouldWriteBytes() { - callService(); + void shouldContainsVorgang() { + var exportData = callService(); - assertThat(outputStream).isNotNull(); - assertThat(outputStream.toByteArray()).hasSizeGreaterThan(100); + assertThat(exportData.getVorgang()).isEqualTo(vorgang); } @Test - void shouldThrowTechnicalException() throws IOException { - doThrow(IOException.class).when(service).putZipEntry(anyString(), eq(XML_STRING), any()); + void shouldContainsXmlContent() { + var exportData = callService(); - assertThatThrownBy(this::callService).isInstanceOf(TechnicalException.class); + assertThat(exportData.getXmlFileContent()).isEqualTo(XML_STRING); } - private void callService() { - service.writeExport(VorgangHeaderTestFactory.ID, FILENAME_ID, outputStream); + @Test + void shouldContainsExportFilename() { + var exportData = callService(); + + assertThat(exportData.getExportFilename()).isEqualTo(FILE_NAME); + } + + @Test + void shouldContainsExportExportFiles() { + var exportData = callService(); + + assertThat(exportData.getExportFiles()).isEqualTo(ozgFiles); + } + + private ExportData callService() { + return service.collectExportData(VorgangHeaderTestFactory.ID, FILENAME_ID); } } @@ -128,81 +199,198 @@ class XDomeaServiceTest { private static final String XML_STRING = "<xml>"; private final VorgangWithEingang vorgang = VorgangWithEingangTestFactory.create(); - private final AnwendungsspezifischeErweiterungType anwendungsspezifischeErweiterung = AnwendungsspezifischeErweiterungTypeTestFactory - .create(); private final AbgabeAbgabe0401 abgabe = AbgabeAbgabe0401TestFactory.create(); @BeforeEach void init() { - when(anwendungsspezifischeErweiterungMapper.map(vorgang)).thenReturn(anwendungsspezifischeErweiterung); - doReturn(abgabe).when(service).buildAbgabe(any()); + doReturn(abgabe).when(abgabeCreator).create(vorgang); when(XDomeaXmlMarshaller.marshal(any())).thenReturn(XML_STRING); } - @Test - void shouldCallMapper() { - service.createXmlContent(vorgang); - - verify(anwendungsspezifischeErweiterungMapper).map(vorgang); - } - @Test void shouldCallXmlMarshaller() { - service.createXmlContent(vorgang); + callService(); verify(XDomeaXmlMarshaller).marshal(abgabe); } @Test void shouldReturnMarshalledString() { - var result = service.createXmlContent(vorgang); + var result = callService(); assertThat(result).isEqualTo(XML_STRING); } + + @Test + void shouldCallAbgabeCreator() { + callService(); + + verify(abgabeCreator).create(vorgang); + } + + private String callService() { + return service.createXmlContent(vorgang); + } + } + + @Nested + class TestCreateZipFile { + + private static final String XML_STRING = "<xml>"; + private final ExportData exportData = ExportDataTestFactory.create(); + + @Captor + private ArgumentCaptor<ZipOutputStream> zipOutputStreamArgumentCaptor; + + @SneakyThrows + @BeforeEach + void setUp() { + doNothing().when(service).putOzgFileIntoZip(any(OzgFile.class), any(ZipOutputStream.class)); + } + + @Test + void shouldCreateZipEntry() throws IOException { + callService(); + + verify(service).putZipEntry(eq(ExportDataTestFactory.EXPORT_FILENAME), eq(ExportDataTestFactory.XML_FILE_CONTENT), + any(ZipOutputStream.class)); + } + + @Test + void shouldCreateZipOutputStream() throws IOException { + callService(); + + verify(service).putZipEntry(eq(ExportDataTestFactory.EXPORT_FILENAME), eq(ExportDataTestFactory.XML_FILE_CONTENT), + zipOutputStreamArgumentCaptor.capture()); + assertThat(zipOutputStreamArgumentCaptor.getValue()).isInstanceOf(ZipOutputStream.class); + } + + @Test + void shouldWriteBytes() { + var file = callService(); + + assertThat(file).isNotEmpty().content().hasSizeGreaterThan(100); + } + + @SneakyThrows + @Test + void shouldWritePdfFiles() { + callService(); + + verify(service).putOzgFileIntoZip(eq(ExportDataTestFactory.OZG_FILE), any(ZipOutputStream.class)); + } + + @Test + void shouldThrowTechnicalException() throws IOException { + doThrow(IOException.class).when(service).putZipEntry(anyString(), eq(XML_STRING), any(ZipOutputStream.class)); + + assertThatThrownBy(this::callService).isInstanceOf(TechnicalException.class); + } + + private File callService() { + return service.createZipFile(exportData); + } + } - @DisplayName("Build abgabe") @Nested - class TestBuildAbgabe { + class TestPutZipEntry { + + @Mock + private ZipOutputStream zipOutputStream; + + @Captor + private ArgumentCaptor<ZipEntry> zipEntryArgumentCaptor; - private final AnwendungsspezifischeErweiterungType type = AnwendungsspezifischeErweiterungTypeTestFactory.create(); - private final Schriftgutobjekt schriftgutObjekt = SchriftgutobjektTestFactory.create(); + @Captor + private ArgumentCaptor<byte[]> fileDataArgumentCaptor; + private final String FILE_NAME = "file.xml"; + private final String FILE_DATA = "xml content"; + + @SneakyThrows + @Test + void shouldPutNextEntry() { + callService(); + + verify(zipOutputStream).putNextEntry(zipEntryArgumentCaptor.capture()); + assertThat(zipEntryArgumentCaptor.getValue().getName()).isEqualTo(FILE_NAME); + } + + @SneakyThrows @Test - void shouldHaveSchriftgutobjekt() { - doReturn(schriftgutObjekt).when(service).buildSchriftgutobjekt(any()); + void shouldWriteDataBytes() { + callService(); + + verify(zipOutputStream).write(fileDataArgumentCaptor.capture()); + assertThat(fileDataArgumentCaptor.getValue()).isEqualTo(FILE_DATA.getBytes(StandardCharsets.UTF_8)); + } + + @SneakyThrows + @Test + void shouldCloseEntry() { + callService(); + + verify(zipOutputStream).closeEntry(); + } + + @SneakyThrows + private void callService() { + service.putZipEntry(FILE_NAME, FILE_DATA, zipOutputStream); + } + } + + @Nested + class TestPutOzgFileIntoZip { + + @Mock + private ZipOutputStream zipOutputStream; + + @Captor + private ArgumentCaptor<ZipEntry> zipEntryArgumentCaptor; - var abgabe = service.buildAbgabe(type); + private final OzgFile ozgFile = OzgFileTestFactory.create(); - assertThat(abgabe.getSchriftgutobjekt().get(0)).isEqualTo(schriftgutObjekt); + @BeforeEach + void setUp() { + when(exportFilenameGenerator.generateExportFilename(ozgFile)).thenReturn(OzgFileTestFactory.NAME); } - @DisplayName("build schriftgutobjekt") - @Nested - class TestBuildSchriftgutObjekt { + @Test + void shouldGenerateExportFilename() { + callService(); - private final VorgangType vorgang = VorgangTypeTestFactory.create(); + verify(exportFilenameGenerator).generateExportFilename(ozgFile); + } - @Test - void shouldHaveVorgangType() { - doReturn(vorgang).when(service).buildVorgangType(any()); + @SneakyThrows + @Test + void shouldPutNextEntry() { + callService(); - var schriftgutobjekt = service.buildSchriftgutobjekt(type); + verify(zipOutputStream).putNextEntry(zipEntryArgumentCaptor.capture()); + assertThat(zipEntryArgumentCaptor.getValue().getName()).isEqualTo(OzgFileTestFactory.NAME); + } - assertThat(schriftgutobjekt.getVorgang()).isEqualTo(vorgang); - } + @Test + void shouldCallExportFileService() { + callService(); - @DisplayName("build vorgangType") - @Nested - class TestBuildVorgangType { + verify(exportFileService).writeOzgFile(OzgFileTestFactory.ID, zipOutputStream); + } - @Test - void shouldHaveAnwendungsspezifischeErweiterungType() { - var vorgangType = service.buildVorgangType(type); + @SneakyThrows + @Test + void shouldCloseEntry() { + callService(); - assertThat(vorgangType.getAnwendungsspezifischeErweiterung()).isEqualTo(type); - } - } + verify(zipOutputStream).closeEntry(); } + + @SneakyThrows + private void callService() { + service.putOzgFileIntoZip(ozgFile, zipOutputStream); + } + } } \ No newline at end of file diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/XmlMarshallerConfigurationTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/XmlMarshallerConfigurationTest.java index 91d53e4afc8c6f934d904c1bef9df3ea87adfb8c..46ddabac96c193f78b8ec3e8a448cbb68897c90f 100644 --- a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/XmlMarshallerConfigurationTest.java +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/export/XmlMarshallerConfigurationTest.java @@ -5,7 +5,7 @@ import static org.mockito.Mockito.*; import java.util.Map; -import javax.xml.bind.Marshaller; +import jakarta.xml.bind.Marshaller; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; diff --git a/goofy-client/angular.json b/goofy-client/angular.json index 7d3d774bea4f7997a60e7edf1af771bcef6c8a2e..5f1d506b3b665e252c59633089bbac7e8e7f1d28 100644 --- a/goofy-client/angular.json +++ b/goofy-client/angular.json @@ -452,9 +452,10 @@ "e2e": { "builder": "@nrwl/cypress:cypress", "options": { - "cypressConfig": "apps/goofy-e2e/cypress.json", + "cypressConfig": "apps/goofy-e2e/cypress.config.ts", "tsConfig": "apps/goofy-e2e/tsconfig.e2e.json", - "devServerTarget": "goofy:serve" + "devServerTarget": "goofy:serve", + "testingType": "e2e" }, "configurations": { "production": { diff --git a/goofy-client/apps/goofy-e2e/Jenkinsfile b/goofy-client/apps/goofy-e2e/Jenkinsfile index cb5ffcccaa43c0efcc5a1946e6bf2c47e9d1545d..a2d3aaf4a684ca4d52a5ce2fc5ef1653d827d3d9 100644 --- a/goofy-client/apps/goofy-e2e/Jenkinsfile +++ b/goofy-client/apps/goofy-e2e/Jenkinsfile @@ -190,15 +190,6 @@ pipeline { } } -// stage('Pausing to wait for ozg-operator') { -// when { -// expression { !SKIP_RUN } -// } -// steps { -// sleep(time: 3, unit: 'MINUTES') -// } -// } - stage('Run E2E-Tests') { when { expression { !SKIP_RUN } @@ -614,12 +605,12 @@ Void publishE2ETestResult(String reportFolder, String reportName) { } String runTests(String bezeichner, String reportFolder, Integer dbPort, String stageName) { - def configFile = generateCypressConfig(bezeichner, reportFolder, dbPort) + def config = generateCypressConfig(bezeichner, reportFolder, dbPort) try { - dir("goofy-client") { - sh "npm run cypress:version" - sh "npm run cypress:ci-run --CONFIG_FILE=${configFile} --REPORT_FOLDER=${reportFolder}" + dir('goofy-client'){ + sh "npm run cypress:version" + sh "apps/goofy-e2e/run-tests.sh ${reportFolder} ${config}" } } catch (Exception e) { printNpmDebugLog() @@ -658,35 +649,35 @@ String cutBranchNameForKeycloakRealm(String branchName, String stageName) { String generateCypressConfig(String bezeichner, String testFolder, Integer dbPort) { def namespace = generateNamespace(bezeichner) - def configName = "cypress-ci-"+testFolder+".json" + def configName = "cypress-ci-"+testFolder+".json" - dir('goofy-client/apps/goofy-e2e/'){ - def config = readJSON file: 'cypress-ci.json' + dir('goofy-client/apps/goofy-e2e/'){ + def config = readJSON file: 'cypress-ci.json' def plutoDatabaseSecret = getPlutoDatabaseSecret(namespace); def decodedPassword = decodeString(plutoDatabaseSecret.password); def parsablePassword = makePasswordUrlConform(decodedPassword); - config.baseUrl = "https://${bezeichner}.${env.CLUSTER_BASE_URL}" as String - config.env.dbUrl = "mongodb://${decodeString(plutoDatabaseSecret.username)}:${parsablePassword}@localhost:${dbPort}/admin?ssl=false&directConnection=true" as String - config.env.keycloakUrl = "https://${env.SSO_URL}/" as String - config.env.keycloakRealm = namespace as String - config.env.keycloakClient = "alfa" as String + config.baseUrl = "https://${bezeichner}.${env.CLUSTER_BASE_URL}" as String + config.env.dbUrl = "mongodb://${decodeString(plutoDatabaseSecret.username)}:${parsablePassword}@localhost:${dbPort}/admin?ssl=false&directConnection=true" as String + config.env.keycloakUrl = "https://${env.SSO_URL}/" as String + config.env.keycloakRealm = namespace as String config.env.sabineUuid = getKeycloakUuid(namespace, "sabine") as String - config.integrationFolder = "./src/integration/${testFolder}" as String - config.videosFolder = "./reports/${testFolder}/videos" as String - config.screenshotsFolder = "./reports/${testFolder}/screenshots" as String - config.reporterOptions.reportDir = "./reports/${testFolder}/mochawesome-report" as String + config.videosFolder = "./reports/${testFolder}/videos" as String + config.screenshotsFolder = "./reports/${testFolder}/screenshots" as String + config.reporterOptions.reportDir = "./reports/${testFolder}/mochawesome-report" as String - config.env.put("search", getElasticsearchEnv(namespace)) - config.env.put("userManager", getUserManagerEnv(namespace, dbPort)) + config.specPattern = "src/e2e/${testFolder}/**/*.cy.{js,jsx,ts,tsx}" as String - writeJSON file: configName, json: config + config.env.put("search", getElasticsearchEnv(namespace)) + config.env.put("userManager", getUserManagerEnv(namespace, dbPort)) - sh "cat ${configName}" - } + writeJSON file: configName, json: config + + sh "cat ${configName}" + } - return configName + return "cypress-ci-"+testFolder+".config.ts" } String makePasswordUrlConform(String password) { diff --git a/goofy-client/apps/goofy-e2e/cypress-ci-einheitlicher-ansprechpartner.config.ts b/goofy-client/apps/goofy-e2e/cypress-ci-einheitlicher-ansprechpartner.config.ts new file mode 100644 index 0000000000000000000000000000000000000000..5ef91724365a1ed66f94db34d0c762d8b1b3b2b7 --- /dev/null +++ b/goofy-client/apps/goofy-e2e/cypress-ci-einheitlicher-ansprechpartner.config.ts @@ -0,0 +1,16 @@ +import { nxE2EPreset } from '@nrwl/cypress/plugins/cypress-preset'; +import { defineConfig } from 'cypress'; + +//Cypress config is generated by JenkinsFile +const cypressConfig = require('./cypress-ci-einheitlicher-ansprechpartner.json'); +const cypressEvents = require('./src/support/cypress-tasks.ts'); + +export default defineConfig({ + e2e: { + ...nxE2EPreset(__dirname), + ...cypressConfig, + setupNodeEvents(on, config) { + return cypressEvents(on, config); + } + }, +}); \ No newline at end of file diff --git a/goofy-client/apps/goofy-e2e/cypress-ci-main-tests.config.ts b/goofy-client/apps/goofy-e2e/cypress-ci-main-tests.config.ts new file mode 100644 index 0000000000000000000000000000000000000000..c3b17666b23e7ef150bfc88da510380739f7f49a --- /dev/null +++ b/goofy-client/apps/goofy-e2e/cypress-ci-main-tests.config.ts @@ -0,0 +1,16 @@ +import { nxE2EPreset } from '@nrwl/cypress/plugins/cypress-preset'; +import { defineConfig } from 'cypress'; + +//Cypress config is generated by JenkinsFile +const cypressConfig = require('./cypress-ci-main-tests.json'); +const cypressEvents = require('./src/support/cypress-tasks.ts'); + +export default defineConfig({ + e2e: { + ...nxE2EPreset(__dirname), + ...cypressConfig, + setupNodeEvents(on, config) { + return cypressEvents(on, config); + } + }, +}); \ No newline at end of file diff --git a/goofy-client/apps/goofy-e2e/cypress-ci.json b/goofy-client/apps/goofy-e2e/cypress-ci.json index cbcd4bfb981c2d6443c05fe4925c05646c1c9325..084a420ec79ba1ddf02340bfe17f62db94a8b985 100644 --- a/goofy-client/apps/goofy-e2e/cypress-ci.json +++ b/goofy-client/apps/goofy-e2e/cypress-ci.json @@ -1,30 +1,22 @@ { - "baseUrl": "https://e2e.dev.by.ozg-cloud.de", "env": { - "dbUrl": "mongodb+srv://pluto-database-user:XnHhfznNWg65NNd@pluto-database-svc.sh-e2e-dev.svc.cluster.local/admin?ssl=false", "database": "pluto-database", - "keycloakRealm": "by-e2e-local-dev", - "keycloakUrl": "https://sso.dev.by.ozg-cloud.de/", "keycloakClient": "alfa" }, "fileServerFolder": ".", "fixturesFolder": "./src/fixtures", - "integrationFolder": "./src/integration", "modifyObstructiveCode": false, - "pluginsFile": "./src/plugins/index", - "supportFile": "./src/support/index.ts", "video": true, - "videosFolder": "./reports/videos", - "screenshotsFolder": "./reports/screenshots", "chromeWebSecurity": false, "reporter": "../../node_modules/cypress-mochawesome-reporter", "defaultCommandTimeout": 10000, + "supportFile": "./src/support/e2e.ts", + "testIsolation": false, "reporterOptions": { "html": false, "json": true, "quite": true, - "reportDir": "./reports/mochawesome-report", "reportFilename": "report", "overwrite": false } -} \ No newline at end of file +} diff --git a/goofy-client/apps/goofy-e2e/cypress.json b/goofy-client/apps/goofy-e2e/cypress.config.json similarity index 84% rename from goofy-client/apps/goofy-e2e/cypress.json rename to goofy-client/apps/goofy-e2e/cypress.config.json index 3b0a26d3b4eff62ab9c59c604f6363b12979da51..2eaa211f04655dea29923a5a9228dc5a98dcc19b 100644 --- a/goofy-client/apps/goofy-e2e/cypress.json +++ b/goofy-client/apps/goofy-e2e/cypress.config.json @@ -20,16 +20,15 @@ }, "fileServerFolder": ".", "fixturesFolder": "./src/fixtures", - "integrationFolder": "./src/integration", - "modifyObstructiveCode": false, - "pluginsFile": "./src/plugins/index", - "supportFile": "./src/support/index.ts", - "video": true, + "video": false, "videosFolder": "./reports/videos", "screenshotsFolder": "./reports/screenshots", "chromeWebSecurity": false, "reporter": "../../node_modules/cypress-mochawesome-reporter", "defaultCommandTimeout": 10000, + "specPattern": "src/e2e/**/*.cy.{js,jsx,ts,tsx}", + "supportFile": "src/support/e2e.ts", + "testIsolation": false, "reporterOptions": { "html": false, "json": true, @@ -37,4 +36,4 @@ "reportFilename": "report", "overwrite": true } -} \ No newline at end of file +} diff --git a/goofy-client/apps/goofy-e2e/cypress.config.ts b/goofy-client/apps/goofy-e2e/cypress.config.ts new file mode 100644 index 0000000000000000000000000000000000000000..21b3aad9fb32db1ae98081e63a3facb256b3593a --- /dev/null +++ b/goofy-client/apps/goofy-e2e/cypress.config.ts @@ -0,0 +1,15 @@ +import { nxE2EPreset } from '@nrwl/cypress/plugins/cypress-preset'; +import { defineConfig } from 'cypress'; + +const cypressConfig = require('./cypress.config.json'); +const cypressEvents = require('./src/support/cypress-tasks.ts'); + +export default defineConfig({ + e2e: { + ...nxE2EPreset(__dirname), + ...cypressConfig, + setupNodeEvents(on, config) { + return cypressEvents(on, config); + } + }, +}); diff --git a/goofy-client/apps/goofy-e2e/docker-compose.yml b/goofy-client/apps/goofy-e2e/docker-compose.yml index 31c7707a16771124d617049f524badcd5f0914f4..3b0a0ea591d1afed116ba0810a7b3cd6e49ecdc6 100644 --- a/goofy-client/apps/goofy-e2e/docker-compose.yml +++ b/goofy-client/apps/goofy-e2e/docker-compose.yml @@ -39,10 +39,11 @@ services: - SPRING_DATA_MONGODB_HOST=ozg-mongodb - SPRING_PROFILES_ACTIVE=${SPRING_PROFILE:-dev,e2e} - logging_level_org_springframework_security=${LOGGING_LEVEL:-WARN} - - SPRING_ELASTICSEARCH_URIS=http://ozg-elastic:9200 - - SPRING_ELASTICSEARCH_USERNAME=elastic - - SPRING_ELASTICSEARCH_PASSWORD=password - - KOP_ELASTICSEARCH_INDEX=e2e-test-index + - OZGCLOUD_ELASTICSEARCH_ADDRESS=ozg-elastic:9200 + - OZGCLOUD_ELASTICSEARCH_USERNAME=elastic + - OZGCLOUD_ELASTICSEARCH_PASSWORD=password + - OZGCLOUD_ELASTICSEARCH_INDEX=e2e-test-index + - OZGCLOUD_ELASTICSEARCH_USESSL=false - GRPC_CLIENT_USER_MANAGER_ADDRESS=static://ozg-usermanager:9000 - GRPC_CLIENT_USER_MANAGER_NEGOTIATION_TYPE=PLAINTEXT - KOP_USERMANAGER_URL=http://localhost:9092/migration/user @@ -98,12 +99,14 @@ services: interval: 10s timeout: 10s retries: 5 + ozg-usermanager: image: docker.ozg-sh.de/user-manager:${USERMANAGER_DOCKER_IMAGE:-snapshot-latest} platform: linux/amd64 environment: - QUARKUS_HTTP_CORS_ORIGINS=http://localhost:4300,http://127.0.0.1:4300,https://e2e.dev.by.ozg-cloud.de - QUARKUS_OIDC_AUTH_SERVER_URL=https://sso.dev.by.ozg-cloud.de/realms/by-e2e-local-dev + - QUARKUS_LOG_CONSOLE_JSON=false - QUARKUS_OIDC_CLIENT_ID=alfa - KOP_KEYCLOAK_API_USER=usermanagerapiuser - KOP_KEYCLOAK_API_PASSWORD= diff --git a/goofy-client/apps/goofy-e2e/run-tests.sh b/goofy-client/apps/goofy-e2e/run-tests.sh new file mode 100755 index 0000000000000000000000000000000000000000..cea8e1905a1f6ac1aa1b90a14769e0c6c86a1f79 --- /dev/null +++ b/goofy-client/apps/goofy-e2e/run-tests.sh @@ -0,0 +1,26 @@ +#!/bin/bash + +export NO_COLOR=1 + +REPORT_FOLDER=$1 +CONFIG_FILE="${2:-cypress.config.ts}" + +echo "Run E2E for $REPORT_FOLDER with configuration apps/goofy-e2e/$CONFIG_FILE..." + +rm -rf apps/goofy-e2e/reports/${REPORT_FOLDER} + +npx cypress run --project apps/goofy-e2e --spec apps/goofy-e2e/src/e2e/${REPORT_FOLDER} --config-file $CONFIG_FILE + +TEST_RESULT=$? + +if [ -d "apps/goofy-e2e/reports/${REPORT_FOLDER}/mochawesome-report/.jsons" ]; then + mv apps/goofy-e2e/reports/${REPORT_FOLDER}/mochawesome-report/.jsons apps/goofy-e2e/reports/${REPORT_FOLDER}/mochawesome-report/jsons + npx mochawesome-merge apps/goofy-e2e/reports/${REPORT_FOLDER}/mochawesome-report/**/*.json > apps/goofy-e2e/reports/${REPORT_FOLDER}/report.json + # Workaround: mochawesome's "screenshotsFolder" value is not added in the generated HTML file. Add "screenshots" to image paths. + sed --in-place --regexp-extended 's/"([^"]*\.png)/"screenshots\1/' apps/goofy-e2e/reports/${REPORT_FOLDER}/report.json + npx marge apps/goofy-e2e/reports/${REPORT_FOLDER}/report.json -f report -o apps/goofy-e2e/reports/${REPORT_FOLDER} +else + echo "ERROR: Reports do not exist at apps/goofy-e2e/reports/${REPORT_FOLDER}/mochawesome-report/.jsons" +fi + +exit $TEST_RESULT \ No newline at end of file diff --git a/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/navigation/navigation.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/einheitlicher-ansprechpartner/navigation/navigation.cy.ts similarity index 100% rename from goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/navigation/navigation.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/einheitlicher-ansprechpartner/navigation/navigation.cy.ts diff --git a/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-abschliessen.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-detail/vorgang-abschliessen.cy.ts similarity index 100% rename from goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-abschliessen.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-detail/vorgang-abschliessen.cy.ts diff --git a/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forward-fail.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forward-fail.cy.ts similarity index 100% rename from goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forward-fail.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forward-fail.cy.ts diff --git a/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forward.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forward.cy.ts similarity index 100% rename from goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forward.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forward.cy.ts diff --git a/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forwarding-failed-e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forwarding-failed-cy.ts similarity index 100% rename from goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forwarding-failed-e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-detail/vorgang-forwarding-failed-cy.ts diff --git a/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-loeschen-anfordern.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-detail/vorgang-loeschen-anfordern.cy.ts similarity index 100% rename from goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-loeschen-anfordern.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-detail/vorgang-loeschen-anfordern.cy.ts diff --git a/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-verwerfen.ea.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-detail/vorgang-verwerfen.ea.cy.ts similarity index 100% rename from goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-verwerfen.ea.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-detail/vorgang-verwerfen.ea.cy.ts diff --git a/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-wiedereroeffnen.ea.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-detail/vorgang-wiedereroeffnen.ea.cy.ts similarity index 100% rename from goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-wiedereroeffnen.ea.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-detail/vorgang-wiedereroeffnen.ea.cy.ts diff --git a/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-zurueckholen.ea.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-detail/vorgang-zurueckholen.ea.cy.ts similarity index 100% rename from goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-detail/vorgang-zurueckholen.ea.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-detail/vorgang-zurueckholen.ea.cy.ts diff --git a/goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-list/vorgang-list-ea.search.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-list/vorgang-list-ea.search.cy.ts similarity index 100% rename from goofy-client/apps/goofy-e2e/src/integration/einheitlicher-ansprechpartner/vorgang-list/vorgang-list-ea.search.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/einheitlicher-ansprechpartner/vorgang-list/vorgang-list-ea.search.cy.ts diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/accessibility/vorgang-list.spec-e2e.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/accessibility/vorgang-list.cy.ts similarity index 91% rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/accessibility/vorgang-list.spec-e2e.ts rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/accessibility/vorgang-list.cy.ts index 5efa4507a3b79ec51e16f54d741debba372b1612..8ada47b1edcf7e7d636abc0cd8361557663d35ad 100644 --- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/accessibility/vorgang-list.spec-e2e.ts +++ b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/accessibility/vorgang-list.cy.ts @@ -4,9 +4,9 @@ import { VorgangSearchE2EComponent } from 'apps/goofy-e2e/src/components/vorgang import { VorgangViewsE2EComponent } from 'apps/goofy-e2e/src/components/vorgang/vorgang-views.e2e.component'; import { HeaderE2EComponent } from 'apps/goofy-e2e/src/page-objects/header.po'; import { MainPage, waitForSpinnerToDisappear } from 'apps/goofy-e2e/src/page-objects/main.po'; -import { getFormField, isKeyboardFocused, isMatFocused } from 'apps/goofy-e2e/src/support/angular.util'; +import { isKeyboardFocused } from 'apps/goofy-e2e/src/support/angular.util'; import { dropCollections, pressTab } from 'apps/goofy-e2e/src/support/cypress-helper'; -import { exist } from 'apps/goofy-e2e/src/support/cypress.util'; +import { exist, haveFocus } from 'apps/goofy-e2e/src/support/cypress.util'; import { getUserManagerUserSabine, initUsermanagerUsers, loginAsSabine } from 'apps/goofy-e2e/src/support/user-util'; describe('VorgangList Page', () => { @@ -54,13 +54,7 @@ describe('VorgangList Page', () => { it('should focus search field', () => { pressTab(); - isMatFocused(getFormField(vorgangSearch.getForm())); - }) - - it('should focus clear search button', () => { - pressTab(); - - isKeyboardFocused(vorgangSearch.getClearButton()); + haveFocus(vorgangSearch.getInput()); }) it('should focus help menu icon', () => { diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/app/buildinfo.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/app/buildinfo.cy.ts similarity index 100% rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/app/buildinfo.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/app/buildinfo.cy.ts diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/app/login-logout.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/app/login-logout.cy.ts similarity index 100% rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/app/login-logout.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/app/login-logout.cy.ts diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/hint/no-organisations-einheit-id.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/hint/no-organisations-einheit-id.cy.ts similarity index 100% rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/hint/no-organisations-einheit-id.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/hint/no-organisations-einheit-id.cy.ts diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/historie/historie.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/historie/historie.cy.ts similarity index 100% rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/historie/historie.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/historie/historie.cy.ts diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/interceptor/interceptor-connection-timout.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/interceptor/interceptor-connection-timout.cy.ts similarity index 100% rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/interceptor/interceptor-connection-timout.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/interceptor/interceptor-connection-timout.cy.ts diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/interceptor/interceptor-forbidden.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/interceptor/interceptor-forbidden.cy.ts similarity index 100% rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/interceptor/interceptor-forbidden.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/interceptor/interceptor-forbidden.cy.ts diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/interceptor/interceptor-server-error.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/interceptor/interceptor-server-error.cy.ts similarity index 98% rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/interceptor/interceptor-server-error.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/interceptor/interceptor-server-error.cy.ts index bbac0d37ed2ce91377bcd6da2b872ca4e0de9f6a..e57681f1ff5a596a9f12b28123f2e9ffe69f8531 100644 --- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/interceptor/interceptor-server-error.e2e-spec.ts +++ b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/interceptor/interceptor-server-error.cy.ts @@ -65,7 +65,6 @@ describe('Interceptor Server Error', () => { it('should show page', () => { vorgangList.getListItem(vorgang.name).getRoot().click(); - waitForSpinnerToDisappear(); waitOfInterceptor(interceptor).then(interception => { assert(interception.response.statusCode, statusCode.toString()); diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/interceptor/interceptor-unauthorized.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/interceptor/interceptor-unauthorized.cy.ts similarity index 100% rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/interceptor/interceptor-unauthorized.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/interceptor/interceptor-unauthorized.cy.ts diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/kommentar-attachment/kommentar-attachment.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/kommentar-attachment/kommentar-attachment.cy.ts similarity index 100% rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/kommentar-attachment/kommentar-attachment.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/kommentar-attachment/kommentar-attachment.cy.ts diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/kommentar/kommentar.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/kommentar/kommentar.cy.ts similarity index 100% rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/kommentar/kommentar.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/kommentar/kommentar.cy.ts diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/loesch-anforderung/endgueltig-loeschen.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/loesch-anforderung/endgueltig-loeschen.cy.ts similarity index 96% rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/loesch-anforderung/endgueltig-loeschen.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/loesch-anforderung/endgueltig-loeschen.cy.ts index f3588c671c47d3c7029f50e2f54434dce166ae86..18eba64a91139e1f089a1ce399f8729e5f95ba9b 100644 --- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/loesch-anforderung/endgueltig-loeschen.e2e-spec.ts +++ b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/loesch-anforderung/endgueltig-loeschen.cy.ts @@ -105,7 +105,8 @@ describe('Vorgang endgültig löschen', () => { }) }) - describe('Endgültig Löschen (ludwig löscht den Vorgang für den die sabine die Löschanforderung gestellt hat)', () => { + // TODO Warum exakt derselbe Test nochmal, nur mit objectIds[2] anstelle objectIds[1]? + describe.skip('Endgültig Löschen (ludwig löscht den Vorgang für den die sabine die Löschanforderung gestellt hat)', () => { before(() => { initVorgang(vorgangZuLoeschen); diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/loesch-anforderung/loesch-anforderung-zuruecknehmen.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/loesch-anforderung/loesch-anforderung-zuruecknehmen.cy.ts similarity index 100% rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/loesch-anforderung/loesch-anforderung-zuruecknehmen.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/loesch-anforderung/loesch-anforderung-zuruecknehmen.cy.ts diff --git a/goofy-client/apps/goofy-e2e/src/e2e/main-tests/loesch-anforderung/loeschen-anfordern.cy.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/loesch-anforderung/loeschen-anfordern.cy.ts new file mode 100644 index 0000000000000000000000000000000000000000..36a11e3c361ee9bc887f01c49d229cf9dfa09a86 --- /dev/null +++ b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/loesch-anforderung/loeschen-anfordern.cy.ts @@ -0,0 +1,360 @@ +import { registerLocaleData } from '@angular/common'; +import localeDe from '@angular/common/locales/de'; +import localeDeExtra from '@angular/common/locales/extra/de'; +import { KommentareInVorgangE2EComponent } from 'apps/goofy-e2e/src/components/kommentar/kommentar-list.e2e.component'; +import { PostfachMailE2EComponent } from 'apps/goofy-e2e/src/components/postfach/postfach-mail.e2e.component'; +import { UserProfileE2EComponent } from 'apps/goofy-e2e/src/components/user-profile/user-profile.component.e2e'; +import { VorgangFormularButtonsE2EComponent } from 'apps/goofy-e2e/src/components/vorgang/vorgang-formular-buttons.e2e.components'; +import { WiedervorlageInVorgangE2EComponent } from 'apps/goofy-e2e/src/components/wiedervorlage/wiedervorlage-in-vorgang.e2e.component'; +import { initVorgangAttachedItem } from 'apps/goofy-e2e/src/support/vorgang-attached-item-util'; +import { createWiedervorlageAttachedItem, createWiedervorlageUriByVorgangIdAndWiedervorlageId } from 'apps/goofy-e2e/src/support/wiedervorlage-util'; +import { SnackBarE2EComponent } from '../../../components/ui/snackbar.e2e.component'; +import { VorgangListE2EComponent } from '../../../components/vorgang/vorgang-list.e2e.component'; +import { VorgangE2E, VorgangMessagesE2E, VorgangStatusE2E, vorgangStatusLabelE2E } from '../../../model/vorgang'; +import { MainPage, waitForSpinnerToDisappear } from '../../../page-objects/main.po'; +import { VorgangPage } from '../../../page-objects/vorgang.po'; +import { dropCollections, visitUrl } from '../../../support/cypress-helper'; +import { contains, exist, haveText, notExist } from '../../../support/cypress.util'; +import { loginAsLudwig, loginAsSabine } from '../../../support/user-util'; +import { buildVorgang, initVorgaenge, initVorgang, objectIds } from '../../../support/vorgang-util'; + +registerLocaleData(localeDe, 'de', localeDeExtra); + +describe('Vorgang Löschen anfordern', () => { + const mainPage: MainPage = new MainPage(); + const vorgangList: VorgangListE2EComponent = mainPage.getVorgangList(); + const snackBar: SnackBarE2EComponent = mainPage.getSnackBar(); + + const vorgangPage: VorgangPage = new VorgangPage(); + const vorgangFormularButtons: VorgangFormularButtonsE2EComponent = vorgangPage.getFormularButtons(); + + const vorgangNichtLoeschbar: VorgangE2E = { ...buildVorgang(objectIds[5], 'DoNichtLoeschbar'), status: VorgangStatusE2E.ABGESCHLOSSEN }; + + const vorgangAbgeschlossenLoeschenAnfordern: VorgangE2E = { ...buildVorgang(objectIds[0], 'DoAbgeschlossenLoeschenAnfordern'), status: VorgangStatusE2E.ABGESCHLOSSEN }; + const vorgangAbgeschlossenLoeschenAnfordernRevoke: VorgangE2E = { ...buildVorgang(objectIds[1], 'DoAbgeschlossenRevokeLoeschenAnfordern'), status: VorgangStatusE2E.ABGESCHLOSSEN }; + + const vorgangVerworfenLoeschenAnfordern: VorgangE2E = { ...buildVorgang(objectIds[2], 'DoVerworfenLoeschenAnfordern'), status: VorgangStatusE2E.VERWORFEN }; + const vorgangVerworfenLoeschenAnfordernRevoke: VorgangE2E = { ...buildVorgang(objectIds[3], 'DoVerworfenRevokeLoeschenAnfordern'), status: VorgangStatusE2E.VERWORFEN }; + + const wiedervorlageAttachedItem = createWiedervorlageAttachedItem(objectIds[4], vorgangAbgeschlossenLoeschenAnfordern._id.$oid); + const wiedervorlageUrl = createWiedervorlageUriByVorgangIdAndWiedervorlageId(objectIds[0], objectIds[4]); + + + describe('Nicht löschen (Ludwig kann keinen Vorgang löschen, für den er selbst die Löschanforderung gestellt hat)', () => { + before(() => { + initVorgang(vorgangNichtLoeschbar); + + loginAsLudwig(); + + waitForSpinnerToDisappear(); + exist(vorgangList.getRoot()); + }) + + it('Öffne Vorgang für Löschanforderung', () => { + vorgangList.getListItem(vorgangNichtLoeschbar.name).getRoot().click(); + waitForSpinnerToDisappear(); + + exist(vorgangPage.getVorgangDetailHeader().getRoot()); + }) + + it('Vorgang ist im Status: Abgeschlossen', () => { + haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E.ABGESCHLOSSEN); + }) + + it('Löschen anfordern klicken', () => { + vorgangFormularButtons.getLoeschenAnfordernButton().click(); + waitForSpinnerToDisappear(); + }) + + it('Vorgang ist im Status: Zu Löschen', () => { + haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E.ZU_LOESCHEN); + }) + + it('Button zum Endgültig löschen ist nicht vorhanden', () => { + waitForSpinnerToDisappear(); + notExist(vorgangFormularButtons.getEndgueltigLoeschenButton()); + }) + }) + + describe('with user Sabine', () => { + before(() => { + initVorgaenge([vorgangAbgeschlossenLoeschenAnfordern, vorgangAbgeschlossenLoeschenAnfordernRevoke, vorgangVerworfenLoeschenAnfordern, vorgangVerworfenLoeschenAnfordernRevoke]); + initVorgangAttachedItem([wiedervorlageAttachedItem]); + + loginAsSabine(); + + waitForSpinnerToDisappear(); + exist(vorgangList.getRoot()); + }) + + after(() => { + dropCollections(); + }) + + describe('Abgeschlossen: löschen anfordern', () => { + + it('Open Vorgang-Detail-Page', () => { + vorgangList.getListItem(vorgangAbgeschlossenLoeschenAnfordern.name).getRoot().click(); + waitForSpinnerToDisappear(); + + exist(vorgangPage.getVorgangDetailHeader().getRoot()); + }) + + describe('by button', () => { + + it('should have status Abgeschlossen', () => { + haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[vorgangAbgeschlossenLoeschenAnfordern.status]); + }) + + it('should click Löschen anfordern button', () => { + vorgangFormularButtons.getLoeschenAnfordernButton().click(); + waitForSpinnerToDisappear(); + }) + + it('should show snackBar message', () => { + exist(snackBar.getCloseButton()); + contains(snackBar.getMessage(), VorgangMessagesE2E.LOESCHEN_ANFORDERN) + }) + + it('should close snackBar', () => { + snackBar.getCloseButton().click(); + + notExist(snackBar.getMessage()); + }) + + it('should have status zu Löschen', () => { + haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.ZU_LOESCHEN]); + }) + + it('should redirect Wiedervorlage link to Vorgang', () => { + visitUrl(wiedervorlageUrl); + + exist(vorgangPage.getVorgangDetailHeader().getRoot()); + }) + + it('should show snackBar message', () => { + exist(snackBar.getCloseButton()); + contains(snackBar.getMessage(), VorgangMessagesE2E.WIEDERVORLAGE_BEARBEITEN_NICHT_MOEGLICH) + }) + + it('should close snackBar', () => { + snackBar.getCloseButton().click(); + + notExist(snackBar.getMessage()); + }) + + it('back to vorgang list', () => { + vorgangPage.getSubnavigation().getBackButton().click(); + waitForSpinnerToDisappear(); + + exist(vorgangList.getRoot()); + }) + + it('should have status zu Löschen', () => { + haveText(vorgangList.getListItem(vorgangAbgeschlossenLoeschenAnfordern.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.ZU_LOESCHEN]); + }) + }) + }) + + describe('Disable functions', () => { + + it('Open Vorgang-Detail-Page', () => { + vorgangList.getListItem(vorgangAbgeschlossenLoeschenAnfordern.name).getRoot().click(); + waitForSpinnerToDisappear(); + + exist(vorgangPage.getVorgangDetailHeader().getRoot()); + }) + + it('should not have add comment button', () => { + const kommentarContainer: KommentareInVorgangE2EComponent = vorgangPage.getKommentarContainer(); + + notExist(kommentarContainer.getHinzufuegenButton()); + }) + + it('should disable edit comment', () => { + const kommentarContainer: KommentareInVorgangE2EComponent = vorgangPage.getKommentarContainer(); + + notExist(kommentarContainer.getFormular()); + }) + + it('should not have create postfach mail buttons', () => { + const postfachMailContainer: PostfachMailE2EComponent = vorgangPage.getPostfachMailcontainer(); + + notExist(postfachMailContainer.getCreateButtonWithoutText()); + notExist(postfachMailContainer.getCreateButtonWithText()); + }) + + it('should not have add wiedervorlage button', () => { + const createWiedervorlageButton = vorgangPage.getWiedervorlagenContainer().getCreateWiedervorlageButton(); + + notExist(createWiedervorlageButton); + }) + + it('should disable open Wiedervorlage-Page link ', () => { + const wiedervorlageInVorgang: WiedervorlageInVorgangE2EComponent = vorgangPage.getWiedervorlagenContainer().getWiedervorlage('Wiedervorlage'); + + notExist(wiedervorlageInVorgang.getLink()); + }) + + it('should not have user assign button', () => { + const userProfileContainer: UserProfileE2EComponent = vorgangPage.getVorgangDetailHeader().getUserContainer(); + + notExist(userProfileContainer.getRoot()); + }) + + it('back to vorgang list', () => { + vorgangPage.getSubnavigation().getBackButton().click(); + waitForSpinnerToDisappear(); + + exist(vorgangList.getRoot()); + }) + + }) + + describe('Abgeschlossen: löschen anfordern und rückgängig machen', () => { + + it('Open Vorgang-Detail-Page', () => { + vorgangList.getListItem(vorgangAbgeschlossenLoeschenAnfordernRevoke.name).getRoot().click(); + waitForSpinnerToDisappear(); + + exist(vorgangPage.getVorgangDetailHeader().getRoot()); + }) + + describe('by icon-button', () => { + + it('should have status Abgeschlossen', () => { + haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[vorgangAbgeschlossenLoeschenAnfordernRevoke.status]); + }) + + it('should show snackBar message', () => { + vorgangPage.getSubnavigation().getLoeschenAnfordernByIconButton().click(); + waitForSpinnerToDisappear(); + + exist(snackBar.getCloseButton()); + contains(snackBar.getMessage(), VorgangMessagesE2E.LOESCHEN_ANFORDERN); + }) + + it('should close snackbar on revoke', () => { + snackBar.getRevokeButton().click(); + waitForSpinnerToDisappear(); + + notExist(snackBar.getMessage()); + }) + + it('should show status Abgeschlossen', () => { + notExist(vorgangPage.getProgressBar()); + + haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.ABGESCHLOSSEN]); + }) + + it('back to vorgang list', () => { + vorgangPage.getSubnavigation().getBackButton().click(); + waitForSpinnerToDisappear(); + + exist(vorgangList.getRoot()); + }) + + it('should have status Abgeschlossen', () => { + haveText(vorgangList.getListItem(vorgangAbgeschlossenLoeschenAnfordernRevoke.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.ABGESCHLOSSEN]) + }) + }) + }) + + describe('Verworfen: löschen anfordern', () => { + + it('Open Vorgang-Detail-Page', () => { + vorgangList.getListItem(vorgangVerworfenLoeschenAnfordern.name).getRoot().click(); + waitForSpinnerToDisappear(); + + exist(vorgangPage.getVorgangDetailHeader().getRoot()); + }) + + describe('by button', () => { + + it('should have status Verworfen', () => { + haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[vorgangVerworfenLoeschenAnfordern.status]); + }) + + it('should show snackBar message', () => { + vorgangFormularButtons.getLoeschenAnfordernButton().click(); + waitForSpinnerToDisappear(); + + exist(snackBar.getCloseButton()); + contains(snackBar.getMessage(), VorgangMessagesE2E.LOESCHEN_ANFORDERN) + }) + + it('should close snackBar', () => { + snackBar.getCloseButton().click(); + + notExist(snackBar.getMessage()); + }) + + it('should have status zu Löschen', () => { + haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.ZU_LOESCHEN]); + }) + + it('back to vorgang list', () => { + vorgangPage.getSubnavigation().getBackButton().click(); + waitForSpinnerToDisappear(); + + exist(vorgangList.getRoot()); + }) + + it('should have status zu Löschen', () => { + haveText(vorgangList.getListItem(vorgangVerworfenLoeschenAnfordern.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.ZU_LOESCHEN]); + }) + }) + }) + + describe('Verworfen: löschen anfordern und rückgängig machen', () => { + + it('Open Vorgang-Detail-Page', () => { + vorgangList.getListItem(vorgangVerworfenLoeschenAnfordernRevoke.name).getRoot().click(); + waitForSpinnerToDisappear(); + + exist(vorgangPage.getVorgangDetailHeader().getRoot()); + }) + + describe('by icon-button', () => { + + it('should have status Verworfen', () => { + haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[vorgangVerworfenLoeschenAnfordernRevoke.status]); + }) + + it('should show snackBar message', () => { + vorgangPage.getSubnavigation().getLoeschenAnfordernByIconButton().click(); + waitForSpinnerToDisappear(); + + exist(snackBar.getCloseButton()); + contains(snackBar.getMessage(), VorgangMessagesE2E.LOESCHEN_ANFORDERN); + }) + + it('should close snackbar on revoke', () => { + snackBar.getRevokeButton().click(); + waitForSpinnerToDisappear(); + + notExist(snackBar.getMessage()); + }) + + it('should show status Verworfen', () => { + notExist(vorgangPage.getProgressBar()); + + haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.VERWORFEN]); + }) + + it('back to vorgang list', () => { + vorgangPage.getSubnavigation().getBackButton().click(); + waitForSpinnerToDisappear(); + + exist(vorgangList.getRoot()); + }) + + it('should have status Verworfen', () => { + haveText(vorgangList.getListItem(vorgangVerworfenLoeschenAnfordernRevoke.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.VERWORFEN]) + }) + }) + }) + }) +}); + + diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/navigation/navigation.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/navigation/navigation.cy.ts similarity index 100% rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/navigation/navigation.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/navigation/navigation.cy.ts diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-mail-error.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/postfach-mail/postfach-mail-error.cy.ts similarity index 100% rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-mail-error.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/postfach-mail/postfach-mail-error.cy.ts diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-mail.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/postfach-mail/postfach-mail.cy.ts similarity index 100% rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-mail.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/postfach-mail/postfach-mail.cy.ts diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-mail.filtered-by-organisationseinheit.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/postfach-mail/postfach-mail.filtered-by-organisationseinheit.cy.ts similarity index 100% rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-mail.filtered-by-organisationseinheit.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/postfach-mail/postfach-mail.filtered-by-organisationseinheit.cy.ts diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-nachicht-reply-button.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/postfach-mail/postfach-nachicht-reply-button.cy.ts similarity index 100% rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-nachicht-reply-button.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/postfach-mail/postfach-nachicht-reply-button.cy.ts diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-nachricht-authorize-by-role.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/postfach-mail/postfach-nachricht-authorize-by-role.cy.ts similarity index 100% rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-nachricht-authorize-by-role.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/postfach-mail/postfach-nachricht-authorize-by-role.cy.ts diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-nachrichten.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/postfach-mail/postfach-nachrichten.cy.ts similarity index 100% rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/postfach-mail/postfach-nachrichten.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/postfach-mail/postfach-nachrichten.cy.ts diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/user-profile/user-profile-current-user-icon.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/user-profile/user-profile-current-user-icon.cy.ts similarity index 100% rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/user-profile/user-profile-current-user-icon.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/user-profile/user-profile-current-user-icon.cy.ts diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/user-profile/user-profile-icon-assign-unassign.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/user-profile/user-profile-icon-assign-unassign.cy.ts similarity index 98% rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/user-profile/user-profile-icon-assign-unassign.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/user-profile/user-profile-icon-assign-unassign.cy.ts index e267803ff8184d7680b35e73605a6cd5826aee49..4acfd38edd15da225ef10614c795af3357ebc5d3 100644 --- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/user-profile/user-profile-icon-assign-unassign.e2e-spec.ts +++ b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/user-profile/user-profile-icon-assign-unassign.cy.ts @@ -28,7 +28,7 @@ import { UserE2E } from '../../../model/user'; import { VorgangE2E } from '../../../model/vorgang'; import { MainPage, waitForSpinnerToDisappear, waitforSpinnerToAppear } from '../../../page-objects/main.po'; import { VorgangPage } from '../../../page-objects/vorgang.po'; -import { dropCollections } from '../../../support/cypress-helper'; +import { dropCollections, wait } from '../../../support/cypress-helper'; import { enter, exist, haveText, notExist } from '../../../support/cypress.util'; import { getUserDorothea, getUserManagerUserDorothea, getUserManagerUserSabine, getUserSabine, initUsermanagerUsers, loginAsSabine } from '../../../support/user-util'; import { createVorgang, initVorgang } from '../../../support/vorgang-util'; @@ -169,6 +169,7 @@ describe('User Profile im ausgewählten Vorgang', () => { it('should show assign icon', { defaultCommandTimeout: 30000 }, () => { waitForSpinnerToDisappear(); // TODO Hier muss aufs Verarbeiten im Backend gewartet werden - oder: wait(500) + wait(500); exist(userProfileContainer.getIconContainer().getAssignedIcon()); haveText(userProfileContainer.getIconContainer().getAssignedIcon(), userDorothea.initials) }) diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/user-profile/user-profile-icon-in-kommentar-error.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/user-profile/user-profile-icon-in-kommentar-error.cy.ts similarity index 100% rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/user-profile/user-profile-icon-in-kommentar-error.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/user-profile/user-profile-icon-in-kommentar-error.cy.ts diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/user-profile/user-profile-icon-in-postfach-nachricht-error.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/user-profile/user-profile-icon-in-postfach-nachricht-error.cy.ts similarity index 100% rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/user-profile/user-profile-icon-in-postfach-nachricht-error.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/user-profile/user-profile-icon-in-postfach-nachricht-error.cy.ts diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/user-profile/user-profile-icon-in-vorgang-error.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/user-profile/user-profile-icon-in-vorgang-error.cy.ts similarity index 100% rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/user-profile/user-profile-icon-in-vorgang-error.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/user-profile/user-profile-icon-in-vorgang-error.cy.ts diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/user-settings/user-settings.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/user-settings/user-settings.cy.ts similarity index 96% rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/user-settings/user-settings.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/user-settings/user-settings.cy.ts index 567f42b87f294697c7ca0eab7eabba9ddcce8b39..0024b22de50c503cfa1fe9042b1f6da2110d2e1d 100644 --- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/user-settings/user-settings.e2e-spec.ts +++ b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/user-settings/user-settings.cy.ts @@ -37,7 +37,6 @@ describe('User Settings', () => { const vorgangList: VorgangListE2EComponent = mainPage.getVorgangList(); const header: HeaderE2EComponent = mainPage.getHeader(); const userSettings: UserSettingsE2EComponent = header.getUserSettings(); - const vorgang: VorgangE2E = createVorgang(); before(() => { @@ -76,7 +75,7 @@ describe('User Settings', () => { }) it('should switch toggle status', () => { - userSettings.getEmailBenachrichtigung().getRoot().click(); + userSettings.getEmailBenachrichtigung().getToggle().click(); isChecked(userSettings.getEmailBenachrichtigung().getToggle()); }) @@ -96,7 +95,7 @@ describe('User Settings', () => { }) it('should switch toggle status', () => { - userSettings.getDarkMode().getRoot().click(); + userSettings.getDarkMode().getToggle().click(); isChecked(userSettings.getDarkMode().getToggle()); }) diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-anhang/anhang-herunterladen.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-anhang/anhang-herunterladen.cy.ts similarity index 100% rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-anhang/anhang-herunterladen.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-anhang/anhang-herunterladen.cy.ts diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-abschliessen.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-abschliessen.cy.ts similarity index 100% rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-abschliessen.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-abschliessen.cy.ts diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-annehmen.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-annehmen.cy.ts similarity index 100% rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-annehmen.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-annehmen.cy.ts diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-bearbeiten.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-bearbeiten.cy.ts similarity index 100% rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-bearbeiten.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-bearbeiten.cy.ts diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-bescheiden.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-bescheiden.cy.ts similarity index 100% rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-bescheiden.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-bescheiden.cy.ts diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-detailansicht-by-role.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-detailansicht-by-role.cy.ts similarity index 100% rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-detailansicht-by-role.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-detailansicht-by-role.cy.ts diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-detailansicht-formdata.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-detailansicht-formdata.cy.ts similarity index 100% rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-detailansicht-formdata.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-detailansicht-formdata.cy.ts diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-detailansicht.authorize-by-role.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-detailansicht.authorize-by-role.cy.ts similarity index 100% rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-detailansicht.authorize-by-role.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-detailansicht.authorize-by-role.cy.ts diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-detailansicht.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-detailansicht.cy.ts similarity index 100% rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-detailansicht.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-detailansicht.cy.ts diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-detailansicht.filtered-by-organisationseinheit.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-detailansicht.filtered-by-organisationseinheit.cy.ts similarity index 100% rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-detailansicht.filtered-by-organisationseinheit.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-detailansicht.filtered-by-organisationseinheit.cy.ts diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-exportieren.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-exportieren.cy.ts similarity index 89% rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-exportieren.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-exportieren.cy.ts index f860a6d99217dd94c8d807dd4c4f33bf92c4ff84..0e5cc6e24d453b4b316ee55d17045984eb1161ed 100644 --- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-exportieren.e2e-spec.ts +++ b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-exportieren.cy.ts @@ -29,10 +29,11 @@ import { VorgangListE2EComponent } from '../../../components/vorgang/vorgang-lis import { VorgangE2E } from '../../../model/vorgang'; import { MainPage, waitForSpinnerToDisappear } from '../../../page-objects/main.po'; import { VorgangPage } from '../../../page-objects/vorgang.po'; -import { dropCollections } from '../../../support/cypress-helper'; -import { exist, notExist } from '../../../support/cypress.util'; +import { countDownloadFiles, deleteDownloadFolder, dropCollections } from '../../../support/cypress-helper'; +import { exist, haveValue, notExist } from '../../../support/cypress.util'; import { loginAsSabine } from '../../../support/user-util'; import { createVorgang, initVorgaenge } from '../../../support/vorgang-util'; +import * as fs from 'fs'; registerLocaleData(localeDe, 'de', localeDeExtra); @@ -83,11 +84,14 @@ describe('Vorgang exportieren', () => { exist(menuItem.getButton()); }) - it('should download', () => { + it('should have 1 file in download folder after download', () => { menuItem.getButton().click(); waitForSpinnerToDisappear(); - //TODO In Cypress 10+ implement something like https://docs.cypress.io/api/commands/task#Return-number-of-files-in-the-folder + countDownloadFiles().then((count) => { + expect(count).to.eq(1); + deleteDownloadFolder(); + }); }) it('should close menu after download', () => { diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-verwerfen.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-verwerfen.cy.ts similarity index 100% rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-verwerfen.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-verwerfen.cy.ts diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-wiedereroeffnen.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-wiedereroeffnen.cy.ts similarity index 100% rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-wiedereroeffnen.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-wiedereroeffnen.cy.ts diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-wiedervorlage-loading.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-wiedervorlage-loading.cy.ts similarity index 100% rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-wiedervorlage-loading.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-wiedervorlage-loading.cy.ts diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-zurueckholen.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-zurueckholen.cy.ts similarity index 100% rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-zurueckholen.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-zurueckholen.cy.ts diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-zurueckstellen.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-zurueckstellen.cy.ts similarity index 100% rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-detailansicht/vorgang-zurueckstellen.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-detailansicht/vorgang-zurueckstellen.cy.ts diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list-wiedervorlage/vorgang-list-wiedervorlagen.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-list-wiedervorlage/vorgang-list-wiedervorlagen.cy.ts similarity index 100% rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list-wiedervorlage/vorgang-list-wiedervorlagen.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-list-wiedervorlage/vorgang-list-wiedervorlagen.cy.ts diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list/vorgang-list-pages.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-list/vorgang-list-pages.cy.ts similarity index 100% rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list/vorgang-list-pages.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-list/vorgang-list-pages.cy.ts diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list/vorgang-list-pagination.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-list/vorgang-list-pagination.cy.ts similarity index 100% rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list/vorgang-list-pagination.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-list/vorgang-list-pagination.cy.ts diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list/vorgang-list-views-pages.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-list/vorgang-list-views-pages.cy.ts similarity index 100% rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list/vorgang-list-views-pages.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-list/vorgang-list-views-pages.cy.ts diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list/vorgang-list.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-list/vorgang-list.cy.ts similarity index 100% rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list/vorgang-list.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-list/vorgang-list.cy.ts diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list/vorgang-list.search.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-list/vorgang-list.search.cy.ts similarity index 88% rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list/vorgang-list.search.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-list/vorgang-list.search.cy.ts index ac4f926faa23319149791317810064025a860a93..977ce30f2e623f7661b02f9ea3ad8ed672bfbfaf 100644 --- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list/vorgang-list.search.e2e-spec.ts +++ b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-list/vorgang-list.search.cy.ts @@ -54,15 +54,19 @@ describe('VorgangList Suche', () => { const vorgangToStay: VorgangE2E = { ...createVorgang(), name: 'VorgangToStay', eingangs: [eingang], assignedTo: getUserSabineInternalId() }; const vorgangToDisappear: VorgangE2E = { ...buildVorgang(objectIds[0], 'VorgangToDisappear'), status: VorgangStatusE2E.NEU }; + const vorgangHyphen: VorgangE2E = { ...buildVorgang(objectIds[1], 'Vorgang-mit-Bindestrich'), status: VorgangStatusE2E.NEU }; + const vorgangWOHyphen: VorgangE2E = { ...buildVorgang(objectIds[2], 'Vorgang mit Leerzeichen'), status: VorgangStatusE2E.NEU }; const vorgangStayInList: VorgangListItemE2EComponent = vorgangList.getListItem(vorgangToStay.name); const vorgangDisappearInList: VorgangListItemE2EComponent = vorgangList.getListItem(vorgangToDisappear.name); + const vorgangHyphenInList: VorgangListItemE2EComponent = vorgangList.getListItem(vorgangHyphen.name); + const vorgangWOHyphenInList: VorgangListItemE2EComponent = vorgangList.getListItem(vorgangWOHyphen.name); const userSabine: UserE2E = getUserSabine(); before(() => { - initVorgaenge([vorgangToStay, vorgangToDisappear]); - initSearchIndex([vorgangToStay, vorgangToDisappear]); + initVorgaenge([vorgangToStay, vorgangToDisappear, vorgangHyphen, vorgangWOHyphen]); + initSearchIndex([vorgangToStay, vorgangToDisappear, vorgangHyphen, vorgangWOHyphen]); initUsermanagerUsers([getUserManagerUserSabine()]); loginAsSabine(); @@ -84,6 +88,64 @@ describe('VorgangList Suche', () => { notExist(vorgangDisappearInList.getRoot()); }) + describe('Search for partial strings...', () => { + it ('should find partial string at the beginning', () => { + doSearchWith('VorgangToS'); + waitForSpinnerToDisappear(); + + exist(vorgangStayInList.getRoot()); + }) + + it ('should find partial string in the middle', () => { + doSearchWith('gangToSt'); + waitForSpinnerToDisappear(); + + exist(vorgangStayInList.getRoot()); + }) + + it ('should find partial string at the end, case insensitive', () => { + doSearchWith('toStay'); + waitForSpinnerToDisappear(); + + exist(vorgangStayInList.getRoot()); + }) + + }) + + describe ('Search with hyphen', () => { + it ('should find entry with hyphen', () => { + doSearchWith('Vorgang-mit'); + waitForSpinnerToDisappear(); + + exist(vorgangHyphenInList.getRoot()); + notExist(vorgangWOHyphenInList.getRoot()); + }) + + it ('should find entry without hyphen', () => { + doSearchWith('Vorgang mit'); + waitForSpinnerToDisappear(); + + notExist(vorgangHyphenInList.getRoot()); + exist(vorgangWOHyphenInList.getRoot()); + }) + }) + + describe ('Search using AND operator', () => { + it ('should find entry with all matches', () => { + doSearchWith('Vorgang mit Leerzeichen'); + waitForSpinnerToDisappear(); + + exist(vorgangWOHyphenInList.getRoot()); + }) + + it ('should not find entry when using additional words', () => { + doSearchWith('Vorgang mit als Leerzeichen'); + waitForSpinnerToDisappear(); + + notExist(vorgangWOHyphenInList.getRoot()); + }) + }) + describe('navigate with filtered list to vorgang detail', () => { beforeEach(() => { @@ -172,8 +234,6 @@ describe('VorgangList Suche', () => { it('should navigate back to list', () => { vorgangPage.getSubnavigation().getBackButton().click(); - exist(vorgangPage.getSpinner()); - waitForSpinnerToDisappear(); exist(vorgangList.getRoot()); }) @@ -444,6 +504,7 @@ describe('VorgangList Suche', () => { }) + function doSearchWith(searchBy: string): void { enterWith(vorgangSearch.getInput(), searchBy); } diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list/vorgang-view-wiedervorlagen.pages.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-list/vorgang-view-wiedervorlagen.pages.cy.ts similarity index 100% rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list/vorgang-view-wiedervorlagen.pages.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-list/vorgang-view-wiedervorlagen.pages.cy.ts diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list/vorgang-views-filter.spec-e2e.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-list/vorgang-views-filter.cy.ts similarity index 100% rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-list/vorgang-views-filter.spec-e2e.ts rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-list/vorgang-views-filter.cy.ts diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-wiedervorlage/vorgang-wiedervorlage.routing.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-wiedervorlage/vorgang-wiedervorlage.routing.cy.ts similarity index 100% rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-wiedervorlage/vorgang-wiedervorlage.routing.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-wiedervorlage/vorgang-wiedervorlage.routing.cy.ts diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-wiedervorlage/vorgang.wiedervorlage-list.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-wiedervorlage/vorgang.wiedervorlage-list.cy.ts similarity index 100% rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/vorgang-wiedervorlage/vorgang.wiedervorlage-list.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/vorgang-wiedervorlage/vorgang.wiedervorlage-list.cy.ts diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/wiedervorlage-attachment/wiedervorlage-attachment.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/wiedervorlage-attachment/wiedervorlage-attachment.cy.ts similarity index 97% rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/wiedervorlage-attachment/wiedervorlage-attachment.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/wiedervorlage-attachment/wiedervorlage-attachment.cy.ts index f3f81417223f0b351ef9711bd9644e8a644960e1..8d25b11950bd3be02aa1dd0048245a2a7b732985 100644 --- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/wiedervorlage-attachment/wiedervorlage-attachment.e2e-spec.ts +++ b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/wiedervorlage-attachment/wiedervorlage-attachment.cy.ts @@ -25,14 +25,14 @@ import { AttachmentContainerE2EComponent, AttachmentListE2EComponent } from 'app import { WiedervorlageSubnavigationE2EComponent } from 'apps/goofy-e2e/src/components/wiedervorlage/wiedervorlage-subnavigation'; import { BinaryFileSnackbarMessageE2E } from 'apps/goofy-e2e/src/model/binary-file'; import { WiedervorlageE2E } from 'apps/goofy-e2e/src/model/wiedervorlage'; -import { dropCollections, readFileFromDownloads } from 'apps/goofy-e2e/src/support/cypress-helper'; +import { dropCollections, readFileFromDownloads, wait } from 'apps/goofy-e2e/src/support/cypress-helper'; import { initVorgangAttachedItem } from 'apps/goofy-e2e/src/support/vorgang-attached-item-util'; import { SnackBarE2EComponent } from '../../../components/ui/snackbar.e2e.component'; import { VorgangListE2EComponent } from '../../../components/vorgang/vorgang-list.e2e.component'; import { WiedervorlageInVorgangE2EComponent } from '../../../components/wiedervorlage/wiedervorlage-in-vorgang.e2e.component'; import { WiedervorlageE2EComponent } from '../../../components/wiedervorlage/wiedervorlage-page.e2e.component'; import { VorgangE2E } from '../../../model/vorgang'; -import { MainPage, waitForSpinnerToDisappear, waitforSpinnerToAppear } from '../../../page-objects/main.po'; +import { MainPage, waitForSpinnerToDisappear } from '../../../page-objects/main.po'; import { VorgangPage } from '../../../page-objects/vorgang.po'; import { WiedervorlagePage } from '../../../page-objects/wiedervorlage.po'; import { containClass, contains, exist, haveLength, notContainClass, notExist } from '../../../support/cypress.util'; @@ -233,9 +233,9 @@ describe('Wiedervorlage attachments', () => { const wiedervorlageComp: WiedervorlageInVorgangE2EComponent = wiedervorlageContainerInVorgang.getWiedervorlage(WIEDERVORLAGE_WITH_ATTACHMENTS_BETREFF); it('should open wiedervorlage page', () => { + wait(500); wiedervorlageComp.getLink().click(); - waitforSpinnerToAppear(); waitForSpinnerToDisappear(); exist(attachmentList.getItem(TEST_FILE_WITH_CONTENT).getRoot()); @@ -244,7 +244,6 @@ describe('Wiedervorlage attachments', () => { it('should mark as erledigt', () => { subnavigation.erledigen(); - waitforSpinnerToAppear(); waitForSpinnerToDisappear(); containClass(wiedervorlageContainer.getStatusDot(), 'erledigt'); @@ -260,7 +259,6 @@ describe('Wiedervorlage attachments', () => { it('should mark as open', () => { subnavigation.wiedereroeffnen(); - waitforSpinnerToAppear(); waitForSpinnerToDisappear(); notContainClass(wiedervorlageContainer.getStatusDot(), 'erledigt'); diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/wiedervorlage/wiedervorlage-authorize-by-role.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/wiedervorlage/wiedervorlage-authorize-by-role.cy.ts similarity index 100% rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/wiedervorlage/wiedervorlage-authorize-by-role.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/wiedervorlage/wiedervorlage-authorize-by-role.cy.ts diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/wiedervorlage/wiedervorlage.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/wiedervorlage/wiedervorlage.cy.ts similarity index 99% rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/wiedervorlage/wiedervorlage.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/wiedervorlage/wiedervorlage.cy.ts index bf77d79dacff2e909c12074011363e1d445e68b4..45c8b354131803e75927e39787f1909a53eb8eb0 100644 --- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/wiedervorlage/wiedervorlage.e2e-spec.ts +++ b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/wiedervorlage/wiedervorlage.cy.ts @@ -33,7 +33,7 @@ import { VorgangE2E } from '../../../model/vorgang'; import { MainPage, waitForSpinnerToDisappear } from '../../../page-objects/main.po'; import { VorgangPage } from '../../../page-objects/vorgang.po'; import { WiedervorlagePage } from '../../../page-objects/wiedervorlage.po'; -import { dropCollections } from '../../../support/cypress-helper'; +import { dropCollections, wait } from '../../../support/cypress-helper'; import { exist, haveText, haveValue, notExist } from '../../../support/cypress.util'; import { MessagesE2E } from '../../../support/messages'; import { formatDateLocal } from '../../../support/tech.util'; @@ -165,6 +165,7 @@ describe('Wiedervorlage', () => { it('should open Wiedervorlage-Page by click on wiedervorlage ', () => { const wiedervorlageInVorgang: WiedervorlageInVorgangE2EComponent = vorgangPage.getWiedervorlagenContainer().getWiedervorlage(wiedervorlageBetreff); + wait(500); wiedervorlageInVorgang.getLink().click(); waitForSpinnerToDisappear(); diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/wiedervorlage/wiedervorlage.erledigen.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/wiedervorlage/wiedervorlage.erledigen.cy.ts similarity index 99% rename from goofy-client/apps/goofy-e2e/src/integration/main-tests/wiedervorlage/wiedervorlage.erledigen.e2e-spec.ts rename to goofy-client/apps/goofy-e2e/src/e2e/main-tests/wiedervorlage/wiedervorlage.erledigen.cy.ts index 000e8fb12d3357f5360bc3cc3f00678a289a0c65..f9a7d8593f4e6a546c4c9e12a312b9290be4df5b 100644 --- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/wiedervorlage/wiedervorlage.erledigen.e2e-spec.ts +++ b/goofy-client/apps/goofy-e2e/src/e2e/main-tests/wiedervorlage/wiedervorlage.erledigen.cy.ts @@ -98,6 +98,7 @@ describe('Wiedervorlage erledigen/wiedereroeffnen', () => { it('should open wiedervorlage on click', () => { exist(wiedervorlage.getRoot()); + wait(500); wiedervorlage.getLink().click(); waitForSpinnerToDisappear(); @@ -135,7 +136,7 @@ describe('Wiedervorlage erledigen/wiedereroeffnen', () => { const wiedervorlage: WiedervorlageInVorgangE2EComponent = wiedervorlageContainerInVorgang.getWiedervorlage(wiedervorlageZumWiedereroeffnen.betreff); it('should open wiedervorlage on click', () => { - wait(1000); + wait(500); wiedervorlage.getLink().click(); waitForSpinnerToDisappear(); @@ -173,6 +174,7 @@ describe('Wiedervorlage erledigen/wiedereroeffnen', () => { const wiedervorlage: WiedervorlageInVorgangE2EComponent = wiedervorlageContainerInVorgang.getWiedervorlage(wiedervorlageZumWiedereroeffnen.betreff); it('should open wiedervorlage on click', () => { + wait(500); wiedervorlage.getLink().click(); waitForSpinnerToDisappear(); @@ -277,6 +279,7 @@ describe('Wiedervorlage erledigen/wiedereroeffnen', () => { }) it('should mark as erledigt', () => { + wait(500); wiedervorlage.getLink().click(); waitForSpinnerToDisappear(); subnavigation.erledigen(); diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/loesch-anforderung/loeschen-anfordern.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/loesch-anforderung/loeschen-anfordern.e2e-spec.ts deleted file mode 100644 index 156be9773db19d271f55033173fea1701f818f86..0000000000000000000000000000000000000000 --- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/loesch-anforderung/loeschen-anfordern.e2e-spec.ts +++ /dev/null @@ -1,317 +0,0 @@ -import { registerLocaleData } from '@angular/common'; -import localeDe from '@angular/common/locales/de'; -import localeDeExtra from '@angular/common/locales/extra/de'; -import { KommentareInVorgangE2EComponent } from 'apps/goofy-e2e/src/components/kommentar/kommentar-list.e2e.component'; -import { PostfachMailE2EComponent } from 'apps/goofy-e2e/src/components/postfach/postfach-mail.e2e.component'; -import { UserProfileE2EComponent } from 'apps/goofy-e2e/src/components/user-profile/user-profile.component.e2e'; -import { VorgangFormularButtonsE2EComponent } from 'apps/goofy-e2e/src/components/vorgang/vorgang-formular-buttons.e2e.components'; -import { WiedervorlageInVorgangE2EComponent } from 'apps/goofy-e2e/src/components/wiedervorlage/wiedervorlage-in-vorgang.e2e.component'; -import { initVorgangAttachedItem } from 'apps/goofy-e2e/src/support/vorgang-attached-item-util'; -import { createWiedervorlageAttachedItem, createWiedervorlageUriByVorgangIdAndWiedervorlageId } from 'apps/goofy-e2e/src/support/wiedervorlage-util'; -import { SnackBarE2EComponent } from '../../../components/ui/snackbar.e2e.component'; -import { VorgangListE2EComponent } from '../../../components/vorgang/vorgang-list.e2e.component'; -import { VorgangE2E, VorgangMessagesE2E, VorgangStatusE2E, vorgangStatusLabelE2E } from '../../../model/vorgang'; -import { MainPage, waitForSpinnerToDisappear } from '../../../page-objects/main.po'; -import { VorgangPage } from '../../../page-objects/vorgang.po'; -import { dropCollections, visitUrl } from '../../../support/cypress-helper'; -import { contains, exist, haveText, notExist } from '../../../support/cypress.util'; -import { loginAsSabine } from '../../../support/user-util'; -import { buildVorgang, initVorgaenge, objectIds } from '../../../support/vorgang-util'; - -registerLocaleData(localeDe, 'de', localeDeExtra); - -describe('Vorgang Löschen anfordern', () => { - const mainPage: MainPage = new MainPage(); - const vorgangList: VorgangListE2EComponent = mainPage.getVorgangList(); - const snackBar: SnackBarE2EComponent = mainPage.getSnackBar(); - - const vorgangPage: VorgangPage = new VorgangPage(); - const vorgangFormularButtons: VorgangFormularButtonsE2EComponent = vorgangPage.getFormularButtons(); - - const vorgangAbgeschlossenLoeschenAnfordern: VorgangE2E = { ...buildVorgang(objectIds[0], 'DoAbgeschlossenLoeschenAnfordern'), status: VorgangStatusE2E.ABGESCHLOSSEN }; - const vorgangAbgeschlossenLoeschenAnfordernRevoke: VorgangE2E = { ...buildVorgang(objectIds[1], 'DoAbgeschlossenRevokeLoeschenAnfordern'), status: VorgangStatusE2E.ABGESCHLOSSEN }; - - const vorgangVerworfenLoeschenAnfordern: VorgangE2E = { ...buildVorgang(objectIds[2], 'DoVerworfenLoeschenAnfordern'), status: VorgangStatusE2E.VERWORFEN }; - const vorgangVerworfenLoeschenAnfordernRevoke: VorgangE2E = { ...buildVorgang(objectIds[3], 'DoVerworfenRevokeLoeschenAnfordern'), status: VorgangStatusE2E.VERWORFEN }; - - const wiedervorlageAttachedItem = createWiedervorlageAttachedItem(objectIds[4], vorgangAbgeschlossenLoeschenAnfordern._id.$oid); - const wiedervorlageUrl = createWiedervorlageUriByVorgangIdAndWiedervorlageId(objectIds[0], objectIds[4]); - - before(() => { - initVorgaenge([vorgangAbgeschlossenLoeschenAnfordern, vorgangAbgeschlossenLoeschenAnfordernRevoke, vorgangVerworfenLoeschenAnfordern, vorgangVerworfenLoeschenAnfordernRevoke]); - initVorgangAttachedItem([wiedervorlageAttachedItem]); - - loginAsSabine(); - - waitForSpinnerToDisappear(); - exist(vorgangList.getRoot()); - }) - - after(() => { - dropCollections(); - }) - - describe('Abgeschlossen: löschen anfordern', () => { - - it('Open Vorgang-Detail-Page', () => { - vorgangList.getListItem(vorgangAbgeschlossenLoeschenAnfordern.name).getRoot().click(); - waitForSpinnerToDisappear(); - - exist(vorgangPage.getVorgangDetailHeader().getRoot()); - }) - - describe('by button', () => { - - it('should have status Abgeschlossen', () => { - haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[vorgangAbgeschlossenLoeschenAnfordern.status]); - }) - - it('should click Löschen anfordern button', () => { - vorgangFormularButtons.getLoeschenAnfordernButton().click(); - waitForSpinnerToDisappear(); - }) - - it('should show snackBar message', () => { - exist(snackBar.getCloseButton()); - contains(snackBar.getMessage(), VorgangMessagesE2E.LOESCHEN_ANFORDERN) - }) - - it('should close snackBar', () => { - snackBar.getCloseButton().click(); - - notExist(snackBar.getMessage()); - }) - - it('should have status zu Löschen', () => { - haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.ZU_LOESCHEN]); - }) - - it('should redirect Wiedervorlage link to Vorgang', () => { - visitUrl(wiedervorlageUrl); - - exist(vorgangPage.getVorgangDetailHeader().getRoot()); - }) - - it('should show snackBar message', () => { - exist(snackBar.getCloseButton()); - contains(snackBar.getMessage(), VorgangMessagesE2E.WIEDERVORLAGE_BEARBEITEN_NICHT_MOEGLICH) - }) - - it('should close snackBar', () => { - snackBar.getCloseButton().click(); - - notExist(snackBar.getMessage()); - }) - - it('back to vorgang list', () => { - vorgangPage.getSubnavigation().getBackButton().click(); - waitForSpinnerToDisappear(); - - exist(vorgangList.getRoot()); - }) - - it('should have status zu Löschen', () => { - haveText(vorgangList.getListItem(vorgangAbgeschlossenLoeschenAnfordern.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.ZU_LOESCHEN]); - }) - }) - }) - - describe('Disable functions', () => { - - it('Open Vorgang-Detail-Page', () => { - vorgangList.getListItem(vorgangAbgeschlossenLoeschenAnfordern.name).getRoot().click(); - waitForSpinnerToDisappear(); - - exist(vorgangPage.getVorgangDetailHeader().getRoot()); - }) - - it('should not have add comment button', () => { - const kommentarContainer: KommentareInVorgangE2EComponent = vorgangPage.getKommentarContainer(); - - notExist(kommentarContainer.getHinzufuegenButton()); - }) - - it('should disable edit comment', () => { - const kommentarContainer: KommentareInVorgangE2EComponent = vorgangPage.getKommentarContainer(); - - notExist(kommentarContainer.getFormular()); - }) - - it('should not have create postfach mail buttons', () => { - const postfachMailContainer: PostfachMailE2EComponent = vorgangPage.getPostfachMailcontainer(); - - notExist(postfachMailContainer.getCreateButtonWithoutText()); - notExist(postfachMailContainer.getCreateButtonWithText()); - }) - - it('should not have add wiedervorlage button', () => { - const createWiedervorlageButton = vorgangPage.getWiedervorlagenContainer().getCreateWiedervorlageButton(); - - notExist(createWiedervorlageButton); - }) - - it('should disable open Wiedervorlage-Page link ', () => { - const wiedervorlageInVorgang: WiedervorlageInVorgangE2EComponent = vorgangPage.getWiedervorlagenContainer().getWiedervorlage('Wiedervorlage'); - - notExist(wiedervorlageInVorgang.getLink()); - }) - - it('should not have user assign button', () => { - const userProfileContainer: UserProfileE2EComponent = vorgangPage.getVorgangDetailHeader().getUserContainer(); - - notExist(userProfileContainer.getRoot()); - }) - - it('back to vorgang list', () => { - vorgangPage.getSubnavigation().getBackButton().click(); - waitForSpinnerToDisappear(); - - exist(vorgangList.getRoot()); - }) - - }) - - describe('Abgeschlossen: löschen anfordern und rückgängig machen', () => { - - it('Open Vorgang-Detail-Page', () => { - vorgangList.getListItem(vorgangAbgeschlossenLoeschenAnfordernRevoke.name).getRoot().click(); - waitForSpinnerToDisappear(); - - exist(vorgangPage.getVorgangDetailHeader().getRoot()); - }) - - describe('by icon-button', () => { - - it('should have status Abgeschlossen', () => { - haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[vorgangAbgeschlossenLoeschenAnfordernRevoke.status]); - }) - - it('should show snackBar message', () => { - vorgangPage.getSubnavigation().getLoeschenAnfordernByIconButton().click(); - waitForSpinnerToDisappear(); - - exist(snackBar.getCloseButton()); - contains(snackBar.getMessage(), VorgangMessagesE2E.LOESCHEN_ANFORDERN); - }) - - it('should close snackbar on revoke', () => { - snackBar.getRevokeButton().click(); - waitForSpinnerToDisappear(); - - notExist(snackBar.getMessage()); - }) - - it('should show status Abgeschlossen', () => { - notExist(vorgangPage.getProgressBar()); - - haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.ABGESCHLOSSEN]); - }) - - it('back to vorgang list', () => { - vorgangPage.getSubnavigation().getBackButton().click(); - waitForSpinnerToDisappear(); - - exist(vorgangList.getRoot()); - }) - - it('should have status Abgeschlossen', () => { - haveText(vorgangList.getListItem(vorgangAbgeschlossenLoeschenAnfordernRevoke.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.ABGESCHLOSSEN]) - }) - }) - }) - - describe('Verworfen: löschen anfordern', () => { - - it('Open Vorgang-Detail-Page', () => { - vorgangList.getListItem(vorgangVerworfenLoeschenAnfordern.name).getRoot().click(); - waitForSpinnerToDisappear(); - - exist(vorgangPage.getVorgangDetailHeader().getRoot()); - }) - - describe('by button', () => { - - it('should have status Verworfen', () => { - haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[vorgangVerworfenLoeschenAnfordern.status]); - }) - - it('should show snackBar message', () => { - vorgangFormularButtons.getLoeschenAnfordernButton().click(); - waitForSpinnerToDisappear(); - - exist(snackBar.getCloseButton()); - contains(snackBar.getMessage(), VorgangMessagesE2E.LOESCHEN_ANFORDERN) - }) - - it('should close snackBar', () => { - snackBar.getCloseButton().click(); - - notExist(snackBar.getMessage()); - }) - - it('should have status zu Löschen', () => { - haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.ZU_LOESCHEN]); - }) - - it('back to vorgang list', () => { - vorgangPage.getSubnavigation().getBackButton().click(); - waitForSpinnerToDisappear(); - - exist(vorgangList.getRoot()); - }) - - it('should have status zu Löschen', () => { - haveText(vorgangList.getListItem(vorgangVerworfenLoeschenAnfordern.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.ZU_LOESCHEN]); - }) - }) - }) - - describe('Verworfen: löschen anfordern und rückgängig machen', () => { - - it('Open Vorgang-Detail-Page', () => { - vorgangList.getListItem(vorgangVerworfenLoeschenAnfordernRevoke.name).getRoot().click(); - waitForSpinnerToDisappear(); - - exist(vorgangPage.getVorgangDetailHeader().getRoot()); - }) - - describe('by icon-button', () => { - - it('should have status Verworfen', () => { - haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[vorgangVerworfenLoeschenAnfordernRevoke.status]); - }) - - it('should show snackBar message', () => { - vorgangPage.getSubnavigation().getLoeschenAnfordernByIconButton().click(); - waitForSpinnerToDisappear(); - - exist(snackBar.getCloseButton()); - contains(snackBar.getMessage(), VorgangMessagesE2E.LOESCHEN_ANFORDERN); - }) - - it('should close snackbar on revoke', () => { - snackBar.getRevokeButton().click(); - waitForSpinnerToDisappear(); - - notExist(snackBar.getMessage()); - }) - - it('should show status Verworfen', () => { - notExist(vorgangPage.getProgressBar()); - - haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.VERWORFEN]); - }) - - it('back to vorgang list', () => { - vorgangPage.getSubnavigation().getBackButton().click(); - waitForSpinnerToDisappear(); - - exist(vorgangList.getRoot()); - }) - - it('should have status Verworfen', () => { - haveText(vorgangList.getListItem(vorgangVerworfenLoeschenAnfordernRevoke.name).getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.VERWORFEN]) - }) - }) - }) -}); diff --git a/goofy-client/apps/goofy-e2e/src/support/angular.util.ts b/goofy-client/apps/goofy-e2e/src/support/angular.util.ts index 5e8d4a3a61c850949129eab62fe897145b264583..27c4f58ca783429f3ead8a3ba2eb0d4a7fa062f9 100644 --- a/goofy-client/apps/goofy-e2e/src/support/angular.util.ts +++ b/goofy-client/apps/goofy-e2e/src/support/angular.util.ts @@ -26,7 +26,7 @@ import { containClass, mouseEnter, notContainClass } from './cypress.util'; export const TOGGLE_ELEMENT: string = 'mat-slide-toggle'; enum AngularClassesE2E { - MAT_CHECKED = 'mat-checked', + MAT_CHECKED = 'mat-mdc-slide-toggle-checked', MAT_BUTTONG_TOGGLE_CHECKED = 'mat-button-toggle-checked', MAT_FOCUSED = 'mat-focused', CDK_KEYBOARD_FOCUSED = 'cdk-keyboard-focused' diff --git a/goofy-client/apps/goofy-e2e/src/support/commands.ts b/goofy-client/apps/goofy-e2e/src/support/commands.ts index b471f61dedb7e41b8cb8a347fae48748cb85d269..7ee49c952b9212d5f85a12852ec954b71951e011 100644 --- a/goofy-client/apps/goofy-e2e/src/support/commands.ts +++ b/goofy-client/apps/goofy-e2e/src/support/commands.ts @@ -1,3 +1,4 @@ + /* * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den * Ministerpräsidenten des Landes Schleswig-Holstein @@ -21,6 +22,53 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ +enum HttpMethod { + POST = 'POST', + GET = 'GET' +} + +interface HttpHeader { + [headerKey: string]: string +} + +const DATA_TEST_ID: string = 'data-test-id'; +const DATA_TEST_CLASS: string = 'data-test-class'; + +const ACCES_TOKEN: string = 'access_token'; +const ID_TOKEN: string = 'id_token'; + +enum Header { + CONTENT_TYPE = 'Content-Type', + AUTHORIZATION = 'Authorization' +} + +const CYPRESS_CONFIG_BASE_URL: unknown = 'baseUrl'; + +enum CypressEnv { + KEYCLOAK_CLIENT = 'keycloakClient', + KEYCLOAK_REALM = 'keycloakRealm', + KEYCLOAK_URL = 'keycloakUrl', + SEARCH = 'search' +} + +const CONTENT_TYPE_HEADER_VALUE: string = 'application/x-www-form-urlencoded'; + +interface SearchIndex { + vorgangId: string, + vorgangName: string, + vorgangNummer: string, + createdAt: string, + antragstellerName: string, + antragstellerVorname: string, + status: string, + organisationseinheitenId: string, + aktenzeichen: string, + assignedTo: string, + _class: string +} + +const SEARCH_INDEX_CLASS: string = 'de.itvsh.ozg.pluto.common.search.IndexedVorgang'; + declare namespace Cypress { interface Chainable<Subject> { getTestElementWithOid(oid: string, ...args); @@ -36,12 +84,13 @@ declare namespace Cypress { } } + Cypress.Commands.add('getTestElement', (selector, ...args) => { - return cy.get(`[data-test-id~="${selector}"]`, ...args) + return cy.get(`[${DATA_TEST_ID}~="${selector}"]`, ...args) }) Cypress.Commands.add('getTestElementWithClass', (selector, ...args) => { - return cy.get(`[data-test-class="${selector}"]`, ...args) + return cy.get(`[${DATA_TEST_CLASS}="${selector}"]`, ...args) }) Cypress.Commands.add('getTestElementWithOid', (oid, ...args) => { @@ -49,63 +98,73 @@ Cypress.Commands.add('getTestElementWithOid', (oid, ...args) => { }) Cypress.Commands.add('findTestElementWithClass', { prevSubject: true }, (subject: any, selector) => { - return subject.find(`[data-test-class="${selector}"]`) + return subject.find(`[${DATA_TEST_CLASS}="${selector}"]`) }) Cypress.Commands.add('findElement', { prevSubject: true }, (subject: any, selector) => { return subject.find(selector); }) -Cypress.Commands.add('login', (user, password) => { - cy.logout(); +Cypress.Commands.add('login', (user: string, password: string) => { + cy.session(user, () => { + cy.request(buildLoginRequest(user, password)).then(response => handleLoginResponse(response)); + }); +}) - cy.request({ - method: 'POST', +function buildLoginRequest(user: string, password: string): any { + return { + method: HttpMethod.POST, followRedirect: false, url: `${getKeycloakBaseRealmUrl()}/token`, headers: { - 'Content-Type': 'application/x-www-form-urlencoded' + [Header.CONTENT_TYPE]: CONTENT_TYPE_HEADER_VALUE }, - body: { - client_id: Cypress.env('keycloakClient'), - username: user, - password: password, - grant_type: 'password', - redirect_uri: Cypress.config('baseUrl'), - response_mode: 'fragment', - response_type: 'code', - scope: 'openid' - } - }).then(response => { - const token = response.body.access_token; - const authorization: any = `bearer ${token}`; + body: buildLoginRequestBody(user, password) + } +} - cy.visit('', authorization); +function buildLoginRequestBody(user: string, password: string): any { + return { + client_id: Cypress.env(CypressEnv.KEYCLOAK_CLIENT), + username: user, + password: password, + grant_type: 'password', + redirect_uri: Cypress.config(CYPRESS_CONFIG_BASE_URL), + response_mode: 'fragment', + response_type: 'code', + scope: 'openid' + } +} - window.sessionStorage.setItem('access_token', token); - window.sessionStorage.setItem('id_token', token); - }); -}) +function handleLoginResponse(response): void { + const authorization: any = `bearer ${response.body.access_token}`; + cy.visit('', authorization); + + window.sessionStorage.setItem(ACCES_TOKEN, response.body.access_token); + window.sessionStorage.setItem(ID_TOKEN, response.body.id_token); + + cy.setCookie('XSRF-TOKEN', response.body.session_state); +} Cypress.Commands.add('getUserInfo', () => { return cy.request({ - method: 'GET', + method: HttpMethod.GET, url: `${getKeycloakBaseRealmUrl()}/userinfo`, headers: { - Authorization: `bearer ${window.sessionStorage.getItem('access_token')}` + [Header.AUTHORIZATION]: `bearer ${window.sessionStorage.getItem(ACCES_TOKEN)}` } }); }) Cypress.Commands.add('logout', () => { cy.request({ - method: 'GET', + method: HttpMethod.GET, url: `${getKeycloakBaseRealmUrl()}/logout`, headers: { - 'Content-Type': 'application/x-www-form-urlencoded' + [Header.CONTENT_TYPE]: CONTENT_TYPE_HEADER_VALUE }, body: { - refresh_token: window.sessionStorage.getItem('id_token') + refresh_token: window.sessionStorage.getItem(ID_TOKEN) }, failOnStatusCode: false }).then(() => { @@ -116,62 +175,62 @@ Cypress.Commands.add('logout', () => { }) function getKeycloakBaseRealmUrl(): string { - return `${Cypress.env('keycloakUrl')}realms/${Cypress.env('keycloakRealm')}/protocol/openid-connect`; + return `${Cypress.env(CypressEnv.KEYCLOAK_URL)}realms/${Cypress.env(CypressEnv.KEYCLOAK_REALM)}/protocol/openid-connect`; } Cypress.Commands.add('addVorgangToSearchIndex', (vorgang) => { cy.request({ - method: 'POST', + method: HttpMethod.POST, url: `${buildSearchIndexPostUrl()}/_doc/${vorgang._id.$oid}`, headers: buildAuthorizationHeader(), body: buildSearchIndexBody(vorgang) }); }) -function buildSearchIndexBody(vorgang) { +function buildSearchIndexBody(vorgang: any): SearchIndex { return { - '_class': 'de.itvsh.ozg.pluto.common.search.IndexedVorgang', - 'vorgangId': vorgang._id.$oid, - 'vorgangName': vorgang.name, - 'vorgangNummer': vorgang.nummer, - 'createdAt': vorgang.createdAt.$date, - 'antragstellerName': vorgang.eingangs[0].antragsteller.nachname, - 'antragstellerVorname': vorgang.eingangs[0].antragsteller.vorname, - 'status': vorgang.status, - 'organisationseinheitenId': vorgang.eingangs[0].zustaendigeStelle.organisationseinheitenId, - 'aktenzeichen': vorgang.aktenzeichen, - 'assignedTo': vorgang.assignedTo + vorgangId: vorgang._id.$oid, + vorgangName: vorgang.name, + vorgangNummer: vorgang.nummer, + createdAt: vorgang.createdAt.$date, + antragstellerName: vorgang.eingangs[0].antragsteller.nachname, + antragstellerVorname: vorgang.eingangs[0].antragsteller.vorname, + status: vorgang.status, + organisationseinheitenId: vorgang.eingangs[0].zustaendigeStelle.organisationseinheitenId, + aktenzeichen: vorgang.aktenzeichen, + assignedTo: vorgang.assignedTo, + _class: SEARCH_INDEX_CLASS, }; } Cypress.Commands.add('removeAllDocumentsFromSearchIndex', () => { cy.request({ - method: 'POST', + method: HttpMethod.POST, url: `${buildSearchIndexPostUrl()}/_delete_by_query`, headers: buildAuthorizationHeader(), body: buildSearchIndexRemoveAllBody() }); }) -function buildSearchIndexPostUrl() { - const searchEnv = getSearchEnv(); +function buildSearchIndexPostUrl(): string { + const searchEnv: string = getSearchEnv(); return `${searchEnv['url']}/${searchEnv['index']}`; } -function buildAuthorizationHeader() { - return { 'Authorization': `Basic ${buildToken()}` }; +function buildAuthorizationHeader(): HttpHeader { + return { [Header.AUTHORIZATION]: `Basic ${buildToken()}` }; } -function buildToken() { - const searchEnv = getSearchEnv(); +function buildToken(): string { + const searchEnv: string = getSearchEnv(); return btoa(`${searchEnv['user']}:${searchEnv['password']}`); } -function getSearchEnv() { - return Cypress.env('search'); +function getSearchEnv(): string { + return Cypress.env(CypressEnv.SEARCH); } -function buildSearchIndexRemoveAllBody() { +function buildSearchIndexRemoveAllBody(): any { return { 'query': { 'match_all': {} diff --git a/goofy-client/apps/goofy-e2e/src/support/cypress-helper.ts b/goofy-client/apps/goofy-e2e/src/support/cypress-helper.ts index bde71f182f74051db676b6bf41da1e23ff93072c..62b64501d57ac8bfed9e3492f184b01eae723a5f 100644 --- a/goofy-client/apps/goofy-e2e/src/support/cypress-helper.ts +++ b/goofy-client/apps/goofy-e2e/src/support/cypress-helper.ts @@ -37,6 +37,8 @@ enum CypressTasks { INIT_VORGANG_DATA = 'initVorgangData', INIT_VORGANG_ATTACHED_ITEM_DATA = 'initVorgangAttachedItemData', INIT_USERMANAGER_DATA = 'initUsermanagerData', + COUNT_FILES = 'countFiles', + DELETE_FOLDER = 'deleteFolder' } enum MongoCollections { @@ -48,6 +50,8 @@ enum MongoCollections { USER = "User" } +const DOWNLOAD_FOLDER: string = 'cypress/downloads'; + export function login(userJsonPath: string): void { cy.fixture(userJsonPath).then(user => { cy.login(user.name, user.password); @@ -108,6 +112,14 @@ export function dropCollections() { cy.task(CypressTasks.DROP_USER_MANAGER_COLLECTIONS, [MongoCollections.USER]); } +export function countDownloadFiles(): Cypress.Chainable<number> { + return cy.task(CypressTasks.COUNT_FILES, DOWNLOAD_FOLDER); +} + +export function deleteDownloadFolder(): void { + cy.task(CypressTasks.DELETE_FOLDER, DOWNLOAD_FOLDER); +} + export function scrollToWindowBottom(): void { cy.window().scrollTo('bottom'); } @@ -143,7 +155,7 @@ export function reload(): void { } export function readFileFromDownloads(fileName: string) { - return cy.readFile(`cypress/downloads/${fileName}`); + return cy.readFile(`${DOWNLOAD_FOLDER}/${fileName}`); } export function pressTab(): void { diff --git a/goofy-client/apps/goofy-e2e/src/plugins/index.js b/goofy-client/apps/goofy-e2e/src/support/cypress-tasks.ts similarity index 77% rename from goofy-client/apps/goofy-e2e/src/plugins/index.js rename to goofy-client/apps/goofy-e2e/src/support/cypress-tasks.ts index 9067346ec0edddf16dbf03231458902863ac2cb2..d92b9e80d3c05c57f3e62671449e84d4ecd40f5b 100644 --- a/goofy-client/apps/goofy-e2e/src/plugins/index.js +++ b/goofy-client/apps/goofy-e2e/src/support/cypress-tasks.ts @@ -1,49 +1,9 @@ -/* - * 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. - */ -/// <reference types="cypress" /> -// *********************************************************** -// This example plugins/index.js can be used to load plugins -// -// You can change the location of this file or turn off loading -// the plugins file with the 'pluginsFile' configuration option. -// -// You can read more here: -// https://on.cypress.io/plugins-guide -// *********************************************************** - -// This function is called when a project is opened or re-opened (e.g. due to -// the project's config changing) - -/** - * @type {Cypress.PluginConfig} - */ -const MongoClient = require('mongodb').MongoClient; +import { rmdir } from 'fs'; +import { Long, MongoClient, ObjectId } from 'mongodb'; + const Binary = require('mongodb').Binary; -const ObjectId = require('mongodb').ObjectId; -const Long = require('mongodb').Long; -module.exports = (on, config) => { +module.exports = (on: any, config: any) => { on('task', { initCommandData({collection, data}) { console.log('initCommandData'); @@ -84,7 +44,16 @@ module.exports = (on, config) => { console.log('dropUserManagerCollections: ', collections); dropUserManagerCollectionsFromDatabase(config, collections); return 0; - } + }, + countFiles(folderName:string) { + console.log('counting files in folder %s', folderName); + return countFiles(folderName); + }, + deleteFolder(folderName:string) { + console.log('deleting folder %s', folderName); + deleteFolder(folderName); + return 0; + }, }); // Workaround für Angular 13 und Cypress mit Webpack 4, @@ -98,32 +67,32 @@ module.exports = (on, config) => { // Lösung: // - NPM-Paket identifizieren, dass "SystemDateTimeProvider" enthält. // - NPM-Paket im "test" Attribut unten hinzufügen. - const webpackPreprocessor = require('@cypress/webpack-batteries-included-preprocessor'); - const webpackOptions = webpackPreprocessor.defaultOptions.webpackOptions; - - webpackOptions.module.rules.unshift({ - test: /[/\\](@angular|@ngxp|angular-oauth2-oidc)[/\\].+\.m?js$/, - resolve: { - fullySpecified: false, - }, - use: { - loader: 'babel-loader', - options: { - plugins: ['@angular/compiler-cli/linker/babel'], - compact: false, - cacheDirectory: true - } - } - }); - - on('file:preprocessor', webpackPreprocessor({ - webpackOptions: webpackOptions, - typescript: require.resolve('typescript') - })); - - return config; + const webpackPreprocessor = require('@cypress/webpack-batteries-included-preprocessor'); + const webpackOptions = webpackPreprocessor.defaultOptions.webpackOptions; + + webpackOptions.module.rules.unshift({ + test: /[/\\](@angular|@ngxp|angular-oauth2-oidc)[/\\].+\.m?js$/, + resolve: { + fullySpecified: false, + }, + use: { + loader: 'babel-loader', + options: { + plugins: ['@angular/compiler-cli/linker/babel'], + compact: false, + cacheDirectory: true + } + } + }); + + on('file:preprocessor', webpackPreprocessor({ + webpackOptions: webpackOptions, + typescript: require.resolve('typescript') + })); + + return config; // Ende - Workaround für Angular 13 und Cypress mit Webpack 4 -}; +} function parseCommandData(commands) { commands.forEach(command => parseCommand(command)) @@ -336,4 +305,28 @@ function dropCollections(databaseUrl, databaseName, collections){ }); } }); +} + +function countFiles(folderName:string): Promise<number> { + return new Promise((resolve, reject) => { + fs.readdir(folderName, (err, files) => { + if (err) { + console.error(err) + return reject(err) + } + resolve(files.length) + }) + }) +} + +function deleteFolder(folderName:string): void { + new Promise((resolve, reject) => { + rmdir(folderName, { maxRetries: 10, recursive: true }, (err) => { + if (err) { + console.error(err) + return reject(err) + } + resolve(null) + }) + }) } \ No newline at end of file diff --git a/goofy-client/apps/goofy-e2e/src/support/cypress.util.ts b/goofy-client/apps/goofy-e2e/src/support/cypress.util.ts index c37486aab81955a516338c2fd08ce5f240decb09..ee3a1ea7f04adbec0e2fbc08c692e6b6c7fa5130 100644 --- a/goofy-client/apps/goofy-e2e/src/support/cypress.util.ts +++ b/goofy-client/apps/goofy-e2e/src/support/cypress.util.ts @@ -48,6 +48,10 @@ export function haveValue(element: any, value: string): void { element.should('have.value', value); } +export function haveFocus(element: any): void { + element.should('have.focus'); +} + export function mouseEnter(element: any): void { element.trigger('mouseenter'); } diff --git a/goofy-client/apps/goofy-e2e/src/support/index.ts b/goofy-client/apps/goofy-e2e/src/support/e2e.ts similarity index 92% rename from goofy-client/apps/goofy-e2e/src/support/index.ts rename to goofy-client/apps/goofy-e2e/src/support/e2e.ts index 3648b5106f64d556365991da18f0c4054d5c2cd8..dfe690bf49b054326bcc103a14ee37e6f209efdb 100644 --- a/goofy-client/apps/goofy-e2e/src/support/index.ts +++ b/goofy-client/apps/goofy-e2e/src/support/e2e.ts @@ -43,28 +43,26 @@ import 'cypress-timestamps/support'; import './commands'; import './file-upload'; -Cypress.Cookies.defaults({ - preserve: ['XSRF-TOKEN', 'session_id'] -}) - Cypress.on('command:start', ({ attributes }) => { if (attributes.type === 'parent') { - Cypress.log({ name: `${new Date().toISOString()} - ${attributes.name}` }); + Cypress.log({ + name: `${new Date().toISOString()} - ${attributes.name}`, + }); } -}) +}); Cypress.on('after:screenshot', ({ testFailure, takenAt }) => { if (testFailure) { console.log(`Error at: ${takenAt}`); } -}) +}); Cypress.on('fail', (err) => { console.error(err); err.message = new Date().toISOString() + '\n' + err.message; throw err; -}) +}); Cypress.Keyboard.defaults({ keystrokeDelay: 30, -}) \ No newline at end of file +}); diff --git a/goofy-client/apps/goofy-e2e/src/support/pre-ea-report-merge.ts b/goofy-client/apps/goofy-e2e/src/support/pre-ea-report-merge.ts deleted file mode 100644 index 656abb5c66310317a87aa181d77a0c6ed3838a8a..0000000000000000000000000000000000000000 --- a/goofy-client/apps/goofy-e2e/src/support/pre-ea-report-merge.ts +++ /dev/null @@ -1,28 +0,0 @@ -/* - * 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. - */ -const fs = require('fs') - -if (fs.existsSync('apps/goofy-e2e/reports_einheitlicher-ansprechpartner/mochawesome-report/.jsons')) { - fs.rename('apps/goofy-e2e/reports_einheitlicher-ansprechpartner/mochawesome-report/.jsons', 'apps/goofy-e2e/reports_einheitlicher-ansprechpartner/mochawesome-report/jsons', () => { }) -} \ No newline at end of file diff --git a/goofy-client/apps/goofy-e2e/src/support/tech.util.ts b/goofy-client/apps/goofy-e2e/src/support/tech.util.ts index fb41b54279a6218940dd985f5600cce9566dd0bb..f8fcc0bfe39b31c84546cc045d4ccde00e60de3c 100644 --- a/goofy-client/apps/goofy-e2e/src/support/tech.util.ts +++ b/goofy-client/apps/goofy-e2e/src/support/tech.util.ts @@ -77,7 +77,7 @@ export function replaceAllWhitespaces(value: string, replaceWith: string): strin } export function simpleTransliteration(value: string) { - return value.normalize('NFKD').replace(/[^-_\w]/g, ''); + return value.normalize('NFKD').replace(/[^-A-Za-z0-9_]/g, ''); } export function createDateToday(): string { diff --git a/goofy-client/apps/goofy-e2e/start-e2e-environment.sh b/goofy-client/apps/goofy-e2e/start-e2e-environment.sh index 1a90b7fb229e8069532eacd82d3b588e386eda5f..092840b925f24cb6d11854056d22903aeeaee27b 100755 --- a/goofy-client/apps/goofy-e2e/start-e2e-environment.sh +++ b/goofy-client/apps/goofy-e2e/start-e2e-environment.sh @@ -49,7 +49,7 @@ SPRING_PROFILE=dev,e2e,initSearchIndex docker compose -f ${SCRIPT_DIR}/docker-co echo waitForInitSearchIndex() { - (docker compose -f ${SCRIPT_DIR}/docker-compose.yml logs | fgrep -q 'Successful filled up index - exiting') + (docker compose -f ${SCRIPT_DIR}/docker-compose.yml logs | grep -F -q 'Successful filled up index - exiting') } echo "Waiting for Pluto to finish search index initialisation." diff --git a/goofy-client/apps/goofy-e2e/tsconfig.e2e.json b/goofy-client/apps/goofy-e2e/tsconfig.e2e.json deleted file mode 100644 index 9dc3660a79ee2f6daf097b4930427223896e3b25..0000000000000000000000000000000000000000 --- a/goofy-client/apps/goofy-e2e/tsconfig.e2e.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "sourceMap": false, - "outDir": "../../dist/out-tsc", - "allowJs": true, - "types": ["cypress", "node"] - }, - "include": ["src/**/*.ts", "src/**/*.js"] -} diff --git a/goofy-client/apps/goofy-e2e/tsconfig.json b/goofy-client/apps/goofy-e2e/tsconfig.json index 4d866746dae60576fad661bfa3985ab75aa31ca4..2cdee4db8b30c135503582f5274a1387ec8cd70c 100644 --- a/goofy-client/apps/goofy-e2e/tsconfig.json +++ b/goofy-client/apps/goofy-e2e/tsconfig.json @@ -1,16 +1,28 @@ { - "extends": "../../tsconfig.base.json", - "files": [], - "include": ["**/*.ts"], - "compilerOptions": { - "sourceMap": false, - "target": "es2020", - "lib": ["es2018", "dom"], - "types": ["cypress", "cypress-real-events"] - }, - "references": [ - { - "path": "./tsconfig.e2e.json" - } - ] -} \ No newline at end of file + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "sourceMap": false, + "outDir": "../dist/out-tsc", + "allowJs": true, + "types": ["cypress", "node"], + "forceConsistentCasingInFileNames": true, + "strict": false, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "include": [ + "src/**/*.ts", + "src/**/*.js", + "cypress.config.ts", + "cypress-ci-main-tests.config.ts", + "cypress-ci-einheitlicher-ansprechpartner.config.ts" + ], + "angularCompilerOptions": { + "enableI18nLegacyMessageIdFormat": false, + "strictInjectionParameters": true, + "strictInputAccessModifiers": true, + "strictTemplates": true + } +} diff --git a/goofy-client/apps/goofy/src/app/app.component.scss b/goofy-client/apps/goofy/src/app/app.component.scss index 4dd788aa6079c689f30997c800d07109e98d6651..1ebfa234f6bc360bdf66124f9678766a2b1cacfe 100644 --- a/goofy-client/apps/goofy/src/app/app.component.scss +++ b/goofy-client/apps/goofy/src/app/app.component.scss @@ -21,9 +21,9 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -@import "breakpoints"; -@import "include-media/dist/include-media"; -@import "variables"; +@import 'breakpoints'; +@import 'include-media/dist/include-media'; +@import 'variables'; :host { display: flex; diff --git a/goofy-client/apps/goofy/src/app/app.component.ts b/goofy-client/apps/goofy/src/app/app.component.ts index 8305b387d4d53659caac1ee8e19822d5616ba8cf..2e0fc5facff518c0542061467910a2d1871db99c 100644 --- a/goofy-client/apps/goofy/src/app/app.component.ts +++ b/goofy-client/apps/goofy/src/app/app.component.ts @@ -34,8 +34,6 @@ import { JwksValidationHandler } from 'angular-oauth2-oidc-jwks'; import { Environment } from 'libs/environment-shared/src/lib/environment.model'; import { Observable, Subscription, filter, tap } from 'rxjs'; -// import * as VorgangNavigationUtil from 'libs/vorgang-shared/src/lib/vorgang-navigation.util'; - @Component({ selector: 'goofy-client-root', templateUrl: './app.component.html', diff --git a/goofy-client/apps/goofy/src/app/app.module.ts b/goofy-client/apps/goofy/src/app/app.module.ts index a942a062498bfd992178e15bda0ff0499cfba0b8..0d17c27bbea8ba41941edabdb7953bc5960eb089 100644 --- a/goofy-client/apps/goofy/src/app/app.module.ts +++ b/goofy-client/apps/goofy/src/app/app.module.ts @@ -25,7 +25,6 @@ import { registerLocaleData } from '@angular/common'; import { HttpClientModule } from '@angular/common/http'; import localeDe from '@angular/common/locales/de'; import { LOCALE_ID, NgModule } from '@angular/core'; -import { MAT_LEGACY_TOOLTIP_DEFAULT_OPTIONS as MAT_TOOLTIP_DEFAULT_OPTIONS, MatLegacyTooltipDefaultOptions as MatTooltipDefaultOptions } from '@angular/material/legacy-tooltip'; import { BrowserModule } from '@angular/platform-browser'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { RouterModule, Routes, UrlSerializer } from '@angular/router'; @@ -53,12 +52,6 @@ const routes: Routes = [ } ]; -const tooltipDefaults: MatTooltipDefaultOptions = { - showDelay: 400, - hideDelay: 0, - touchendHideDelay: 0, -}; - @NgModule({ declarations: [ AppComponent, @@ -100,7 +93,6 @@ const tooltipDefaults: MatTooltipDefaultOptions = { ], providers: [ { provide: LOCALE_ID, useValue: 'de' }, - { provide: MAT_TOOLTIP_DEFAULT_OPTIONS, useValue: tooltipDefaults }, { provide: UrlSerializer, useClass: OzgCloudUrlSerializer } ], bootstrap: [AppComponent] diff --git a/goofy-client/apps/goofy/src/assets/benutzerleitfaden/Benutzerleitfaden_2.5.pdf b/goofy-client/apps/goofy/src/assets/benutzerleitfaden/benutzerleitfaden.pdf similarity index 51% rename from goofy-client/apps/goofy/src/assets/benutzerleitfaden/Benutzerleitfaden_2.5.pdf rename to goofy-client/apps/goofy/src/assets/benutzerleitfaden/benutzerleitfaden.pdf index 5eaf5b9a75ad9306680fd53fca81f625a3f3ec9b..616272da40889365f202e39955b5462d6b59080e 100644 Binary files a/goofy-client/apps/goofy/src/assets/benutzerleitfaden/Benutzerleitfaden_2.5.pdf and b/goofy-client/apps/goofy/src/assets/benutzerleitfaden/benutzerleitfaden.pdf differ diff --git a/goofy-client/apps/goofy/src/styles/abstracts/_variables.scss b/goofy-client/apps/goofy/src/styles/abstracts/_variables.scss index 2f6575848e0e05d025087e1cd1725444a8823580..8b60dd8b0a5e39df11d05c0ce8b88bd80386b710 100644 --- a/goofy-client/apps/goofy/src/styles/abstracts/_variables.scss +++ b/goofy-client/apps/goofy/src/styles/abstracts/_variables.scss @@ -70,4 +70,6 @@ $goofyDarkTheme: mat.define-dark-theme(( ) )); -$default-font-size: 16px; \ No newline at end of file +$default-font-size: 16px; + +$iconHeight: 24px; \ No newline at end of file diff --git a/goofy-client/apps/goofy/src/styles/base/_setup.scss b/goofy-client/apps/goofy/src/styles/base/_setup.scss index 501db613c485655f83cbf47b8c6321d2ae92577d..02ffa48cc627960dd9224a2043e76b943575ca06 100644 --- a/goofy-client/apps/goofy/src/styles/base/_setup.scss +++ b/goofy-client/apps/goofy/src/styles/base/_setup.scss @@ -37,16 +37,3 @@ body { margin: 0; font-family: Roboto, "Helvetica Neue", sans-serif; } - -.mat-tooltip { - font-size: 12px !important; - padding-top: 2px !important; - padding-bottom: 2px !important; - margin-top: 2px !important; - margin-bottom: 2px !important; - white-space: pre-line; - - &.word-break { - word-break: break-word; - } -} diff --git a/goofy-client/apps/goofy/src/styles/layout/_main.scss b/goofy-client/apps/goofy/src/styles/layout/_main.scss index 43d583b22eef71e47af93a8cea9a1a8b9f865134..e026b1fffd5e57d0ed81d9fed9c86f623ffe8f58 100644 --- a/goofy-client/apps/goofy/src/styles/layout/_main.scss +++ b/goofy-client/apps/goofy/src/styles/layout/_main.scss @@ -21,7 +21,7 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ - @import "variables"; + @import 'variables'; .l-scroll-area { height: calc(100vh - $header-height - $navigation-height); diff --git a/goofy-client/apps/goofy/src/styles/main.scss b/goofy-client/apps/goofy/src/styles/main.scss index 4a6d88927261ec690aa55acb4f6e1115ff349d5e..01997706ad624cc9d8c32872e78cb5f088cfbe79 100644 --- a/goofy-client/apps/goofy/src/styles/main.scss +++ b/goofy-client/apps/goofy/src/styles/main.scss @@ -28,12 +28,18 @@ @import 'abstracts/variables'; @import 'base/setup'; @import 'layout/main'; -@import 'material/tabs'; +@import 'material/autocomplete'; +@import 'material/button'; +@import 'material/dialog'; +@import 'material/formfield'; @import 'material/icons'; +@import 'material/list'; +@import 'material/menu'; +@import 'material/snackbar'; +@import 'material/tabs'; +@import 'material/typography'; @import 'libs/navigation/src/lib/header-container/header/header.theme'; @import 'libs/ui/src/lib/ui/expansion-panel/expansion-panel.theme'; -@import 'libs/ui/src/lib/ui/notification/internal-server-error-dialog/internal-server-error-dialog.theme'; -@import 'libs/ui/src/lib/ui/button-with-spinner/button-with-spinner.theme'; @import 'libs/ui/src/lib/ui/fixed-dialog/fixed-dialog.theme'; @import 'libs/wiedervorlage/src/lib/wiedervorlage-page-container/wiedervorlage-page/wiedervorlage-breadcrumb-container/wiedervorlage-breadcrumb/wiedervorlage-breadcrumb.theme'; @import 'libs/binary-file/src/lib/binary-file-container/binary-file/binary-file.theme'; @@ -47,33 +53,25 @@ @import 'libs/ui/src/lib/ui/button-toggle/button-toogle.theme'; @import 'libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page/vorgang-filter-menu-container/vorgang-filter-menu/_vorgang-filter-item.theme.scss'; @import 'libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page/vorgang-views-menu/_vorgang-views-menu.theme.scss'; -@import 'libs/user-assistance/src/lib/help-menu/_help-menu.theme.scss'; -// TODO(v15): As of v15 mat.legacy-core no longer includes default typography styles. -// The following line adds: -// 1. Default typography styles for all components -// 2. Styles for typography hierarchy classes (e.g. .mat-headline-1) -// If you specify typography styles for the components you use elsewhere, you should delete this line. -// If you don't need the default component typographies but still want the hierarchy styles, -// you can delete this line and instead use: -// `@include mat.legacy-typography-hierarchy(mat.define-legacy-typography-config());` -@include mat.all-legacy-component-typographies(); -@include mat.legacy-core(); +@include mat.all-component-typographies(); +@include mat.core(); @mixin custom-components-theme($theme) { @include expansion-panel($theme); - @include button-with-spinner($theme); + @include button($theme); @include breadcrumb($theme); @include search-container($theme); @include user-profile-icon($theme); @include internal-server-error-dialog($theme); + @include autocomplete($theme); } -@include mat.all-legacy-component-themes($goofyTheme); +@include mat.all-component-themes($goofyTheme); @include custom-components-theme($goofyTheme); body.dark { - @include mat.all-legacy-component-colors($goofyDarkTheme); + @include mat.all-component-colors($goofyDarkTheme); @include custom-components-theme($goofyDarkTheme); } \ No newline at end of file diff --git a/goofy-client/apps/goofy/src/styles/material/_autocomplete.scss b/goofy-client/apps/goofy/src/styles/material/_autocomplete.scss new file mode 100644 index 0000000000000000000000000000000000000000..c825d087cb75ed7e3e335beab2811bd59f5050de --- /dev/null +++ b/goofy-client/apps/goofy/src/styles/material/_autocomplete.scss @@ -0,0 +1,74 @@ +@use 'sass:map'; +@use '@angular/material' as mat; +@use 'variables'; + +@mixin autocomplete($theme) { + $color-config: mat.get-color-config($theme); + $primary-palette: map.get($color-config, 'primary'); + + .cdk-overlay-pane { + &:before { + content: ""; + height: 7px; + width: 100%; + position: absolute; + top: -6px; + background: inherit; + z-index: 2; + } + } + + goofy-client-vorgang-search { + + button.mat-mdc-icon-button.mat-mdc-button-base { + padding: 8px; + width: 40px; + height: 40px; + } + + .mdc-text-field--no-label:not(.mdc-text-field--outlined):not(.mdc-text-field--textarea) .mat-mdc-form-field-infix { + padding: 0.4375em 0; + min-height: auto; + } + + } + + .mdc-menu-surface.mat-mdc-autocomplete-panel.vorgang-search { + max-height: calc(100vh - $header-height); + max-width: 600px; + width: calc(600px - (800px - 100vw)); + height: auto; + box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.4); + position: relative; + border-bottom-left-radius: 20px; + border-bottom-right-radius: 20px; + margin-left: -40px; + padding: 0; + + .mat-mdc-option { + border-top: 1px solid rgba(0, 0, 0, 0.08); + font-size: 14px; + padding: 0.5rem 1rem; + margin-bottom: 0 !important; + + &:first-child { + border-top: none; + } + + .mdc-list-item__primary-text { + flex-grow: 1; + } + + .line .date { + span { + vertical-align: middle; + } + mat-icon { + margin-right: 0.25rem; + min-width: 1.5rem; + vertical-align: middle; + } + } + } + } +} \ No newline at end of file diff --git a/goofy-client/apps/goofy/src/styles/material/_button.scss b/goofy-client/apps/goofy/src/styles/material/_button.scss new file mode 100644 index 0000000000000000000000000000000000000000..3511c217cb7cf10c50da10a2cdb0b00f025bf639 --- /dev/null +++ b/goofy-client/apps/goofy/src/styles/material/_button.scss @@ -0,0 +1,28 @@ +@use 'sass:map'; +@use '@angular/material' as mat; + +@mixin button($theme) { + $color-config: mat.get-color-config($theme); + $primary: map.get($color-config, 'primary'); + + goofy-client-ozgcloud-button-with-spinner, + goofy-client-ozgcloud-stroked-button-with-spinner { + .mat-primary svg path { + fill: mat.get-color-from-palette($primary); + } + } + + .mdc-button { + mat-icon { + font-size: 24px !important; + width: 24px !important; + height: 24px !important + } + + } + + .mat-mdc-unelevated-button > .mat-icon, .mat-mdc-raised-button > .mat-icon, .mat-mdc-outlined-button > .mat-icon { + margin-left: 0 !important; + margin-right: 0 !important; + } +} diff --git a/goofy-client/apps/goofy/src/styles/material/_dialog.scss b/goofy-client/apps/goofy/src/styles/material/_dialog.scss new file mode 100644 index 0000000000000000000000000000000000000000..638b9851e6b8f6dd2ccb5347db8d4cc2d50cb0a7 --- /dev/null +++ b/goofy-client/apps/goofy/src/styles/material/_dialog.scss @@ -0,0 +1,37 @@ +@use 'sass:map'; +@use '@angular/material' as mat; + +@mixin internal-server-error-dialog($theme) { + $color-config: mat.get-color-config($theme); + $primary-palette: map.get($color-config, 'primary'); + + h1 { + color: mat.get-color-from-palette($primary-palette) !important; + font-size: 24px !important; + font-weight: normal !important; + } + + .mat-mdc-dialog-title { + margin-bottom: 0 !important; + padding-top: 16px !important; + } + + goofy-client-fixed-dialog .mat-mdc-dialog-title { + margin-bottom: 0 !important; + padding-top: 0 !important; + } + + + .mdc-dialog__title::before { + height: 0 !important; + } + + .mat-mdc-dialog-content .mdc-dialog__content, + .mdc-dialog .mdc-dialog__content { + padding-bottom: 24px !important; + } + + .mat-mdc-dialog-actions { + padding: 0 24px 24px 24px !important; + } +} diff --git a/goofy-client/apps/goofy/src/styles/material/_expansion-panel.scss b/goofy-client/apps/goofy/src/styles/material/_expansion-panel.scss index e1a97f29006c5f3c0c4d315cefb0612c1bc58327..94c3ebb197867f03b3cc58bc97500638717f6e30 100644 --- a/goofy-client/apps/goofy/src/styles/material/_expansion-panel.scss +++ b/goofy-client/apps/goofy/src/styles/material/_expansion-panel.scss @@ -21,7 +21,70 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -@import "variables"; +@use 'sass:map'; +@use '@angular/material' as mat; +@import 'variables'; + +@mixin expansion-panel($theme) { + $color-config: mat.get-color-config($theme); + $primary-palette: map.get($color-config, 'primary'); + + goofy-client-expansion-panel h3 { + color: mat.get-color-from-palette($primary-palette); + } + + body.mat-typography goofy-client-expansion-panel { + .mat-expansion-panel-header { + padding: 0 !important; + height: 44px !important; + } + + h3 { + margin-bottom: 0; + font-weight: 500; + margin-left: 16px; + font-size: 16px; + } + + .mat-expansion-panel-body { + padding: 0 0 16px 56px; + } + + goofy-client-expansion-panel { + .mat-expansion-panel-header { + height: 40px !important; + } + + h3 { + color: inherit; + font-size: 14px !important; + font-weight: 500 !important; + margin-left: 0; + } + + .mat-expansion-panel-header-title { + flex-direction: row-reverse; + justify-content: flex-end; + } + + .mat-expansion-panel-body { + padding: 0 0 0 16px; + } + } + } + + body.mat-typography goofy-client-expansion-panel-with-user { + .mat-expansion-panel-body { + padding: 0 0 0 32px; + } + } + + .section.wiedervorlagen { + .mat-expansion-panel-body .mat-expansion-panel-body { + padding: 0 0 0 24px; + } + } +} .mat-expansion-panel { display: flex; @@ -35,4 +98,4 @@ :host-context(.dark) .mat-expansion-panel { background: $darkBackgroundExpansionPanelLike; -} \ No newline at end of file +} diff --git a/goofy-client/apps/goofy/src/styles/material/_formfield.scss b/goofy-client/apps/goofy/src/styles/material/_formfield.scss new file mode 100644 index 0000000000000000000000000000000000000000..61ac051ae0d6b54d10df9a57cad587aadc6b7a2d --- /dev/null +++ b/goofy-client/apps/goofy/src/styles/material/_formfield.scss @@ -0,0 +1,25 @@ +goofy-client-vorgang-search { + .mdc-text-field--filled, + .mdc-text-field--filled:hover { + .mdc-line-ripple::before, + .mdc-line-ripple::after { + border-bottom: none; + } + } + + .mat-mdc-form-field-focus-overlay, + .mdc-text-field--filled:not(.mdc-text-field--disabled) { + background-color: transparent !important; + } +} + +goofy-client-fixed-dialog { + .mat-mdc-form-field-focus-overlay, + .mdc-text-field--filled:not(.mdc-text-field--disabled) { + background-color: transparent !important; + } + + .mdc-text-field { + padding: 0; + } +} diff --git a/goofy-client/apps/goofy/src/styles/material/_list.scss b/goofy-client/apps/goofy/src/styles/material/_list.scss new file mode 100644 index 0000000000000000000000000000000000000000..5426fe1965fa84fa868e75182228e4599a50a6d7 --- /dev/null +++ b/goofy-client/apps/goofy/src/styles/material/_list.scss @@ -0,0 +1,33 @@ +body.dark { + .mdc-list-item--with-leading-icon .mdc-list-item__start, + .mdc-list-item__secondary-text { + color: white !important; + } +} + +.mdc-list-item--with-leading-icon .mdc-list-item__start, +.mdc-list-item__secondary-text { + color: rgba(0, 0, 0, 0.87) !important; +} + +.mdc-list-item--with-leading-icon .mdc-list-item__start { + margin: 0 !important; + line-height: 24px !important; +} + +.mat-mdc-list-item.mdc-list-item--with-leading-icon.mdc-list-item--with-one-line, +.mat-mdc-list-item.mdc-list-item--with-leading-icon.mdc-list-item--with-two-lines { + height: auto !important; +} + +.mdc-list-item__secondary-text::before { + height: auto !important; +} + +.mdc-list-item__content { + padding-left: 6px; +} + +.mdc-list-item { + margin-bottom: 8px; +} \ No newline at end of file diff --git a/goofy-client/apps/goofy/src/styles/material/_menu.scss b/goofy-client/apps/goofy/src/styles/material/_menu.scss new file mode 100644 index 0000000000000000000000000000000000000000..ceaa8694f07f76a50469b040daa6848fa42db7d7 --- /dev/null +++ b/goofy-client/apps/goofy/src/styles/material/_menu.scss @@ -0,0 +1,17 @@ +@use 'variables'; + +.mat-mdc-menu-panel.mat-mdc-menu-panel { + max-width: 365px !important; + background-color: $background; +} + +goofy-client-help-menu { + .mat-mdc-fab { + box-shadow: none !important; + background-color: transparent !important; + border-radius: 10px; + height: 40px; + width: auto; + padding: 0.5rem; + } +} \ No newline at end of file diff --git a/goofy-client/apps/goofy/src/styles/material/_snackbar.scss b/goofy-client/apps/goofy/src/styles/material/_snackbar.scss new file mode 100644 index 0000000000000000000000000000000000000000..659851a0dbc6abc8401af672111e881639dc9be1 --- /dev/null +++ b/goofy-client/apps/goofy/src/styles/material/_snackbar.scss @@ -0,0 +1,49 @@ +.mat-mdc-snack-bar-container { + goofy-client-snackbar-info > button { + color: #2196f3 !important; + height: 24px !important; + } +} + +.mat-mdc-snack-bar-container.error { + .mdc-snackbar__surface { + background-color: transparent !important; + box-shadow: none !important; + } + + .mdc-snackbar__label { + padding-top: 11px !important; + padding-bottom: 11px !important; + color: black !important; + } + + .mat-mdc-button-persistent-ripple, .mat-mdc-button-ripple { + display: none; + } + + min-width: 240px; + max-width: 90vw; + + border: 3px solid mat.get-color-from-palette($warnPalette); + border-radius: 4px; + background-color: lighten(mat.get-color-from-palette($warnPalette), 38%); + box-shadow: 0px 3px 5px -1px rgba(0, 0, 0, 0.2), 0px 6px 10px 0px rgba(0, 0, 0, 0.14), 0px 1px 18px 0px rgba(0, 0, 0, 0.12); + color: rgba(#000, 0.89); + position: relative; + + &:before { + position: absolute; + content: url("/assets/icons/error_outline_white.svg"); + display: block; + background-color: mat.get-color-from-palette($warnPalette); + left: 0; + top: 0; + padding: 11px 9px 11px 7px; + color: #fff; + height: 100%; + } + + > div { + margin-left: 44px; + } +} diff --git a/goofy-client/apps/goofy/src/styles/material/_tabs.scss b/goofy-client/apps/goofy/src/styles/material/_tabs.scss index af0f1fd585243198566b53656e777d0455ae3912..3cfafb3bb42f45f37fd86fc9aea0b3bef823e346 100644 --- a/goofy-client/apps/goofy/src/styles/material/_tabs.scss +++ b/goofy-client/apps/goofy/src/styles/material/_tabs.scss @@ -21,14 +21,17 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -.mat-tab-label { +.mat-mdc-tab-header { + border-bottom: 1px solid rgba(0, 0, 0, 0.12); +} +.mat-mdc-tab { padding: 0 !important; min-width: auto !important; - margin: 0 12px; + margin: 0 12px !important; &:first-child { - margin-left: 0; + margin-left: 0 !important; } &:last-child { - margin-right: 0; + margin-right: 0 !important; } } diff --git a/goofy-client/apps/goofy/src/styles/material/_tooltip.scss b/goofy-client/apps/goofy/src/styles/material/_tooltip.scss new file mode 100644 index 0000000000000000000000000000000000000000..c900b9ece70d04818a1d1b39c76a7a8d4596eec0 --- /dev/null +++ b/goofy-client/apps/goofy/src/styles/material/_tooltip.scss @@ -0,0 +1,12 @@ +.mat-tooltip { + font-size: 12px !important; + padding-top: 2px !important; + padding-bottom: 2px !important; + margin-top: 2px !important; + margin-bottom: 2px !important; + white-space: pre-line; + + &.word-break { + word-break: break-word; + } +} diff --git a/goofy-client/apps/goofy/src/styles/material/_typography.scss b/goofy-client/apps/goofy/src/styles/material/_typography.scss new file mode 100644 index 0000000000000000000000000000000000000000..f0f7ab67a35609d1a675770005b367a1b63b7f7d --- /dev/null +++ b/goofy-client/apps/goofy/src/styles/material/_typography.scss @@ -0,0 +1,10 @@ +.mdc-button, +.mdc-tab, +.mdc-fab--extended, +.mat-mdc-form-field, +.mat-mdc-floating-label, +.mat-mdc-menu-content, +.mdc-list-item__primary-text, +.mat-mdc-dialog-container .mdc-dialog__content { + letter-spacing: normal !important; +} \ No newline at end of file diff --git a/goofy-client/libs/binary-file/src/lib/binary-file-container/binary-file/binary-file.component.spec.ts b/goofy-client/libs/binary-file/src/lib/binary-file-container/binary-file/binary-file.component.spec.ts index 87ccdd0e2378d152fa3c158081fb5cc51b997a79..d100e5edbff57a20eaf7296f7eab6ceba2cf15b9 100644 --- a/goofy-client/libs/binary-file/src/lib/binary-file-container/binary-file/binary-file.component.spec.ts +++ b/goofy-client/libs/binary-file/src/lib/binary-file-container/binary-file/binary-file.component.spec.ts @@ -23,13 +23,12 @@ */ import { ComponentFixture, fakeAsync, TestBed, tick } from '@angular/core/testing'; import { MatIcon } from '@angular/material/icon'; -import { MatLegacyTooltip as MatTooltip } from '@angular/material/legacy-tooltip'; import { faker } from '@faker-js/faker'; import { ApiDownloadToken } from '@goofy-client/api-root-shared'; import { BinaryFileLinkRel, BinaryFileResource } from '@goofy-client/binary-file-shared'; import { createEmptyStateResource, FileSizePipe, HasLinkPipe } from '@goofy-client/tech-shared'; import { getElementFromFixture } from '@goofy-client/test-utils'; -import { IconButtonWithSpinnerComponent, SpinnerComponent } from '@goofy-client/ui'; +import { IconButtonWithSpinnerComponent, MatTooltipDirective, SpinnerComponent } from '@goofy-client/ui'; import { createBinaryFileResource } from 'libs/binary-file-shared/test/binary-file'; import { getDataTestClassOf } from 'libs/tech-shared/test/data-test'; import { MockComponent, MockDirective } from 'ng-mocks'; @@ -49,7 +48,7 @@ describe('BinaryFileComponent', () => { MatIcon, FileSizePipe, HasLinkPipe, - MockDirective(MatTooltip), + MockDirective(MatTooltipDirective), MockComponent(SpinnerComponent), MockComponent(IconButtonWithSpinnerComponent) ] diff --git a/goofy-client/libs/forwarding/src/lib/vorgang-forwarding-container/vorgang-forward-formular/vorgang-forward-form/vorgang-forward-form.component.html b/goofy-client/libs/forwarding/src/lib/vorgang-forwarding-container/vorgang-forward-formular/vorgang-forward-form/vorgang-forward-form.component.html index 7394614860b09030de63d8c1749ecd13ecf0e171..31e1a17bd400b3206bc4f946d019f7a181e739a9 100644 --- a/goofy-client/libs/forwarding/src/lib/vorgang-forwarding-container/vorgang-forward-formular/vorgang-forward-form/vorgang-forward-form.component.html +++ b/goofy-client/libs/forwarding/src/lib/vorgang-forwarding-container/vorgang-forward-formular/vorgang-forward-form/vorgang-forward-form.component.html @@ -38,12 +38,12 @@ placeholder="Passwort für die Verschlüsselung"> </goofy-client-text-editor> - <goofy-client-button-with-spinner dataTestId="forward-button" + <goofy-client-ozgcloud-stroked-button-with-spinner dataTestId="forward-button" toolTip="Vorgang weiterleiten" icon="forward" type="submit" text="Weiterleiten" [stateResource]="forwardStateResource"> - </goofy-client-button-with-spinner> + </goofy-client-ozgcloud-stroked-button-with-spinner> </form> diff --git a/goofy-client/libs/forwarding/src/lib/vorgang-forwarding-container/vorgang-forward-formular/vorgang-forward-form/vorgang-forward-form.component.spec.ts b/goofy-client/libs/forwarding/src/lib/vorgang-forwarding-container/vorgang-forward-formular/vorgang-forward-form/vorgang-forward-form.component.spec.ts index f3d01ce2877bd5154978c6c0c57aac8ba89977fe..f4dcc3489c576d95e151f73c2c86b1794a1e4bef 100644 --- a/goofy-client/libs/forwarding/src/lib/vorgang-forwarding-container/vorgang-forward-formular/vorgang-forward-form/vorgang-forward-form.component.spec.ts +++ b/goofy-client/libs/forwarding/src/lib/vorgang-forwarding-container/vorgang-forward-formular/vorgang-forward-form/vorgang-forward-form.component.spec.ts @@ -23,12 +23,12 @@ */ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ReactiveFormsModule, UntypedFormControl, UntypedFormGroup } from '@angular/forms'; +import { MatFormFieldModule } from '@angular/material/form-field'; import { MatIcon } from '@angular/material/icon'; -import { MatLegacyFormFieldModule as MatFormFieldModule } from '@angular/material/legacy-form-field'; -import { MatLegacyInputModule as MatInputModule } from '@angular/material/legacy-input'; +import { MatInputModule } from '@angular/material/input'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { mock } from '@goofy-client/test-utils'; -import { ButtonWithSpinnerComponent, TextEditorComponent } from '@goofy-client/ui'; +import { OzgcloudStrokedButtonWithSpinnerComponent, TextEditorComponent } from '@goofy-client/ui'; import { VorgangWithEingangResource } from '@goofy-client/vorgang-shared'; import { createVorgangWithEingangResource } from 'libs/vorgang-shared/test/vorgang'; import { MockComponent } from 'ng-mocks'; @@ -53,7 +53,7 @@ describe('VorgangForwardFormComponent', () => { declarations: [ VorgangForwardFormComponent, MatIcon, - MockComponent(ButtonWithSpinnerComponent), + MockComponent(OzgcloudStrokedButtonWithSpinnerComponent), MockComponent(TextEditorComponent) ], imports: [ diff --git a/goofy-client/libs/forwarding/src/lib/vorgang-forwarding-zustellen-container/vorgang-forward-zustellen-container.component.html b/goofy-client/libs/forwarding/src/lib/vorgang-forwarding-zustellen-container/vorgang-forward-zustellen-container.component.html index 203aaebab423a86027a9acb9c023586058e53892..c6d568bca7072f6c54659c587f5922b2c8ace93d 100644 --- a/goofy-client/libs/forwarding/src/lib/vorgang-forwarding-zustellen-container/vorgang-forward-zustellen-container.component.html +++ b/goofy-client/libs/forwarding/src/lib/vorgang-forwarding-zustellen-container/vorgang-forward-zustellen-container.component.html @@ -36,19 +36,19 @@ </div> <div class="buttons"> - <goofy-client-button-with-spinner *ngIf="forwarding | hasLink: linkRel.MARK_AS_SUCCESS" + <goofy-client-ozgcloud-stroked-button-with-spinner *ngIf="forwarding | hasLink: linkRel.MARK_AS_SUCCESS" data-test-id="mark-as-success-button" text="Bestätigen" icon="check_circle_outline" [stateResource]="markAsSuccessCommandStateResource$ | async" (clickEmitter)="markAsSuccess()"> - </goofy-client-button-with-spinner> + </goofy-client-ozgcloud-stroked-button-with-spinner> - <goofy-client-button-with-spinner *ngIf="forwarding | hasLink: linkRel.MARK_AS_FAIL" + <goofy-client-ozgcloud-stroked-button-with-spinner *ngIf="forwarding | hasLink: linkRel.MARK_AS_FAIL" data-test-id="mark-as-fail-button" text="Widerrufen" icon="info_outline" [stateResource]="markAsFailCommandStateResource$ | async" (clickEmitter)="markAsFail()"> - </goofy-client-button-with-spinner> + </goofy-client-ozgcloud-stroked-button-with-spinner> </div> diff --git a/goofy-client/libs/forwarding/src/lib/vorgang-forwarding-zustellen-container/vorgang-forward-zustellen-container.component.scss b/goofy-client/libs/forwarding/src/lib/vorgang-forwarding-zustellen-container/vorgang-forward-zustellen-container.component.scss index f0d1883e8ee15c8b0e9b2e368b7537d6ae4e7bdb..9bef324f39988dc2c7dbd060bcb0c6c7b089f010 100644 --- a/goofy-client/libs/forwarding/src/lib/vorgang-forwarding-zustellen-container/vorgang-forward-zustellen-container.component.scss +++ b/goofy-client/libs/forwarding/src/lib/vorgang-forwarding-zustellen-container/vorgang-forward-zustellen-container.component.scss @@ -31,7 +31,7 @@ margin: 16px -8px; display: flex; - goofy-client-button-with-spinner { + goofy-client-ozgcloud-stroked-button-with-spinner { margin: 0 8px; } } diff --git a/goofy-client/libs/forwarding/src/lib/vorgang-forwarding-zustellen-container/vorgang-forward-zustellen-container.component.spec.ts b/goofy-client/libs/forwarding/src/lib/vorgang-forwarding-zustellen-container/vorgang-forward-zustellen-container.component.spec.ts index 6c9cf45254bbb350e2751a07d38d2997092e522e..4b3375d84d3010bcc6c1522f5f39735cc2588f2a 100644 --- a/goofy-client/libs/forwarding/src/lib/vorgang-forwarding-zustellen-container/vorgang-forward-zustellen-container.component.spec.ts +++ b/goofy-client/libs/forwarding/src/lib/vorgang-forwarding-zustellen-container/vorgang-forward-zustellen-container.component.spec.ts @@ -26,7 +26,7 @@ import { MatIcon } from '@angular/material/icon'; import { ForwardingLinkRel, ForwardingResource, ForwardingService } from '@goofy-client/forwarding-shared'; import { HasLinkPipe } from '@goofy-client/tech-shared'; import { mock } from '@goofy-client/test-utils'; -import { ButtonWithSpinnerComponent } from '@goofy-client/ui'; +import { OzgcloudStrokedButtonWithSpinnerComponent } from '@goofy-client/ui'; import { createForwardingResource } from 'libs/forwarding-shared/test/forwarding'; import { MockComponent } from 'ng-mocks'; import { VorgangForwardZustellenContainerComponent } from './vorgang-forward-zustellen-container.component'; @@ -51,7 +51,7 @@ describe('VorgangForwardZustellenContainerComponent', () => { HasLinkPipe, VorgangForwardZustellenContainerComponent, MatIcon, - MockComponent(ButtonWithSpinnerComponent) + MockComponent(OzgcloudStrokedButtonWithSpinnerComponent) ], providers: [ { diff --git a/goofy-client/libs/historie/src/lib/historie-container/historie-list/historie-item-assign-user-container/historie-item-assign-user-container.component.scss b/goofy-client/libs/historie/src/lib/historie-container/historie-list/historie-item-assign-user-container/historie-item-assign-user-container.component.scss index b56b8b71d3afb82c055c91a652ffa371c5144fa7..d6238211bb493815e84e9e0c249c4cb0acc816e7 100644 --- a/goofy-client/libs/historie/src/lib/historie-container/historie-list/historie-item-assign-user-container/historie-item-assign-user-container.component.scss +++ b/goofy-client/libs/historie/src/lib/historie-container/historie-list/historie-item-assign-user-container/historie-item-assign-user-container.component.scss @@ -21,4 +21,4 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -@import "expansion-panel"; +@import 'expansion-panel'; diff --git a/goofy-client/libs/historie/src/lib/historie-container/historie-list/historie-item-forwarding/historie-item-forwarding.component.scss b/goofy-client/libs/historie/src/lib/historie-container/historie-list/historie-item-forwarding/historie-item-forwarding.component.scss index ffac2a3fa21a2357dd73e2abdde6606d64959f70..5bdff0dea3cbaef97bcaef245352e2e6af1c6f73 100644 --- a/goofy-client/libs/historie/src/lib/historie-container/historie-list/historie-item-forwarding/historie-item-forwarding.component.scss +++ b/goofy-client/libs/historie/src/lib/historie-container/historie-list/historie-item-forwarding/historie-item-forwarding.component.scss @@ -21,4 +21,4 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -@import "expansion-panel" \ No newline at end of file +@import 'expansion-panel' \ No newline at end of file diff --git a/goofy-client/libs/historie/src/lib/historie-container/historie-list/historie-item-unknown/historie-item-unknown.component.scss b/goofy-client/libs/historie/src/lib/historie-container/historie-list/historie-item-unknown/historie-item-unknown.component.scss index af33108ca1143f7d9d084537e4fa5e1be22649c0..c85698e574b5c212b494a3951d656e50dbf38b6c 100644 --- a/goofy-client/libs/historie/src/lib/historie-container/historie-list/historie-item-unknown/historie-item-unknown.component.scss +++ b/goofy-client/libs/historie/src/lib/historie-container/historie-list/historie-item-unknown/historie-item-unknown.component.scss @@ -21,4 +21,4 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -@import "expansion-panel"; \ No newline at end of file +@import 'expansion-panel'; \ No newline at end of file diff --git a/goofy-client/libs/historie/src/lib/historie-container/historie-list/historie-item-vorgang-created/historie-item-vorgang-created.component.scss b/goofy-client/libs/historie/src/lib/historie-container/historie-list/historie-item-vorgang-created/historie-item-vorgang-created.component.scss index f08f4f2d0915b1925150eebcdfbc2480d6d625e1..13ffdbdf74b14c777722e352dba64d724a0a2647 100644 --- a/goofy-client/libs/historie/src/lib/historie-container/historie-list/historie-item-vorgang-created/historie-item-vorgang-created.component.scss +++ b/goofy-client/libs/historie/src/lib/historie-container/historie-list/historie-item-vorgang-created/historie-item-vorgang-created.component.scss @@ -21,8 +21,8 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -@import "variables"; -@import "expansion-panel"; +@import 'variables'; +@import 'expansion-panel'; :host { border-bottom: 1px solid $greyLight; diff --git a/goofy-client/libs/historie/src/lib/historie-container/historie-list/historie-list-item/historie-list-item.component.scss b/goofy-client/libs/historie/src/lib/historie-container/historie-list/historie-list-item/historie-list-item.component.scss index 4ea73000d82c0aae4e452ec26ac169118a7fae53..4ad74587729bb4e23c2ac29aeb7b70fee5d3828f 100644 --- a/goofy-client/libs/historie/src/lib/historie-container/historie-list/historie-list-item/historie-list-item.component.scss +++ b/goofy-client/libs/historie/src/lib/historie-container/historie-list/historie-list-item/historie-list-item.component.scss @@ -21,7 +21,7 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -@import "variables"; +@import 'variables'; :host { display: block; diff --git a/goofy-client/libs/historie/src/lib/historie-container/historie-list/historie-list.component.scss b/goofy-client/libs/historie/src/lib/historie-container/historie-list/historie-list.component.scss index 004b169f6166c199fbcd380e5df39ac0630c228b..86e14516c34fa09bee546a46b3e3c69dd2ec0dbe 100644 --- a/goofy-client/libs/historie/src/lib/historie-container/historie-list/historie-list.component.scss +++ b/goofy-client/libs/historie/src/lib/historie-container/historie-list/historie-list.component.scss @@ -21,7 +21,7 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -@import "variables"; +@import 'variables'; ul { margin-top: 0; diff --git a/goofy-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-form/kommentar-form.component.html b/goofy-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-form/kommentar-form.component.html index 7b20106d1f137ccf453f2cb3845c4c4fee6d7576..be5ed6221fd7978fc521f572af806a2b338f8fa3 100644 --- a/goofy-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-form/kommentar-form.component.html +++ b/goofy-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-form/kommentar-form.component.html @@ -39,22 +39,22 @@ </goofy-client-binary-file-attachment-container> <div class="buttons"> - <goofy-client-button-with-spinner + <goofy-client-ozgcloud-stroked-button-with-spinner text="Speichern" data-test-id="add-button" icon="save_alt" class="submit-button" [stateResource]="submitInProgress$ | async" (clickEmitter)="submit()"> - </goofy-client-button-with-spinner> + </goofy-client-ozgcloud-stroked-button-with-spinner> - <goofy-client-button-with-spinner + <goofy-client-ozgcloud-stroked-button-with-spinner text="Abbrechen" data-test-id="cancel-button" icon="clear" color="" class="cancel-button" (clickEmitter)="cancel.emit()"> - </goofy-client-button-with-spinner> + </goofy-client-ozgcloud-stroked-button-with-spinner> </div> </form> diff --git a/goofy-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-form/kommentar-form.component.scss b/goofy-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-form/kommentar-form.component.scss index 78609186ecdda5fd657a9e96ae1f7607a04d58bb..51961869dbe4174bb7fd648721b6df7b08c6a0b4 100644 --- a/goofy-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-form/kommentar-form.component.scss +++ b/goofy-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-form/kommentar-form.component.scss @@ -32,7 +32,7 @@ display: flex; margin: 16px -8px; - goofy-client-button-with-spinner { + goofy-client-ozgcloud-stroked-button-with-spinner { margin: 0 8px; } } diff --git a/goofy-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-form/kommentar-form.component.spec.ts b/goofy-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-form/kommentar-form.component.spec.ts index 32a622293e57108d5231435c6b5122f1aea4934a..8e7b629cb562374498ea5f03ba88401d3ef90c57 100644 --- a/goofy-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-form/kommentar-form.component.spec.ts +++ b/goofy-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-form/kommentar-form.component.spec.ts @@ -23,12 +23,12 @@ */ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ReactiveFormsModule } from '@angular/forms'; -import { MatLegacyFormFieldModule as MatFormFieldModule } from '@angular/material/legacy-form-field'; +import { MatFormFieldModule } from '@angular/material/form-field'; import { BinaryFileAttachmentContainerComponent } from '@goofy-client/binary-file'; import { KommentarLinkRel, KommentarService } from '@goofy-client/kommentar-shared'; import { createStateResource } from '@goofy-client/tech-shared'; import { mock } from '@goofy-client/test-utils'; -import { ButtonWithSpinnerComponent, TextAreaEditorComponent } from '@goofy-client/ui'; +import { OzgcloudStrokedButtonWithSpinnerComponent, TextAreaEditorComponent } from '@goofy-client/ui'; import { MockComponent } from 'ng-mocks'; import { of } from 'rxjs'; import { createBinaryFileListResource } from '../../../../../binary-file-shared/test/binary-file'; @@ -48,7 +48,7 @@ describe('KommentarFormComponent', () => { declarations: [ KommentarFormComponent, MockComponent(TextAreaEditorComponent), - MockComponent(ButtonWithSpinnerComponent), + MockComponent(OzgcloudStrokedButtonWithSpinnerComponent), MockComponent(BinaryFileAttachmentContainerComponent), ], imports: [ diff --git a/goofy-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-list-in-vorgang-container.component.html b/goofy-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-list-in-vorgang-container.component.html index 312a3aead13076dfd24712b09a4655cb34938b01..e5311fe2d059b1394d4c7f1676e1ac10b9425c32 100644 --- a/goofy-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-list-in-vorgang-container.component.html +++ b/goofy-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-list-in-vorgang-container.component.html @@ -40,13 +40,13 @@ data-test-id="kommentar-formular"> </goofy-client-kommentar-form> - <goofy-client-button-with-spinner + <goofy-client-ozgcloud-stroked-button-with-spinner *ngIf="canCreateNewKommentar$ | async" (clickEmitter)="showFormular()" class="create-button" text="Kommentar" icon="add" dataTestId="create-kommentar"> - </goofy-client-button-with-spinner> + </goofy-client-ozgcloud-stroked-button-with-spinner> </ng-container> diff --git a/goofy-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-list-in-vorgang-container.component.spec.ts b/goofy-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-list-in-vorgang-container.component.spec.ts index 89e5f7233c158ec9f7346ca38e4766366e59c8cd..f0cc1c211f906c463b02f50c84037d5608c857fd 100644 --- a/goofy-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-list-in-vorgang-container.component.spec.ts +++ b/goofy-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-list-in-vorgang-container.component.spec.ts @@ -23,17 +23,17 @@ */ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { KommentarListLinkRel, KommentarService } from '@goofy-client/kommentar-shared'; +import { createStateResource } from '@goofy-client/tech-shared'; import { mock } from '@goofy-client/test-utils'; -import { ButtonWithSpinnerComponent, ExpansionPanelComponent } from '@goofy-client/ui'; +import { ExpansionPanelComponent, OzgcloudStrokedButtonWithSpinnerComponent } from '@goofy-client/ui'; +import { cold } from 'jest-marbles'; import { MockComponent } from 'ng-mocks'; +import { Observable } from 'rxjs'; +import { createKommentarListResource } from '../../../../kommentar-shared/test/kommentar'; +import { createVorgangWithEingangResource } from '../../../../vorgang-shared/test/vorgang'; import { KommentarFormComponent } from './kommentar-form/kommentar-form.component'; import { KommentarListInVorgangContainerComponent } from './kommentar-list-in-vorgang-container.component'; import { KommentarListInVorgangComponent } from './kommentar-list-in-vorgang/kommentar-list-in-vorgang.component'; -import { cold } from 'jest-marbles'; -import { createStateResource } from '@goofy-client/tech-shared'; -import { createKommentarListResource } from '../../../../kommentar-shared/test/kommentar'; -import { Observable } from 'rxjs'; -import { createVorgangWithEingangResource } from '../../../../vorgang-shared/test/vorgang'; describe('KommentarListInVorgangContainerComponent', () => { let component: KommentarListInVorgangContainerComponent; @@ -48,7 +48,7 @@ describe('KommentarListInVorgangContainerComponent', () => { MockComponent(ExpansionPanelComponent), MockComponent(KommentarListInVorgangComponent), MockComponent(KommentarFormComponent), - MockComponent(ButtonWithSpinnerComponent) + MockComponent(OzgcloudStrokedButtonWithSpinnerComponent) ], providers: [ { diff --git a/goofy-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-list-in-vorgang/kommentar-list-item-in-vorgang/kommentar-list-item-in-vorgang.component.ts b/goofy-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-list-in-vorgang/kommentar-list-item-in-vorgang/kommentar-list-item-in-vorgang.component.ts index a89cd0122c03a80556be442cc4f09dbac26161e6..df3208154642a8ac4f8c351dc665a92e5015cc78 100644 --- a/goofy-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-list-in-vorgang/kommentar-list-item-in-vorgang/kommentar-list-item-in-vorgang.component.ts +++ b/goofy-client/libs/kommentar/src/lib/kommentar-list-in-vorgang-container/kommentar-list-in-vorgang/kommentar-list-item-in-vorgang/kommentar-list-item-in-vorgang.component.ts @@ -23,10 +23,10 @@ */ import { Component, Input, OnInit } from '@angular/core'; import { BinaryFileListResource } from '@goofy-client/binary-file-shared'; -import { KommentarLinkRel, KommentarListLinkRel, KommentarListResource, KommentarResource, KommentarService } from '@goofy-client/kommentar-shared'; -import { createEmptyStateResource, StateResource } from "@goofy-client/tech-shared"; -import { Observable, of } from 'rxjs'; +import { KommentarLinkRel, KommentarListResource, KommentarResource, KommentarService } from '@goofy-client/kommentar-shared'; +import { StateResource, createEmptyStateResource } from "@goofy-client/tech-shared"; import { hasLink } from '@ngxp/rest'; +import { Observable, of } from 'rxjs'; @Component({ selector: 'goofy-client-kommentar-list-item-in-vorgang', diff --git a/goofy-client/libs/loesch-anforderung-shared/src/lib/+state/loesch-anforderung.actions.ts b/goofy-client/libs/loesch-anforderung-shared/src/lib/+state/loesch-anforderung.actions.ts index c3a62b795e46767355136240ed7621ae7a31cda3..3cc1ebc16bab01635a685cc7199b60473a3765d9 100644 --- a/goofy-client/libs/loesch-anforderung-shared/src/lib/+state/loesch-anforderung.actions.ts +++ b/goofy-client/libs/loesch-anforderung-shared/src/lib/+state/loesch-anforderung.actions.ts @@ -12,10 +12,10 @@ export const loadLoeschAnforderung: TypedActionCreatorWithProps<VorgangWithEinga export const loadLoeschAnforderungSuccess: TypedActionCreatorWithProps<LoeschAnforderungProps> = createAction('[LoeschAnforderung] Load LoeschAnforderung Success', props<LoeschAnforderungProps>()); export const loadLoeschAnforderungFailure: TypedActionCreatorWithProps<ApiErrorAction> = createAction('[LoeschAnforderung] Load LoeschAnforderung Failure', props<ApiErrorAction>()); -export interface loeschAnforderungZuruecknehmenFailedAndReloadVorgangFailureProps { +export interface LoeschAnforderungZuruecknehmenFailedAndReloadVorgangFailureProps { error: HttpErrorResponse, overviewUrl: string } export const loeschAnforderungZuruecknehmenFailedAndReloadVorgangSuccess: TypedActionCreator = createAction('[LoeschAnforderung] LoeschAnforderung zurücknehmen reload vorgang success'); -export const loeschAnforderungZuruecknehmenFailedAndReloadVorgangFailure: TypedActionCreatorWithProps<loeschAnforderungZuruecknehmenFailedAndReloadVorgangFailureProps> = createAction('[LoeschAnforderung] LoeschAnforderung zurücknehmen reload vorgang failure', props<loeschAnforderungZuruecknehmenFailedAndReloadVorgangFailureProps>()); \ No newline at end of file +export const loeschAnforderungZuruecknehmenFailedAndReloadVorgangFailure: TypedActionCreatorWithProps<LoeschAnforderungZuruecknehmenFailedAndReloadVorgangFailureProps> = createAction('[LoeschAnforderung] LoeschAnforderung zurücknehmen reload vorgang failure', props<LoeschAnforderungZuruecknehmenFailedAndReloadVorgangFailureProps>()); \ No newline at end of file diff --git a/goofy-client/libs/loesch-anforderung-shared/src/lib/+state/loesch-anforderung.effects.ts b/goofy-client/libs/loesch-anforderung-shared/src/lib/+state/loesch-anforderung.effects.ts index de14570bb3c540ae8ae4ba9da583725d405a2bba..8aeedfcb045ce309dad0d847d8d6dc92f1bda51f 100644 --- a/goofy-client/libs/loesch-anforderung-shared/src/lib/+state/loesch-anforderung.effects.ts +++ b/goofy-client/libs/loesch-anforderung-shared/src/lib/+state/loesch-anforderung.effects.ts @@ -9,7 +9,7 @@ import { hasLink } from '@ngxp/rest'; import { of } from 'rxjs'; import { catchError, filter, map, switchMap, tap } from 'rxjs/operators'; import { isVorgangLoeschenCommand } from '../loesch-anforderung.util'; -import { loeschAnforderungZuruecknehmenFailedAndReloadVorgangFailureProps } from './loesch-anforderung.actions'; +import { LoeschAnforderungZuruecknehmenFailedAndReloadVorgangFailureProps } from './loesch-anforderung.actions'; import { LoeschAnforderungRepository } from './loesch-anforderung.repository'; import * as CommandActions from '../../../../command-shared/src/lib/+state/command.actions'; @@ -40,8 +40,8 @@ export class LoeschAnforderungEffects { ), { dispatch: false }); loeschAnforderungZuruecknehmenFailedAndReloadVorgangFailure$ = createEffect(() => this.actions$.pipe(ofType(LoeschAnforderungActions.loeschAnforderungZuruecknehmenFailedAndReloadVorgangFailure), - filter((props: loeschAnforderungZuruecknehmenFailedAndReloadVorgangFailureProps) => isNotFound(props.error.error.status)), - tap((props: loeschAnforderungZuruecknehmenFailedAndReloadVorgangFailureProps) => { + filter((props: LoeschAnforderungZuruecknehmenFailedAndReloadVorgangFailureProps) => isNotFound(props.error.error.status)), + tap((props: LoeschAnforderungZuruecknehmenFailedAndReloadVorgangFailureProps) => { this.snackBarService.showInfo(LOESCH_ANFORDERUNG_ZURUECKNEHMEN_CONCURRENT_TO_DELETE_VORGANG_MESSAGE); this.navigationService.navigate(props.overviewUrl); }) diff --git a/goofy-client/libs/loesch-anforderung/src/lib/endgueltig-loeschen-button-container/endgueltig-loeschen-button/endgueltig-loeschen-button.component.html b/goofy-client/libs/loesch-anforderung/src/lib/endgueltig-loeschen-button-container/endgueltig-loeschen-button/endgueltig-loeschen-button.component.html index 612a32fb55907aca731e67813471c304446d59ef..5f62122e26615c580ea8691c31d278b73e684e1a 100644 --- a/goofy-client/libs/loesch-anforderung/src/lib/endgueltig-loeschen-button-container/endgueltig-loeschen-button/endgueltig-loeschen-button.component.html +++ b/goofy-client/libs/loesch-anforderung/src/lib/endgueltig-loeschen-button-container/endgueltig-loeschen-button/endgueltig-loeschen-button.component.html @@ -1,8 +1,8 @@ -<goofy-client-button-with-spinner *ngIf="!showAsIconButton" data-test-id="endgueltig-loeschen-button" +<goofy-client-ozgcloud-stroked-button-with-spinner *ngIf="!showAsIconButton" data-test-id="endgueltig-loeschen-button" text="Endgültig löschen" svgIcon="delete_finally" (clickEmitter)="endgueltigLoeschen.emit()"> -</goofy-client-button-with-spinner> +</goofy-client-ozgcloud-stroked-button-with-spinner> <goofy-client-icon-button-with-spinner *ngIf="showAsIconButton" data-test-id="endgueltig-loeschen-icon-button" toolTip="Endgültig löschen" diff --git a/goofy-client/libs/loesch-anforderung/src/lib/endgueltig-loeschen-button-container/endgueltig-loeschen-button/endgueltig-loeschen-button.component.spec.ts b/goofy-client/libs/loesch-anforderung/src/lib/endgueltig-loeschen-button-container/endgueltig-loeschen-button/endgueltig-loeschen-button.component.spec.ts index 097f8e5b77d5ae942949203727f309956bbc3077..60328f58254a6c8dd4bfada6258f63865aa8ff20 100644 --- a/goofy-client/libs/loesch-anforderung/src/lib/endgueltig-loeschen-button-container/endgueltig-loeschen-button/endgueltig-loeschen-button.component.spec.ts +++ b/goofy-client/libs/loesch-anforderung/src/lib/endgueltig-loeschen-button-container/endgueltig-loeschen-button/endgueltig-loeschen-button.component.spec.ts @@ -1,6 +1,6 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { existsAsHtmlElement, notExistsAsHtmlElement } from '@goofy-client/test-utils'; -import { ButtonWithSpinnerComponent, IconButtonWithSpinnerComponent } from '@goofy-client/ui'; +import { IconButtonWithSpinnerComponent, OzgcloudStrokedButtonWithSpinnerComponent } from '@goofy-client/ui'; import { getDataTestIdOf } from 'libs/tech-shared/test/data-test'; import { MockComponent } from 'ng-mocks'; import { EndgueltigLoeschenButtonComponent } from './endgueltig-loeschen-button.component'; @@ -16,7 +16,7 @@ describe('EndgueltigLoeschenButtonComponent', () => { await TestBed.configureTestingModule({ declarations: [ EndgueltigLoeschenButtonComponent, - MockComponent(ButtonWithSpinnerComponent), + MockComponent(OzgcloudStrokedButtonWithSpinnerComponent), MockComponent(IconButtonWithSpinnerComponent), ], }).compileComponents(); diff --git a/goofy-client/libs/loesch-anforderung/src/lib/loesch-anforderung-zuruecknehmen-button-container/loesch-anforderung-zuruecknehmen-button/loesch-anforderung-zuruecknehmen-button.component.html b/goofy-client/libs/loesch-anforderung/src/lib/loesch-anforderung-zuruecknehmen-button-container/loesch-anforderung-zuruecknehmen-button/loesch-anforderung-zuruecknehmen-button.component.html index 33a07bc62b70a6e9d6b33ffee3b01522e17f7781..e86a6fc480c561d25f3da54a8f355fa1d30b390d 100644 --- a/goofy-client/libs/loesch-anforderung/src/lib/loesch-anforderung-zuruecknehmen-button-container/loesch-anforderung-zuruecknehmen-button/loesch-anforderung-zuruecknehmen-button.component.html +++ b/goofy-client/libs/loesch-anforderung/src/lib/loesch-anforderung-zuruecknehmen-button-container/loesch-anforderung-zuruecknehmen-button/loesch-anforderung-zuruecknehmen-button.component.html @@ -1,9 +1,9 @@ -<goofy-client-button-with-spinner *ngIf="!showAsIconButton" data-test-id="loesch-anforderung-zuruecknehmen-button" +<goofy-client-ozgcloud-stroked-button-with-spinner *ngIf="!showAsIconButton" data-test-id="loesch-anforderung-zuruecknehmen-button" text="Löschanforderung zurücknehmen" svgIcon="undo_request_deletion" [stateResource]="loeschAnforderungZuruecknehmenCommand" (clickEmitter)="loeschAnforderungZuruecknehmen.emit()"> -</goofy-client-button-with-spinner> +</goofy-client-ozgcloud-stroked-button-with-spinner> <goofy-client-icon-button-with-spinner *ngIf="showAsIconButton" data-test-id="loesch-anforderung-zuruecknehmen-icon-button" svgIcon="undo_request_deletion" diff --git a/goofy-client/libs/loesch-anforderung/src/lib/loesch-anforderung-zuruecknehmen-button-container/loesch-anforderung-zuruecknehmen-button/loesch-anforderung-zuruecknehmen-button.component.spec.ts b/goofy-client/libs/loesch-anforderung/src/lib/loesch-anforderung-zuruecknehmen-button-container/loesch-anforderung-zuruecknehmen-button/loesch-anforderung-zuruecknehmen-button.component.spec.ts index 25848eea2f1e5f9352d44e2f86f8a5d429fa78d6..ed8f7789e886ec1bba7f717157eeb13357716f35 100644 --- a/goofy-client/libs/loesch-anforderung/src/lib/loesch-anforderung-zuruecknehmen-button-container/loesch-anforderung-zuruecknehmen-button/loesch-anforderung-zuruecknehmen-button.component.spec.ts +++ b/goofy-client/libs/loesch-anforderung/src/lib/loesch-anforderung-zuruecknehmen-button-container/loesch-anforderung-zuruecknehmen-button/loesch-anforderung-zuruecknehmen-button.component.spec.ts @@ -1,6 +1,6 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { existsAsHtmlElement, notExistsAsHtmlElement } from '@goofy-client/test-utils'; -import { ButtonWithSpinnerComponent, IconButtonWithSpinnerComponent } from "@goofy-client/ui"; +import { IconButtonWithSpinnerComponent, OzgcloudStrokedButtonWithSpinnerComponent } from "@goofy-client/ui"; import { getDataTestIdOf } from 'libs/tech-shared/test/data-test'; import { MockComponent } from "ng-mocks"; import { LoeschAnforderungZuruecknehmenButtonComponent } from './loesch-anforderung-zuruecknehmen-button.component'; @@ -16,7 +16,7 @@ describe('LoeschAnforderungZuruecknehmenButtonComponent', () => { await TestBed.configureTestingModule({ declarations: [ LoeschAnforderungZuruecknehmenButtonComponent, - MockComponent(ButtonWithSpinnerComponent), + MockComponent(OzgcloudStrokedButtonWithSpinnerComponent), MockComponent(IconButtonWithSpinnerComponent) ], }).compileComponents(); diff --git a/goofy-client/libs/loesch-anforderung/src/lib/loeschen-anfordern-button-container/loeschen-anfordern-button/loeschen-anfordern-button.component.html b/goofy-client/libs/loesch-anforderung/src/lib/loeschen-anfordern-button-container/loeschen-anfordern-button/loeschen-anfordern-button.component.html index f6c58ef5bb01f4cc43aa7975321aeafd3fb65cfd..4767b59813e839e0d89f567e855d0acfece06ab3 100644 --- a/goofy-client/libs/loesch-anforderung/src/lib/loeschen-anfordern-button-container/loeschen-anfordern-button/loeschen-anfordern-button.component.html +++ b/goofy-client/libs/loesch-anforderung/src/lib/loeschen-anfordern-button-container/loeschen-anfordern-button/loeschen-anfordern-button.component.html @@ -1,9 +1,9 @@ -<goofy-client-button-with-spinner *ngIf="!showAsIconButton" data-test-id="loeschen-anfordern-button" +<goofy-client-ozgcloud-stroked-button-with-spinner *ngIf="!showAsIconButton" data-test-id="loeschen-anfordern-button" text="Löschen anfordern" svgIcon="request_deletion" [stateResource]="loeschenAnfordernCommand" (clickEmitter)="loeschenAnfordern.emit()"> -</goofy-client-button-with-spinner> +</goofy-client-ozgcloud-stroked-button-with-spinner> <goofy-client-icon-button-with-spinner *ngIf="showAsIconButton" data-test-id="loeschen-anfordern-icon-button" svgIcon="request_deletion" diff --git a/goofy-client/libs/loesch-anforderung/src/lib/loeschen-anfordern-button-container/loeschen-anfordern-button/loeschen-anfordern-button.component.spec.ts b/goofy-client/libs/loesch-anforderung/src/lib/loeschen-anfordern-button-container/loeschen-anfordern-button/loeschen-anfordern-button.component.spec.ts index c6595a5af788eb834fcc086892ac57dc4c84ee93..f139b0053be740522548f15dfb0838a24393178a 100644 --- a/goofy-client/libs/loesch-anforderung/src/lib/loeschen-anfordern-button-container/loeschen-anfordern-button/loeschen-anfordern-button.component.spec.ts +++ b/goofy-client/libs/loesch-anforderung/src/lib/loeschen-anfordern-button-container/loeschen-anfordern-button/loeschen-anfordern-button.component.spec.ts @@ -1,6 +1,6 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { existsAsHtmlElement, notExistsAsHtmlElement } from '@goofy-client/test-utils'; -import { ButtonWithSpinnerComponent, IconButtonWithSpinnerComponent } from '@goofy-client/ui'; +import { IconButtonWithSpinnerComponent, OzgcloudStrokedButtonWithSpinnerComponent } from '@goofy-client/ui'; import { getDataTestIdOf } from 'libs/tech-shared/test/data-test'; import { MockComponent } from 'ng-mocks'; import { LoeschenAnfordernButtonComponent } from './loeschen-anfordern-button.component'; @@ -16,7 +16,7 @@ describe('LoeschenAnfordernButtonComponent', () => { await TestBed.configureTestingModule({ declarations: [ LoeschenAnfordernButtonComponent, - MockComponent(ButtonWithSpinnerComponent), + MockComponent(OzgcloudStrokedButtonWithSpinnerComponent), MockComponent(IconButtonWithSpinnerComponent) ], }).compileComponents(); diff --git a/goofy-client/libs/navigation/src/lib/build-info/build-info.component.scss b/goofy-client/libs/navigation/src/lib/build-info/build-info.component.scss index 317e2628d4eec056d13bb3ba295c674fc2be3a9f..687bf9dc28611fe0de820edacad151dcd45114db 100644 --- a/goofy-client/libs/navigation/src/lib/build-info/build-info.component.scss +++ b/goofy-client/libs/navigation/src/lib/build-info/build-info.component.scss @@ -44,7 +44,6 @@ p { margin: 0; line-height: 1; white-space: nowrap; - font-family: 'Roboto'; font-style: normal; font-weight: 400; font-size: 11px; diff --git a/goofy-client/libs/postfach-shared/src/lib/postfach.service.spec.ts b/goofy-client/libs/postfach-shared/src/lib/postfach.service.spec.ts index bafe872b1286d449e3aa25dd975ecf10de3844f3..a98a4a59f08fe716da57b3d1a85936d65f33e39e 100644 --- a/goofy-client/libs/postfach-shared/src/lib/postfach.service.spec.ts +++ b/goofy-client/libs/postfach-shared/src/lib/postfach.service.spec.ts @@ -21,7 +21,7 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; +import { MatDialog } from '@angular/material/dialog'; import { BinaryFileListResource, BinaryFileResource, BinaryFileService } from '@goofy-client/binary-file-shared'; import { CommandResource, CommandService } from '@goofy-client/command-shared'; import { NavigationService } from '@goofy-client/navigation-shared'; diff --git a/goofy-client/libs/postfach-shared/src/lib/postfach.service.ts b/goofy-client/libs/postfach-shared/src/lib/postfach.service.ts index 7cfc91a73b65219abd2c903cc3d7cfcac732b6b4..a14adf982120e4dc574b566801cd47ed49efdc40 100644 --- a/goofy-client/libs/postfach-shared/src/lib/postfach.service.ts +++ b/goofy-client/libs/postfach-shared/src/lib/postfach.service.ts @@ -22,7 +22,7 @@ * unter der Lizenz sind dem Lizenztext zu entnehmen. */ import { Injectable } from '@angular/core'; -import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; +import { MatDialog } from '@angular/material/dialog'; import { Params } from '@angular/router'; import { BinaryFileListResource, BinaryFileResource, BinaryFileService, getBinaryFiles } from '@goofy-client/binary-file-shared'; import { CommandResource, CommandService, doIfCommandIsDone, hasError, isDone, isPending } from '@goofy-client/command-shared'; diff --git a/goofy-client/libs/postfach/src/lib/postfach-mail-button-container/postfach-mail-button-container.component.ts b/goofy-client/libs/postfach/src/lib/postfach-mail-button-container/postfach-mail-button-container.component.ts index dea79c0f8bbe455801a4328e9324e9884d150b44..b55cb1f2c78959116a5b569d0b3c4f265e2f17d2 100644 --- a/goofy-client/libs/postfach/src/lib/postfach-mail-button-container/postfach-mail-button-container.component.ts +++ b/goofy-client/libs/postfach/src/lib/postfach-mail-button-container/postfach-mail-button-container.component.ts @@ -22,7 +22,7 @@ * unter der Lizenz sind dem Lizenztext zu entnehmen. */ import { Component, Input } from '@angular/core'; -import { MatLegacyDialogRef as MatDialogRef } from '@angular/material/legacy-dialog'; +import { MatDialogRef } from '@angular/material/dialog'; import { CommandResource } from '@goofy-client/command-shared'; import { PostfachMailFormDialogData, PostfachMailListLinkRel, PostfachMailListResource, PostfachService } from '@goofy-client/postfach-shared'; import { EMPTY_STRING, StateResource, hasError, isNotNull, isNotUndefined } from '@goofy-client/tech-shared'; diff --git a/goofy-client/libs/postfach/src/lib/postfach-mail-button-container/postfach-mail-button/postfach-mail-button.component.html b/goofy-client/libs/postfach/src/lib/postfach-mail-button-container/postfach-mail-button/postfach-mail-button.component.html index 84e14cd1b588e750854fdb3b97619b0b357c980a..b1e55799273c56e2e560264a4e22f8368aec38b2 100644 --- a/goofy-client/libs/postfach/src/lib/postfach-mail-button-container/postfach-mail-button/postfach-mail-button.component.html +++ b/goofy-client/libs/postfach/src/lib/postfach-mail-button-container/postfach-mail-button/postfach-mail-button.component.html @@ -25,21 +25,21 @@ --> <ng-container *ngIf="postfachMailListStateResource.resource | hasLink: postfachMailListLinkRel.SEND_POSTFACH_MAIL"> <!-- TODO Aufteilen in 3 einzelne Komponenten --> - <goofy-client-button-with-spinner *ngIf="!showAsIconButton && text && !toolTip" data-test-id="create-mail-button-with-text" + <goofy-client-ozgcloud-stroked-button-with-spinner *ngIf="!showAsIconButton && text && !toolTip" data-test-id="create-mail-button-with-text" [showSpinner]="pendingSendPostfachMailCommand.resource | hasLink: commandLinkRel.UPDATE" class="create-button" [text]="text" icon="add" (clickEmitter)="openPostfachNachrichtenDialog.emit()"> - </goofy-client-button-with-spinner> + </goofy-client-ozgcloud-stroked-button-with-spinner> - <goofy-client-button-with-spinner *ngIf="!showAsIconButton && !text && toolTip" data-test-id="create-mail-button-without-text" + <goofy-client-ozgcloud-stroked-button-with-spinner *ngIf="!showAsIconButton && !text && toolTip" data-test-id="create-mail-button-without-text" [showSpinner]="pendingSendPostfachMailCommand.resource | hasLink: commandLinkRel.UPDATE" class="create-button" [toolTip]="toolTip" icon="add" (clickEmitter)="openPostfachNachrichtenDialog.emit()"> - </goofy-client-button-with-spinner> + </goofy-client-ozgcloud-stroked-button-with-spinner> <goofy-client-icon-button-with-spinner *ngIf="showAsIconButton" data-test-id="send-mail-icon-button" [showSpinner]="pendingSendPostfachMailCommand.resource | hasLink: commandLinkRel.UPDATE" diff --git a/goofy-client/libs/postfach/src/lib/postfach-mail-button-container/postfach-mail-button/postfach-mail-button.component.spec.ts b/goofy-client/libs/postfach/src/lib/postfach-mail-button-container/postfach-mail-button/postfach-mail-button.component.spec.ts index b55c1d860e8d2b65428dfcd45266fbfc1e08da89..033bd924713286de94e6c4cd9affcb8e0aeac5c9 100644 --- a/goofy-client/libs/postfach/src/lib/postfach-mail-button-container/postfach-mail-button/postfach-mail-button.component.spec.ts +++ b/goofy-client/libs/postfach/src/lib/postfach-mail-button-container/postfach-mail-button/postfach-mail-button.component.spec.ts @@ -24,8 +24,8 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import faker from '@faker-js/faker'; import { PostfachMailListLinkRel } from '@goofy-client/postfach-shared'; -import { createStateResource, EMPTY_STRING, HasLinkPipe } from '@goofy-client/tech-shared'; -import { ButtonWithSpinnerComponent, IconButtonWithSpinnerComponent } from '@goofy-client/ui'; +import { EMPTY_STRING, HasLinkPipe, createStateResource } from '@goofy-client/tech-shared'; +import { IconButtonWithSpinnerComponent, OzgcloudStrokedButtonWithSpinnerComponent } from '@goofy-client/ui'; import { createCommandResource } from 'libs/command-shared/test/command'; import { createPostfachMailListResource } from 'libs/postfach-shared/test/postfach'; import { getDataTestIdOf } from 'libs/tech-shared/test/data-test'; @@ -46,7 +46,7 @@ describe('PostfachMailButtonComponent', () => { PostfachMailButtonComponent, HasLinkPipe, MockComponent(IconButtonWithSpinnerComponent), - MockComponent(ButtonWithSpinnerComponent), + MockComponent(OzgcloudStrokedButtonWithSpinnerComponent), ] }) .compileComponents(); diff --git a/goofy-client/libs/postfach/src/lib/postfach-mail-form/postfach-mail-form.component.html b/goofy-client/libs/postfach/src/lib/postfach-mail-form/postfach-mail-form.component.html index 636a5d34e1b01d91565ec32ee766d0e04ba0a642..ec3434bb2bc14910a541a93be5887486e6d864fb 100644 --- a/goofy-client/libs/postfach/src/lib/postfach-mail-form/postfach-mail-form.component.html +++ b/goofy-client/libs/postfach/src/lib/postfach-mail-form/postfach-mail-form.component.html @@ -32,12 +32,10 @@ <goofy-client-text-editor [formControlName]="formServiceClass.FIELD_SUBJECT" label="Betreff" - appearance="standard" [autoFocus]="true"> </goofy-client-text-editor> <goofy-client-textarea-editor [formControlName]="formServiceClass.FIELD_MAIL_BODY" label="Text" - appearance="standard" class="message-editor"> </goofy-client-textarea-editor> @@ -45,13 +43,13 @@ <div class="button-bar-bottom"> - <goofy-client-button-with-spinner data-test-id="postfach-send-button" + <goofy-client-ozgcloud-stroked-button-with-spinner data-test-id="postfach-send-button" [stateResource]="sendInProgress$ | async" text="Senden" icon="send" type="submit" class="submit-button"> - </goofy-client-button-with-spinner> + </goofy-client-ozgcloud-stroked-button-with-spinner> <goofy-client-postfach-nachricht-reply-editor-container></goofy-client-postfach-nachricht-reply-editor-container> </div> diff --git a/goofy-client/libs/postfach/src/lib/postfach-mail-form/postfach-mail-form.component.scss b/goofy-client/libs/postfach/src/lib/postfach-mail-form/postfach-mail-form.component.scss index a9ec23d3f18172195186485e81bb750479bba547..25ec89ce44ffff5a7b2f080631c7b5c58e35c201 100644 --- a/goofy-client/libs/postfach/src/lib/postfach-mail-form/postfach-mail-form.component.scss +++ b/goofy-client/libs/postfach/src/lib/postfach-mail-form/postfach-mail-form.component.scss @@ -23,7 +23,7 @@ */ :host { ::ng-deep { - .mat-form-field { + .mat-mdc-form-field { width: 100%; } diff --git a/goofy-client/libs/postfach/src/lib/postfach-mail-form/postfach-mail-form.component.spec.ts b/goofy-client/libs/postfach/src/lib/postfach-mail-form/postfach-mail-form.component.spec.ts index 5320509b21a57d8bdc21032189e39a582a0ee1a8..3f4215bed55617aa91c38bdf0b9994c522162eec 100644 --- a/goofy-client/libs/postfach/src/lib/postfach-mail-form/postfach-mail-form.component.spec.ts +++ b/goofy-client/libs/postfach/src/lib/postfach-mail-form/postfach-mail-form.component.spec.ts @@ -23,14 +23,14 @@ */ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { FormBuilder, ReactiveFormsModule } from '@angular/forms'; -import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog'; -import { MatLegacyFormFieldModule as MatFormFieldModule } from '@angular/material/legacy-form-field'; -import { MatLegacyInputModule as MatInputModule } from '@angular/material/legacy-input'; +import { MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { PostfachService } from '@goofy-client/postfach-shared'; import { createStateResource } from '@goofy-client/tech-shared'; import { Mock, mock, useFromMock } from '@goofy-client/test-utils'; -import { ButtonWithSpinnerComponent, DialogService, FileUploadComponent, IconButtonWithSpinnerComponent, SpinnerComponent, TextAreaEditorComponent, TextEditorComponent } from '@goofy-client/ui'; +import { DialogService, FileUploadComponent, IconButtonWithSpinnerComponent, OzgcloudStrokedButtonWithSpinnerComponent, SpinnerComponent, TextAreaEditorComponent, TextEditorComponent } from '@goofy-client/ui'; import { createCommandResource } from 'libs/command-shared/test/command'; import { PostfachTestFactory } from 'libs/postfach-shared/test/postfach'; import { MockComponent } from 'ng-mocks'; @@ -57,7 +57,7 @@ describe('PostfachMailFormComponent', () => { MockComponent(TextAreaEditorComponent), MockComponent(TextEditorComponent), MockComponent(IconButtonWithSpinnerComponent), - MockComponent(ButtonWithSpinnerComponent), + MockComponent(OzgcloudStrokedButtonWithSpinnerComponent), MockComponent(PostfachNachrichtReplyEditorContainerComponent), MockComponent(SpinnerComponent), MockComponent(FileUploadComponent), diff --git a/goofy-client/libs/postfach/src/lib/postfach-mail-form/postfach-mail-form.component.ts b/goofy-client/libs/postfach/src/lib/postfach-mail-form/postfach-mail-form.component.ts index 4e99f5ee6d450b86448f33eadd0f45d18f35b97a..11923dac26a3444ef8059ea06d534f68844e716a 100644 --- a/goofy-client/libs/postfach/src/lib/postfach-mail-form/postfach-mail-form.component.ts +++ b/goofy-client/libs/postfach/src/lib/postfach-mail-form/postfach-mail-form.component.ts @@ -22,7 +22,7 @@ * unter der Lizenz sind dem Lizenztext zu entnehmen. */ import { Component, Inject, OnInit } from '@angular/core'; -import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog'; +import { MAT_DIALOG_DATA } from '@angular/material/dialog'; import { CommandResource } from '@goofy-client/command-shared'; import { StateResource, createEmptyStateResource, isNotNil } from '@goofy-client/tech-shared'; import { DialogService } from '@goofy-client/ui'; diff --git a/goofy-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/outgoing-mail-error-container/outgoing-mail-error/outgoing-mail-error.component.html b/goofy-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/outgoing-mail-error-container/outgoing-mail-error/outgoing-mail-error.component.html index f573d5f2456df379063119c16a4076896cd016b2..64c04c0b8b447910c81fc1082cbc67dccb19d106 100644 --- a/goofy-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/outgoing-mail-error-container/outgoing-mail-error/outgoing-mail-error.component.html +++ b/goofy-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/outgoing-mail-error-container/outgoing-mail-error/outgoing-mail-error.component.html @@ -28,10 +28,10 @@ <mat-icon data-test-id="mail-send-error-icon" class="mail-send-error__icon mat-icon-error">error_outline_white</mat-icon> </div> <!-- TODO Eigene Component fuer den Button --> -<goofy-client-button-with-spinner dataTestId="mail-resend-button" +<goofy-client-ozgcloud-stroked-button-with-spinner dataTestId="mail-resend-button" text="Erneut versuchen" icon="autorenew" [stateResource]="resendPostfachMailStateResource" (clickEmitter)="resend.emit()"> -</goofy-client-button-with-spinner> +</goofy-client-ozgcloud-stroked-button-with-spinner> <!-- --> \ No newline at end of file diff --git a/goofy-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/outgoing-mail-error-container/outgoing-mail-error/outgoing-mail-error.component.scss b/goofy-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/outgoing-mail-error-container/outgoing-mail-error/outgoing-mail-error.component.scss index a5fdc7e01c439d5199552b3741dca3043c0acc35..5e77efb9e5f2528ab35709ee7213281e83175a9c 100644 --- a/goofy-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/outgoing-mail-error-container/outgoing-mail-error/outgoing-mail-error.component.scss +++ b/goofy-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/outgoing-mail-error-container/outgoing-mail-error/outgoing-mail-error.component.scss @@ -23,7 +23,7 @@ */ @use 'sass:map'; @use '@angular/material' as mat; -@import "variables"; +@import 'variables'; .mat-icon-error{ color: mat.get-color-from-palette($warnPalette); @@ -45,7 +45,7 @@ } } -goofy-client-button-with-spinner { +goofy-client-ozgcloud-stroked-button-with-spinner { display: block; margin-bottom: 8px; } diff --git a/goofy-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/outgoing-mail-error-container/outgoing-mail-error/outgoing-mail-error.component.spec.ts b/goofy-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/outgoing-mail-error-container/outgoing-mail-error/outgoing-mail-error.component.spec.ts index f173ea1c77e2ce38ed63a50e59bbb01a05f56548..60fe72a8a08fef78af27e6238209705c9614a526 100644 --- a/goofy-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/outgoing-mail-error-container/outgoing-mail-error/outgoing-mail-error.component.spec.ts +++ b/goofy-client/libs/postfach/src/lib/postfach-mail-list-container/postfach-mail-list/postfach-mail/outgoing-mail/outgoing-mail-error-container/outgoing-mail-error/outgoing-mail-error.component.spec.ts @@ -24,7 +24,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { MatIcon } from '@angular/material/icon'; import { notExistsAsHtmlElement } from '@goofy-client/test-utils'; -import { ButtonWithSpinnerComponent } from '@goofy-client/ui'; +import { OzgcloudStrokedButtonWithSpinnerComponent } from '@goofy-client/ui'; import { createPostfachMailResource } from 'libs/postfach-shared/test/postfach'; import { getDataTestIdOf } from 'libs/tech-shared/test/data-test'; import { MockComponent } from 'ng-mocks'; @@ -41,7 +41,7 @@ describe('OutgoingMailFailedComponent', () => { declarations: [ OutgoingMailErrorComponent, MatIcon, - MockComponent(ButtonWithSpinnerComponent) + MockComponent(OzgcloudStrokedButtonWithSpinnerComponent) ] }).compileComponents(); }); diff --git a/goofy-client/libs/postfach/src/lib/postfach-mail-pdf-button-container/postfach-mail-pdf-button-container.component.spec.ts b/goofy-client/libs/postfach/src/lib/postfach-mail-pdf-button-container/postfach-mail-pdf-button-container.component.spec.ts index 479dd98c8e96f038838fb93069c372cf52057e0d..8e334cbf884c8cd94bca3731cbf69a032d5823c1 100644 --- a/goofy-client/libs/postfach/src/lib/postfach-mail-pdf-button-container/postfach-mail-pdf-button-container.component.spec.ts +++ b/goofy-client/libs/postfach/src/lib/postfach-mail-pdf-button-container/postfach-mail-pdf-button-container.component.spec.ts @@ -24,7 +24,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { PostfachService } from '@goofy-client/postfach-shared'; import { Mock, mock } from '@goofy-client/test-utils'; -import { ButtonWithSpinnerComponent } from '@goofy-client/ui'; +import { OzgcloudStrokedButtonWithSpinnerComponent } from '@goofy-client/ui'; import { MockComponent } from 'ng-mocks'; import { PostfachMailPdfButtonContainerComponent } from './postfach-mail-pdf-button-container.component'; import { PostfachMailPdfButtonComponent } from './postfach-mail-pdf-button/postfach-mail-pdf-button.component'; @@ -39,7 +39,7 @@ describe('PostfachMailPdfButtonContainerComponent', () => { await TestBed.configureTestingModule({ declarations: [ PostfachMailPdfButtonContainerComponent, - MockComponent(ButtonWithSpinnerComponent), + MockComponent(OzgcloudStrokedButtonWithSpinnerComponent), MockComponent(PostfachMailPdfButtonComponent) ], providers: [ diff --git a/goofy-client/libs/postfach/src/lib/postfach-mail-pdf-button-container/postfach-mail-pdf-button/postfach-mail-pdf-button.component.html b/goofy-client/libs/postfach/src/lib/postfach-mail-pdf-button-container/postfach-mail-pdf-button/postfach-mail-pdf-button.component.html index afbdc29b6f0a120553cd44fb3dff73ec3f7fdd8c..95c943ae410eba1c497ccbbe48928e71bbf12625 100644 --- a/goofy-client/libs/postfach/src/lib/postfach-mail-pdf-button-container/postfach-mail-pdf-button/postfach-mail-pdf-button.component.html +++ b/goofy-client/libs/postfach/src/lib/postfach-mail-pdf-button-container/postfach-mail-pdf-button/postfach-mail-pdf-button.component.html @@ -26,20 +26,20 @@ <ng-container *ngIf="postfachMailCount != postfachNachrichtenCount.NONE"> <ng-container *ngIf="showButtonWithLabel; else showButton"> - <goofy-client-button-with-spinner data-test-id="postfach-pdf-export-button" + <goofy-client-ozgcloud-stroked-button-with-spinner data-test-id="postfach-pdf-export-button" [showSpinner]="isDownloadInProgress" svgIcon="pdf_export" [text]="label" [toolTip]="label" (clickEmitter)="downloadPdf.emit()"> - </goofy-client-button-with-spinner> + </goofy-client-ozgcloud-stroked-button-with-spinner> </ng-container> <ng-template #showButton> - <goofy-client-button-with-spinner data-test-id="postfach-pdf-export-label-button" + <goofy-client-ozgcloud-stroked-button-with-spinner data-test-id="postfach-pdf-export-label-button" [showSpinner]="isDownloadInProgress" svgIcon="pdf_export" [toolTip]="label" (clickEmitter)="downloadPdf.emit()"> - </goofy-client-button-with-spinner> + </goofy-client-ozgcloud-stroked-button-with-spinner> </ng-template> </ng-container> \ No newline at end of file diff --git a/goofy-client/libs/postfach/src/lib/postfach-mail-pdf-button-container/postfach-mail-pdf-button/postfach-mail-pdf-button.component.spec.ts b/goofy-client/libs/postfach/src/lib/postfach-mail-pdf-button-container/postfach-mail-pdf-button/postfach-mail-pdf-button.component.spec.ts index 8281d08bb6d42b33628fc92a3d7643ea837aaa1c..0971228de535e7ab58714f4daa02fd49fd842c5a 100644 --- a/goofy-client/libs/postfach/src/lib/postfach-mail-pdf-button-container/postfach-mail-pdf-button/postfach-mail-pdf-button.component.spec.ts +++ b/goofy-client/libs/postfach/src/lib/postfach-mail-pdf-button-container/postfach-mail-pdf-button/postfach-mail-pdf-button.component.spec.ts @@ -24,7 +24,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { PostfachMailListResource, PostfachNachrichtenCount } from '@goofy-client/postfach-shared'; import { getElementFromFixture } from '@goofy-client/test-utils'; -import { ButtonWithSpinnerComponent } from '@goofy-client/ui'; +import { OzgcloudStrokedButtonWithSpinnerComponent } from '@goofy-client/ui'; import { createPostfachMailListResource } from 'libs/postfach-shared/test/postfach'; import { getDataTestIdOf } from 'libs/tech-shared/test/data-test'; import { MockComponent } from 'ng-mocks'; @@ -41,7 +41,7 @@ describe('PostfachMailPdfButtonComponent', () => { await TestBed.configureTestingModule({ declarations: [ PostfachMailPdfButtonComponent, - MockComponent(ButtonWithSpinnerComponent) + MockComponent(OzgcloudStrokedButtonWithSpinnerComponent) ], }).compileComponents(); diff --git a/goofy-client/libs/tech-shared/src/lib/tech.util.ts b/goofy-client/libs/tech-shared/src/lib/tech.util.ts index 49578dea0312b3342430c049d875ce6f772a0a70..1e77223d9318e59bb225991cf7a5d0bcdcfb969f 100644 --- a/goofy-client/libs/tech-shared/src/lib/tech.util.ts +++ b/goofy-client/libs/tech-shared/src/lib/tech.util.ts @@ -39,14 +39,6 @@ export function isEmptyObject(obj: any): boolean { return Object.keys(obj).length === 0; } -export function replaceAllWhitespaces(value: string, replaceWith: string) { - return value.replace(/ /g, replaceWith); -} - -export function simpleTransliteration(value: string) { - return value.normalize('NFKD').replace(/[^-_\w]/g, ''); -} - export function replacePlaceholders(text: string, placeholders: { [key: string]: string }): string { let replaced = text; Object.keys(placeholders).forEach(key => replaced = replacePlaceholder(replaced, key, placeholders[key])); @@ -96,6 +88,14 @@ export function convertForDataTest(value: string): string { return simpleTransliteration(value); } +export function replaceAllWhitespaces(value: string, replaceWith: string) { + return value.replace(/ /g, replaceWith); +} + +export function simpleTransliteration(value: string) { + return value.normalize('NFKD').replace(/[^-A-Za-z0-9_]/g, ''); +} + export function getStringValue(value: null | undefined | string): string { if (isNil(value)) { return EMPTY_STRING; diff --git a/goofy-client/libs/test-utils/src/lib/mocking.ts b/goofy-client/libs/test-utils/src/lib/mocking.ts index e0f99e200bc81fb4bc7c73dc7c7d7e7ad33765f8..141db74e40b6275c057e8889b718015448889e6c 100644 --- a/goofy-client/libs/test-utils/src/lib/mocking.ts +++ b/goofy-client/libs/test-utils/src/lib/mocking.ts @@ -56,5 +56,5 @@ export function mockComponent(options: Component): Component { } export function mockClass(clazz: any): Mock<any> { - return clazz as jest.Mocked<typeof clazz>; + return clazz as jest.Mocked<typeof clazz>; //NOSONAR } \ No newline at end of file diff --git a/goofy-client/libs/ui/src/index.ts b/goofy-client/libs/ui/src/index.ts index c71a4a86355e23eaaceb1a04a313d60753e4e620..afb85c472f1aa40c64d4d961389a8d8d649a6f0e 100644 --- a/goofy-client/libs/ui/src/index.ts +++ b/goofy-client/libs/ui/src/index.ts @@ -29,7 +29,6 @@ export * from './lib/ui/accordion/accordion.component'; export * from './lib/ui/back-button/back-button.component'; export * from './lib/ui/basic-dialog/basic-dialog-data.model'; export * from './lib/ui/basic-dialog/basic-dialog.component'; -export * from './lib/ui/button-with-spinner/button-with-spinner.component'; export * from './lib/ui/dialog/dialog.service'; export * from './lib/ui/download-button/download-button.component'; export * from './lib/ui/editor/autocomplete-editor/autocomplete-editor.component'; @@ -43,9 +42,12 @@ export * from './lib/ui/file-upload/file-upload.component'; export * from './lib/ui/fixed-dialog/fixed-dialog-data.model'; export * from './lib/ui/fixed-dialog/fixed-dialog.component'; export * from './lib/ui/icon-button-with-spinner/icon-button-with-spinner.component'; +export * from './lib/ui/mattooltip/mattooltip.directive'; export * from './lib/ui/menu-item/menu-item.component'; export * from './lib/ui/messages'; export * from './lib/ui/open-url-button/open-url-button.component'; +export * from './lib/ui/ozgcloud-button/ozgcloud-button-with-spinner/ozgcloud-button-with-spinner.component'; +export * from './lib/ui/ozgcloud-button/ozgcloud-stroked-button-with-spinner/ozgcloud-stroked-button-with-spinner.component'; export * from './lib/ui/ozgcloud-icon/ozgcloud-icon.component'; export * from './lib/ui/ozgcloud-menu/ozgcloud-menu.component'; export * from './lib/ui/ozgcloud-routing-button/ozgcloud-routing-button.component'; diff --git a/goofy-client/libs/ui/src/lib/font/_font_roboto_mono.scss b/goofy-client/libs/ui/src/lib/font/_font_roboto_mono.scss deleted file mode 100644 index caf9e3873da561c3147f006e9a718c921c9086fd..0000000000000000000000000000000000000000 --- a/goofy-client/libs/ui/src/lib/font/_font_roboto_mono.scss +++ /dev/null @@ -1,24 +0,0 @@ -/* roboto-mono-regular - latin */ -@font-face { - font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ - font-family: 'Roboto Mono'; - font-style: normal; - font-weight: 400; - src: url('../fonts/roboto-mono-v22-latin-regular.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ -} -/* roboto-mono-500 - latin */ -@font-face { - font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ - font-family: 'Roboto Mono'; - font-style: normal; - font-weight: 500; - src: url('../fonts/roboto-mono-v22-latin-500.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ -} -/* roboto-mono-700 - latin */ -@font-face { - font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */ - font-family: 'Roboto Mono'; - font-style: normal; - font-weight: 700; - src: url('../fonts/roboto-mono-v22-latin-700.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ -} \ No newline at end of file diff --git a/goofy-client/libs/ui/src/lib/font/roboto-mono-v22-latin-500.woff2 b/goofy-client/libs/ui/src/lib/font/roboto-mono-v22-latin-500.woff2 deleted file mode 100644 index b4f2bf8c22481b36ce7f9079d40155fa0e31ff42..0000000000000000000000000000000000000000 Binary files a/goofy-client/libs/ui/src/lib/font/roboto-mono-v22-latin-500.woff2 and /dev/null differ diff --git a/goofy-client/libs/ui/src/lib/font/roboto-mono-v22-latin-700.woff2 b/goofy-client/libs/ui/src/lib/font/roboto-mono-v22-latin-700.woff2 deleted file mode 100644 index d7170daca1a38b071f13c03f47611f92bb8e0e1a..0000000000000000000000000000000000000000 Binary files a/goofy-client/libs/ui/src/lib/font/roboto-mono-v22-latin-700.woff2 and /dev/null differ diff --git a/goofy-client/libs/ui/src/lib/font/roboto-mono-v22-latin-regular.woff2 b/goofy-client/libs/ui/src/lib/font/roboto-mono-v22-latin-regular.woff2 deleted file mode 100644 index f8894bab50f641e86f695e85830a74dd395732fa..0000000000000000000000000000000000000000 Binary files a/goofy-client/libs/ui/src/lib/font/roboto-mono-v22-latin-regular.woff2 and /dev/null differ diff --git a/goofy-client/libs/ui/src/lib/interceptor/http-error.interceptor.spec.ts b/goofy-client/libs/ui/src/lib/interceptor/http-error.interceptor.spec.ts index fc049d3db60f4e84b03264d0ff2415321732319b..1e03485dba5b4b3bcfcfa3bc2a146b84b87f530b 100644 --- a/goofy-client/libs/ui/src/lib/interceptor/http-error.interceptor.spec.ts +++ b/goofy-client/libs/ui/src/lib/interceptor/http-error.interceptor.spec.ts @@ -23,7 +23,7 @@ */ import { HttpErrorResponse, HttpRequest, HttpStatusCode } from '@angular/common/http'; import { TestBed } from '@angular/core/testing'; -import { MatLegacyDialogModule as MatDialogModule } from '@angular/material/legacy-dialog'; +import { MatDialogModule } from '@angular/material/dialog'; import { AuthService } from '@goofy-client/app-shared'; import { HttpErrorHandler } from '@goofy-client/tech-shared'; import { Mock, mock } from '@goofy-client/test-utils'; diff --git a/goofy-client/libs/ui/src/lib/interceptor/http-error.interceptor.ts b/goofy-client/libs/ui/src/lib/interceptor/http-error.interceptor.ts index eb26cc4472beb1b40dceff08cb194afbf8a49e26..b6fe858de0d5cdb32f2ad38c410c70db04855fbc 100644 --- a/goofy-client/libs/ui/src/lib/interceptor/http-error.interceptor.ts +++ b/goofy-client/libs/ui/src/lib/interceptor/http-error.interceptor.ts @@ -25,11 +25,9 @@ import { HttpErrorResponse, HttpEvent, HttpHandler, HttpInterceptor, HttpRequest import { Injectable } from '@angular/core'; import { AuthService } from '@goofy-client/app-shared'; import { ApiError, HttpErrorHandler, isForbidden, isServerError, isUnauthorized } from '@goofy-client/tech-shared'; -import { SnackBarService } from '@goofy-client/ui'; +import { DialogService, Messages, SnackBarService } from 'libs/ui/src'; import { EMPTY, Observable, throwError } from 'rxjs'; import { catchError, finalize } from 'rxjs/operators'; -import { DialogService } from '../ui/dialog/dialog.service'; -import { Messages } from '../ui/messages'; @Injectable() export class HttpErrorInterceptor implements HttpInterceptor { diff --git a/goofy-client/libs/ui/src/lib/snackbar/snackbar-close-button/snackbar-close-button.component.scss b/goofy-client/libs/ui/src/lib/snackbar/snackbar-close-button/snackbar-close-button.component.scss index 79197ab3d868efeebf12c71845bf53ff79b523ee..9a97723219a6d633dc7bba4c8cfc0531941fd209 100644 --- a/goofy-client/libs/ui/src/lib/snackbar/snackbar-close-button/snackbar-close-button.component.scss +++ b/goofy-client/libs/ui/src/lib/snackbar/snackbar-close-button/snackbar-close-button.component.scss @@ -25,49 +25,12 @@ @use '@angular/material' as mat; @import 'variables'; -.message { - white-space: pre-wrap +:host { + height: 24px; } -::ng-deep .mat-snack-bar-container.error { - min-width: 240px; - max-width: 90vw; - - border: 3px solid mat.get-color-from-palette($warnPalette); - background-color: lighten(mat.get-color-from-palette($warnPalette), 38%); - color: rgba(#000, 0.89); - position: relative; - - &:before { - position: absolute; - content: url("/assets/icons/error_outline_white.svg"); - display: block; - background-color: mat.get-color-from-palette($warnPalette); - left: 0; - top: 0; - padding: 11px 9px 11px 7px; - color: #fff; - height: 100%; - } - - > div { - margin-left: 44px; - } -} - -.wrapper { - display: flex; - align-items: center; -} - -.mat-button { - color: mat.get-color-from-palette($primaryPalette, lighter); -} - -button { - margin: -12px -8px -12px 8px -} - -::ng-deep body.dark .mat-snack-bar-container .mat-button { - color: mat.get-color-from-palette($primaryPalette); +.mat-mdc-icon-button.mat-mdc-button-base { + width: 24px; + height: 24px; + padding: 0; } diff --git a/goofy-client/libs/ui/src/lib/snackbar/snackbar-error/snackbar-error.component.html b/goofy-client/libs/ui/src/lib/snackbar/snackbar-error/snackbar-error.component.html index 2517ebb9eba4326ea3e7dfff3fe4c764fd1aab22..782a21c59cbcd3f788e85f45cf847bb5178bb7da 100644 --- a/goofy-client/libs/ui/src/lib/snackbar/snackbar-error/snackbar-error.component.html +++ b/goofy-client/libs/ui/src/lib/snackbar/snackbar-error/snackbar-error.component.html @@ -23,8 +23,6 @@ unter der Lizenz sind dem Lizenztext zu entnehmen. --> -<div class="wrapper"> - <span data-test-id="snackbar-message" class="message">{{ message }}</span> +<div data-test-id="snackbar-message" class="message">{{ message }}</div> - <goofy-client-snackbar-close-button (close)="close()"></goofy-client-snackbar-close-button> -</div> +<goofy-client-snackbar-close-button (close)="close()"></goofy-client-snackbar-close-button> diff --git a/goofy-client/libs/ui/src/lib/snackbar/snackbar-error/snackbar-error.component.scss b/goofy-client/libs/ui/src/lib/snackbar/snackbar-error/snackbar-error.component.scss index 79197ab3d868efeebf12c71845bf53ff79b523ee..8e3d25d7a59ec997571f367ee0e333f8192c7d35 100644 --- a/goofy-client/libs/ui/src/lib/snackbar/snackbar-error/snackbar-error.component.scss +++ b/goofy-client/libs/ui/src/lib/snackbar/snackbar-error/snackbar-error.component.scss @@ -21,53 +21,12 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -@use 'sass:map'; -@use '@angular/material' as mat; -@import 'variables'; - .message { white-space: pre-wrap } -::ng-deep .mat-snack-bar-container.error { - min-width: 240px; - max-width: 90vw; - - border: 3px solid mat.get-color-from-palette($warnPalette); - background-color: lighten(mat.get-color-from-palette($warnPalette), 38%); - color: rgba(#000, 0.89); - position: relative; - - &:before { - position: absolute; - content: url("/assets/icons/error_outline_white.svg"); - display: block; - background-color: mat.get-color-from-palette($warnPalette); - left: 0; - top: 0; - padding: 11px 9px 11px 7px; - color: #fff; - height: 100%; - } - - > div { - margin-left: 44px; - } -} - -.wrapper { +:host { display: flex; align-items: center; -} - -.mat-button { - color: mat.get-color-from-palette($primaryPalette, lighter); -} - -button { - margin: -12px -8px -12px 8px -} - -::ng-deep body.dark .mat-snack-bar-container .mat-button { - color: mat.get-color-from-palette($primaryPalette); + justify-content: space-between; } diff --git a/goofy-client/libs/ui/src/lib/snackbar/snackbar-error/snackbar-error.component.spec.ts b/goofy-client/libs/ui/src/lib/snackbar/snackbar-error/snackbar-error.component.spec.ts index 944f38f895da2efb07852b5e122b69b904d2593e..332f2b560bef3cc85d38a7a8e453b753a0124f5a 100644 --- a/goofy-client/libs/ui/src/lib/snackbar/snackbar-error/snackbar-error.component.spec.ts +++ b/goofy-client/libs/ui/src/lib/snackbar/snackbar-error/snackbar-error.component.spec.ts @@ -23,7 +23,7 @@ */ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { MatIconModule } from '@angular/material/icon'; -import { MAT_LEGACY_SNACK_BAR_DATA as MAT_SNACK_BAR_DATA, MatLegacySnackBarRef as MatSnackBarRef } from '@angular/material/legacy-snack-bar'; +import { MAT_SNACK_BAR_DATA, MatSnackBarRef } from '@angular/material/snack-bar'; import { mock } from '@goofy-client/test-utils'; import { MockComponent } from 'ng-mocks'; import { SnackbarCloseButtonComponent } from '../snackbar-close-button/snackbar-close-button.component'; diff --git a/goofy-client/libs/ui/src/lib/snackbar/snackbar-error/snackbar-error.component.ts b/goofy-client/libs/ui/src/lib/snackbar/snackbar-error/snackbar-error.component.ts index 25da2ddea5c90acfd022b9b85007bf358eda1c4f..6ceb37ba7f68ef70c247fd3814eee5fc2611d336 100644 --- a/goofy-client/libs/ui/src/lib/snackbar/snackbar-error/snackbar-error.component.ts +++ b/goofy-client/libs/ui/src/lib/snackbar/snackbar-error/snackbar-error.component.ts @@ -22,7 +22,7 @@ * unter der Lizenz sind dem Lizenztext zu entnehmen. */ import { Component, Inject } from '@angular/core'; -import { MAT_LEGACY_SNACK_BAR_DATA as MAT_SNACK_BAR_DATA, MatLegacySnackBarRef as MatSnackBarRef } from '@angular/material/legacy-snack-bar'; +import { MAT_SNACK_BAR_DATA, MatSnackBarRef } from '@angular/material/snack-bar'; import { SnackBarData } from '../snackbar.model'; @Component({ diff --git a/goofy-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.html b/goofy-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.html index c6f78650402d0f71777af6f7d37939252c04f598..ab90eeb659662a6958fa8619b864345bef2ee0b0 100644 --- a/goofy-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.html +++ b/goofy-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.html @@ -23,7 +23,7 @@ unter der Lizenz sind dem Lizenztext zu entnehmen. --> -<span data-test-id="snackbar-message">{{ message }}</span> +<div data-test-id="snackbar-message">{{ message }}</div> <button *ngIf="showRevokeButton()" data-test-id="snackbar-revoke-button" mat-button diff --git a/goofy-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.scss b/goofy-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.scss index 7c18583b237564084a0378ad81b4920b4908a7e8..e48375ba020059e5d93760c965e90862d788376d 100644 --- a/goofy-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.scss +++ b/goofy-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.scss @@ -21,23 +21,8 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -@use 'sass:map'; -@use '@angular/material' as mat; -@import "variables"; - -::ng-deep .mat-snack-bar-container { - min-width: 240px; - max-width: 90vw; - - .mat-button { - color: mat.get-color-from-palette($primaryPalette, lighter); - } -} - -button { - margin: -12px -8px -12px 8px -} - -::ng-deep body.dark .mat-snack-bar-container .mat-button { - color: mat.get-color-from-palette($primaryPalette); +:host { + display: flex; + align-items: center; + justify-content: space-between; } \ No newline at end of file diff --git a/goofy-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.spec.ts b/goofy-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.spec.ts index 081db1db257210f1bfbb4bd61a9823ef3912f6b3..f7286034c26704f52b4178b9b7c334146c6016e9 100644 --- a/goofy-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.spec.ts +++ b/goofy-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.spec.ts @@ -23,7 +23,7 @@ */ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { MatIconModule } from '@angular/material/icon'; -import { MAT_LEGACY_SNACK_BAR_DATA as MAT_SNACK_BAR_DATA, MatLegacySnackBarModule as MatSnackBarModule, MatLegacySnackBarRef as MatSnackBarRef } from '@angular/material/legacy-snack-bar'; +import { MAT_SNACK_BAR_DATA, MatSnackBarModule, MatSnackBarRef } from '@angular/material/snack-bar'; import { mock } from '@goofy-client/test-utils'; import { CommandLinkRel } from 'libs/command-shared/src/lib/command.linkrel'; import { createCommandResource } from 'libs/command-shared/test/command'; diff --git a/goofy-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.ts b/goofy-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.ts index 440b15971c0013628f31312d9175bce849e13326..7e441fdb7fba7aad2805bf859f956f80bb0b72d0 100644 --- a/goofy-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.ts +++ b/goofy-client/libs/ui/src/lib/snackbar/snackbar-info/snackbar-info.component.ts @@ -22,7 +22,7 @@ * unter der Lizenz sind dem Lizenztext zu entnehmen. */ import { Component, Inject } from '@angular/core'; -import { MAT_LEGACY_SNACK_BAR_DATA as MAT_SNACK_BAR_DATA, MatLegacySnackBarRef as MatSnackBarRef } from '@angular/material/legacy-snack-bar'; +import { MAT_SNACK_BAR_DATA, MatSnackBarRef } from '@angular/material/snack-bar'; import { isRevokeable } from '@goofy-client/command-shared'; import { isUndefined } from 'lodash-es'; import { SnackBarData } from '../snackbar.model'; diff --git a/goofy-client/libs/ui/src/lib/snackbar/snackbar.service.spec.ts b/goofy-client/libs/ui/src/lib/snackbar/snackbar.service.spec.ts index fd3570d58d575353dc5d2f09807134b8133f84f0..d57564b2d77b9d13c1f4102c16e4eb6749ec4303 100644 --- a/goofy-client/libs/ui/src/lib/snackbar/snackbar.service.spec.ts +++ b/goofy-client/libs/ui/src/lib/snackbar/snackbar.service.spec.ts @@ -22,7 +22,7 @@ * unter der Lizenz sind dem Lizenztext zu entnehmen. */ import { TestBed } from '@angular/core/testing'; -import { MatLegacySnackBar as MatSnackBar } from '@angular/material/legacy-snack-bar'; +import { MatSnackBar } from '@angular/material/snack-bar'; import { MatSnackBarConfig, MatSnackBarRef } from '@angular/material/snack-bar'; import { faker } from '@faker-js/faker'; import { CommandResource, CommandStatus } from '@goofy-client/command-shared'; diff --git a/goofy-client/libs/ui/src/lib/snackbar/snackbar.service.ts b/goofy-client/libs/ui/src/lib/snackbar/snackbar.service.ts index 68e6aa4f8939a585744578d1f3b54528aad65c37..ef1135d27a678f55536991397ef6c456464971a6 100644 --- a/goofy-client/libs/ui/src/lib/snackbar/snackbar.service.ts +++ b/goofy-client/libs/ui/src/lib/snackbar/snackbar.service.ts @@ -23,8 +23,7 @@ */ import { ComponentType } from '@angular/cdk/overlay'; import { Injectable } from '@angular/core'; -import { MatLegacySnackBar as MatSnackBar, MatLegacySnackBarRef as MatSnackBarRef } from '@angular/material/legacy-snack-bar'; -import { MatSnackBarConfig } from '@angular/material/snack-bar'; +import { MatSnackBar, MatSnackBarConfig, MatSnackBarRef } from '@angular/material/snack-bar'; import { CommandResource, CommandStatus } from '@goofy-client/command-shared'; import { isNotUndefined } from '@goofy-client/tech-shared'; import { isUndefined } from 'lodash-es'; diff --git a/goofy-client/libs/ui/src/lib/ui/accordion/accordion.component.scss b/goofy-client/libs/ui/src/lib/ui/accordion/accordion.component.scss index 004b169f6166c199fbcd380e5df39ac0630c228b..86e14516c34fa09bee546a46b3e3c69dd2ec0dbe 100644 --- a/goofy-client/libs/ui/src/lib/ui/accordion/accordion.component.scss +++ b/goofy-client/libs/ui/src/lib/ui/accordion/accordion.component.scss @@ -21,7 +21,7 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -@import "variables"; +@import 'variables'; ul { margin-top: 0; diff --git a/goofy-client/libs/ui/src/lib/ui/back-button/back-button.component.spec.ts b/goofy-client/libs/ui/src/lib/ui/back-button/back-button.component.spec.ts index 7d274830a821c60e39b6501e4bce9c027022e1c5..29ec95547efa0ed707e21897d228eb89a8cdb9d9 100644 --- a/goofy-client/libs/ui/src/lib/ui/back-button/back-button.component.spec.ts +++ b/goofy-client/libs/ui/src/lib/ui/back-button/back-button.component.spec.ts @@ -4,7 +4,7 @@ import { RouterTestingModule } from '@angular/router/testing'; import faker from '@faker-js/faker'; import { getElementFromFixture } from '@goofy-client/test-utils'; import { getDataTestIdOf } from 'libs/tech-shared/test/data-test'; -import { MattooltipDirective } from 'libs/ui/src/lib/ui/mattooltip/mattooltip.directive'; +import { MatTooltipDirective } from 'libs/ui/src/lib/ui/mattooltip/mattooltip.directive'; import { BackButtonComponent } from './back-button.component'; describe('BackButtonComponent', () => { @@ -20,7 +20,7 @@ describe('BackButtonComponent', () => { declarations: [ BackButtonComponent, MatIcon, - MattooltipDirective, + MatTooltipDirective, ], imports: [ RouterTestingModule diff --git a/goofy-client/libs/ui/src/lib/ui/basic-dialog/basic-dialog.component.html b/goofy-client/libs/ui/src/lib/ui/basic-dialog/basic-dialog.component.html index 04d3734b2d260930451b31d02da910bc28e94802..df0b8a4b6eb368149121817300be113cfef30460 100644 --- a/goofy-client/libs/ui/src/lib/ui/basic-dialog/basic-dialog.component.html +++ b/goofy-client/libs/ui/src/lib/ui/basic-dialog/basic-dialog.component.html @@ -3,14 +3,17 @@ <p data-test-id="dialog-message">{{ data.message }}</p> </div> <div mat-dialog-actions> - <goofy-client-button-with-spinner + <goofy-client-ozgcloud-stroked-button-with-spinner dataTestId="dialog-confirmation-button" [mat-dialog-close]="true" svgIcon="{{ data.okSvgIcon }}" text="{{ data.okText }}"> - </goofy-client-button-with-spinner> + </goofy-client-ozgcloud-stroked-button-with-spinner> + + <goofy-client-ozgcloud-stroked-button-with-spinner + dataTestId="dialog-cancel-button" + (click)="onNoClick()" + text="Abbrechen"> + </goofy-client-ozgcloud-stroked-button-with-spinner> - <button data-test-id="dialog-cancel-button" mat-stroked-button (click)="onNoClick()"> - Abbrechen - </button> </div> \ No newline at end of file diff --git a/goofy-client/libs/ui/src/lib/ui/basic-dialog/basic-dialog.component.scss b/goofy-client/libs/ui/src/lib/ui/basic-dialog/basic-dialog.component.scss index 32ca729d1fb8ffca66095b21ea2c8a06d8b80a52..90ac2b7e8a2997c595ab46c0322aa990053bf3a1 100644 --- a/goofy-client/libs/ui/src/lib/ui/basic-dialog/basic-dialog.component.scss +++ b/goofy-client/libs/ui/src/lib/ui/basic-dialog/basic-dialog.component.scss @@ -7,6 +7,6 @@ button, h1 { color: mat.get-color-from-palette($primaryPalette); } -button { +goofy-client-ozgcloud-stroked-button-with-spinner { margin-left: 1rem; } \ No newline at end of file diff --git a/goofy-client/libs/ui/src/lib/ui/basic-dialog/basic-dialog.component.spec.ts b/goofy-client/libs/ui/src/lib/ui/basic-dialog/basic-dialog.component.spec.ts index baa930740dfddbde7d66b590e9341c8d2b31f974..698f774e5917e52988fe4d2eab88b5acaf4cb7ed 100644 --- a/goofy-client/libs/ui/src/lib/ui/basic-dialog/basic-dialog.component.spec.ts +++ b/goofy-client/libs/ui/src/lib/ui/basic-dialog/basic-dialog.component.spec.ts @@ -1,7 +1,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog'; import { MatIcon } from '@angular/material/icon'; -import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA, MatLegacyDialogModule as MatDialogModule, MatLegacyDialogRef as MatDialogRef } from '@angular/material/legacy-dialog'; -import { ButtonWithSpinnerComponent, IconButtonWithSpinnerComponent } from '@goofy-client/ui'; +import { IconButtonWithSpinnerComponent, OzgcloudStrokedButtonWithSpinnerComponent } from '@goofy-client/ui'; import { MockComponent } from 'ng-mocks'; import { BasicDialogComponent } from './basic-dialog.component'; @@ -17,7 +17,7 @@ describe('BasicDialogComponent', () => { declarations: [ BasicDialogComponent, MatIcon, - MockComponent(ButtonWithSpinnerComponent), + MockComponent(OzgcloudStrokedButtonWithSpinnerComponent), MockComponent(IconButtonWithSpinnerComponent), ], providers: [ diff --git a/goofy-client/libs/ui/src/lib/ui/basic-dialog/basic-dialog.component.ts b/goofy-client/libs/ui/src/lib/ui/basic-dialog/basic-dialog.component.ts index f45e7f2a27371170280322db139003e01a619a71..d7df63108bc6320034bf2a541279a9eaa81bc9e1 100644 --- a/goofy-client/libs/ui/src/lib/ui/basic-dialog/basic-dialog.component.ts +++ b/goofy-client/libs/ui/src/lib/ui/basic-dialog/basic-dialog.component.ts @@ -1,5 +1,5 @@ import { Component, Inject } from '@angular/core'; -import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA, MatLegacyDialogRef as MatDialogRef } from '@angular/material/legacy-dialog'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; import { BasicDialogData } from './basic-dialog-data.model'; @Component({ diff --git a/goofy-client/libs/ui/src/lib/ui/button-toggle/_button-toogle.theme.scss b/goofy-client/libs/ui/src/lib/ui/button-toggle/_button-toogle.theme.scss index 5795dbd8a65e300cc774fe71ffd8553d4e7cfa9f..23a97552a073b3f3a0462b724543ccb2b21cf30c 100644 --- a/goofy-client/libs/ui/src/lib/ui/button-toggle/_button-toogle.theme.scss +++ b/goofy-client/libs/ui/src/lib/ui/button-toggle/_button-toogle.theme.scss @@ -2,11 +2,8 @@ goofy-client-button-toggle { .mat-button-toggle-standalone.mat-button-toggle-appearance-standard, .mat-button-toggle-appearance-standard { border-radius: 20px; - .mat-button-toggle-label-content { line-height: 2rem; } - } - } diff --git a/goofy-client/libs/ui/src/lib/ui/button-with-spinner/button-with-spinner.component.spec.ts b/goofy-client/libs/ui/src/lib/ui/button-with-spinner/button-with-spinner.component.spec.ts deleted file mode 100644 index d6227cf0850b1d0f18deb1d835b6dbbd5ee5f402..0000000000000000000000000000000000000000 --- a/goofy-client/libs/ui/src/lib/ui/button-with-spinner/button-with-spinner.component.spec.ts +++ /dev/null @@ -1,133 +0,0 @@ -/* - * 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. - */ -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { MatRipple } from '@angular/material/core'; -import { MatIcon } from '@angular/material/icon'; -import { MatLegacyButton as MatButton } from '@angular/material/legacy-button'; -import { createEmptyStateResource } from '@goofy-client/tech-shared'; -import { getDataTestClassOf } from 'libs/tech-shared/test/data-test'; -import { MattooltipDirective } from 'libs/ui/src/lib/ui/mattooltip/mattooltip.directive'; -import { MockComponent } from 'ng-mocks'; -import { SpinnerComponent } from '../spinner/spinner.component'; -import { ButtonWithSpinnerComponent } from './button-with-spinner.component'; - -describe('ButtonWithSpinnerComponent', () => { - let component: ButtonWithSpinnerComponent; - let fixture: ComponentFixture<ButtonWithSpinnerComponent>; - - const buttonSelector: string = getDataTestClassOf('icon-button'); - const iconSelector: string = getDataTestClassOf('icon'); - const text: string = getDataTestClassOf('button-with-spinner-text'); - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ - MatButton, - MatRipple, - MatIcon, - ButtonWithSpinnerComponent, - MattooltipDirective, - MockComponent(SpinnerComponent) - ] - }).compileComponents(); - }); - - beforeEach(() => { - fixture = TestBed.createComponent(ButtonWithSpinnerComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); - - describe('Button', () => { - - it('should NOT disabled initial', () => { - component.stateResource = createEmptyStateResource(); - fixture.detectChanges(); - - const button = fixture.nativeElement.querySelector(buttonSelector); - - expect(button).not.toBeDisabled() - }); - - it('should disabled if loading', () => { - component.stateResource = createEmptyStateResource(true); - fixture.detectChanges(); - - const button = fixture.nativeElement.querySelector(buttonSelector); - - expect(button).toBeDisabled(); - }); - }) - - describe('Icon', () => { - - beforeEach(() => { - component.icon = 'add'; - fixture.detectChanges(); - }) - - it('should visible initial', () => { - component.stateResource = createEmptyStateResource(); - fixture.detectChanges(); - - const icon = fixture.nativeElement.querySelector(iconSelector); - - expect(icon).toBeVisible(); - }); - - it('should not visible if loading', () => { - component.stateResource = createEmptyStateResource(true); - fixture.detectChanges(); - - const icon = fixture.nativeElement.querySelector(iconSelector); - - expect(icon).not.toBeVisible(); - }); - }) - - describe('Text', () => { - - it('should visible if exist', () => { - component.text = 'Test text'; - fixture.detectChanges(); - - const textElement = fixture.nativeElement.querySelector(text); - - expect(textElement).toBeInTheDocument(); - }); - - it('should not visible if is null', () => { - component.text = null; - fixture.detectChanges(); - - const textElement = fixture.nativeElement.querySelector(text); - - expect(textElement).not.toBeInTheDocument(); - }); - }) -}); \ No newline at end of file diff --git a/goofy-client/libs/ui/src/lib/ui/dialog/dialog.service.spec.ts b/goofy-client/libs/ui/src/lib/ui/dialog/dialog.service.spec.ts index 9002c91257c38b8e912e8cf7a76d79d9d99356f8..8dd10e04d2052c76d75bf91164af68afddab21d3 100644 --- a/goofy-client/libs/ui/src/lib/ui/dialog/dialog.service.spec.ts +++ b/goofy-client/libs/ui/src/lib/ui/dialog/dialog.service.spec.ts @@ -22,7 +22,7 @@ * unter der Lizenz sind dem Lizenztext zu entnehmen. */ import { TestBed } from '@angular/core/testing'; -import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; +import { MatDialog } from '@angular/material/dialog'; import { ApiError } from '@goofy-client/tech-shared'; import { createApiError } from 'libs/tech-shared/test/error'; import { BasicDialogComponent } from '../basic-dialog/basic-dialog.component'; diff --git a/goofy-client/libs/ui/src/lib/ui/dialog/dialog.service.ts b/goofy-client/libs/ui/src/lib/ui/dialog/dialog.service.ts index f7e8b5fbaa2d4dd06b9aaac605758f27b8ed6632..f76356b783fa253fba420227947da0e9a4a78a32 100644 --- a/goofy-client/libs/ui/src/lib/ui/dialog/dialog.service.ts +++ b/goofy-client/libs/ui/src/lib/ui/dialog/dialog.service.ts @@ -24,7 +24,7 @@ import { NoopScrollStrategy } from '@angular/cdk/overlay'; import { ComponentType } from "@angular/cdk/portal"; import { Injectable } from "@angular/core"; -import { MatLegacyDialog as MatDialog, MatLegacyDialogConfig as MatDialogConfig, MatLegacyDialogRef as MatDialogRef } from '@angular/material/legacy-dialog'; +import { MatDialog, MatDialogConfig, MatDialogRef } from '@angular/material/dialog'; import { ApiError, isNotUndefined } from "@goofy-client/tech-shared"; import { BasicDialogComponent, BasicDialogData, FixedDialogComponent, FixedDialogData } from "@goofy-client/ui"; import { InternalServerErrorDialogComponent } from "../notification/internal-server-error-dialog/internal-server-error-dialog.component"; diff --git a/goofy-client/libs/ui/src/lib/ui/download-button/download-button.component.scss b/goofy-client/libs/ui/src/lib/ui/download-button/download-button.component.scss index 98401b64e76f6868738a7262770a075ab9273fe9..0a99fb3418e543df0aec2bb285645dded123f24a 100644 --- a/goofy-client/libs/ui/src/lib/ui/download-button/download-button.component.scss +++ b/goofy-client/libs/ui/src/lib/ui/download-button/download-button.component.scss @@ -1,5 +1,3 @@ -$leftMargin: 8px; - -span { - margin-left: $leftMargin; +a { + padding: 0 15px; } \ No newline at end of file diff --git a/goofy-client/libs/ui/src/lib/ui/editor/autocomplete-editor/autocomplete-editor.component.spec.ts b/goofy-client/libs/ui/src/lib/ui/editor/autocomplete-editor/autocomplete-editor.component.spec.ts index 437ed469b5b96a5e3e28602d52644914c68b5d09..164482f5c7c79ff9a5727dfb4eb8617048b4f0c5 100644 --- a/goofy-client/libs/ui/src/lib/ui/editor/autocomplete-editor/autocomplete-editor.component.spec.ts +++ b/goofy-client/libs/ui/src/lib/ui/editor/autocomplete-editor/autocomplete-editor.component.spec.ts @@ -23,9 +23,9 @@ */ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { NgControl, ReactiveFormsModule, UntypedFormControl } from '@angular/forms'; -import { MatLegacyAutocompleteModule as MatAutocompleteModule } from '@angular/material/legacy-autocomplete'; -import { MatLegacyFormFieldModule as MatFormFieldModule } from '@angular/material/legacy-form-field'; -import { MatLegacyInputModule as MatInputModule } from '@angular/material/legacy-input'; +import { MatAutocompleteModule } from '@angular/material/autocomplete'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { ConvertForDataTestPipe } from '@goofy-client/tech-shared'; import { MockComponent } from 'ng-mocks'; diff --git a/goofy-client/libs/ui/src/lib/ui/editor/date-editor/date-editor.component.html b/goofy-client/libs/ui/src/lib/ui/editor/date-editor/date-editor.component.html index c1f028c04797066cb37402c14449685298848e9e..5dfc95345f11f052a209e9940563f97c9455bbd8 100644 --- a/goofy-client/libs/ui/src/lib/ui/editor/date-editor/date-editor.component.html +++ b/goofy-client/libs/ui/src/lib/ui/editor/date-editor/date-editor.component.html @@ -23,7 +23,7 @@ unter der Lizenz sind dem Lizenztext zu entnehmen. --> -<mat-form-field appearance="fill"> +<mat-form-field> <mat-label>{{ label }}</mat-label> <input matInput [matDatepicker]="picker" [formControl]="fieldControl" (blur)="touch()" [attr.data-test-id]="(label | convertForDataTest) + '-date-input'" diff --git a/goofy-client/libs/ui/src/lib/ui/editor/date-editor/date-editor.component.spec.ts b/goofy-client/libs/ui/src/lib/ui/editor/date-editor/date-editor.component.spec.ts index bf47a5bbca8c46167e21cf23167d105b291792e8..2c454f6c7eb5db644d9ddade601095a39b72c337 100644 --- a/goofy-client/libs/ui/src/lib/ui/editor/date-editor/date-editor.component.spec.ts +++ b/goofy-client/libs/ui/src/lib/ui/editor/date-editor/date-editor.component.spec.ts @@ -26,8 +26,8 @@ import { ReactiveFormsModule } from '@angular/forms'; import { MatNativeDateModule } from '@angular/material/core'; import { MatDatepickerModule } from '@angular/material/datepicker'; import { MatIconModule } from '@angular/material/icon'; -import { MatLegacyFormFieldModule as MatFormFieldModule } from '@angular/material/legacy-form-field'; -import { MatLegacyInputModule as MatInputModule } from '@angular/material/legacy-input'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { ConvertForDataTestPipe } from '@goofy-client/tech-shared'; import { MockComponent } from 'ng-mocks'; diff --git a/goofy-client/libs/ui/src/lib/ui/editor/enum-editor/enum-editor.component.scss b/goofy-client/libs/ui/src/lib/ui/editor/enum-editor/enum-editor.component.scss index 6c5394012ec135f592f0811e6dd8f70ecfb478c8..d60b847e83a4cbbc6262bff546c13d221109fcde 100644 --- a/goofy-client/libs/ui/src/lib/ui/editor/enum-editor/enum-editor.component.scss +++ b/goofy-client/libs/ui/src/lib/ui/editor/enum-editor/enum-editor.component.scss @@ -30,7 +30,7 @@ mat-label { } ::ng-deep { - .mat-menu-panel.reply-option-menu { + .mat-mdc-menu-panel.reply-option-menu { margin-left: -8px; } } diff --git a/goofy-client/libs/ui/src/lib/ui/editor/enum-editor/enum-editor.component.spec.ts b/goofy-client/libs/ui/src/lib/ui/editor/enum-editor/enum-editor.component.spec.ts index 11df7ff2aeea74920a5874c548092b01509459e2..53ea33b784e3c565e3ea88de41cfd4dd71fc5ac3 100644 --- a/goofy-client/libs/ui/src/lib/ui/editor/enum-editor/enum-editor.component.spec.ts +++ b/goofy-client/libs/ui/src/lib/ui/editor/enum-editor/enum-editor.component.spec.ts @@ -24,7 +24,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ReactiveFormsModule } from '@angular/forms'; import { MatIcon } from '@angular/material/icon'; -import { MatLegacyFormFieldModule as MatFormFieldModule } from '@angular/material/legacy-form-field'; +import { MatFormFieldModule } from '@angular/material/form-field'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { ConvertForDataTestPipe } from '@goofy-client/tech-shared'; import { IconButtonWithSpinnerComponent, UiModule } from '@goofy-client/ui'; diff --git a/goofy-client/libs/ui/src/lib/ui/editor/file-upload-editor/file-upload-editor.component.spec.ts b/goofy-client/libs/ui/src/lib/ui/editor/file-upload-editor/file-upload-editor.component.spec.ts index f546d3c54ec17291cf4be70ad4bdb5779a6005b5..3bd4742554d51bc2e3743a10aa05ff8ab39adace 100644 --- a/goofy-client/libs/ui/src/lib/ui/editor/file-upload-editor/file-upload-editor.component.spec.ts +++ b/goofy-client/libs/ui/src/lib/ui/editor/file-upload-editor/file-upload-editor.component.spec.ts @@ -26,8 +26,8 @@ import { AbstractControl, FormGroupDirective, ReactiveFormsModule, UntypedFormBu import { MatNativeDateModule } from '@angular/material/core'; import { MatDatepickerModule } from '@angular/material/datepicker'; import { MatIconModule } from '@angular/material/icon'; -import { MatLegacyFormFieldModule as MatFormFieldModule } from '@angular/material/legacy-form-field'; -import { MatLegacyInputModule as MatInputModule } from '@angular/material/legacy-input'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { ConvertForDataTestPipe, createEmptyStateResource } from '@goofy-client/tech-shared'; import { MockComponent } from 'ng-mocks'; diff --git a/goofy-client/libs/ui/src/lib/ui/editor/text-editor/text-editor.component.spec.ts b/goofy-client/libs/ui/src/lib/ui/editor/text-editor/text-editor.component.spec.ts index c5e9b3a9a04564c09eed850333c91c85b8b88f61..f8f69bbca2672f4cac52ae193f9c5ffb93c2f811 100644 --- a/goofy-client/libs/ui/src/lib/ui/editor/text-editor/text-editor.component.spec.ts +++ b/goofy-client/libs/ui/src/lib/ui/editor/text-editor/text-editor.component.spec.ts @@ -23,8 +23,8 @@ */ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { NgControl, ReactiveFormsModule, UntypedFormControl } from '@angular/forms'; -import { MatLegacyFormFieldModule as MatFormFieldModule } from '@angular/material/legacy-form-field'; -import { MatLegacyInputModule as MatInputModule } from '@angular/material/legacy-input'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { ConvertForDataTestPipe } from '@goofy-client/tech-shared'; import { MockComponent } from 'ng-mocks'; diff --git a/goofy-client/libs/ui/src/lib/ui/editor/text-editor/text-editor.component.ts b/goofy-client/libs/ui/src/lib/ui/editor/text-editor/text-editor.component.ts index 43cfcff857d76f66fb44beba84061c5a837954b4..591babdcf277e4c59d758017db82963326edf0bb 100644 --- a/goofy-client/libs/ui/src/lib/ui/editor/text-editor/text-editor.component.ts +++ b/goofy-client/libs/ui/src/lib/ui/editor/text-editor/text-editor.component.ts @@ -37,7 +37,7 @@ export class TextEditorComponent extends FormControlEditorAbstractComponent impl @Input() placeholder: string; @Input() placeholderLabel: string = null; @Input() autocomplete: 'off' | 'email' = 'off'; - @Input() appearance: 'standard' | 'fill' = 'fill'; + @Input() appearance: 'outline' | 'fill' = 'fill'; @Input() readOnly: boolean; @Input() autoFocus: boolean; diff --git a/goofy-client/libs/ui/src/lib/ui/editor/textarea-editor/textarea-editor.component.spec.ts b/goofy-client/libs/ui/src/lib/ui/editor/textarea-editor/textarea-editor.component.spec.ts index 7233ef47c7c0e56250dfaa4b07de541159b1c62e..8ca66b4042f560b37c9317097e1f44449e751947 100644 --- a/goofy-client/libs/ui/src/lib/ui/editor/textarea-editor/textarea-editor.component.spec.ts +++ b/goofy-client/libs/ui/src/lib/ui/editor/textarea-editor/textarea-editor.component.spec.ts @@ -23,8 +23,8 @@ */ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { NgControl, ReactiveFormsModule, UntypedFormControl } from '@angular/forms'; -import { MatLegacyFormFieldModule as MatFormFieldModule } from '@angular/material/legacy-form-field'; -import { MatLegacyInputModule as MatInputModule } from '@angular/material/legacy-input'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { ConvertForDataTestPipe } from '@goofy-client/tech-shared'; import { MockComponent } from 'ng-mocks'; diff --git a/goofy-client/libs/ui/src/lib/ui/editor/textarea-editor/textarea-editor.component.ts b/goofy-client/libs/ui/src/lib/ui/editor/textarea-editor/textarea-editor.component.ts index fded47204cc693d96da9bc3db996f5daf4674f77..88a680c88fc2864d52f456908cf711923c9dda23 100644 --- a/goofy-client/libs/ui/src/lib/ui/editor/textarea-editor/textarea-editor.component.ts +++ b/goofy-client/libs/ui/src/lib/ui/editor/textarea-editor/textarea-editor.component.ts @@ -36,7 +36,7 @@ export class TextAreaEditorComponent extends FormControlEditorAbstractComponent @Input() placeholder: string; @Input() label: string = ''; - @Input() appearance: 'standard' | 'fill' = 'fill' + @Input() appearance: 'outline' | 'fill' = 'fill' ngAfterViewInit() { this.autosize.resizeToFitContent(true); diff --git a/goofy-client/libs/ui/src/lib/ui/fixed-dialog/_fixed-dialog.theme.scss b/goofy-client/libs/ui/src/lib/ui/fixed-dialog/_fixed-dialog.theme.scss index 79885441538c01cb29027a3284b6ccfd36cc2477..0b4c18dfae3bbfe602477119799a5a2b7bee7b18 100644 --- a/goofy-client/libs/ui/src/lib/ui/fixed-dialog/_fixed-dialog.theme.scss +++ b/goofy-client/libs/ui/src/lib/ui/fixed-dialog/_fixed-dialog.theme.scss @@ -23,72 +23,97 @@ */ .fixed-dialog { - .mat-dialog-container { + .mat-mdc-dialog-container { padding: 0; border-bottom-left-radius: 0; border-bottom-right-radius: 0; position: relative; - } - .mat-dialog-title { - display: flex; - background-color: $dark-background; - margin: 0; - padding: 0 4px 0 16px; - color: #fff; - font-size: 16px; - line-height: 40px; - font-weight: normal; - justify-content: space-between; - } + .mat-mdc-dialog-title { + display: flex; + background-color: $dark-background; + margin: 0; + padding: 0 4px 0 16px; + color: #fff; + font-size: 16px; + font-weight: normal; + justify-content: space-between; + align-items: center; + } + .mdc-dialog__title::before { + display: none; + } + .mat-mdc-icon-button.mat-mdc-button-base { + padding: 0; + width: 40px; + height: 40px; + } + .mdc-text-field, + .mat-mdc-form-field-hint-wrapper, + .mat-mdc-form-field-error-wrapper { + padding: 0; + } + .mat-mdc-form-field-error { + font-size: 12px; + } + .mdc-dialog__content { + line-height: 20px; + } + .mat-mdc-dialog-content { + max-height: 50vh; + min-height: 200px; + margin: 0 0 58px 0; + padding: 8px 16px; - .mat-dialog-content { - max-height: 50vh; - min-height: 200px; - margin: 0 0 58px 0; - padding: 8px 16px; + > * { + background-color: inherit; + } + + &.minimized { + max-height: 0; + min-height: initial; + overflow: hidden; + margin: 0; + padding: 0 !important; - > * { - background-color: inherit; + .button-bar-bottom { + height: 0; + overflow: hidden; + padding: 0; + } + } } - &.minimized { - max-height: 0; + .mat-mdc-dialog-actions { min-height: initial; - overflow: hidden; - margin: 0; - padding: 0; + margin-bottom: 0; + } - .button-bar-bottom { - height: 0; - overflow: hidden; - padding: 0; - } + .button-bar .mat-icon { + padding: 8px 0; } - } - .mat-dialog-actions { - min-height: initial; - margin-bottom: 0; - } + .minimized .mat-icon { + transform: rotate(180deg); + padding: 0; + } - .minimized .mat-icon { - transform: rotate(180deg); + .button-bar-bottom { + position: absolute; + bottom: 0; + left: 0; + right: 0; + padding: 0 16px 16px 16px; + display: flex; + align-items: center; + } } - .button-bar-bottom { - position: absolute; - bottom: 0; - left: 0; - right: 0; - padding: 16px; - display: flex; - align-items: center; - } + } body.dark { .fixed-dialog { - .mat-dialog-title { + .mat-mdc-dialog-title { background-color: $background; color: $dark-background; } diff --git a/goofy-client/libs/ui/src/lib/ui/fixed-dialog/fixed-dialog.component.spec.ts b/goofy-client/libs/ui/src/lib/ui/fixed-dialog/fixed-dialog.component.spec.ts index 5bd7cf6b100fd5f0aa637e85fbf3f44c1ef59b55..478e73a89bd8562751ecf3bee180faff9d6ed4b5 100644 --- a/goofy-client/libs/ui/src/lib/ui/fixed-dialog/fixed-dialog.component.spec.ts +++ b/goofy-client/libs/ui/src/lib/ui/fixed-dialog/fixed-dialog.component.spec.ts @@ -23,7 +23,7 @@ */ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { MatIcon } from '@angular/material/icon'; -import { MatLegacyDialogModule as MatDialogModule, MatLegacyDialogRef as MatDialogRef, MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog'; +import { MatDialogModule, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; import { FixedDialogComponent } from './fixed-dialog.component'; describe('FixedDialogComponent', () => { diff --git a/goofy-client/libs/ui/src/lib/ui/fixed-dialog/fixed-dialog.component.ts b/goofy-client/libs/ui/src/lib/ui/fixed-dialog/fixed-dialog.component.ts index 9d9ab683783d170caa389ae25a7829b49bf53b6e..374a660110aa936f6345344740b5c9a1395551bb 100644 --- a/goofy-client/libs/ui/src/lib/ui/fixed-dialog/fixed-dialog.component.ts +++ b/goofy-client/libs/ui/src/lib/ui/fixed-dialog/fixed-dialog.component.ts @@ -22,7 +22,7 @@ * unter der Lizenz sind dem Lizenztext zu entnehmen. */ import { Component, Inject, Injectable, Injector } from '@angular/core'; -import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog'; +import { MAT_DIALOG_DATA } from '@angular/material/dialog'; import { VorgangWithEingangResource } from '@goofy-client/vorgang-shared'; import { FixedDialogData } from './fixed-dialog-data.model'; diff --git a/goofy-client/libs/ui/src/lib/ui/http-error-dialog/connection-timeout-retry-dialog/connection-timeout-retry-dialog.component.html b/goofy-client/libs/ui/src/lib/ui/http-error-dialog/connection-timeout-retry-dialog/connection-timeout-retry-dialog.component.html index 1b82fd2f0324cb70be07b26561fe7acb218e16a3..7eb27762bdfc3a65d7e74eb827fa4389149f2de0 100644 --- a/goofy-client/libs/ui/src/lib/ui/http-error-dialog/connection-timeout-retry-dialog/connection-timeout-retry-dialog.component.html +++ b/goofy-client/libs/ui/src/lib/ui/http-error-dialog/connection-timeout-retry-dialog/connection-timeout-retry-dialog.component.html @@ -24,10 +24,10 @@ --> <div class="notification-dialog" data-test-id="connection-timeout-retry-dialog"> - <h2 mat-dialog-title> + <h1 mat-dialog-title> <mat-icon data-test-id="icon">error_outline</mat-icon> <span data-test-id="header">Es ist ein Verbindungsfehler aufgetreten ...</span> - </h2> + </h1> <mat-dialog-content> <p data-test-id="message"> Ihre Anfrage wird wiederholt diff --git a/goofy-client/libs/ui/src/lib/ui/http-error-dialog/connection-timeout-retry-dialog/connection-timeout-retry-dialog.component.scss b/goofy-client/libs/ui/src/lib/ui/http-error-dialog/connection-timeout-retry-dialog/connection-timeout-retry-dialog.component.scss index 216ac6aa787fb4fc8fb0d1f7638ac76fe522235e..921a943426ae3182104f148bebfbf3aaf0361c9b 100644 --- a/goofy-client/libs/ui/src/lib/ui/http-error-dialog/connection-timeout-retry-dialog/connection-timeout-retry-dialog.component.scss +++ b/goofy-client/libs/ui/src/lib/ui/http-error-dialog/connection-timeout-retry-dialog/connection-timeout-retry-dialog.component.scss @@ -21,7 +21,7 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -h2 { +h1 { font-weight: normal; font-size: 24px; display: flex; diff --git a/goofy-client/libs/ui/src/lib/ui/http-error-dialog/connection-timeout-retry-dialog/connection-timeout-retry-dialog.component.spec.ts b/goofy-client/libs/ui/src/lib/ui/http-error-dialog/connection-timeout-retry-dialog/connection-timeout-retry-dialog.component.spec.ts index b3f4053b95c53965323bb05efc19dd12d419a548..34536651288e4615ea9a09de6e78da167cbe2166 100644 --- a/goofy-client/libs/ui/src/lib/ui/http-error-dialog/connection-timeout-retry-dialog/connection-timeout-retry-dialog.component.spec.ts +++ b/goofy-client/libs/ui/src/lib/ui/http-error-dialog/connection-timeout-retry-dialog/connection-timeout-retry-dialog.component.spec.ts @@ -22,9 +22,9 @@ * unter der Lizenz sind dem Lizenztext zu entnehmen. */ import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { MatDialogModule } from '@angular/material/dialog'; import { MatIcon } from '@angular/material/icon'; -import { MatLegacyDialogModule as MatDialogModule } from '@angular/material/legacy-dialog'; -import { ButtonWithSpinnerComponent } from '@goofy-client/ui'; +import { OzgcloudStrokedButtonWithSpinnerComponent } from '@goofy-client/ui'; import { MockComponent } from 'ng-mocks'; import { ConnectionTimeoutRetryDialogComponent } from './connection-timeout-retry-dialog.component'; @@ -39,7 +39,7 @@ describe('ConnectionTimeoutRetryDialogComponent', () => { ], declarations: [ConnectionTimeoutRetryDialogComponent, MatIcon, - MockComponent(ButtonWithSpinnerComponent), + MockComponent(OzgcloudStrokedButtonWithSpinnerComponent), ] }).compileComponents(); diff --git a/goofy-client/libs/ui/src/lib/ui/http-error-dialog/connection-timeout-retry-fail-dialog/connection-timeout-retry-fail-dialog.component.html b/goofy-client/libs/ui/src/lib/ui/http-error-dialog/connection-timeout-retry-fail-dialog/connection-timeout-retry-fail-dialog.component.html index ecf63d818dd0a582175f318a65b57376015ec0c1..1ed9aa8d9592ce723aff768baa88590c2decf9e9 100644 --- a/goofy-client/libs/ui/src/lib/ui/http-error-dialog/connection-timeout-retry-fail-dialog/connection-timeout-retry-fail-dialog.component.html +++ b/goofy-client/libs/ui/src/lib/ui/http-error-dialog/connection-timeout-retry-fail-dialog/connection-timeout-retry-fail-dialog.component.html @@ -33,8 +33,8 @@ Auch nach weiteren Versuchen konnte keine Verbindung aufgebaut werden. <br /> Bitte wenden Sie sich an Ihren Administrator. </p> - <goofy-client-button-with-spinner tabindex="-1" class="button" icon="refresh" text="Reload" data-test-id="reload-button" + <goofy-client-ozgcloud-stroked-button-with-spinner tabindex="-1" class="button" icon="refresh" text="Reload" data-test-id="reload-button" (click)="reload()"> - </goofy-client-button-with-spinner> + </goofy-client-ozgcloud-stroked-button-with-spinner> </mat-dialog-content> </div> diff --git a/goofy-client/libs/ui/src/lib/ui/http-error-dialog/connection-timeout-retry-fail-dialog/connection-timeout-retry-fail-dialog.component.spec.ts b/goofy-client/libs/ui/src/lib/ui/http-error-dialog/connection-timeout-retry-fail-dialog/connection-timeout-retry-fail-dialog.component.spec.ts index 8eb43b66330319132c7e2caacd82cfbcf5373e94..5c5ad0d826fb6b6632907451fffb2b8a8ca815fe 100644 --- a/goofy-client/libs/ui/src/lib/ui/http-error-dialog/connection-timeout-retry-fail-dialog/connection-timeout-retry-fail-dialog.component.spec.ts +++ b/goofy-client/libs/ui/src/lib/ui/http-error-dialog/connection-timeout-retry-fail-dialog/connection-timeout-retry-fail-dialog.component.spec.ts @@ -22,9 +22,9 @@ * unter der Lizenz sind dem Lizenztext zu entnehmen. */ import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { MatDialogModule } from '@angular/material/dialog'; import { MatIcon } from '@angular/material/icon'; -import { MatLegacyDialogModule as MatDialogModule } from '@angular/material/legacy-dialog'; -import { ButtonWithSpinnerComponent } from '@goofy-client/ui'; +import { OzgcloudStrokedButtonWithSpinnerComponent } from '@goofy-client/ui'; import { MockComponent } from 'ng-mocks'; import { ConnectionTimeoutRetryFailDialogComponent } from './connection-timeout-retry-fail-dialog.component'; @@ -39,7 +39,7 @@ describe('ConnectionTimeoutRetryFailDialogComponent', () => { ], declarations: [ConnectionTimeoutRetryFailDialogComponent, MatIcon, - MockComponent(ButtonWithSpinnerComponent) + MockComponent(OzgcloudStrokedButtonWithSpinnerComponent) ] }).compileComponents(); }); diff --git a/goofy-client/libs/ui/src/lib/ui/icon-button-with-spinner/icon-button-with-spinner.component.spec.ts b/goofy-client/libs/ui/src/lib/ui/icon-button-with-spinner/icon-button-with-spinner.component.spec.ts index 6d7d7d5e9f38b2ecc3e7aabe9627e530444fbb2e..421d286dc5f416be5724a339e21fcd8db329dd75 100644 --- a/goofy-client/libs/ui/src/lib/ui/icon-button-with-spinner/icon-button-with-spinner.component.spec.ts +++ b/goofy-client/libs/ui/src/lib/ui/icon-button-with-spinner/icon-button-with-spinner.component.spec.ts @@ -23,9 +23,9 @@ */ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { MatIcon } from '@angular/material/icon'; -import { MatLegacyTooltip as MatTooltip } from '@angular/material/legacy-tooltip'; import { createEmptyStateResource } from '@goofy-client/tech-shared'; import { MockComponent, MockDirective } from 'ng-mocks'; +import { MatTooltipDirective } from '../mattooltip/mattooltip.directive'; import { SpinnerComponent } from '../spinner/spinner.component'; import { IconButtonWithSpinnerComponent } from './icon-button-with-spinner.component'; @@ -41,7 +41,7 @@ describe('IconButtonWithSpinnerComponent', () => { declarations: [ IconButtonWithSpinnerComponent, MatIcon, - MockDirective(MatTooltip), + MockDirective(MatTooltipDirective), MockComponent(SpinnerComponent) ], }) diff --git a/goofy-client/libs/ui/src/lib/ui/mattooltip/mattooltip.directive.spec.ts b/goofy-client/libs/ui/src/lib/ui/mattooltip/mattooltip.directive.spec.ts index 8452e9519798fcfd3e4dd5a02aa4de24b486b252..6ccbe0db7cb07a98b04d907aa9d80911aac1db19 100644 --- a/goofy-client/libs/ui/src/lib/ui/mattooltip/mattooltip.directive.spec.ts +++ b/goofy-client/libs/ui/src/lib/ui/mattooltip/mattooltip.directive.spec.ts @@ -23,33 +23,33 @@ */ import { ElementRef } from '@angular/core'; import faker from '@faker-js/faker'; -import { MattooltipClassDirective, MattooltipDirective, MattooltipDisabledDirective } from './mattooltip.directive'; +import { MatTooltipClassDirective, MatTooltipDirective, MatTooltipDisabledDirective } from './mattooltip.directive'; describe('MatToolTip Directives', () => { - describe('MattooltipDirective', () => { + describe('MatTooltipDirective', () => { const el: ElementRef = <ElementRef>{}; const tooltipText: string = faker.lorem.text(); it('should create an instance', () => { - const directive = new MattooltipDirective(el); + const directive = new MatTooltipDirective(el); expect(directive).toBeTruthy(); }); }); - describe('MattooltipDisabledDirective', () => { + describe('MatTooltipDisabledDirective', () => { const el: ElementRef = <ElementRef>{}; it('should create an instance', () => { - const directive = new MattooltipDisabledDirective(el); + const directive = new MatTooltipDisabledDirective(el); expect(directive).toBeTruthy(); }); }); - describe('MattooltipClassDirective', () => { + describe('MatTooltipClassDirective', () => { it('should create an instance', () => { - const directive = new MattooltipClassDirective(); + const directive = new MatTooltipClassDirective(); expect(directive).toBeTruthy(); }); }); diff --git a/goofy-client/libs/ui/src/lib/ui/mattooltip/mattooltip.directive.ts b/goofy-client/libs/ui/src/lib/ui/mattooltip/mattooltip.directive.ts index 365a939c485fef4a5d3f54aa5feb4e9fa544b2b6..c50919e90effa9feb006cf878220ca2512691250 100644 --- a/goofy-client/libs/ui/src/lib/ui/mattooltip/mattooltip.directive.ts +++ b/goofy-client/libs/ui/src/lib/ui/mattooltip/mattooltip.directive.ts @@ -40,7 +40,7 @@ const ariaDescribedBy: string = 'aria-describedby' @Directive({ selector: '[matTooltip]' }) -export class MattooltipDirective implements OnChanges { +export class MatTooltipDirective implements OnChanges { @Input() matTooltip: string = EMPTY_STRING; constructor(private el: ElementRef) { } @@ -54,7 +54,7 @@ export class MattooltipDirective implements OnChanges { @Directive({ selector: '[matTooltipDisabled]' }) -export class MattooltipDisabledDirective implements OnInit { +export class MatTooltipDisabledDirective implements OnInit { @Input() matTooltipDisabled: boolean = false; constructor(private el: ElementRef) { } @@ -70,6 +70,6 @@ export class MattooltipDisabledDirective implements OnInit { @Directive({ selector: '[matTooltipClass]' }) -export class MattooltipClassDirective { +export class MatTooltipClassDirective { @Input() matTooltipClass: string = EMPTY_STRING; } diff --git a/goofy-client/libs/ui/src/lib/ui/notification/internal-server-error-dialog/_internal-server-error-dialog.theme.scss b/goofy-client/libs/ui/src/lib/ui/notification/internal-server-error-dialog/_internal-server-error-dialog.theme.scss deleted file mode 100644 index 3539f7b821bf6550a5fe1736e444cdfabfc2da5e..0000000000000000000000000000000000000000 --- a/goofy-client/libs/ui/src/lib/ui/notification/internal-server-error-dialog/_internal-server-error-dialog.theme.scss +++ /dev/null @@ -1,34 +0,0 @@ -/** - * 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. - */ -@use 'sass:map'; -@use '@angular/material' as mat; - -@mixin internal-server-error-dialog($theme) { - $color-config: mat.get-color-config($theme); - $primary-palette: map.get($color-config, 'primary'); - - .notification-dialog h2 { - color: mat.get-color-from-palette($primary-palette); - } -} diff --git a/goofy-client/libs/ui/src/lib/ui/notification/internal-server-error-dialog/internal-server-error-dialog.component.html b/goofy-client/libs/ui/src/lib/ui/notification/internal-server-error-dialog/internal-server-error-dialog.component.html index e3283c405dc92aba0093ad430c5e064cae7592cb..f3a1798b807c85dfabd1b8d2cdc7250708f2b480 100644 --- a/goofy-client/libs/ui/src/lib/ui/notification/internal-server-error-dialog/internal-server-error-dialog.component.html +++ b/goofy-client/libs/ui/src/lib/ui/notification/internal-server-error-dialog/internal-server-error-dialog.component.html @@ -23,18 +23,18 @@ unter der Lizenz sind dem Lizenztext zu entnehmen. --> -<h2 mat-dialog-title> +<h1 mat-dialog-title> <mat-icon data-test-id="error-icon">error_outline</mat-icon> <span data-test-id="error-header">Es ist ein Fehler aufgetreten ...</span> -</h2> +</h1> <mat-dialog-content> - <p data-test-id="error-message"> + <p data-test-id="error-message" class="error-message"> Wir sind nicht ganz sicher, was schiefgelaufen ist. Der Fehler <span *ngIf="showId()">(ID: {{ data.issues[0].exceptionId }})</span> wurde unserem Support gemeldet. Bitte starten sie die Anwendung neu. </p> <a href="/" tabindex="-1" class="button"> - <goofy-client-button-with-spinner icon="refresh" text="Neu starten"></goofy-client-button-with-spinner> + <goofy-client-ozgcloud-stroked-button-with-spinner icon="refresh" text="Neu starten"></goofy-client-ozgcloud-stroked-button-with-spinner> </a> - <goofy-client-button-with-spinner icon="logout" text="Abmelden" data-test-id="logout-button" + <goofy-client-ozgcloud-stroked-button-with-spinner icon="logout" text="Abmelden" data-test-id="logout-button" (clickEmitter)="authService.logOut()"> - </goofy-client-button-with-spinner> + </goofy-client-ozgcloud-stroked-button-with-spinner> </mat-dialog-content> diff --git a/goofy-client/libs/ui/src/lib/ui/notification/internal-server-error-dialog/internal-server-error-dialog.component.scss b/goofy-client/libs/ui/src/lib/ui/notification/internal-server-error-dialog/internal-server-error-dialog.component.scss index 0dbb306201edf485d9c534ea274dfd20d7571c2e..b7646cc7feccde2cf346600e7d2fdd609afd84b0 100644 --- a/goofy-client/libs/ui/src/lib/ui/notification/internal-server-error-dialog/internal-server-error-dialog.component.scss +++ b/goofy-client/libs/ui/src/lib/ui/notification/internal-server-error-dialog/internal-server-error-dialog.component.scss @@ -21,9 +21,7 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -h2 { - font-weight: normal; - font-size: 24px; +h1 { display: flex; align-items: center; @@ -38,3 +36,7 @@ h2 { .button { margin-right: 16px; } + +.error-message { + margin-bottom: 20px; +} diff --git a/goofy-client/libs/ui/src/lib/ui/notification/internal-server-error-dialog/internal-server-error-dialog.component.spec.ts b/goofy-client/libs/ui/src/lib/ui/notification/internal-server-error-dialog/internal-server-error-dialog.component.spec.ts index 4ddfaaed557ab6450f36c2de2434423eb1a3f87f..6c1c32e1032b7a42194a2b69cfd9c515c98cf82d 100644 --- a/goofy-client/libs/ui/src/lib/ui/notification/internal-server-error-dialog/internal-server-error-dialog.component.spec.ts +++ b/goofy-client/libs/ui/src/lib/ui/notification/internal-server-error-dialog/internal-server-error-dialog.component.spec.ts @@ -22,11 +22,11 @@ * unter der Lizenz sind dem Lizenztext zu entnehmen. */ import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog'; import { MatIcon } from '@angular/material/icon'; -import { MatLegacyDialogModule as MatDialogModule, MatLegacyDialogRef as MatDialogRef, MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog'; import { faker } from '@faker-js/faker'; import { mock } from '@goofy-client/test-utils'; -import { ButtonWithSpinnerComponent } from '@goofy-client/ui'; +import { OzgcloudStrokedButtonWithSpinnerComponent } from '@goofy-client/ui'; import { OAuthService } from 'angular-oauth2-oidc'; import { createIssue } from 'libs/tech-shared/test/error'; import { MockComponent } from 'ng-mocks'; @@ -43,7 +43,7 @@ describe('InternalServerErrorDialogComponent', () => { declarations: [ InternalServerErrorDialogComponent, MatIcon, - MockComponent(ButtonWithSpinnerComponent) + MockComponent(OzgcloudStrokedButtonWithSpinnerComponent) ], imports: [ MatDialogModule diff --git a/goofy-client/libs/ui/src/lib/ui/notification/internal-server-error-dialog/internal-server-error-dialog.component.ts b/goofy-client/libs/ui/src/lib/ui/notification/internal-server-error-dialog/internal-server-error-dialog.component.ts index 8c5b4e42ed426729be271f250391de19ec3135a5..e20668a46c1f492a8f76c0688e8c9b515c5dd3b8 100644 --- a/goofy-client/libs/ui/src/lib/ui/notification/internal-server-error-dialog/internal-server-error-dialog.component.ts +++ b/goofy-client/libs/ui/src/lib/ui/notification/internal-server-error-dialog/internal-server-error-dialog.component.ts @@ -22,7 +22,7 @@ * unter der Lizenz sind dem Lizenztext zu entnehmen. */ import { Component, Inject } from '@angular/core'; -import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog'; +import { MAT_DIALOG_DATA } from '@angular/material/dialog'; import { ApiError, hasExceptionId } from '@goofy-client/tech-shared'; import { OAuthService } from 'angular-oauth2-oidc'; diff --git a/goofy-client/libs/ui/src/lib/ui/open-url-button/open-url-button.component.scss b/goofy-client/libs/ui/src/lib/ui/open-url-button/open-url-button.component.scss index 98401b64e76f6868738a7262770a075ab9273fe9..0a99fb3418e543df0aec2bb285645dded123f24a 100644 --- a/goofy-client/libs/ui/src/lib/ui/open-url-button/open-url-button.component.scss +++ b/goofy-client/libs/ui/src/lib/ui/open-url-button/open-url-button.component.scss @@ -1,5 +1,3 @@ -$leftMargin: 8px; - -span { - margin-left: $leftMargin; +a { + padding: 0 15px; } \ No newline at end of file diff --git a/goofy-client/libs/ui/src/lib/ui/button-with-spinner/button-with-spinner.component.html b/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-button-with-spinner/ozgcloud-button-with-spinner.component.html similarity index 69% rename from goofy-client/libs/ui/src/lib/ui/button-with-spinner/button-with-spinner.component.html rename to goofy-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-button-with-spinner/ozgcloud-button-with-spinner.component.html index e183fdff7348f2b073d992d60c492764dd383feb..a061fc0449b87e6fa426617c7a12ced56579818b 100644 --- a/goofy-client/libs/ui/src/lib/ui/button-with-spinner/button-with-spinner.component.html +++ b/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-button-with-spinner/ozgcloud-button-with-spinner.component.html @@ -29,24 +29,15 @@ [disabled]="isDisabled" [matTooltip]="toolTip" [class.with-text]="text" - [class.mat-stroked-button]="strokedButton" (click)="clickEmitter.emit($event)"> - <mat-icon *ngIf="icon" data-test-class="icon" - [style.visibility]="isDisabled ? 'hidden' : 'visible'"> - {{ icon }} - </mat-icon> - - <mat-icon *ngIf="svgIcon" data-test-class="icon" - [svgIcon]="svgIcon" - [style.visibility]="isDisabled ? 'hidden' : 'visible'"> - </mat-icon> - - <span *ngIf="text" data-test-class="button-with-spinner-text">{{ text }}</span> - - <goofy-client-spinner - [diameter]="22" padding="0" - [stateResource]="getStateResource()" [show]="showSpinner"> - </goofy-client-spinner> + <goofy-client-ozgcloud-button-content + [icon]="icon" + [svgIcon]="svgIcon" + [text]="text" + [stateResource]="stateResource" + [showSpinner]="showSpinner" + [isDisabled]="isDisabled" + ></goofy-client-ozgcloud-button-content> </button> diff --git a/goofy-client/apps/goofy-e2e/src/support/delete-old-reports.ts b/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-button-with-spinner/ozgcloud-button-with-spinner.component.scss similarity index 89% rename from goofy-client/apps/goofy-e2e/src/support/delete-old-reports.ts rename to goofy-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-button-with-spinner/ozgcloud-button-with-spinner.component.scss index 3a7e7d5170a0d442ac2272f1082c2f440ada2ca4..8069fed25cd27089f993e6233b46148263192a6e 100644 --- a/goofy-client/apps/goofy-e2e/src/support/delete-old-reports.ts +++ b/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-button-with-spinner/ozgcloud-button-with-spinner.component.scss @@ -1,4 +1,4 @@ -/* +/** * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den * Ministerpräsidenten des Landes Schleswig-Holstein * Staatskanzlei @@ -21,6 +21,11 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -const fs = require('fs') - -fs.rmdirSync(`apps/goofy-e2e/reports/${process.env.REPORT_FOLDER}`, { recursive: true }); \ No newline at end of file +button { + min-width: 36px; + min-height: 36px; + padding: 0; + &.with-text { + padding: 0 15px; + } +} \ No newline at end of file diff --git a/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-button-with-spinner/ozgcloud-button-with-spinner.component.spec.ts b/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-button-with-spinner/ozgcloud-button-with-spinner.component.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..1ded0801c248b23436378f817c58cecb18679d50 --- /dev/null +++ b/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-button-with-spinner/ozgcloud-button-with-spinner.component.spec.ts @@ -0,0 +1,161 @@ +/* + * 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. + */ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { MatButton } from '@angular/material/button'; +import { MatRipple } from '@angular/material/core'; +import { createCommandResource } from 'libs/command-shared/test/command'; +import { getDataTestClassOf } from 'libs/tech-shared/test/data-test'; +import { MatTooltipDirective } from 'libs/ui/src/lib/ui/mattooltip/mattooltip.directive'; +import { MockComponent } from 'ng-mocks'; +import { OzgcloudButtonContentComponent } from '../shared/ozgcloud-button-content/ozgcloud-button-content.component'; +import { OzgcloudButtonWithSpinnerComponent } from './ozgcloud-button-with-spinner.component'; + +import * as ResourceUtils from 'libs/tech-shared/src/lib/resource/resource.util'; + +describe('OzgcloudButtonWithSpinnerComponent', () => { + let component: OzgcloudButtonWithSpinnerComponent; + let fixture: ComponentFixture<OzgcloudButtonWithSpinnerComponent>; + + const buttonSelector: string = getDataTestClassOf('icon-button'); + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ + MatButton, + MatRipple, + OzgcloudButtonWithSpinnerComponent, + MatTooltipDirective, + MockComponent(OzgcloudButtonContentComponent) + ] + }).compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(OzgcloudButtonWithSpinnerComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + describe('isDisabled', () => { + it('should return true if showSpinner is true and stateResource is loading', () => { + component.showSpinner = true; + component.stateResource.loading = true; + + const result: boolean = component.isDisabled; + + expect(result).toBeTruthy(); + }) + + it('should return true if showSpinner is false and stateResource is loading', () => { + component.showSpinner = false; + component.stateResource.loading = true; + + const result: boolean = component.isDisabled; + + expect(result).toBeTruthy(); + }) + + it('should return true if showSpinner is true and stateResource is not loading', () => { + component.showSpinner = true; + component.stateResource.loading = false; + + const result: boolean = component.isDisabled; + + expect(result).toBeTruthy(); + }) + + it('should return false if showSpinner is false and stateResource is not loading', () => { + component.showSpinner = false; + component.stateResource.loading = false; + + const result: boolean = component.isDisabled; + + expect(result).toBeFalsy(); + }) + }) + + describe('ngOnInit', () => { + it('should call getStateResource()', () => { + component.getStateResource = jest.fn(); + + component.ngOnInit(); + + expect(component.getStateResource).toHaveBeenCalled(); + }) + }) + + describe('getStateResource', () => { + it('should call createEmptyStateResource if stateResource is undefined', () => { + const spy = jest.spyOn(ResourceUtils, 'createEmptyStateResource'); + component.stateResource = undefined; + + component.getStateResource(); + + expect(spy).toHaveBeenCalled(); + }) + + it('should call createEmptyStateResource if stateResource is null', () => { + const spy = jest.spyOn(ResourceUtils, 'createEmptyStateResource'); + component.stateResource = null; + + component.getStateResource(); + + expect(spy).toHaveBeenCalled(); + }) + + it('should return non empty stateResource', () => { + component.stateResource = ResourceUtils.createStateResource(createCommandResource()); + + component.getStateResource(); + + const valid: boolean = ResourceUtils.isValidStateResouce(component.stateResource); + expect(valid).toBeTruthy(); + }) + }) + + describe('Button', () => { + + it('should NOT be disabled initialy', () => { + component.stateResource = ResourceUtils.createEmptyStateResource(); + fixture.detectChanges(); + + const button = fixture.nativeElement.querySelector(buttonSelector); + + expect(button).not.toBeDisabled() + }); + + it('should be disabled if loading', () => { + component.stateResource = ResourceUtils.createEmptyStateResource(true); + fixture.detectChanges(); + + const button = fixture.nativeElement.querySelector(buttonSelector); + + expect(button).toBeDisabled(); + }); + }) +}); \ No newline at end of file diff --git a/goofy-client/libs/ui/src/lib/ui/button-with-spinner/button-with-spinner.component.ts b/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-button-with-spinner/ozgcloud-button-with-spinner.component.ts similarity index 79% rename from goofy-client/libs/ui/src/lib/ui/button-with-spinner/button-with-spinner.component.ts rename to goofy-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-button-with-spinner/ozgcloud-button-with-spinner.component.ts index 810babe14b3e6ebd2e4c7ec1571a822cc2c22a58..3ce63acc1803e4c9b1d2719a81e46607e01a1cfc 100644 --- a/goofy-client/libs/ui/src/lib/ui/button-with-spinner/button-with-spinner.component.ts +++ b/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-button-with-spinner/ozgcloud-button-with-spinner.component.ts @@ -21,17 +21,17 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -import { Component, EventEmitter, Input, Output } from '@angular/core'; +import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; import { StateResource, createEmptyStateResource } from '@goofy-client/tech-shared'; import { Resource } from '@ngxp/rest'; import { isNil } from 'lodash-es'; @Component({ - selector: 'goofy-client-button-with-spinner', - templateUrl: './button-with-spinner.component.html', - styleUrls: ['./button-with-spinner.component.scss'] + selector: 'goofy-client-ozgcloud-button-with-spinner', + templateUrl: './ozgcloud-button-with-spinner.component.html', + styleUrls: ['./ozgcloud-button-with-spinner.component.scss'] }) -export class ButtonWithSpinnerComponent { +export class OzgcloudButtonWithSpinnerComponent implements OnInit { @Input() icon: string; @Input() svgIcon: string; @@ -42,12 +42,15 @@ export class ButtonWithSpinnerComponent { @Input() toolTip: string = ''; @Input() dataTestId: string; @Input() showSpinner: boolean = false; - @Input() strokedButton: boolean = true; @Output() public clickEmitter: EventEmitter<MouseEvent> = new EventEmitter<MouseEvent>(); get isDisabled(): boolean { - return this.showSpinner || this.getStateResource().loading; + return this.showSpinner || this.stateResource.loading; + } + + ngOnInit(): void { + this.stateResource = this.getStateResource(); } getStateResource(): StateResource<Resource> { diff --git a/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-stroked-button-with-spinner/ozgcloud-stroked-button-with-spinner.component.html b/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-stroked-button-with-spinner/ozgcloud-stroked-button-with-spinner.component.html new file mode 100644 index 0000000000000000000000000000000000000000..3c2cb884f7837cf3855ef68c300b26a85ac89079 --- /dev/null +++ b/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-stroked-button-with-spinner/ozgcloud-stroked-button-with-spinner.component.html @@ -0,0 +1,43 @@ +<!-- + + 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. + +--> +<button mat-stroked-button data-test-class="icon-button" [attr.data-test-id]="dataTestId" + [color]="color" + [type]="type" + [disabled]="isDisabled" + [matTooltip]="toolTip" + [class.with-text]="text" + (click)="clickEmitter.emit($event)"> + + <goofy-client-ozgcloud-button-content + [icon]="icon" + [svgIcon]="svgIcon" + [text]="text" + [stateResource]="stateResource" + [showSpinner]="showSpinner" + [isDisabled]="isDisabled" + ></goofy-client-ozgcloud-button-content> + +</button> diff --git a/goofy-client/libs/ui/src/lib/ui/button-with-spinner/button-with-spinner.component.scss b/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-stroked-button-with-spinner/ozgcloud-stroked-button-with-spinner.component.scss similarity index 82% rename from goofy-client/libs/ui/src/lib/ui/button-with-spinner/button-with-spinner.component.scss rename to goofy-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-stroked-button-with-spinner/ozgcloud-stroked-button-with-spinner.component.scss index c4dea65393834200633b2be7c9f6830aa32446fa..8069fed25cd27089f993e6233b46148263192a6e 100644 --- a/goofy-client/libs/ui/src/lib/ui/button-with-spinner/button-with-spinner.component.scss +++ b/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-stroked-button-with-spinner/ozgcloud-stroked-button-with-spinner.component.scss @@ -21,23 +21,6 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -$leftMargin: 8px; - -span { - margin-left: $leftMargin; -} - -goofy-client-spinner { - position: absolute; - top: 0; - left: $leftMargin; - display: flex; - height: 100%; - width: 100%; - justify-content: flex-start; - align-items: center; -} - button { min-width: 36px; min-height: 36px; diff --git a/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-stroked-button-with-spinner/ozgcloud-stroked-button-with-spinner.component.spec.ts b/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-stroked-button-with-spinner/ozgcloud-stroked-button-with-spinner.component.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..d0ef6e5df6a0779a2b7d29ff87ac26863229c978 --- /dev/null +++ b/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-stroked-button-with-spinner/ozgcloud-stroked-button-with-spinner.component.spec.ts @@ -0,0 +1,161 @@ +/* + * 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. + */ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { MatButton } from '@angular/material/button'; +import { MatRipple } from '@angular/material/core'; +import { createCommandResource } from 'libs/command-shared/test/command'; +import { getDataTestClassOf } from 'libs/tech-shared/test/data-test'; +import { MatTooltipDirective } from 'libs/ui/src/lib/ui/mattooltip/mattooltip.directive'; +import { MockComponent } from 'ng-mocks'; +import { OzgcloudButtonContentComponent } from '../shared/ozgcloud-button-content/ozgcloud-button-content.component'; +import { OzgcloudStrokedButtonWithSpinnerComponent } from './ozgcloud-stroked-button-with-spinner.component'; + +import * as ResourceUtils from 'libs/tech-shared/src/lib/resource/resource.util'; + +describe('OzgcloudStrokedButtonWithSpinnerComponent', () => { + let component: OzgcloudStrokedButtonWithSpinnerComponent; + let fixture: ComponentFixture<OzgcloudStrokedButtonWithSpinnerComponent>; + + const buttonSelector: string = getDataTestClassOf('icon-button'); + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ + MatButton, + MatRipple, + OzgcloudStrokedButtonWithSpinnerComponent, + MatTooltipDirective, + MockComponent(OzgcloudButtonContentComponent) + ] + }).compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(OzgcloudStrokedButtonWithSpinnerComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + describe('isDisabled', () => { + it('should return true if showSpinner is true and stateResource is loading', () => { + component.showSpinner = true; + component.stateResource.loading = true; + + const result: boolean = component.isDisabled; + + expect(result).toBeTruthy(); + }) + + it('should return true if showSpinner is false and stateResource is loading', () => { + component.showSpinner = false; + component.stateResource.loading = true; + + const result: boolean = component.isDisabled; + + expect(result).toBeTruthy(); + }) + + it('should return true if showSpinner is true and stateResource is not loading', () => { + component.showSpinner = true; + component.stateResource.loading = false; + + const result: boolean = component.isDisabled; + + expect(result).toBeTruthy(); + }) + + it('should return false if showSpinner is false and stateResource is not loading', () => { + component.showSpinner = false; + component.stateResource.loading = false; + + const result: boolean = component.isDisabled; + + expect(result).toBeFalsy(); + }) + }) + + describe('ngOnInit', () => { + it('should call getStateResource()', () => { + component.getStateResource = jest.fn(); + + component.ngOnInit(); + + expect(component.getStateResource).toHaveBeenCalled(); + }) + }) + + describe('getStateResource', () => { + it('should call createEmptyStateResource if stateResource is undefined', () => { + const spy = jest.spyOn(ResourceUtils, 'createEmptyStateResource'); + component.stateResource = undefined; + + component.getStateResource(); + + expect(spy).toHaveBeenCalled(); + }) + + it('should call createEmptyStateResource if stateResource is null', () => { + const spy = jest.spyOn(ResourceUtils, 'createEmptyStateResource'); + component.stateResource = null; + + component.getStateResource(); + + expect(spy).toHaveBeenCalled(); + }) + + it('should return non empty stateResource', () => { + component.stateResource = ResourceUtils.createStateResource(createCommandResource()); + + component.getStateResource(); + + const valid: boolean = ResourceUtils.isValidStateResouce(component.stateResource); + expect(valid).toBeTruthy(); + }) + }) + + describe('Button', () => { + + it('should NOT be disabled initialy', () => { + component.stateResource = ResourceUtils.createEmptyStateResource(); + fixture.detectChanges(); + + const button = fixture.nativeElement.querySelector(buttonSelector); + + expect(button).not.toBeDisabled() + }); + + it('should be disabled if loading', () => { + component.stateResource = ResourceUtils.createEmptyStateResource(true); + fixture.detectChanges(); + + const button = fixture.nativeElement.querySelector(buttonSelector); + + expect(button).toBeDisabled(); + }); + }) +}); \ No newline at end of file diff --git a/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-stroked-button-with-spinner/ozgcloud-stroked-button-with-spinner.component.ts b/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-stroked-button-with-spinner/ozgcloud-stroked-button-with-spinner.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..1fe4fe73ee15ba3c1274f2526face4722851021d --- /dev/null +++ b/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/ozgcloud-stroked-button-with-spinner/ozgcloud-stroked-button-with-spinner.component.ts @@ -0,0 +1,60 @@ +/* + * 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. + */ +import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; +import { StateResource, createEmptyStateResource } from '@goofy-client/tech-shared'; +import { Resource } from '@ngxp/rest'; +import { isNil } from 'lodash-es'; + +@Component({ + selector: 'goofy-client-ozgcloud-stroked-button-with-spinner', + templateUrl: './ozgcloud-stroked-button-with-spinner.component.html', + styleUrls: ['./ozgcloud-stroked-button-with-spinner.component.scss'] +}) +export class OzgcloudStrokedButtonWithSpinnerComponent implements OnInit { + + @Input() icon: string; + @Input() svgIcon: string; + @Input() text: string; + @Input() stateResource: StateResource<Resource>; + @Input() color: string = 'primary'; + @Input() type: 'button' | 'submit' = 'button'; + @Input() toolTip: string = ''; + @Input() dataTestId: string; + @Input() showSpinner: boolean = false; + @Input() strokedButton: boolean = true; + + @Output() public clickEmitter: EventEmitter<MouseEvent> = new EventEmitter<MouseEvent>(); + + get isDisabled(): boolean { + return this.showSpinner || this.stateResource.loading; + } + + ngOnInit(): void { + this.stateResource = this.getStateResource(); + } + + getStateResource(): StateResource<Resource> { + return isNil(this.stateResource) ? createEmptyStateResource<Resource>() : this.stateResource; + } +} \ No newline at end of file diff --git a/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/shared/ozgcloud-button-content/ozgcloud-button-content.component.html b/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/shared/ozgcloud-button-content/ozgcloud-button-content.component.html new file mode 100644 index 0000000000000000000000000000000000000000..574caa535e6bd04080e6d0ea850b7c2caea9e261 --- /dev/null +++ b/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/shared/ozgcloud-button-content/ozgcloud-button-content.component.html @@ -0,0 +1,17 @@ +<mat-icon *ngIf="icon" data-test-class="icon" + [style.visibility]="isDisabled ? 'hidden' : 'visible'"> + {{ icon }} +</mat-icon> + +<mat-icon *ngIf="svgIcon" data-test-class="icon" + [svgIcon]="svgIcon" + [style.visibility]="isDisabled ? 'hidden' : 'visible'"> +</mat-icon> + +<span *ngIf="text" data-test-class="button-with-spinner-text">{{ text }}</span> + +<goofy-client-spinner + [diameter]="22" padding="0" + [stateResource]="stateResource" + [show]="showSpinner"> +</goofy-client-spinner> \ No newline at end of file diff --git a/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/shared/ozgcloud-button-content/ozgcloud-button-content.component.scss b/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/shared/ozgcloud-button-content/ozgcloud-button-content.component.scss new file mode 100644 index 0000000000000000000000000000000000000000..51ca9b238141c180a3662adeea18b850acd71d28 --- /dev/null +++ b/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/shared/ozgcloud-button-content/ozgcloud-button-content.component.scss @@ -0,0 +1,22 @@ +$leftMargin: 8px; + +:host { + display: flex; + align-items: center; + justify-content: center; +} + +span { + margin-left: $leftMargin; +} + +goofy-client-spinner { + position: absolute; + top: 0; + display: flex; + height: 100%; + width: 100%; + justify-content: flex-start; + align-items: center; +} + diff --git a/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/shared/ozgcloud-button-content/ozgcloud-button-content.component.spec.ts b/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/shared/ozgcloud-button-content/ozgcloud-button-content.component.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..dcec09dddd50d60748ba045794ac94b4c3a72060 --- /dev/null +++ b/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/shared/ozgcloud-button-content/ozgcloud-button-content.component.spec.ts @@ -0,0 +1,79 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { MatIcon } from '@angular/material/icon'; +import { getDataTestClassOf } from 'libs/tech-shared/test/data-test'; +import { MockComponent } from 'ng-mocks'; +import { SpinnerComponent } from '../../../spinner/spinner.component'; +import { OzgcloudButtonContentComponent } from './ozgcloud-button-content.component'; + +describe('OzgcloudButtonContentComponent', () => { + let component: OzgcloudButtonContentComponent; + let fixture: ComponentFixture<OzgcloudButtonContentComponent>; + + const iconSelector: string = getDataTestClassOf('icon'); + const text: string = getDataTestClassOf('button-with-spinner-text'); + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ + MatIcon, + MockComponent(SpinnerComponent), + OzgcloudButtonContentComponent + ], + }).compileComponents(); + + fixture = TestBed.createComponent(OzgcloudButtonContentComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + describe('Icon', () => { + + beforeEach(() => { + component.icon = 'add'; + }) + + it('should be visible', () => { + component.isDisabled = false; + fixture.detectChanges(); + + const icon = fixture.nativeElement.querySelector(iconSelector); + + expect(icon).toBeVisible(); + }); + + it('should not be visible', () => { + component.isDisabled = true; + fixture.detectChanges(); + + const icon = fixture.nativeElement.querySelector(iconSelector); + + expect(icon).not.toBeVisible(); + }); + }) + + describe('Text', () => { + + it('should be visible if exist', () => { + component.text = 'Test text'; + fixture.detectChanges(); + + const textElement = fixture.nativeElement.querySelector(text); + + expect(textElement).toBeInTheDocument(); + }); + + it('should not be visible if is null', () => { + component.text = null; + fixture.detectChanges(); + + const textElement = fixture.nativeElement.querySelector(text); + + expect(textElement).not.toBeInTheDocument(); + }); + }) + +}); diff --git a/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/shared/ozgcloud-button-content/ozgcloud-button-content.component.ts b/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/shared/ozgcloud-button-content/ozgcloud-button-content.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..4a7c57ed021b3396fa0bb3483e618367a6309ea6 --- /dev/null +++ b/goofy-client/libs/ui/src/lib/ui/ozgcloud-button/shared/ozgcloud-button-content/ozgcloud-button-content.component.ts @@ -0,0 +1,19 @@ +import { Component, Input } from '@angular/core'; +import { StateResource } from '@goofy-client/tech-shared'; +import { Resource } from '@ngxp/rest'; + +@Component({ + selector: 'goofy-client-ozgcloud-button-content', + templateUrl: './ozgcloud-button-content.component.html', + styleUrls: ['./ozgcloud-button-content.component.scss'], +}) +export class OzgcloudButtonContentComponent { + + @Input() icon: string; + @Input() svgIcon: string; + @Input() text: string; + @Input() stateResource: StateResource<Resource>; + @Input() showSpinner: boolean = false; + @Input() isDisabled: boolean = false; + +} diff --git a/goofy-client/libs/ui/src/lib/ui/ozgcloud-icon/ozgcloud-icon.component.scss b/goofy-client/libs/ui/src/lib/ui/ozgcloud-icon/ozgcloud-icon.component.scss index d981d714ce1489424fa764faa69d7e6e8f462791..95f1adbcfaa0000d68178e5b675f9c768cc3146c 100644 --- a/goofy-client/libs/ui/src/lib/ui/ozgcloud-icon/ozgcloud-icon.component.scss +++ b/goofy-client/libs/ui/src/lib/ui/ozgcloud-icon/ozgcloud-icon.component.scss @@ -1,8 +1,6 @@ -:host { - vertical-align: initial !important; -} +@import 'variables'; -mat-icon { +:host { display: inline-block; - vertical-align: middle; -} + height: $iconHeight; +} \ No newline at end of file diff --git a/goofy-client/libs/ui/src/lib/ui/ozgcloud-menu/ozgcloud-menu.component.scss b/goofy-client/libs/ui/src/lib/ui/ozgcloud-menu/ozgcloud-menu.component.scss index e3fe170bf2dd173f7dbe7998a7510ac492d857f1..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 --- a/goofy-client/libs/ui/src/lib/ui/ozgcloud-menu/ozgcloud-menu.component.scss +++ b/goofy-client/libs/ui/src/lib/ui/ozgcloud-menu/ozgcloud-menu.component.scss @@ -1,6 +0,0 @@ -::ng-deep { - .mat-menu-panel.menu { - max-width: 350px; - background-color: #fafafa; - } -} \ No newline at end of file diff --git a/goofy-client/libs/ui/src/lib/ui/ozgcloud-menu/ozgcloud-menu.component.spec.ts b/goofy-client/libs/ui/src/lib/ui/ozgcloud-menu/ozgcloud-menu.component.spec.ts index fae42566896908052b5abb309f9961da2e5bd6fc..d2a8dbed4d5ccc6c6531fc8b7369b511d08645a8 100644 --- a/goofy-client/libs/ui/src/lib/ui/ozgcloud-menu/ozgcloud-menu.component.spec.ts +++ b/goofy-client/libs/ui/src/lib/ui/ozgcloud-menu/ozgcloud-menu.component.spec.ts @@ -1,5 +1,5 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { MatLegacyMenuModule as MatMenuModule } from '@angular/material/legacy-menu'; +import { MatMenuModule } from '@angular/material/menu'; import { OzgcloudMenuComponent } from './ozgcloud-menu.component'; describe('OzgcloudMenuComponent', () => { diff --git a/goofy-client/libs/ui/src/lib/ui/ozgcloud-menu/ozgcloud-menu.component.ts b/goofy-client/libs/ui/src/lib/ui/ozgcloud-menu/ozgcloud-menu.component.ts index 047d29ad006d13abc475f6ba22b5b339f5010690..e634603a692352e7f9fceb09217996625777b1c1 100644 --- a/goofy-client/libs/ui/src/lib/ui/ozgcloud-menu/ozgcloud-menu.component.ts +++ b/goofy-client/libs/ui/src/lib/ui/ozgcloud-menu/ozgcloud-menu.component.ts @@ -1,5 +1,5 @@ import { Component, ViewChild } from '@angular/core'; -import { MatLegacyMenu as MatMenu } from '@angular/material/legacy-menu'; +import { MatMenu } from '@angular/material/menu'; @Component({ selector: 'goofy-client-ozgcloud-menu', diff --git a/goofy-client/libs/ui/src/lib/ui/progress-bar/progress-bar.component.spec.ts b/goofy-client/libs/ui/src/lib/ui/progress-bar/progress-bar.component.spec.ts index b8f81df666f3c762e9007e378adeee09f82ff489..7f6ae1de86bfe2c0bbc182b3280daec48805a4f5 100644 --- a/goofy-client/libs/ui/src/lib/ui/progress-bar/progress-bar.component.spec.ts +++ b/goofy-client/libs/ui/src/lib/ui/progress-bar/progress-bar.component.spec.ts @@ -22,7 +22,7 @@ * unter der Lizenz sind dem Lizenztext zu entnehmen. */ import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { MatLegacyProgressBar as MatProgressBar } from '@angular/material/legacy-progress-bar'; +import { MatProgressBar } from '@angular/material/progress-bar'; import { createEmptyStateResource } from '@goofy-client/tech-shared'; import { ProgressBarComponent } from './progress-bar.component'; diff --git a/goofy-client/libs/ui/src/lib/ui/slide-toggle/slide-toggle.component.spec.ts b/goofy-client/libs/ui/src/lib/ui/slide-toggle/slide-toggle.component.spec.ts index 73e42ba20a84b0af673e748fe5269c7c20b71765..108c2d62672dc5532d278e7df93efe194a898771 100644 --- a/goofy-client/libs/ui/src/lib/ui/slide-toggle/slide-toggle.component.spec.ts +++ b/goofy-client/libs/ui/src/lib/ui/slide-toggle/slide-toggle.component.spec.ts @@ -23,8 +23,8 @@ */ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { MatRippleModule } from '@angular/material/core'; -import { MatLegacySlideToggle as MatSlideToggle } from '@angular/material/legacy-slide-toggle'; -import { MattooltipDirective } from 'libs/ui/src/lib/ui/mattooltip/mattooltip.directive'; +import { MatSlideToggle } from '@angular/material/slide-toggle'; +import { MatTooltipDirective } from 'libs/ui/src/lib/ui/mattooltip/mattooltip.directive'; import { SlideToggleComponent } from './slide-toggle.component'; describe('SlideToggleComponent', () => { @@ -38,7 +38,7 @@ describe('SlideToggleComponent', () => { ], declarations: [ SlideToggleComponent, - MattooltipDirective, + MatTooltipDirective, MatSlideToggle ], }).compileComponents(); diff --git a/goofy-client/libs/ui/src/lib/ui/spinner/spinner.component.spec.ts b/goofy-client/libs/ui/src/lib/ui/spinner/spinner.component.spec.ts index 3eb0ac268d79cabdd6b288fd2d929e82b344f261..bee8cfbc41884d1e0761b218ab181ca051434c0d 100644 --- a/goofy-client/libs/ui/src/lib/ui/spinner/spinner.component.spec.ts +++ b/goofy-client/libs/ui/src/lib/ui/spinner/spinner.component.spec.ts @@ -23,7 +23,7 @@ */ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { MatIcon } from '@angular/material/icon'; -import { MatLegacySpinner as MatSpinner } from '@angular/material/legacy-progress-spinner'; +import { MatSpinner } from '@angular/material/progress-spinner'; import { createEmptyStateResource } from '@goofy-client/tech-shared'; import { getElementFromFixture } from '@goofy-client/test-utils'; import { getDataTestClassOf } from 'libs/tech-shared/test/data-test'; diff --git a/goofy-client/libs/ui/src/lib/ui/ui.module.ts b/goofy-client/libs/ui/src/lib/ui/ui.module.ts index dc3507bffca24c209602fef94c0423de0c3d2207..b1f4f114189dad671bb5ec17c980166a547bbbe3 100644 --- a/goofy-client/libs/ui/src/lib/ui/ui.module.ts +++ b/goofy-client/libs/ui/src/lib/ui/ui.module.ts @@ -26,25 +26,25 @@ import { HTTP_INTERCEPTORS } from '@angular/common/http'; import { NgModule } from '@angular/core'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { DateFnsAdapter, MatDateFnsModule } from '@angular/material-date-fns-adapter'; +import { MatAutocompleteModule } from '@angular/material/autocomplete'; import { MatBadgeModule } from '@angular/material/badge'; +import { MatButtonModule } from '@angular/material/button'; import { MatButtonToggleModule } from '@angular/material/button-toggle'; +import { MatCheckboxModule } from '@angular/material/checkbox'; import { DateAdapter, MAT_DATE_LOCALE, MatRippleModule } from '@angular/material/core'; import { MatDatepickerModule } from '@angular/material/datepicker'; +import { MatDialogModule } from '@angular/material/dialog'; import { MatExpansionModule } from '@angular/material/expansion'; +import { MatFormFieldModule } from '@angular/material/form-field'; import { MatIconModule } from '@angular/material/icon'; -import { MatLegacyAutocompleteModule as MatAutocompleteModule } from '@angular/material/legacy-autocomplete'; -import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button'; -import { MatLegacyCheckboxModule as MatCheckboxModule } from '@angular/material/legacy-checkbox'; -import { MatLegacyDialogModule as MatDialogModule } from '@angular/material/legacy-dialog'; -import { MatLegacyFormFieldModule as MatFormFieldModule } from '@angular/material/legacy-form-field'; -import { MatLegacyInputModule as MatInputModule } from '@angular/material/legacy-input'; -import { MatLegacyListModule as MatListModule } from '@angular/material/legacy-list'; -import { MatLegacyMenuModule as MatMenuModule } from '@angular/material/legacy-menu'; -import { MatLegacyProgressBarModule as MatProgressBarModule } from '@angular/material/legacy-progress-bar'; -import { MatLegacyProgressSpinnerModule as MatProgressSpinnerModule } from '@angular/material/legacy-progress-spinner'; -import { MatLegacySlideToggleModule as MatSlideToggleModule } from '@angular/material/legacy-slide-toggle'; -import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar'; -import { MatLegacyTabsModule as MatTabsModule } from '@angular/material/legacy-tabs'; +import { MatInputModule } from '@angular/material/input'; +import { MatListModule } from '@angular/material/list'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatProgressBarModule } from '@angular/material/progress-bar'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { MatSlideToggleModule } from '@angular/material/slide-toggle'; +import { MatSnackBarModule } from '@angular/material/snack-bar'; +import { MatTabsModule } from '@angular/material/tabs'; import { RouterModule } from '@angular/router'; import { TechSharedModule } from '@goofy-client/tech-shared'; import { de } from 'date-fns/locale'; @@ -60,7 +60,6 @@ import { BackButtonComponent } from './back-button/back-button.component'; import { BasicDialogComponent } from './basic-dialog/basic-dialog.component'; import { ButtonToggleGroupComponent } from './button-toggle-group/button-toggle-group.component'; import { ButtonToggleComponent } from './button-toggle/button-toggle.component'; -import { ButtonWithSpinnerComponent } from './button-with-spinner/button-with-spinner.component'; import { DownloadButtonComponent } from './download-button/download-button.component'; import { AutocompleteEditorComponent } from './editor/autocomplete-editor/autocomplete-editor.component'; import { DateEditorComponent } from './editor/date-editor/date-editor.component'; @@ -74,10 +73,13 @@ import { FixedDialogComponent } from './fixed-dialog/fixed-dialog.component'; import { ConnectionTimeoutRetryDialogComponent } from './http-error-dialog/connection-timeout-retry-dialog/connection-timeout-retry-dialog.component'; import { ConnectionTimeoutRetryFailDialogComponent } from './http-error-dialog/connection-timeout-retry-fail-dialog/connection-timeout-retry-fail-dialog.component'; import { IconButtonWithSpinnerComponent } from './icon-button-with-spinner/icon-button-with-spinner.component'; -import { MattooltipClassDirective, MattooltipDirective, MattooltipDisabledDirective } from './mattooltip/mattooltip.directive'; +import { MatTooltipClassDirective, MatTooltipDirective, MatTooltipDisabledDirective } from './mattooltip/mattooltip.directive'; import { MenuItemComponent } from './menu-item/menu-item.component'; import { InternalServerErrorDialogComponent } from './notification/internal-server-error-dialog/internal-server-error-dialog.component'; import { OpenUrlButtonComponent } from './open-url-button/open-url-button.component'; +import { OzgcloudButtonWithSpinnerComponent } from './ozgcloud-button/ozgcloud-button-with-spinner/ozgcloud-button-with-spinner.component'; +import { OzgcloudStrokedButtonWithSpinnerComponent } from './ozgcloud-button/ozgcloud-stroked-button-with-spinner/ozgcloud-stroked-button-with-spinner.component'; +import { OzgcloudButtonContentComponent } from './ozgcloud-button/shared/ozgcloud-button-content/ozgcloud-button-content.component'; import { OzgcloudIconComponent } from './ozgcloud-icon/ozgcloud-icon.component'; import { OzgcloudMenuComponent } from './ozgcloud-menu/ozgcloud-menu.component'; import { OzgcloudRoutingButtonComponent } from './ozgcloud-routing-button/ozgcloud-routing-button.component'; @@ -90,85 +92,150 @@ import { SpinnerComponent } from './spinner/spinner.component'; import { SubnavigationComponent } from './subnavigation/subnavigation.component'; import { ValidationErrorComponent } from './validation-error/validation-error.component'; -const components = [ - SubnavigationComponent, - SpinnerComponent, - ButtonWithSpinnerComponent, - IconButtonWithSpinnerComponent, - ProgressBarComponent, - ExpansionPanelComponent, - SnackbarInfoComponent, - SnackbarErrorComponent, - EnumEditorComponent, - FileUploadComponent, - DateEditorComponent, - TextEditorComponent, - TextAreaEditorComponent, - ValidationErrorComponent, - AutocompleteEditorComponent, - FixedDialogComponent, - EnumEditorComponent, - InternalServerErrorDialogComponent, - FileUploadEditorComponent, - MattooltipDirective, - MattooltipDisabledDirective, - MattooltipClassDirective, - MenuItemComponent, - PostfachIconComponent, - AccordionComponent, - AppIconComponent, - SlideToggleComponent, - BackButtonComponent, - ButtonToggleGroupComponent, - ButtonToggleComponent, - OzgcloudIconComponent, - OzgcloudRoutingButtonComponent, - OzgcloudSvgIconComponent, - OzgcloudSvgIconBigComponent, - SpinnerTransparencyComponent, - OpenUrlButtonComponent, - DownloadButtonComponent, - OzgcloudMenuComponent -]; - -const modules = [ - MatButtonModule, - MatIconModule, - MatProgressBarModule, - MatProgressSpinnerModule, - MatMenuModule, - MatSlideToggleModule, - MatExpansionModule, - MatRippleModule, - MatSnackBarModule, - MatCheckboxModule, - MatFormFieldModule, - MatInputModule, - MatListModule, - MatDatepickerModule, - MatDateFnsModule, - FormsModule, - ReactiveFormsModule, - MatAutocompleteModule, - MatDialogModule, - MatTabsModule, - MatBadgeModule, - CommonModule, - TechSharedModule, - RouterModule, - MatButtonToggleModule, -]; - @NgModule({ declarations: [ - components, + SubnavigationComponent, + SpinnerComponent, + OzgcloudButtonWithSpinnerComponent, + OzgcloudStrokedButtonWithSpinnerComponent, + IconButtonWithSpinnerComponent, + ProgressBarComponent, + ExpansionPanelComponent, + SnackbarInfoComponent, + SnackbarErrorComponent, + EnumEditorComponent, + FileUploadComponent, + DateEditorComponent, + TextEditorComponent, + TextAreaEditorComponent, + ValidationErrorComponent, + AutocompleteEditorComponent, + FixedDialogComponent, + EnumEditorComponent, + InternalServerErrorDialogComponent, + FileUploadEditorComponent, + MatTooltipDirective, + MatTooltipDisabledDirective, + MatTooltipClassDirective, + MenuItemComponent, + PostfachIconComponent, + AccordionComponent, + AppIconComponent, + SlideToggleComponent, + BackButtonComponent, + ButtonToggleGroupComponent, + ButtonToggleComponent, + OzgcloudIconComponent, + OzgcloudRoutingButtonComponent, + OzgcloudSvgIconComponent, + OzgcloudSvgIconBigComponent, + SpinnerTransparencyComponent, + OpenUrlButtonComponent, + DownloadButtonComponent, + OzgcloudMenuComponent, + ConnectionTimeoutRetryDialogComponent, + ConnectionTimeoutRetryFailDialogComponent, + SnackbarCloseButtonComponent, + BasicDialogComponent, + OzgcloudButtonContentComponent + ], + imports: [ + MatButtonModule, + MatIconModule, + MatProgressBarModule, + MatProgressSpinnerModule, + MatMenuModule, + MatSlideToggleModule, + MatExpansionModule, + MatRippleModule, + MatSnackBarModule, + MatCheckboxModule, + MatFormFieldModule, + MatInputModule, + MatListModule, + MatDatepickerModule, + MatDateFnsModule, + FormsModule, + ReactiveFormsModule, + MatAutocompleteModule, + MatDialogModule, + MatTabsModule, + MatBadgeModule, + CommonModule, + TechSharedModule, + RouterModule, + MatButtonToggleModule + ], + exports: [ + MatButtonModule, + MatIconModule, + MatProgressBarModule, + MatProgressSpinnerModule, + MatMenuModule, + MatSlideToggleModule, + MatExpansionModule, + MatRippleModule, + MatSnackBarModule, + MatCheckboxModule, + MatFormFieldModule, + MatInputModule, + MatListModule, + MatDatepickerModule, + MatDateFnsModule, + FormsModule, + ReactiveFormsModule, + MatAutocompleteModule, + MatDialogModule, + MatTabsModule, + MatBadgeModule, + CommonModule, + TechSharedModule, + RouterModule, + MatButtonToggleModule, + SubnavigationComponent, + SpinnerComponent, + OzgcloudButtonWithSpinnerComponent, + OzgcloudStrokedButtonWithSpinnerComponent, + IconButtonWithSpinnerComponent, + ProgressBarComponent, + ExpansionPanelComponent, + SnackbarInfoComponent, + SnackbarErrorComponent, + EnumEditorComponent, + FileUploadComponent, + DateEditorComponent, + TextEditorComponent, + TextAreaEditorComponent, + ValidationErrorComponent, + AutocompleteEditorComponent, + FixedDialogComponent, + EnumEditorComponent, + InternalServerErrorDialogComponent, + FileUploadEditorComponent, + MatTooltipDirective, + MatTooltipDisabledDirective, + MatTooltipClassDirective, + MenuItemComponent, + PostfachIconComponent, + AccordionComponent, + AppIconComponent, + SlideToggleComponent, + BackButtonComponent, + ButtonToggleGroupComponent, + ButtonToggleComponent, + OzgcloudIconComponent, + OzgcloudRoutingButtonComponent, + OzgcloudSvgIconComponent, + OzgcloudSvgIconBigComponent, + SpinnerTransparencyComponent, + OpenUrlButtonComponent, + DownloadButtonComponent, + OzgcloudMenuComponent, ConnectionTimeoutRetryDialogComponent, ConnectionTimeoutRetryFailDialogComponent, SnackbarCloseButtonComponent, BasicDialogComponent, ], - imports: [...modules], - exports: [...modules, ...components], providers: [ { provide: HTTP_INTERCEPTORS, diff --git a/goofy-client/libs/user-assistance/src/lib/help-menu/_help-menu.theme.scss b/goofy-client/libs/user-assistance/src/lib/help-menu/_help-menu.theme.scss deleted file mode 100644 index e2dd3e9a0986d661fda9d2a9a317ec7d93cc27db..0000000000000000000000000000000000000000 --- a/goofy-client/libs/user-assistance/src/lib/help-menu/_help-menu.theme.scss +++ /dev/null @@ -1,12 +0,0 @@ -goofy-client-help-menu { - .mat-fab { - box-shadow: none !important; - background-color: transparent !important; - border-radius: 10px; - height: 40px; - width: auto; - .mat-button-wrapper { - padding: 0.5rem; - } - } -} \ No newline at end of file diff --git a/goofy-client/libs/user-assistance/src/lib/help-menu/documentation/documentation.component.scss b/goofy-client/libs/user-assistance/src/lib/help-menu/documentation/documentation.component.scss index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..a440dd243c68309efbcf544aa7f680ad7b94efc7 100644 --- a/goofy-client/libs/user-assistance/src/lib/help-menu/documentation/documentation.component.scss +++ b/goofy-client/libs/user-assistance/src/lib/help-menu/documentation/documentation.component.scss @@ -0,0 +1,3 @@ +:host { + white-space: nowrap; +} \ No newline at end of file diff --git a/goofy-client/libs/user-assistance/src/lib/help-menu/documentation/dowload-documentation-button/download-documentation-button.component.ts b/goofy-client/libs/user-assistance/src/lib/help-menu/documentation/dowload-documentation-button/download-documentation-button.component.ts index cc44375e2821e8a51fff5d37f8a3e58b4b236e61..4e26419b8f4543755cb6bb677f0ca920d2291427 100644 --- a/goofy-client/libs/user-assistance/src/lib/help-menu/documentation/dowload-documentation-button/download-documentation-button.component.ts +++ b/goofy-client/libs/user-assistance/src/lib/help-menu/documentation/dowload-documentation-button/download-documentation-button.component.ts @@ -1,6 +1,6 @@ import { Component, Input } from '@angular/core'; -const FILE_NAME_REGEX: string = '^.*\\/(.*.pdf)$'; +const FILE_NAME_REGEX: RegExp = /^.*\/(.*.pdf)$/; @Component({ selector: 'goofy-client-download-documentation-button', diff --git a/goofy-client/libs/user-assistance/src/lib/help-menu/help-menu.component.scss b/goofy-client/libs/user-assistance/src/lib/help-menu/help-menu.component.scss index 659bfb479d6bb866431b89c8634ca8306ea0a666..f37eb84c894b33653670999079d6904caa4a59e3 100644 --- a/goofy-client/libs/user-assistance/src/lib/help-menu/help-menu.component.scss +++ b/goofy-client/libs/user-assistance/src/lib/help-menu/help-menu.component.scss @@ -4,9 +4,6 @@ display: flex; align-items: center; color: $grey; - .text { - margin-top: 1px; - } } goofy-client-ozgcloud-icon { diff --git a/goofy-client/libs/user-profile/src/lib/link-with-user-name-tooltip-container/link-with-user-name-tooltip/link-with-user-name-tooltip.component.spec.ts b/goofy-client/libs/user-profile/src/lib/link-with-user-name-tooltip-container/link-with-user-name-tooltip/link-with-user-name-tooltip.component.spec.ts index 9ef8caa38544a8a8a169635e57373d090e92ab03..0c0e248074f713e6b24d87eefe5443d074d74ed2 100644 --- a/goofy-client/libs/user-profile/src/lib/link-with-user-name-tooltip-container/link-with-user-name-tooltip/link-with-user-name-tooltip.component.spec.ts +++ b/goofy-client/libs/user-profile/src/lib/link-with-user-name-tooltip-container/link-with-user-name-tooltip/link-with-user-name-tooltip.component.spec.ts @@ -25,7 +25,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { RouterTestingModule } from '@angular/router/testing'; import { createStateResource } from '@goofy-client/tech-shared'; import { UserProfileResource } from '@goofy-client/user-profile-shared'; -import { MattooltipDirective } from 'libs/ui/src/lib/ui/mattooltip/mattooltip.directive'; +import { MatTooltipDirective } from 'libs/ui/src/lib/ui/mattooltip/mattooltip.directive'; import { createUserProfileResource } from 'libs/user-profile-shared/test/user-profile'; import { LinkWithUserNameTooltipComponent } from './link-with-user-name-tooltip.component'; @@ -43,7 +43,7 @@ describe('LinkWithUserNameTooltipComponent', () => { ], declarations: [ LinkWithUserNameTooltipComponent, - MattooltipDirective + MatTooltipDirective ], }).compileComponents(); }); diff --git a/goofy-client/libs/user-profile/src/lib/text-with-user-name-tooltip-container/text-with-user-name-tooltip/text-with-user-name-tooltip.component.spec.ts b/goofy-client/libs/user-profile/src/lib/text-with-user-name-tooltip-container/text-with-user-name-tooltip/text-with-user-name-tooltip.component.spec.ts index d1d97ad800dfe6d434c2a3fa099392a6f5df5c39..50c2ff52b4beb2257dc582808cfa9ba05214368b 100644 --- a/goofy-client/libs/user-profile/src/lib/text-with-user-name-tooltip-container/text-with-user-name-tooltip/text-with-user-name-tooltip.component.spec.ts +++ b/goofy-client/libs/user-profile/src/lib/text-with-user-name-tooltip-container/text-with-user-name-tooltip/text-with-user-name-tooltip.component.spec.ts @@ -24,7 +24,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { createStateResource } from '@goofy-client/tech-shared'; import { UserProfileResource } from '@goofy-client/user-profile-shared'; -import { MattooltipDirective } from 'libs/ui/src/lib/ui/mattooltip/mattooltip.directive'; +import { MatTooltipDirective } from 'libs/ui/src/lib/ui/mattooltip/mattooltip.directive'; import { createUserProfileResource } from 'libs/user-profile-shared/test/user-profile'; import { TextWithUserNameTooltipComponent } from './text-with-user-name-tooltip.component'; @@ -39,7 +39,7 @@ describe('TextWithUserNameTooltipComponent', () => { await TestBed.configureTestingModule({ declarations: [ TextWithUserNameTooltipComponent, - MattooltipDirective, + MatTooltipDirective, ], }).compileComponents(); }); diff --git a/goofy-client/libs/user-profile/src/lib/user-icon/user-icon.component.scss b/goofy-client/libs/user-profile/src/lib/user-icon/user-icon.component.scss index 15cc0f1b665139576d7d143dad6b34765409a3d9..ca9d41ae4bf0898241098cfcf8d57b8d53f9724c 100644 --- a/goofy-client/libs/user-profile/src/lib/user-icon/user-icon.component.scss +++ b/goofy-client/libs/user-profile/src/lib/user-icon/user-icon.component.scss @@ -23,7 +23,7 @@ */ @use 'sass:map'; @use '@angular/material' as mat; -@import "variables"; +@import 'variables'; .user-profile { width: 36px; diff --git a/goofy-client/libs/user-profile/src/lib/user-icon/user-icon.component.spec.ts b/goofy-client/libs/user-profile/src/lib/user-icon/user-icon.component.spec.ts index 7a396cb279bcc559e93281d93b47ba6313d4d39d..2c46e012c9f2568d11e8418b422d8dcec55e8ef1 100644 --- a/goofy-client/libs/user-profile/src/lib/user-icon/user-icon.component.spec.ts +++ b/goofy-client/libs/user-profile/src/lib/user-icon/user-icon.component.spec.ts @@ -24,12 +24,12 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { MatIcon } from '@angular/material/icon'; import { faker } from '@faker-js/faker'; -import { ApiError, createEmptyStateResource, createErrorStateResource, createStateResource, EMPTY_STRING, MessageCode } from '@goofy-client/tech-shared'; +import { ApiError, EMPTY_STRING, MessageCode, createEmptyStateResource, createErrorStateResource, createStateResource } from '@goofy-client/tech-shared'; import { getElementFromFixture } from '@goofy-client/test-utils'; import { SpinnerComponent } from '@goofy-client/ui'; -import { NO_NAME_MESSAGE, userProfileMessage, UserProfileResource } from '@goofy-client/user-profile-shared'; +import { NO_NAME_MESSAGE, UserProfileResource, userProfileMessage } from '@goofy-client/user-profile-shared'; import { getDataTestClassOf } from 'libs/tech-shared/test/data-test'; -import { MattooltipDirective, MattooltipDisabledDirective } from 'libs/ui/src/lib/ui/mattooltip/mattooltip.directive'; +import { MatTooltipDirective, MatTooltipDisabledDirective } from 'libs/ui/src/lib/ui/mattooltip/mattooltip.directive'; import { createUserProfileResource } from 'libs/user-profile-shared/test/user-profile'; import { MockComponent } from 'ng-mocks'; import { createApiError, createIssue } from '../../../../tech-shared/test/error'; @@ -51,8 +51,8 @@ describe('UserIconComponent', () => { declarations: [ UserIconComponent, MatIcon, - MattooltipDirective, - MattooltipDisabledDirective, + MatTooltipDirective, + MatTooltipDisabledDirective, MockComponent(SpinnerComponent) ] }) diff --git a/goofy-client/libs/user-profile/src/lib/user-profile-in-vorgang-container/user-profile-in-vorgang/user-profile-button-container/user-profile-button-container.component.ts b/goofy-client/libs/user-profile/src/lib/user-profile-in-vorgang-container/user-profile-in-vorgang/user-profile-button-container/user-profile-button-container.component.ts index 89469ef25845c71fa6f38b363bf6380f1b408c1e..5d50b4783d2fdbcfc5d30baf28dac0455d956fb1 100644 --- a/goofy-client/libs/user-profile/src/lib/user-profile-in-vorgang-container/user-profile-in-vorgang/user-profile-button-container/user-profile-button-container.component.ts +++ b/goofy-client/libs/user-profile/src/lib/user-profile-in-vorgang-container/user-profile-in-vorgang/user-profile-button-container/user-profile-button-container.component.ts @@ -22,7 +22,7 @@ * unter der Lizenz sind dem Lizenztext zu entnehmen. */ import { Component, Input, OnInit, ViewChild } from '@angular/core'; -import { MatLegacyMenuTrigger as MatMenuTrigger } from '@angular/material/legacy-menu'; +import { MatMenuTrigger } from '@angular/material/menu'; import { StateResource } from '@goofy-client/tech-shared'; import { UserProfileResource, UserProfileService } from '@goofy-client/user-profile-shared'; import { Observable, tap } from 'rxjs'; diff --git a/goofy-client/libs/user-profile/src/lib/user-profile-search-container/user-profile-search/user-profile-search.component.spec.ts b/goofy-client/libs/user-profile/src/lib/user-profile-search-container/user-profile-search/user-profile-search.component.spec.ts index 8b55d8b04861caf5cf39b0596d8a109b39eb87d3..4e39de54b68d7a3c71246b7729b65d0a4a4ccb0f 100644 --- a/goofy-client/libs/user-profile/src/lib/user-profile-search-container/user-profile-search/user-profile-search.component.spec.ts +++ b/goofy-client/libs/user-profile/src/lib/user-profile-search-container/user-profile-search/user-profile-search.component.spec.ts @@ -23,7 +23,7 @@ */ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ReactiveFormsModule, UntypedFormBuilder } from '@angular/forms'; -import { MatLegacyFormFieldModule as MatFormFieldModule } from '@angular/material/legacy-form-field'; +import { MatFormFieldModule } from '@angular/material/form-field'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { mock } from '@goofy-client/test-utils'; import { AutocompleteEditorComponent } from '@goofy-client/ui'; diff --git a/goofy-client/libs/user-settings/src/lib/user-settings-container/user-settings/user-settings.component.spec.ts b/goofy-client/libs/user-settings/src/lib/user-settings-container/user-settings/user-settings.component.spec.ts index d7b9222c00673505dbe05c65a93a58b145d70554..7f3f1bc3ab1fdd19bf3050f50e3737de3eb97cca 100644 --- a/goofy-client/libs/user-settings/src/lib/user-settings-container/user-settings/user-settings.component.spec.ts +++ b/goofy-client/libs/user-settings/src/lib/user-settings-container/user-settings/user-settings.component.spec.ts @@ -22,7 +22,7 @@ * unter der Lizenz sind dem Lizenztext zu entnehmen. */ import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button'; +import { MatButtonModule } from '@angular/material/button'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { ApiRootLinkRel } from '@goofy-client/api-root-shared'; import { HasLinkPipe, createEmptyStateResource, createStateResource } from '@goofy-client/tech-shared'; diff --git a/goofy-client/libs/vorgang-detail/src/lib/buttons/abschliessen-button/abschliessen-button.component.html b/goofy-client/libs/vorgang-detail/src/lib/buttons/abschliessen-button/abschliessen-button.component.html index 4feb77da5d53a07255e1e433f4012c378a116016..c9734b41bf9cad1a25345e241ae974146ca9b020 100644 --- a/goofy-client/libs/vorgang-detail/src/lib/buttons/abschliessen-button/abschliessen-button.component.html +++ b/goofy-client/libs/vorgang-detail/src/lib/buttons/abschliessen-button/abschliessen-button.component.html @@ -25,12 +25,12 @@ --> <ng-container *ngIf="vorgang | hasLink: linkRel.ABSCHLIESSEN"> - <goofy-client-button-with-spinner *ngIf="!showAsIconButton" data-test-id="abschliessen-button" + <goofy-client-ozgcloud-stroked-button-with-spinner *ngIf="!showAsIconButton" data-test-id="abschliessen-button" text="Abschließen" icon="done" [stateResource]="commandStateResource$ | async" (clickEmitter)="abschliessen()"> - </goofy-client-button-with-spinner> + </goofy-client-ozgcloud-stroked-button-with-spinner> <goofy-client-icon-button-with-spinner *ngIf="showAsIconButton" data-test-id="abschliessen-icon-button" icon="done" diff --git a/goofy-client/libs/vorgang-detail/src/lib/buttons/abschliessen-button/abschliessen-button.component.spec.ts b/goofy-client/libs/vorgang-detail/src/lib/buttons/abschliessen-button/abschliessen-button.component.spec.ts index beb4ac66e306345b050869681b315003b7b6130f..88b000dc9e31fb47c119cdde91e2ec408cb2d23f 100644 --- a/goofy-client/libs/vorgang-detail/src/lib/buttons/abschliessen-button/abschliessen-button.component.spec.ts +++ b/goofy-client/libs/vorgang-detail/src/lib/buttons/abschliessen-button/abschliessen-button.component.spec.ts @@ -24,7 +24,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { HasLinkPipe, createStateResource } from '@goofy-client/tech-shared'; import { mock } from '@goofy-client/test-utils'; -import { ButtonWithSpinnerComponent, IconButtonWithSpinnerComponent } from '@goofy-client/ui'; +import { IconButtonWithSpinnerComponent, OzgcloudStrokedButtonWithSpinnerComponent } from '@goofy-client/ui'; import { VorgangCommandService, VorgangWithEingangLinkRel } from '@goofy-client/vorgang-shared'; import { createCommandResource } from 'libs/command-shared/test/command'; import { getDataTestIdOf } from 'libs/tech-shared/test/data-test'; @@ -46,7 +46,7 @@ describe('AbschliessenButtonComponent', () => { await TestBed.configureTestingModule({ declarations: [ AbschliessenButtonComponent, - MockComponent(ButtonWithSpinnerComponent), + MockComponent(OzgcloudStrokedButtonWithSpinnerComponent), MockComponent(IconButtonWithSpinnerComponent), HasLinkPipe ], diff --git a/goofy-client/libs/vorgang-detail/src/lib/buttons/annehmen-button/annehmen-button.component.html b/goofy-client/libs/vorgang-detail/src/lib/buttons/annehmen-button/annehmen-button.component.html index 03c6bc82731755903824acde8f8de155c1b9d1c1..893f71b3477092344997446a77fcf646a098bcdd 100644 --- a/goofy-client/libs/vorgang-detail/src/lib/buttons/annehmen-button/annehmen-button.component.html +++ b/goofy-client/libs/vorgang-detail/src/lib/buttons/annehmen-button/annehmen-button.component.html @@ -25,12 +25,12 @@ --> <ng-container *ngIf="vorgang | hasLink: linkRel.ANNEHMEN"> - <goofy-client-button-with-spinner *ngIf="!showAsIconButton" data-test-id="annehmen-button" + <goofy-client-ozgcloud-stroked-button-with-spinner *ngIf="!showAsIconButton" data-test-id="annehmen-button" text="Annehmen" icon="check_circle_outline" [stateResource]="commandStateResource$ | async" (clickEmitter)="annehmen()"> - </goofy-client-button-with-spinner> + </goofy-client-ozgcloud-stroked-button-with-spinner> <goofy-client-icon-button-with-spinner *ngIf="showAsIconButton" data-test-id="annehmen-icon-button" icon="check_circle_outline" diff --git a/goofy-client/libs/vorgang-detail/src/lib/buttons/annehmen-button/annehmen-button.component.spec.ts b/goofy-client/libs/vorgang-detail/src/lib/buttons/annehmen-button/annehmen-button.component.spec.ts index c45c73fb294465417b8a784a2feac586d9ca519b..d7e1fd7703068b5e1c864f7fd5929872c5c05d65 100644 --- a/goofy-client/libs/vorgang-detail/src/lib/buttons/annehmen-button/annehmen-button.component.spec.ts +++ b/goofy-client/libs/vorgang-detail/src/lib/buttons/annehmen-button/annehmen-button.component.spec.ts @@ -24,7 +24,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { HasLinkPipe, createStateResource } from '@goofy-client/tech-shared'; import { mock } from '@goofy-client/test-utils'; -import { ButtonWithSpinnerComponent, IconButtonWithSpinnerComponent } from '@goofy-client/ui'; +import { IconButtonWithSpinnerComponent, OzgcloudStrokedButtonWithSpinnerComponent } from '@goofy-client/ui'; import { VorgangCommandService, VorgangWithEingangLinkRel } from '@goofy-client/vorgang-shared'; import { createCommandResource } from 'libs/command-shared/test/command'; import { getDataTestIdOf } from 'libs/tech-shared/test/data-test'; @@ -46,7 +46,7 @@ describe('AnnehmenButtonComponent', () => { await TestBed.configureTestingModule({ declarations: [ AnnehmenButtonComponent, - MockComponent(ButtonWithSpinnerComponent), + MockComponent(OzgcloudStrokedButtonWithSpinnerComponent), MockComponent(IconButtonWithSpinnerComponent), HasLinkPipe ], diff --git a/goofy-client/libs/vorgang-detail/src/lib/buttons/bearbeiten-button/bearbeiten-button.component.html b/goofy-client/libs/vorgang-detail/src/lib/buttons/bearbeiten-button/bearbeiten-button.component.html index c0cb8cadca0b541dd881e990c3b4318b55cf5b3c..066894ec68f95c7f2b552690324e9d02783d1d88 100644 --- a/goofy-client/libs/vorgang-detail/src/lib/buttons/bearbeiten-button/bearbeiten-button.component.html +++ b/goofy-client/libs/vorgang-detail/src/lib/buttons/bearbeiten-button/bearbeiten-button.component.html @@ -25,12 +25,12 @@ --> <ng-container *ngIf="vorgang | hasLink: linkRel.BEARBEITEN"> - <goofy-client-button-with-spinner *ngIf="!showAsIconButton" data-test-id="bearbeiten-button" + <goofy-client-ozgcloud-stroked-button-with-spinner *ngIf="!showAsIconButton" data-test-id="bearbeiten-button" text="Bearbeiten" icon="edit_icon" [stateResource]="commandStateResource$ | async" (clickEmitter)="bearbeiten()"> - </goofy-client-button-with-spinner> + </goofy-client-ozgcloud-stroked-button-with-spinner> <goofy-client-icon-button-with-spinner *ngIf="showAsIconButton" data-test-id="bearbeiten-icon-button" svgIcon="edit" diff --git a/goofy-client/libs/vorgang-detail/src/lib/buttons/bearbeiten-button/bearbeiten-button.component.spec.ts b/goofy-client/libs/vorgang-detail/src/lib/buttons/bearbeiten-button/bearbeiten-button.component.spec.ts index 513aaae5ecf99cc49be56c9c56e45e1f2eead17b..23b0d0306b64d5c0d75b727af28f5100c26c10f5 100644 --- a/goofy-client/libs/vorgang-detail/src/lib/buttons/bearbeiten-button/bearbeiten-button.component.spec.ts +++ b/goofy-client/libs/vorgang-detail/src/lib/buttons/bearbeiten-button/bearbeiten-button.component.spec.ts @@ -22,9 +22,9 @@ * unter der Lizenz sind dem Lizenztext zu entnehmen. */ import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { createStateResource, HasLinkPipe } from '@goofy-client/tech-shared'; +import { HasLinkPipe, createStateResource } from '@goofy-client/tech-shared'; import { mock } from '@goofy-client/test-utils'; -import { ButtonWithSpinnerComponent, IconButtonWithSpinnerComponent } from '@goofy-client/ui'; +import { IconButtonWithSpinnerComponent, OzgcloudStrokedButtonWithSpinnerComponent } from '@goofy-client/ui'; import { VorgangCommandService, VorgangWithEingangLinkRel } from '@goofy-client/vorgang-shared'; import { createCommandResource } from 'libs/command-shared/test/command'; import { createVorgangWithEingangResource } from 'libs/vorgang-shared/test/vorgang'; @@ -45,7 +45,7 @@ describe('BearbeitenButtonComponent', () => { await TestBed.configureTestingModule({ declarations: [ BearbeitenButtonComponent, - MockComponent(ButtonWithSpinnerComponent), + MockComponent(OzgcloudStrokedButtonWithSpinnerComponent), MockComponent(IconButtonWithSpinnerComponent), HasLinkPipe ], diff --git a/goofy-client/libs/vorgang-detail/src/lib/buttons/bescheiden-button/bescheiden-button.component.html b/goofy-client/libs/vorgang-detail/src/lib/buttons/bescheiden-button/bescheiden-button.component.html index d18ce06c95d3ced026ed65a8ce7dcaeccf7fcc0d..c9b40ffb445afbb960328cde56d2e5d670980bcf 100644 --- a/goofy-client/libs/vorgang-detail/src/lib/buttons/bescheiden-button/bescheiden-button.component.html +++ b/goofy-client/libs/vorgang-detail/src/lib/buttons/bescheiden-button/bescheiden-button.component.html @@ -25,12 +25,12 @@ --> <ng-container *ngIf="vorgang | hasLink: linkRel.BESCHEIDEN"> - <goofy-client-button-with-spinner *ngIf="!showAsIconButton" data-test-id="bescheiden-button" + <goofy-client-ozgcloud-stroked-button-with-spinner *ngIf="!showAsIconButton" data-test-id="bescheiden-button" text="Bescheiden" svgIcon="stamp" [stateResource]="commandStateResource$ | async" (clickEmitter)="bescheiden()"> - </goofy-client-button-with-spinner> + </goofy-client-ozgcloud-stroked-button-with-spinner> <goofy-client-icon-button-with-spinner *ngIf="showAsIconButton" data-test-id="bescheiden-icon-button" svgIcon="stamp" diff --git a/goofy-client/libs/vorgang-detail/src/lib/buttons/bescheiden-button/bescheiden-button.component.spec.ts b/goofy-client/libs/vorgang-detail/src/lib/buttons/bescheiden-button/bescheiden-button.component.spec.ts index a481108f53506e0eda54e81df69ff79ecf3d0ee1..744f76b7702e6e65aa5777f31b5d7991e8669829 100644 --- a/goofy-client/libs/vorgang-detail/src/lib/buttons/bescheiden-button/bescheiden-button.component.spec.ts +++ b/goofy-client/libs/vorgang-detail/src/lib/buttons/bescheiden-button/bescheiden-button.component.spec.ts @@ -24,7 +24,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { HasLinkPipe, createStateResource } from '@goofy-client/tech-shared'; import { mock } from '@goofy-client/test-utils'; -import { ButtonWithSpinnerComponent, IconButtonWithSpinnerComponent } from '@goofy-client/ui'; +import { IconButtonWithSpinnerComponent, OzgcloudStrokedButtonWithSpinnerComponent } from '@goofy-client/ui'; import { VorgangCommandService, VorgangWithEingangLinkRel } from '@goofy-client/vorgang-shared'; import { createCommandResource } from 'libs/command-shared/test/command'; import { getDataTestIdOf } from 'libs/tech-shared/test/data-test'; @@ -47,7 +47,7 @@ describe('BescheidenButtonComponent', () => { declarations: [ BescheidenButtonComponent, HasLinkPipe, - MockComponent(ButtonWithSpinnerComponent), + MockComponent(OzgcloudStrokedButtonWithSpinnerComponent), MockComponent(IconButtonWithSpinnerComponent) ], providers: [ diff --git a/goofy-client/libs/vorgang-detail/src/lib/buttons/verwerfen-button/verwerfen-button.component.html b/goofy-client/libs/vorgang-detail/src/lib/buttons/verwerfen-button/verwerfen-button.component.html index 378cb27ef72ca0e56a2761ece947b93531fc9fa5..a31a193ee0d9d751156c028081c354655a602f70 100644 --- a/goofy-client/libs/vorgang-detail/src/lib/buttons/verwerfen-button/verwerfen-button.component.html +++ b/goofy-client/libs/vorgang-detail/src/lib/buttons/verwerfen-button/verwerfen-button.component.html @@ -25,12 +25,12 @@ --> <ng-container *ngIf="vorgang | hasLink: linkRel.VERWERFEN"> - <goofy-client-button-with-spinner *ngIf="!showAsIconButton" data-test-id="verwerfen-button" + <goofy-client-ozgcloud-stroked-button-with-spinner *ngIf="!showAsIconButton" data-test-id="verwerfen-button" text="Verwerfen" svgIcon="discard_document" [stateResource]="commandStateResource$ | async" (clickEmitter)="verwerfen()"> - </goofy-client-button-with-spinner> + </goofy-client-ozgcloud-stroked-button-with-spinner> <goofy-client-icon-button-with-spinner *ngIf="showAsIconButton" data-test-id="verwerfen-icon-button" svgIcon="discard_document" diff --git a/goofy-client/libs/vorgang-detail/src/lib/buttons/verwerfen-button/verwerfen-button.component.spec.ts b/goofy-client/libs/vorgang-detail/src/lib/buttons/verwerfen-button/verwerfen-button.component.spec.ts index c9b24b56c49e09a3dbd190d1e7ba23ef3096a4e7..08f11d59d273b54f3b84ad3c853221794ea25941 100644 --- a/goofy-client/libs/vorgang-detail/src/lib/buttons/verwerfen-button/verwerfen-button.component.spec.ts +++ b/goofy-client/libs/vorgang-detail/src/lib/buttons/verwerfen-button/verwerfen-button.component.spec.ts @@ -24,7 +24,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { HasLinkPipe, createStateResource } from '@goofy-client/tech-shared'; import { mock } from '@goofy-client/test-utils'; -import { ButtonWithSpinnerComponent, IconButtonWithSpinnerComponent } from '@goofy-client/ui'; +import { IconButtonWithSpinnerComponent, OzgcloudStrokedButtonWithSpinnerComponent } from '@goofy-client/ui'; import { VorgangCommandService, VorgangWithEingangLinkRel } from '@goofy-client/vorgang-shared'; import { createCommandResource } from 'libs/command-shared/test/command'; import { getDataTestIdOf } from 'libs/tech-shared/test/data-test'; @@ -46,7 +46,7 @@ describe('VerwerfenButtonComponent', () => { await TestBed.configureTestingModule({ declarations: [ VerwerfenButtonComponent, - MockComponent(ButtonWithSpinnerComponent), + MockComponent(OzgcloudStrokedButtonWithSpinnerComponent), MockComponent(IconButtonWithSpinnerComponent), HasLinkPipe ], diff --git a/goofy-client/libs/vorgang-detail/src/lib/buttons/wiedereroeffnen-button/wiedereroeffnen-button.component.html b/goofy-client/libs/vorgang-detail/src/lib/buttons/wiedereroeffnen-button/wiedereroeffnen-button.component.html index 7f5b16a1f31e69aba092c5ad44fc831ba4f372b7..cce50c8dcfb60e1fb50da2c2054cc65500870547 100644 --- a/goofy-client/libs/vorgang-detail/src/lib/buttons/wiedereroeffnen-button/wiedereroeffnen-button.component.html +++ b/goofy-client/libs/vorgang-detail/src/lib/buttons/wiedereroeffnen-button/wiedereroeffnen-button.component.html @@ -25,12 +25,12 @@ --> <ng-container *ngIf="vorgang | hasLink: linkRel.WIEDEREROEFFNEN"> - <goofy-client-button-with-spinner *ngIf="!showAsIconButton" data-test-id="wiedereroeffnen-button" + <goofy-client-ozgcloud-stroked-button-with-spinner *ngIf="!showAsIconButton" data-test-id="wiedereroeffnen-button" text="Wiedereröffnen" icon="undo" [stateResource]="commandStateResource$ | async" (clickEmitter)="wiedereroeffnen()"> - </goofy-client-button-with-spinner> + </goofy-client-ozgcloud-stroked-button-with-spinner> <goofy-client-icon-button-with-spinner *ngIf="showAsIconButton" data-test-id="wiedereroeffnen-icon-button" icon="undo" diff --git a/goofy-client/libs/vorgang-detail/src/lib/buttons/wiedereroeffnen-button/wiedereroeffnen-button.component.spec.ts b/goofy-client/libs/vorgang-detail/src/lib/buttons/wiedereroeffnen-button/wiedereroeffnen-button.component.spec.ts index 581a82533a60a4451e06f9caf33f1f8e8ff4ef3b..d8fd9aee50aae6af0fffa80c975f39a212c0ec00 100644 --- a/goofy-client/libs/vorgang-detail/src/lib/buttons/wiedereroeffnen-button/wiedereroeffnen-button.component.spec.ts +++ b/goofy-client/libs/vorgang-detail/src/lib/buttons/wiedereroeffnen-button/wiedereroeffnen-button.component.spec.ts @@ -24,7 +24,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { HasLinkPipe, createStateResource } from '@goofy-client/tech-shared'; import { mock } from '@goofy-client/test-utils'; -import { ButtonWithSpinnerComponent, IconButtonWithSpinnerComponent } from '@goofy-client/ui'; +import { IconButtonWithSpinnerComponent, OzgcloudStrokedButtonWithSpinnerComponent } from '@goofy-client/ui'; import { VorgangCommandService, VorgangWithEingangLinkRel } from '@goofy-client/vorgang-shared'; import { createCommandResource } from 'libs/command-shared/test/command'; import { getDataTestIdOf } from 'libs/tech-shared/test/data-test'; @@ -46,7 +46,7 @@ describe('WiedereroeffnenButtonComponent', () => { declarations: [ WiedereroeffnenButtonComponent, HasLinkPipe, - MockComponent(ButtonWithSpinnerComponent), + MockComponent(OzgcloudStrokedButtonWithSpinnerComponent), MockComponent(IconButtonWithSpinnerComponent) ], providers: [ diff --git a/goofy-client/libs/vorgang-detail/src/lib/buttons/zurueckholen-button/zurueckholen-button.component.html b/goofy-client/libs/vorgang-detail/src/lib/buttons/zurueckholen-button/zurueckholen-button.component.html index 1e5a52c35863094a54548c8df16f08ac0e9f4a51..0d48160c61ffb8c4693020bfa999defd596751b5 100644 --- a/goofy-client/libs/vorgang-detail/src/lib/buttons/zurueckholen-button/zurueckholen-button.component.html +++ b/goofy-client/libs/vorgang-detail/src/lib/buttons/zurueckholen-button/zurueckholen-button.component.html @@ -25,12 +25,12 @@ --> <ng-container *ngIf="vorgang | hasLink: linkRel.ZURUECKHOLEN"> - <goofy-client-button-with-spinner *ngIf="!showAsIconButton" data-test-id="zurueckholen-button" + <goofy-client-ozgcloud-stroked-button-with-spinner *ngIf="!showAsIconButton" data-test-id="zurueckholen-button" text="Zurückholen" icon="undo" [stateResource]="commandStateResource$ | async" (click)="zurueckholen()"> - </goofy-client-button-with-spinner> + </goofy-client-ozgcloud-stroked-button-with-spinner> <goofy-client-icon-button-with-spinner *ngIf="showAsIconButton" data-test-id="zurueckholen-icon-button" icon="undo" diff --git a/goofy-client/libs/vorgang-detail/src/lib/buttons/zurueckholen-button/zurueckholen-button.component.spec.ts b/goofy-client/libs/vorgang-detail/src/lib/buttons/zurueckholen-button/zurueckholen-button.component.spec.ts index b7e845cc296b6c778c7ccc2aa68c5bf3d02ac810..f4b750b13276e3a576fd789e6d638e9993933975 100644 --- a/goofy-client/libs/vorgang-detail/src/lib/buttons/zurueckholen-button/zurueckholen-button.component.spec.ts +++ b/goofy-client/libs/vorgang-detail/src/lib/buttons/zurueckholen-button/zurueckholen-button.component.spec.ts @@ -24,7 +24,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { HasLinkPipe, createStateResource } from '@goofy-client/tech-shared'; import { mock } from '@goofy-client/test-utils'; -import { ButtonWithSpinnerComponent, IconButtonWithSpinnerComponent } from '@goofy-client/ui'; +import { IconButtonWithSpinnerComponent, OzgcloudStrokedButtonWithSpinnerComponent } from '@goofy-client/ui'; import { VorgangCommandService, VorgangWithEingangLinkRel } from '@goofy-client/vorgang-shared'; import { createCommandResource } from 'libs/command-shared/test/command'; import { getDataTestIdOf } from 'libs/tech-shared/test/data-test'; @@ -47,7 +47,7 @@ describe('ZurueckholenButtonComponent', () => { declarations: [ ZurueckholenButtonComponent, HasLinkPipe, - MockComponent(ButtonWithSpinnerComponent), + MockComponent(OzgcloudStrokedButtonWithSpinnerComponent), MockComponent(IconButtonWithSpinnerComponent) ], providers: [ diff --git a/goofy-client/libs/vorgang-detail/src/lib/buttons/zurueckstellen-button/zurueckstellen-button.component.html b/goofy-client/libs/vorgang-detail/src/lib/buttons/zurueckstellen-button/zurueckstellen-button.component.html index 554e07c6e57b480141cb4f360d19fc15fae53c95..3bce6a332a7a104d7c160b2e649f30b82c696777 100644 --- a/goofy-client/libs/vorgang-detail/src/lib/buttons/zurueckstellen-button/zurueckstellen-button.component.html +++ b/goofy-client/libs/vorgang-detail/src/lib/buttons/zurueckstellen-button/zurueckstellen-button.component.html @@ -25,12 +25,12 @@ --> <ng-container *ngIf="vorgang | hasLink: linkRel.ZURUECKSTELLEN"> - <goofy-client-button-with-spinner *ngIf="!showAsIconButton" data-test-id="zurueckstellen-button" + <goofy-client-ozgcloud-stroked-button-with-spinner *ngIf="!showAsIconButton" data-test-id="zurueckstellen-button" text="Zurückstellen" icon="undo" [stateResource]="commandStateResource$ | async" (clickEmitter)="zurueckstellen()"> - </goofy-client-button-with-spinner> + </goofy-client-ozgcloud-stroked-button-with-spinner> <goofy-client-icon-button-with-spinner *ngIf="showAsIconButton" data-test-id="zurueckstellen-icon-button" icon="undo" diff --git a/goofy-client/libs/vorgang-detail/src/lib/buttons/zurueckstellen-button/zurueckstellen-button.component.spec.ts b/goofy-client/libs/vorgang-detail/src/lib/buttons/zurueckstellen-button/zurueckstellen-button.component.spec.ts index 9997c65a3342f7e1e43b258714302d35d6b8c47c..d039aabe413c9704d4cda9eb177d8b7331176ee0 100644 --- a/goofy-client/libs/vorgang-detail/src/lib/buttons/zurueckstellen-button/zurueckstellen-button.component.spec.ts +++ b/goofy-client/libs/vorgang-detail/src/lib/buttons/zurueckstellen-button/zurueckstellen-button.component.spec.ts @@ -24,7 +24,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { HasLinkPipe, createStateResource } from '@goofy-client/tech-shared'; import { mock } from '@goofy-client/test-utils'; -import { ButtonWithSpinnerComponent, IconButtonWithSpinnerComponent } from '@goofy-client/ui'; +import { IconButtonWithSpinnerComponent, OzgcloudStrokedButtonWithSpinnerComponent } from '@goofy-client/ui'; import { VorgangCommandService, VorgangWithEingangLinkRel } from '@goofy-client/vorgang-shared'; import { createCommandResource } from 'libs/command-shared/test/command'; import { getDataTestIdOf } from 'libs/tech-shared/test/data-test'; @@ -47,7 +47,7 @@ describe('ZurueckstellenButtonComponent', () => { declarations: [ ZurueckstellenButtonComponent, HasLinkPipe, - MockComponent(ButtonWithSpinnerComponent), + MockComponent(OzgcloudStrokedButtonWithSpinnerComponent), MockComponent(IconButtonWithSpinnerComponent) ], providers: [ diff --git a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-antragsteller/vorgang-detail-antragsteller.component.html b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-antragsteller/vorgang-detail-antragsteller.component.html index d77af4023d461f23e98b57e018026c14ad756f03..cf2614dab7295acadeb7ed1a6bd97ede4009e1b0 100644 --- a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-antragsteller/vorgang-detail-antragsteller.component.html +++ b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-antragsteller/vorgang-detail-antragsteller.component.html @@ -26,25 +26,25 @@ <h3>Antragstellerdaten</h3> <mat-list *ngIf="antragstellerExists; else noAntragsteller" data-test-id="antragsteller-mat-list"> <mat-list-item *ngIf="name" > - <mat-icon mat-list-icon class="material-icons-outlined" aria-label="Name" aria-hidden="false">assignment_ind</mat-icon> - <div mat-line data-test-id="antragsteller-name">{{ name }}</div> + <mat-icon matListItemIcon class="material-icons-outlined" aria-label="Name" aria-hidden="false">assignment_ind</mat-icon> + <div matListItemLine data-test-id="antragsteller-name">{{ name }}</div> </mat-list-item> <mat-list-item *ngIf="antragsteller.email"> - <mat-icon mat-list-icon class="material-icons-outlined" aria-label="E-Mail-Adresse" aria-hidden="false">email</mat-icon> - <div mat-line data-test-id="antragsteller-email">{{ antragsteller.email }}</div> + <mat-icon matListItemIcon class="material-icons-outlined" aria-label="E-Mail-Adresse" aria-hidden="false">email</mat-icon> + <div matListItemLine data-test-id="antragsteller-email">{{ antragsteller.email }}</div> </mat-list-item> <mat-list-item *ngIf="antragsteller.telefon"> - <mat-icon mat-list-icon class="material-icons-outlined" aria-label="Telefonnummer" aria-hidden="false">call_black</mat-icon> - <div mat-line data-test-id="antragsteller-telefon">{{ antragsteller.telefon }}</div> + <mat-icon matListItemIcon class="material-icons-outlined" aria-label="Telefonnummer" aria-hidden="false">call_black</mat-icon> + <div matListItemLine data-test-id="antragsteller-telefon">{{ antragsteller.telefon }}</div> </mat-list-item> <mat-list-item *ngIf="antragstellerStrasseHausnummer || antragstellerPlzOrt" data-test-id="antragsteller-adresse"> - <mat-icon mat-list-icon class="material-icons-outlined" aria-label="Adresse" aria-hidden="false">location_on</mat-icon> - <div mat-line data-test-id="antragsteller-strasse-hausnummer">{{ antragstellerStrasseHausnummer }}</div> - <div mat-line data-test-id="antragsteller-plz-ort">{{ antragstellerPlzOrt }}</div> + <mat-icon matListItemIcon class="material-icons-outlined" aria-label="Adresse" aria-hidden="false">location_on</mat-icon> + <div matListItemLine data-test-id="antragsteller-strasse-hausnummer">{{ antragstellerStrasseHausnummer }}</div> + <div matListItemLine data-test-id="antragsteller-plz-ort">{{ antragstellerPlzOrt }}</div> </mat-list-item> <mat-list-item *ngIf="geburt"> - <mat-icon mat-list-icon class="material-icons-outlined" aria-label="Geburtsdatum und Geburtsort" aria-hidden="false">cake</mat-icon> - <div mat-line data-test-id="antragsteller-geburt">{{ geburt }}</div> + <mat-icon matListItemIcon class="material-icons-outlined" aria-label="Geburtsdatum und Geburtsort" aria-hidden="false">cake</mat-icon> + <div matListItemLine data-test-id="antragsteller-geburt">{{ geburt }}</div> </mat-list-item> </mat-list> diff --git a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-antragsteller/vorgang-detail-antragsteller.component.scss b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-antragsteller/vorgang-detail-antragsteller.component.scss index 8984444b5f007b3e533fe2ddd5861561478e096a..7590abc0f79483e6ce2c98d6f925204c4822433f 100644 --- a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-antragsteller/vorgang-detail-antragsteller.component.scss +++ b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-antragsteller/vorgang-detail-antragsteller.component.scss @@ -21,34 +21,6 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -// Bei Bedarf in einen globalen Style verschieben. -:host ::ng-deep { - .mat-list-base { - padding-top: 0; - } - .mat-list-base .mat-list-item, - .mat-list-base .mat-list-item.mat-list-item-with-avatar { - height: auto; - .mat-list-item-content { - padding: 0; - .mat-list-text { - padding-left: 6px; - } - } - .mat-icon { - padding: 2px 0 3px; - } - .mat-list-text > *, - .mat-line:nth-child(n+2) { - font-size: 14px; - } - .mat-line { - word-wrap: break-word; - white-space: pre-wrap; - } - } -} - h3 { font-weight: 500; } \ No newline at end of file diff --git a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-antragsteller/vorgang-detail-antragsteller.component.spec.ts b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-antragsteller/vorgang-detail-antragsteller.component.spec.ts index d635652fd016263cf999253c1062154966c5fdf3..5a06ecec0f7beef48567fb870f1cfa2a0904aba7 100644 --- a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-antragsteller/vorgang-detail-antragsteller.component.spec.ts +++ b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-antragsteller/vorgang-detail-antragsteller.component.spec.ts @@ -26,7 +26,7 @@ import localeDe from '@angular/common/locales/de'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { MatRipple } from '@angular/material/core'; import { MatIcon } from '@angular/material/icon'; -import { MatLegacyList as MatList, MatLegacyListItem as MatListItem } from '@angular/material/legacy-list'; +import { MatList, MatListItem } from '@angular/material/list'; import { EMPTY_STRING } from '@goofy-client/tech-shared'; import { Antragsteller } from '@goofy-client/vorgang-shared'; import { getElementFromFixture } from 'libs/test-utils/src/lib/helper'; @@ -189,7 +189,7 @@ describe('VorgangDetailAntragstellerComponent', () => { it('should be visible', () => { const element = getElementFromFixture(fixture, antragstellerAdresse); - expect(element).toHaveClass('mat-list-item'); + expect(element).toHaveClass('mdc-list-item'); }); it('should not be visible', () => { diff --git a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-area.component.scss b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-area.component.scss index d7dae48756ba7455ba866b0b5d5b7f8425aad1c7..b5b56914f09e62caff0d9854980aea66191ec939 100644 --- a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-area.component.scss +++ b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-area.component.scss @@ -21,9 +21,9 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -@import "breakpoints"; -@import "include-media/dist/include-media"; -@import "variables"; +@import 'breakpoints'; +@import 'include-media/dist/include-media'; +@import 'variables'; :host { position: relative; diff --git a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-area.component.spec.ts b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-area.component.spec.ts index e51f6661660e55cf0e984c5ed6021019401dc19d..c361c0a4d2aea3fff0424788795e77f595247f12 100644 --- a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-area.component.spec.ts +++ b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-area.component.spec.ts @@ -22,12 +22,12 @@ * unter der Lizenz sind dem Lizenztext zu entnehmen. */ import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { MatLegacyDialogModule as MatDialogModule } from '@angular/material/legacy-dialog'; +import { MatDialogModule } from '@angular/material/dialog'; import { VorgangForwardingContainerComponent } from '@goofy-client/forwarding'; import { KommentarListInVorgangContainerComponent } from '@goofy-client/kommentar'; import { PostfachMailListContainerComponent } from '@goofy-client/postfach'; import { HasLinkPipe, ToEmbeddedResourcesPipe, createEmptyStateResource, createStateResource } from '@goofy-client/tech-shared'; -import { ButtonWithSpinnerComponent } from '@goofy-client/ui'; +import { OzgcloudStrokedButtonWithSpinnerComponent } from '@goofy-client/ui'; import { VorgangHeaderLinkRel, VorgangWithEingangLinkRel, VorgangWithEingangResource } from '@goofy-client/vorgang-shared'; import { WiedervorlageListInVorgangContainerComponent } from '@goofy-client/wiedervorlage'; import { getDataTestIdOf } from 'libs/tech-shared/test/data-test'; @@ -63,7 +63,7 @@ describe('VorgangDetailAreaComponent', () => { MockComponent(SpinnerComponent), MockComponent(VorgangDetailHeaderComponent), MockComponent(VorgangDetailFormularButtonsComponent), - MockComponent(ButtonWithSpinnerComponent), + MockComponent(OzgcloudStrokedButtonWithSpinnerComponent), MockComponent(WiedervorlageListInVorgangContainerComponent), MockComponent(KommentarListInVorgangContainerComponent), MockComponent(PostfachMailListContainerComponent), diff --git a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-formular-buttons/vorgang-detail-formular-buttons.component.scss b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-formular-buttons/vorgang-detail-formular-buttons.component.scss index 82592a13acc75a3a375f627dd393ca83f37aa4a6..752da8e715baef4bfef8fa45e0d721083e1cbfa5 100644 --- a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-formular-buttons/vorgang-detail-formular-buttons.component.scss +++ b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-formular-buttons/vorgang-detail-formular-buttons.component.scss @@ -25,7 +25,7 @@ margin-left: 48px; ::ng-deep { - goofy-client-button-with-spinner { + goofy-client-ozgcloud-stroked-button-with-spinner { margin: 0 8px; } } diff --git a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-formular-buttons/vorgang-detail-formular-buttons.component.spec.ts b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-formular-buttons/vorgang-detail-formular-buttons.component.spec.ts index 582c72dda4d9ba00d08ff0da516f961dc36a0ebb..4ec28f80b22f25b6e499b05c86ba07803264b291 100644 --- a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-formular-buttons/vorgang-detail-formular-buttons.component.spec.ts +++ b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-formular-buttons/vorgang-detail-formular-buttons.component.spec.ts @@ -25,7 +25,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { EndgueltigLoeschenButtonContainerComponent, LoeschAnforderungZuruecknehmenButtonContainerComponent, LoeschenAnfordernButtonContainerComponent } from '@goofy-client/loesch-anforderung'; import { HasLinkPipe } from '@goofy-client/tech-shared'; import { existsAsHtmlElement, notExistsAsHtmlElement } from '@goofy-client/test-utils'; -import { ButtonWithSpinnerComponent } from '@goofy-client/ui'; +import { OzgcloudStrokedButtonWithSpinnerComponent } from '@goofy-client/ui'; import { VorgangWithEingangLinkRel } from '@goofy-client/vorgang-shared'; import { getDataTestIdOf } from 'libs/tech-shared/test/data-test'; import { createVorgangWithEingangResource } from 'libs/vorgang-shared/test/vorgang'; @@ -51,7 +51,7 @@ describe('VorgangDetailFormularButtonsComponent', () => { declarations: [ VorgangDetailFormularButtonsComponent, HasLinkPipe, - MockComponent(ButtonWithSpinnerComponent), + MockComponent(OzgcloudStrokedButtonWithSpinnerComponent), MockComponent(AnnehmenButtonComponent), MockComponent(BearbeitenButtonComponent), MockComponent(VerwerfenButtonComponent), diff --git a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-formular-daten/vorgang-detail-formular-daten.component.html b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-formular-daten/vorgang-detail-formular-daten.component.html index 21d2178ff59a2575312fbd54ed1110f75dbaef79..9aa3b558e94fa6ed3c4f34e72f3a7b3547fe173b 100644 --- a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-formular-daten/vorgang-detail-formular-daten.component.html +++ b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-formular-daten/vorgang-detail-formular-daten.component.html @@ -26,7 +26,7 @@ <goofy-client-expansion-panel *ngIf="vorgangWithEingang.eingang" data-test-id="formulardaten-panel" headline="Formulardaten"> - <mat-tab-group animationDuration="0" [selectedIndex]="defaultSelection"> + <mat-tab-group mat-stretch-tabs="false" mat-align-tabs="start" animationDuration="0" [selectedIndex]="defaultSelection"> <mat-tab label="Antragsdaten"> <goofy-client-vorgang-detail-antrag-data [eingang]="vorgangWithEingang.eingang" [antragsData]="antragsData"></goofy-client-vorgang-detail-antrag-data> </mat-tab> diff --git a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-formular-daten/vorgang-detail-formular-daten.component.spec.ts b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-formular-daten/vorgang-detail-formular-daten.component.spec.ts index fc86ce4c021bcc6abad2e820c806cadb5fec8b99..b47775078b5ab9017c45b7b39056118851fed714 100644 --- a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-formular-daten/vorgang-detail-formular-daten.component.spec.ts +++ b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-formular-daten/vorgang-detail-formular-daten.component.spec.ts @@ -22,7 +22,7 @@ * unter der Lizenz sind dem Lizenztext zu entnehmen. */ import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { MatLegacyTabsModule as MatTabsModule } from '@angular/material/legacy-tabs'; +import { MatTabsModule } from '@angular/material/tabs'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { HistorieContainerComponent } from '@goofy-client/historie'; import { HasLinkPipe, NotHasLinkPipe } from '@goofy-client/tech-shared'; @@ -50,7 +50,7 @@ describe('VorgangDetailFormularDatenComponent', () => { return `div[role=tab]:nth-child(${ index })` } - const disabledTabClass: string = 'mat-tab-disabled'; + const disabledTabClass: string = 'mat-mdc-tab-disabled'; const vorgangWithEingang: VorgangWithEingangResource = createVorgangWithEingangResource(); const vorgangWithHistorie: VorgangWithEingangResource = createVorgangWithEingangResource([VorgangWithEingangLinkRel.HISTORIE]); diff --git a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-header/vorgang-detail-header.component.scss b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-header/vorgang-detail-header.component.scss index 99c7e9e6ad89df2284effdeaf3ed9782aa763ec4..5fd548620e9d7697331d507805a8399b98f86aea 100644 --- a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-header/vorgang-detail-header.component.scss +++ b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-area/vorgang-detail-header/vorgang-detail-header.component.scss @@ -21,9 +21,9 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -@import "breakpoints"; -@import "include-media/dist/include-media"; -@import "variables"; +@import 'breakpoints'; +@import 'include-media/dist/include-media'; +@import 'variables'; :host { display: grid; diff --git a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-export-container/vorgang-export-container.component.html b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-export-container/vorgang-export-container.component.html index 1c329b9e9c0791cecb73888c89900c4e660a9f63..635de1e1acb8dc3e65198580f502a5b2540f30e3 100644 --- a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-export-container/vorgang-export-container.component.html +++ b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-export-container/vorgang-export-container.component.html @@ -1,7 +1,6 @@ -<goofy-client-button-with-spinner dataTestId="export-vorgang" +<goofy-client-ozgcloud-button-with-spinner dataTestId="export-vorgang" [showSpinner]="(exportStateResource$ | async)?.loading" (clickEmitter)="export()" text="Herunterladen" - icon="save_alt" - [strokedButton]="false"> -</goofy-client-button-with-spinner> \ No newline at end of file + icon="save_alt"> +</goofy-client-ozgcloud-button-with-spinner> \ No newline at end of file diff --git a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-export-container/vorgang-export-container.component.spec.ts b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-export-container/vorgang-export-container.component.spec.ts index a859d4474ae101e53f028637e6296ac26e781dd9..61c5d016774d927717667a8fb3acb0caa44c8220 100644 --- a/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-export-container/vorgang-export-container.component.spec.ts +++ b/goofy-client/libs/vorgang-detail/src/lib/vorgang-detail-page/vorgang-detail-more-menu/vorgang-export-container/vorgang-export-container.component.spec.ts @@ -1,7 +1,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { StateResource, createStateResource } from '@goofy-client/tech-shared'; import { dispatchEventFromFixture, mock } from '@goofy-client/test-utils'; -import { ButtonWithSpinnerComponent } from '@goofy-client/ui'; +import { OzgcloudButtonWithSpinnerComponent } from '@goofy-client/ui'; import { VorgangService } from '@goofy-client/vorgang-shared'; import { MockComponent } from 'ng-mocks'; import { of } from 'rxjs'; @@ -20,7 +20,7 @@ describe('VorgangExportContainerComponent', () => { await TestBed.configureTestingModule({ declarations: [ VorgangExportContainerComponent, - MockComponent(ButtonWithSpinnerComponent), + MockComponent(OzgcloudButtonWithSpinnerComponent), ], providers: [ { diff --git a/goofy-client/libs/vorgang-shared-ui/src/lib/aktenzeichen/aktenzeichen.component.spec.ts b/goofy-client/libs/vorgang-shared-ui/src/lib/aktenzeichen/aktenzeichen.component.spec.ts index ce9281d41fdf94fc5d110426ea0c347ddf181840..b6354ae73c874ca75f65507c5489622c172729f7 100644 --- a/goofy-client/libs/vorgang-shared-ui/src/lib/aktenzeichen/aktenzeichen.component.spec.ts +++ b/goofy-client/libs/vorgang-shared-ui/src/lib/aktenzeichen/aktenzeichen.component.spec.ts @@ -23,7 +23,7 @@ */ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { VorgangResource } from '@goofy-client/vorgang-shared'; -import { MattooltipDirective } from 'libs/ui/src/lib/ui/mattooltip/mattooltip.directive'; +import { MatTooltipDirective } from 'libs/ui/src/lib/ui/mattooltip/mattooltip.directive'; import { createVorgangResource } from 'libs/vorgang-shared/test/vorgang'; import { VORGANG_KEIN_AKTENZEICHEN_ZUGEWIESEN } from '../vorgang-util'; import { AktenzeichenComponent } from './aktenzeichen.component'; @@ -40,7 +40,7 @@ describe('AktenzeichenComponent', () => { await TestBed.configureTestingModule({ declarations: [ AktenzeichenComponent, - MattooltipDirective + MatTooltipDirective ] }).compileComponents(); }); diff --git a/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-in-postfach-breadcrumb-container/vorgang-in-postfach-breadcrumb/vorgang-in-postfach-breadcrumb.component.scss b/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-in-postfach-breadcrumb-container/vorgang-in-postfach-breadcrumb/vorgang-in-postfach-breadcrumb.component.scss index c8508d6f0d2495ef29709fe4a001ab330c053222..fc20de9113991e7e70654e30b5f19da9be8e3bdb 100644 --- a/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-in-postfach-breadcrumb-container/vorgang-in-postfach-breadcrumb/vorgang-in-postfach-breadcrumb.component.scss +++ b/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-in-postfach-breadcrumb-container/vorgang-in-postfach-breadcrumb/vorgang-in-postfach-breadcrumb.component.scss @@ -21,7 +21,7 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -@import "variables"; +@import 'variables'; :host { display: block; diff --git a/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-nummer/vorgang-nummer.component.spec.ts b/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-nummer/vorgang-nummer.component.spec.ts index 5e96722836f42524b3d2918789ddb3a52eb356ad..755d50460166314610cde82f10fad018669960d7 100644 --- a/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-nummer/vorgang-nummer.component.spec.ts +++ b/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-nummer/vorgang-nummer.component.spec.ts @@ -27,7 +27,7 @@ import { MatIconTestingModule } from '@angular/material/icon/testing'; import { getElementFromFixture } from '@goofy-client/test-utils'; import { VorgangResource } from '@goofy-client/vorgang-shared'; import { getDataTestIdOf } from 'libs/tech-shared/test/data-test'; -import { MattooltipDirective } from 'libs/ui/src/lib/ui/mattooltip/mattooltip.directive'; +import { MatTooltipDirective } from 'libs/ui/src/lib/ui/mattooltip/mattooltip.directive'; import { createVorgangResource } from 'libs/vorgang-shared/test/vorgang'; import { VorgangNummerComponent } from './vorgang-nummer.component'; @@ -42,7 +42,7 @@ describe('VorgangNummerComponent', () => { await TestBed.configureTestingModule({ declarations: [ MatIcon, - MattooltipDirective, + MatTooltipDirective, VorgangNummerComponent ], imports: [ diff --git a/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-search-container/vorgang-search/vorgang-search.component.html b/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-search-container/vorgang-search/vorgang-search.component.html index 8863a78a241f9ba584274cd48473bf7c18a769f9..716e4c376d67777d04be46cc2da8b3778df8c730 100644 --- a/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-search-container/vorgang-search/vorgang-search.component.html +++ b/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-search-container/vorgang-search/vorgang-search.component.html @@ -33,7 +33,7 @@ mat-icon-button aria-label="Vorgang suchen"> <mat-icon matPrefix class="search-icon">search</mat-icon> </button> - <mat-form-field floatLabel="never"> + <mat-form-field floatLabel="never" subscriptSizing="dynamic"> <input matInput data-test-id="search-input" #searchInput placeholder="Vorgang suchen" diff --git a/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-search-container/vorgang-search/vorgang-search.component.scss b/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-search-container/vorgang-search/vorgang-search.component.scss index 4111cd48e71495c531f894bc19a64757219e4410..074edac131a01f41476756748682caed62f313c4 100644 --- a/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-search-container/vorgang-search/vorgang-search.component.scss +++ b/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-search-container/vorgang-search/vorgang-search.component.scss @@ -21,7 +21,7 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -@import "variables"; +@import 'variables'; mat-form-field { flex-grow: 1; @@ -31,8 +31,7 @@ input { border: 0; background-color: transparent; outline: 0; - flex-grow: 1; - font-size: 18px; + font-size: 18px !important; color: inherit; min-width: 0; // Firefox workaround for close icon width: calc(100% - 40px); @@ -55,72 +54,6 @@ input { } } -::ng-deep { - .cdk-overlay-pane { - &:before { - content: ""; - height: 7px; - width: 100%; - position: absolute; - top: -6px; - background: inherit; - z-index: 2; - } - } - - goofy-client-vorgang-search { - .mat-form-field-underline { - display: none; - } - .mat-form-field-appearance-legacy { - .mat-form-field-wrapper { - padding-bottom: 0; - font-size: 18px; - - .mat-form-field-flex { - align-items: center; - height: 40px; - - .mat-form-field-infix { - border-top: none; - } - } - } - } - } - - .mat-autocomplete-panel.vorgang-search { - max-height: calc(100vh - $header-height); - max-width: 600px; - width: calc(600px - (800px - 100vw)); - height: auto; - box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.4); - position: relative; - border-bottom-left-radius: 20px; - border-bottom-right-radius: 20px; - margin-left: -40px; - - .mat-option { - border-top: 1px solid rgba(0, 0, 0, 0.08); - - &:first-child { - border-top: none; - } - font-size: 14px; - height: auto; - line-height: normal; - padding: 0.5rem 1rem; - - .line { - mat-icon { - margin-right: 0.25rem; - min-width: 1.5rem; - } - } - } - } -} - .autocomplete-spinner { position: absolute; width: 100%; diff --git a/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-search-container/vorgang-search/vorgang-search.component.spec.ts b/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-search-container/vorgang-search/vorgang-search.component.spec.ts index a861f7bebd3a3896684824920fdf673ae189452c..48846c6084529b48789d7c742d236aef661682a4 100644 --- a/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-search-container/vorgang-search/vorgang-search.component.spec.ts +++ b/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-search-container/vorgang-search/vorgang-search.component.spec.ts @@ -24,10 +24,10 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ReactiveFormsModule, UntypedFormBuilder, UntypedFormControl, UntypedFormGroup } from '@angular/forms'; import { MatIcon } from '@angular/material/icon'; -import { MatLegacyAutocompleteModule as MatAutocompleteModule } from '@angular/material/legacy-autocomplete'; -import { MatLegacyButton as MatButton } from '@angular/material/legacy-button'; -import { MatLegacyFormFieldModule as MatFormFieldModule } from '@angular/material/legacy-form-field'; -import { MatLegacyInputModule as MatInputModule } from '@angular/material/legacy-input'; +import { MatAutocompleteModule } from '@angular/material/autocomplete'; +import { MatButton } from '@angular/material/button'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { RouterTestingModule } from '@angular/router/testing'; import { NavigationService } from '@goofy-client/navigation-shared'; diff --git a/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-search-container/vorgang-search/vorgang-search.component.ts b/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-search-container/vorgang-search/vorgang-search.component.ts index 838ecb52d7e1c409cae00edb0bc505a229948ad6..55ff86367ea442a220017e5acd1da2c64be64857 100644 --- a/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-search-container/vorgang-search/vorgang-search.component.ts +++ b/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-search-container/vorgang-search/vorgang-search.component.ts @@ -23,7 +23,7 @@ */ import { Component, ElementRef, EventEmitter, Input, Output, ViewChild } from '@angular/core'; import { MatAutocomplete } from '@angular/material/autocomplete'; -import { MatLegacyButton as MatButton } from '@angular/material/legacy-button'; +import { MatButton } from '@angular/material/button'; import { StateResource, isNotNil } from '@goofy-client/tech-shared'; import { VorgangHeaderLinkRel, VorgangListLinkRel, VorgangListResource } from '@goofy-client/vorgang-shared'; import { VorgangSearchFormService } from './vorgang-search.formservice'; diff --git a/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-status-dot/vorgang-status-dot.component.scss b/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-status-dot/vorgang-status-dot.component.scss index 3f4bc35cd972dbabc5b726a1c11d06f123de7e27..31d3a555ee22587580982771d98cc034405fe659 100644 --- a/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-status-dot/vorgang-status-dot.component.scss +++ b/goofy-client/libs/vorgang-shared-ui/src/lib/vorgang-status-dot/vorgang-status-dot.component.scss @@ -23,7 +23,7 @@ */ @use 'sass:map'; @use '@angular/material' as mat; -@import "variables"; +@import 'variables'; .dot { border-radius: 50%; diff --git a/goofy-client/libs/vorgang-shared-ui/src/lib/wiedervorlage-icon/wiedervorlage-icon.component.scss b/goofy-client/libs/vorgang-shared-ui/src/lib/wiedervorlage-icon/wiedervorlage-icon.component.scss index 2b7e150569fa34647fa8037a907dc124f8cf989d..6933eccb16aa120fffc60bfd4dc84fc02157157f 100644 --- a/goofy-client/libs/vorgang-shared-ui/src/lib/wiedervorlage-icon/wiedervorlage-icon.component.scss +++ b/goofy-client/libs/vorgang-shared-ui/src/lib/wiedervorlage-icon/wiedervorlage-icon.component.scss @@ -1,9 +1,10 @@ @use 'sass:map'; @use '@angular/material' as mat; -@import "variables"; +@import 'variables'; :host { margin-right: 6px; + height: $iconHeight; } .red { diff --git a/goofy-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-created-at/vorgang-created-at.component.spec.ts b/goofy-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-created-at/vorgang-created-at.component.spec.ts index ad769d0cfc8fbbd6ae96ff9b5148c85eb06e68f8..7c5d2379389d3245b76014f9da98e5ed3a6afbf0 100644 --- a/goofy-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-created-at/vorgang-created-at.component.spec.ts +++ b/goofy-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-created-at/vorgang-created-at.component.spec.ts @@ -30,7 +30,7 @@ import { FormatDateWithTimePipe, FormatDateWithoutYearWithTimePipe, formatDateWi import { getElementFromFixture } from '@goofy-client/test-utils'; import { VorgangResource } from '@goofy-client/vorgang-shared'; import { getDataTestIdOf } from 'libs/tech-shared/test/data-test'; -import { MattooltipDirective } from 'libs/ui/src/lib/ui/mattooltip/mattooltip.directive'; +import { MatTooltipDirective } from 'libs/ui/src/lib/ui/mattooltip/mattooltip.directive'; import { createVorgangResource } from 'libs/vorgang-shared/test/vorgang'; import { VorgangCreatedAtComponent } from './vorgang-created-at.component'; @@ -47,7 +47,7 @@ describe('VorgangCreatedAtComponent', () => { await TestBed.configureTestingModule({ declarations: [ MatIcon, - MattooltipDirective, + MatTooltipDirective, FormatDateWithoutYearWithTimePipe, FormatDateWithTimePipe, VorgangCreatedAtComponent diff --git a/goofy-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-list-item.component.scss b/goofy-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-list-item.component.scss index 47a1fe388236b6b912a107d19abbc5d794a704a6..8d4b05c75e265fecbdbbf2f92bd2a45c401a92c0 100644 --- a/goofy-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-list-item.component.scss +++ b/goofy-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-list-item.component.scss @@ -21,9 +21,9 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -@import "breakpoints"; -@import "include-media/dist/include-media"; -@import "variables"; +@import 'breakpoints'; +@import 'include-media/dist/include-media'; +@import 'variables'; .list-item { display: grid; diff --git a/goofy-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-list-item.component.spec.ts b/goofy-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-list-item.component.spec.ts index d8185e75c78b532665337a056d256cafb872d47e..7a4ac8982b440298f840e96e1200d0070f8e6d60 100644 --- a/goofy-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-list-item.component.spec.ts +++ b/goofy-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-list-item.component.spec.ts @@ -38,7 +38,7 @@ import { VorgangHeaderLinkRel } from '@goofy-client/vorgang-shared'; import { AktenzeichenComponent, VorgangNummerComponent, VorgangStatusDotComponent, VorgangStatusTextComponent } from '@goofy-client/vorgang-shared-ui'; import { WiedervorlageListInVorgangListContainerComponent } from '@goofy-client/wiedervorlage'; import { getDataTestClassOf, getDataTestIdOf } from 'libs/tech-shared/test/data-test'; -import { MattooltipDirective } from 'libs/ui/src/lib/ui/mattooltip/mattooltip.directive'; +import { MatTooltipDirective } from 'libs/ui/src/lib/ui/mattooltip/mattooltip.directive'; import { createVorgangResource } from 'libs/vorgang-shared/test/vorgang'; import { MockComponent } from 'ng-mocks'; import { VorgangCreatedAtComponent } from './vorgang-created-at/vorgang-created-at.component'; @@ -63,7 +63,7 @@ describe('VorgangListItemComponent', () => { declarations: [ VorgangListItemComponent, MatIcon, - MattooltipDirective, + MatTooltipDirective, EnumToLabelPipe, ToResourceUriPipe, HasLinkPipe, diff --git a/goofy-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-next-frist-button/vorgang-next-frist-button.component.scss b/goofy-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-next-frist-button/vorgang-next-frist-button.component.scss index 275c598e62c3551759b28497ebc56b3d12f137f8..38097e77f4843948a373643bef0c067d19c748ff 100644 --- a/goofy-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-next-frist-button/vorgang-next-frist-button.component.scss +++ b/goofy-client/libs/vorgang/src/lib/vorgang-list-container/vorgang-list/vorgang-list-item/vorgang-next-frist-button/vorgang-next-frist-button.component.scss @@ -23,7 +23,7 @@ */ @use 'sass:map'; @use '@angular/material' as mat; -@import "variables"; +@import 'variables'; .frist { background-color: inherit; diff --git a/goofy-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page/vorgang-filter-menu-container/vorgang-filter-menu/_vorgang-filter-item.theme.scss b/goofy-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page/vorgang-filter-menu-container/vorgang-filter-menu/_vorgang-filter-item.theme.scss index 93d228811dfb494f43564d7daf13310f83ac72af..838558d2813db49aa0981bc25ac162b54e1fea54 100644 --- a/goofy-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page/vorgang-filter-menu-container/vorgang-filter-menu/_vorgang-filter-item.theme.scss +++ b/goofy-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page/vorgang-filter-menu-container/vorgang-filter-menu/_vorgang-filter-item.theme.scss @@ -35,6 +35,7 @@ goofy-client-vorgang-filter-menu { display: none; } } + .mat-button-toggle-checked .filter-item-content { font-weight: bold; diff --git a/goofy-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page/vorgang-list-page.component.scss b/goofy-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page/vorgang-list-page.component.scss index 9a171e68db7a51c79288235fcaca9cc733f32d42..62cd872b8afc3904b6f3132d717815020e3ecf85 100644 --- a/goofy-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page/vorgang-list-page.component.scss +++ b/goofy-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page/vorgang-list-page.component.scss @@ -21,7 +21,7 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -@import "variables"; +@import 'variables'; h1 { text-align: center; diff --git a/goofy-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page/vorgang-views-menu/_vorgang-views-menu.theme.scss b/goofy-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page/vorgang-views-menu/_vorgang-views-menu.theme.scss index 9e9ebbf1038dbc38aa20ba301797d99268e5f39d..af312bf2d5faeddfc810bcee1fbd8a8393ab9ae6 100644 --- a/goofy-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page/vorgang-views-menu/_vorgang-views-menu.theme.scss +++ b/goofy-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page/vorgang-views-menu/_vorgang-views-menu.theme.scss @@ -15,7 +15,7 @@ goofy-client-vorgang-search-view-item { goofy-client-vorgang-view-item, goofy-client-vorgang-search-view-item { goofy-client-ozgcloud-routing-button { - .mat-button { + .mat-mdc-button { text-align: left; width: 100%; border-radius: 1rem; @@ -23,14 +23,14 @@ goofy-client-vorgang-search-view-item { padding: 0 0.875rem; } - &.selected .mat-button { + &.selected .mat-mdc-button { background-color: $activeButton; font-weight: 500; } - - .mat-button-wrapper { + .mdc-button__label { display: flex; align-items: center; + width: 100%; .label { flex-grow: 1; @@ -43,7 +43,7 @@ body.dark { goofy-client-vorgang-view-item, goofy-client-vorgang-search-view-item-container { goofy-client-ozgcloud-routing-button { - &.selected .mat-button { + &.selected .mat-mdc-button { background-color: #212121; } } diff --git a/goofy-client/libs/wiedervorlage/src/lib/submit-wiedervorlage-button/submit-wiedervorlage-button.component.html b/goofy-client/libs/wiedervorlage/src/lib/submit-wiedervorlage-button/submit-wiedervorlage-button.component.html index b793b5665d8e37166039abde8ae09b3be30e06ab..bb9f884b89f29f9e6f154ad2b10c989efcc0c111 100644 --- a/goofy-client/libs/wiedervorlage/src/lib/submit-wiedervorlage-button/submit-wiedervorlage-button.component.html +++ b/goofy-client/libs/wiedervorlage/src/lib/submit-wiedervorlage-button/submit-wiedervorlage-button.component.html @@ -23,11 +23,11 @@ unter der Lizenz sind dem Lizenztext zu entnehmen. --> -<goofy-client-button-with-spinner *ngIf="!showAsIconButton" text="Speichern" data-test-id="speichern-button" +<goofy-client-ozgcloud-stroked-button-with-spinner *ngIf="!showAsIconButton" text="Speichern" data-test-id="speichern-button" icon="save_alt" [stateResource]="submitInProgress$ | async" (clickEmitter)="submit()"> -</goofy-client-button-with-spinner> +</goofy-client-ozgcloud-stroked-button-with-spinner> <goofy-client-icon-button-with-spinner *ngIf="showAsIconButton" icon="save_alt" toolTip="Wiedervorlage speichern" diff --git a/goofy-client/libs/wiedervorlage/src/lib/submit-wiedervorlage-button/submit-wiedervorlage-button.component.spec.ts b/goofy-client/libs/wiedervorlage/src/lib/submit-wiedervorlage-button/submit-wiedervorlage-button.component.spec.ts index 676f5479e38aa46ab39643e40213875745a06f85..eb436b9cf48cf238761a9e5bd8ee58da43701f2f 100644 --- a/goofy-client/libs/wiedervorlage/src/lib/submit-wiedervorlage-button/submit-wiedervorlage-button.component.spec.ts +++ b/goofy-client/libs/wiedervorlage/src/lib/submit-wiedervorlage-button/submit-wiedervorlage-button.component.spec.ts @@ -25,9 +25,9 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ActivatedRoute } from '@angular/router'; import { CommandResource } from '@goofy-client/command-shared'; import { NavigationService } from '@goofy-client/navigation-shared'; -import { createStateResource, StateResource } from '@goofy-client/tech-shared'; +import { StateResource, createStateResource } from '@goofy-client/tech-shared'; import { mock } from '@goofy-client/test-utils'; -import { ButtonWithSpinnerComponent, IconButtonWithSpinnerComponent } from '@goofy-client/ui'; +import { IconButtonWithSpinnerComponent, OzgcloudStrokedButtonWithSpinnerComponent } from '@goofy-client/ui'; import { WiedervorlageService } from '@goofy-client/wiedervorlage-shared'; import { CommandLinkRel } from 'libs/command-shared/src/lib/command.linkrel'; import { createCommandResource } from 'libs/command-shared/test/command'; @@ -50,7 +50,7 @@ describe('SubmitWiedervorlageButtonComponent', () => { await TestBed.configureTestingModule({ declarations: [ SubmitWiedervorlageButtonComponent, - MockComponent(ButtonWithSpinnerComponent), + MockComponent(OzgcloudStrokedButtonWithSpinnerComponent), MockComponent(IconButtonWithSpinnerComponent) ], providers: [ diff --git a/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-create-button/wiedervorlage-create-button.component.html b/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-create-button/wiedervorlage-create-button.component.html index 86888c66834b634a6ecefcf5f0964c29673f0f30..a4d2cbf0101054bb9fa52fed14de54034fa48b34 100644 --- a/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-create-button/wiedervorlage-create-button.component.html +++ b/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-create-button/wiedervorlage-create-button.component.html @@ -28,9 +28,9 @@ <div class="create-button" *ngIf="wiedervorlageListResource | hasLink: wiedervorlageListLinkRel.CREATE_WIEDERVORLAGE"> <a [routerLink]="'wiedervorlage/' + wiedervorlageRoute.NEW" tabindex="-1"> - <goofy-client-button-with-spinner *ngIf="!showAsIconButton" data-test-id="create-wiedervorlage" + <goofy-client-ozgcloud-stroked-button-with-spinner *ngIf="!showAsIconButton" data-test-id="create-wiedervorlage" class="create-button" text="Wiedervorlage" icon="add"> - </goofy-client-button-with-spinner> + </goofy-client-ozgcloud-stroked-button-with-spinner> <goofy-client-icon-button-with-spinner *ngIf="showAsIconButton" data-test-id="create-wiedervorlage-icon-button" icon="update" toolTip="Wiedervorlage erstellen"> diff --git a/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-create-button/wiedervorlage-create-button.component.spec.ts b/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-create-button/wiedervorlage-create-button.component.spec.ts index 06fe1dd18a7e9300863c0babba163bc7631577ad..53a201f3c966a254fb114677c17be2e78b130646 100644 --- a/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-create-button/wiedervorlage-create-button.component.spec.ts +++ b/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-create-button/wiedervorlage-create-button.component.spec.ts @@ -23,8 +23,8 @@ */ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { RouterTestingModule } from '@angular/router/testing'; -import { createStateResource, HasLinkPipe } from '@goofy-client/tech-shared'; -import { ButtonWithSpinnerComponent, IconButtonWithSpinnerComponent } from '@goofy-client/ui'; +import { HasLinkPipe, createStateResource } from '@goofy-client/tech-shared'; +import { IconButtonWithSpinnerComponent, OzgcloudStrokedButtonWithSpinnerComponent } from '@goofy-client/ui'; import { WiedervorlageListLinkRel } from '@goofy-client/wiedervorlage-shared'; import { getDataTestIdOf } from 'libs/tech-shared/test/data-test'; import { createWiedervorlageListResource } from 'libs/wiedervorlage-shared/test/wiedervorlage'; @@ -42,7 +42,7 @@ describe('WiedervorlageCreateButtonComponent', () => { declarations: [ WiedervorlageCreateButtonComponent, HasLinkPipe, - MockComponent(ButtonWithSpinnerComponent), + MockComponent(OzgcloudStrokedButtonWithSpinnerComponent), MockComponent(IconButtonWithSpinnerComponent) ], imports: [ diff --git a/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-in-vorgang/wiedervorlage-in-vorgang.component.spec.ts b/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-in-vorgang/wiedervorlage-in-vorgang.component.spec.ts index e17a322961f598ea36303a3720afdacebccea000..4042e93484e944d4a92f21ad97cf0947a06dbc1c 100644 --- a/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-in-vorgang/wiedervorlage-in-vorgang.component.spec.ts +++ b/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-container/wiedervorlage-list-in-vorgang/wiedervorlage-in-vorgang/wiedervorlage-in-vorgang.component.spec.ts @@ -29,12 +29,12 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { MAT_DATE_LOCALE } from '@angular/material/core'; import { MatIcon } from '@angular/material/icon'; import { RouterTestingModule } from '@angular/router/testing'; -import { ConvertForDataTestPipe, formatFullDate, FormatToPrettyDatePipe, HasLinkPipe, ToResourceUriPipe, ToTrafficLightTooltipPipe } from '@goofy-client/tech-shared'; +import { ConvertForDataTestPipe, FormatToPrettyDatePipe, HasLinkPipe, ToResourceUriPipe, ToTrafficLightTooltipPipe, formatFullDate } from '@goofy-client/tech-shared'; import { dispatchEventFromFixture } from '@goofy-client/test-utils'; import { ExpansionPanelComponent } from '@goofy-client/ui'; import { LinkWithUserNameTooltipContainerComponent, TextWithUserNameTooltipContainerComponent } from '@goofy-client/user-profile'; import { WiedervorlageResource } from '@goofy-client/wiedervorlage-shared'; -import { MattooltipDirective } from 'libs/ui/src/lib/ui/mattooltip/mattooltip.directive'; +import { MatTooltipDirective } from 'libs/ui/src/lib/ui/mattooltip/mattooltip.directive'; import { createWiedervorlageResource } from 'libs/wiedervorlage-shared/test/wiedervorlage'; import { MockComponent } from 'ng-mocks'; import { WiedervorlageStatusComponent } from '../../../wiedervorlage-status/wiedervorlage-status.component'; @@ -61,7 +61,7 @@ describe('WiedervorlageInVorgangComponent', () => { ToTrafficLightTooltipPipe, ConvertForDataTestPipe, MatIcon, - MattooltipDirective, + MatTooltipDirective, HasLinkPipe, MockComponent(ExpansionPanelComponent), MockComponent(WiedervorlageStatusComponent), diff --git a/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-list-container/wiedervorlage-list-in-vorgang-list-container.component.spec.ts b/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-list-container/wiedervorlage-list-in-vorgang-list-container.component.spec.ts index e7f68b2d41653a4e882f0fafd9e2339161829055..c174db9d8587043d7422655586292a52673feb47 100644 --- a/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-list-container/wiedervorlage-list-in-vorgang-list-container.component.spec.ts +++ b/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-list-in-vorgang-list-container/wiedervorlage-list-in-vorgang-list-container.component.spec.ts @@ -22,9 +22,9 @@ * unter der Lizenz sind dem Lizenztext zu entnehmen. */ import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { MatLegacyTooltip as MatTooltip } from '@angular/material/legacy-tooltip'; -import { createStateResource, FormatToPrettyDatePipe, ToTrafficLightTooltipPipe } from '@goofy-client/tech-shared'; +import { FormatToPrettyDatePipe, ToTrafficLightTooltipPipe, createStateResource } from '@goofy-client/tech-shared'; import { mock } from '@goofy-client/test-utils'; +import { MatTooltipDirective } from '@goofy-client/ui'; import { WiedervorlageService } from '@goofy-client/wiedervorlage-shared'; import { createWiedervorlageListResource } from 'libs/wiedervorlage-shared/test/wiedervorlage'; import { MockComponent } from 'ng-mocks'; @@ -42,7 +42,7 @@ describe('WiedervorlageListInVorgangListContainerComponent', () => { await TestBed.configureTestingModule({ declarations: [ WiedervorlageListInVorgangListContainerComponent, - MatTooltip, + MatTooltipDirective, FormatToPrettyDatePipe, ToTrafficLightTooltipPipe, MockComponent(WiedervorlageStatusComponent) diff --git a/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-page-container/wiedervorlage-page/wiedervorlage-breadcrumb-container/wiedervorlage-breadcrumb/wiedervorlage-breadcrumb.component.scss b/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-page-container/wiedervorlage-page/wiedervorlage-breadcrumb-container/wiedervorlage-breadcrumb/wiedervorlage-breadcrumb.component.scss index d2ff2cd19eddc71487e2320fe1f164b7f2a2e32c..5dcc5f416150e682b0b567988893eb3ec147cfab 100644 --- a/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-page-container/wiedervorlage-page/wiedervorlage-breadcrumb-container/wiedervorlage-breadcrumb/wiedervorlage-breadcrumb.component.scss +++ b/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-page-container/wiedervorlage-page/wiedervorlage-breadcrumb-container/wiedervorlage-breadcrumb/wiedervorlage-breadcrumb.component.scss @@ -21,7 +21,7 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -@import "variables"; +@import 'variables'; :host { display: block; diff --git a/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-status/wiedervorlage-status.component.scss b/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-status/wiedervorlage-status.component.scss index 56d7903303d3a21e06df37646f497e7e0d54ec9f..1a2b0053867f54776399136d91eaf307fffe5278 100644 --- a/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-status/wiedervorlage-status.component.scss +++ b/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-status/wiedervorlage-status.component.scss @@ -23,7 +23,7 @@ */ @use 'sass:map'; @use '@angular/material' as mat; -@import "variables"; +@import 'variables'; :host { display: flex; diff --git a/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-status/wiedervorlage-status.component.spec.ts b/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-status/wiedervorlage-status.component.spec.ts index 140790a5c7523026bdabe2e047598f08abd6f196..864cacb42a5eec0633d06fdae157631f5c0bf74d 100644 --- a/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-status/wiedervorlage-status.component.spec.ts +++ b/goofy-client/libs/wiedervorlage/src/lib/wiedervorlage-status/wiedervorlage-status.component.spec.ts @@ -23,8 +23,8 @@ */ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { MatIcon } from '@angular/material/icon'; -import { MatLegacyTooltip as MatTooltip } from '@angular/material/legacy-tooltip'; import { ToTrafficLightPipe } from '@goofy-client/tech-shared'; +import { MatTooltipDirective } from '@goofy-client/ui'; import { createWiedervorlageResource } from 'libs/wiedervorlage-shared/test/wiedervorlage'; import { MockDirective } from 'ng-mocks'; import { WiedervorlageStatusComponent } from './wiedervorlage-status.component'; @@ -40,7 +40,7 @@ describe('WiedervorlageStatusComponent', () => { declarations: [ WiedervorlageStatusComponent, ToTrafficLightPipe, - MockDirective(MatTooltip), + MockDirective(MatTooltipDirective), MatIcon ] }) diff --git a/goofy-client/package-lock.json b/goofy-client/package-lock.json index 10b14ffa4b27a46ef2939f8e675a77ce7c43d90c..f7e6c78364530df617dc20000bf696f1abe10aad 100644 --- a/goofy-client/package-lock.json +++ b/goofy-client/package-lock.json @@ -33,9 +33,9 @@ "date-fns": "^2.29.3", "file-saver": "2.0.5", "include-media": "^1.4.10", - "js-base64": "^3.7.3", + "js-base64": "^3.7.5", "lodash-es": "4.17.21", - "rxjs": "~7.8.0", + "rxjs": "~7.8.1", "sanitize-filename-ts": "^1.0.2", "tslib": "^2.3.0", "typeface-roboto": "1.1.13", @@ -50,8 +50,8 @@ "@angular/compiler-cli": "15.1.4", "@angular/language-service": "15.1.4", "@bahmutov/cypress-extends": "1.1.0", - "@cypress/webpack-batteries-included-preprocessor": "^2.3.0", - "@cypress/webpack-preprocessor": "^5.16.3", + "@cypress/webpack-batteries-included-preprocessor": "^2.4.1", + "@cypress/webpack-preprocessor": "^5.17.1", "@faker-js/faker": "^6.3.1", "@ngrx/schematics": "15.0.0", "@ngrx/store-devtools": "15.0.0", @@ -62,16 +62,16 @@ "@nrwl/linter": "15.6.3", "@nrwl/workspace": "15.6.3", "@testing-library/jest-dom": "5.16.4", - "@types/file-saver": "2.0.5", + "@types/file-saver": "2.0.6", "@types/jest": "28.1.8", - "@types/lodash-es": "4.17.6", + "@types/lodash-es": "4.17.10", "@types/node": "^16.18.1", "@typescript-eslint/eslint-plugin": "5.44.0", "@typescript-eslint/parser": "5.44.0", - "cypress": "^9.7.0", + "cypress": "^12.17.4", "cypress-file-upload": "5.0.8", - "cypress-mochawesome-reporter": "3.3.0", - "cypress-real-events": "^1.7.6", + "cypress-mochawesome-reporter": "3.6.0", + "cypress-real-events": "^1.10.3", "cypress-timestamps": "^1.2.3", "eslint": "8.15.0", "eslint-config-prettier": "8.3.0", @@ -85,10 +85,10 @@ "jest-preset-angular": "12.2.3", "jest-sonar-reporter": "^2.0.0", "mongodb": "4.5.0", - "ng-mocks": "^14.1.0", + "ng-mocks": "^14.11.0", "nx": "15.6.3", "prettier": "2.7.1", - "sonarqube-scanner": "2.9.1", + "sonarqube-scanner": "3.1.0", "ts-jest": "28.0.8", "ts-node": "10.9.1", "typescript": "4.8.4" @@ -3341,9 +3341,9 @@ } }, "node_modules/@cypress/request": { - "version": "2.88.11", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/@cypress/request/-/request-2.88.11.tgz", - "integrity": "sha512-M83/wfQ1EkspjkE2lNWNV5ui2Cv7UCv1swW1DqljahbzLVWltcsexQh8jYtuS/vzFXP+HySntGM83ZXA9fn17w==", + "version": "2.88.12", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/@cypress/request/-/request-2.88.12.tgz", + "integrity": "sha512-tOn+0mDZxASFM+cuAP9szGUGPI1HwWVSvdzm7V4cCsPdFTx6qMj29CwaQmRAMIEhORIUBFBsYROYJcveK4uOjA==", "devOptional": true, "license": "Apache-2.0", "dependencies": { @@ -3362,7 +3362,7 @@ "performance-now": "^2.1.0", "qs": "~6.10.3", "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", + "tough-cookie": "^4.1.3", "tunnel-agent": "^0.6.0", "uuid": "^8.3.2" }, @@ -4347,9 +4347,9 @@ "license": "ISC" }, "node_modules/@cypress/webpack-preprocessor": { - "version": "5.17.0", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/@cypress/webpack-preprocessor/-/webpack-preprocessor-5.17.0.tgz", - "integrity": "sha512-HyFqHkrOrIIYOt4G+r3VK0kVYTcev1tEcqBI/0DJ4AzEuEgW/TB+cX56txy4Cgn60XXdJoul2utclZwUqOsPZA==", + "version": "5.17.1", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/@cypress/webpack-preprocessor/-/webpack-preprocessor-5.17.1.tgz", + "integrity": "sha512-FE/e8ikPc8z4EVopJCaior3RGy0jd2q9Xcp5NtiwNG4XnLfEnUFTZlAGwXe75sEh4fNMPrBJW1KIz77PX5vGAw==", "dev": true, "license": "MIT", "dependencies": { @@ -8945,9 +8945,9 @@ } }, "node_modules/@types/file-saver": { - "version": "2.0.5", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/@types/file-saver/-/file-saver-2.0.5.tgz", - "integrity": "sha512-zv9kNf3keYegP5oThGLaPk8E081DFDuwfqjtiTzm6PoxChdJ1raSuADf2YGCVIyrSynLrgc8JWv296s7Q7pQSQ==", + "version": "2.0.6", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/@types/file-saver/-/file-saver-2.0.6.tgz", + "integrity": "sha512-Mw671DVqoMHbjw0w4v2iiOro01dlT/WhWp5uwecBa0Wg8c+bcZOjgF1ndBnlaxhtvFCgTRBtsGivSVhrK/vnag==", "dev": true, "license": "MIT" }, @@ -9037,9 +9037,9 @@ "license": "MIT" }, "node_modules/@types/lodash-es": { - "version": "4.17.6", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/@types/lodash-es/-/lodash-es-4.17.6.tgz", - "integrity": "sha512-R+zTeVUKDdfoRxpAryaQNRKk3105Rrgx2CFRClIgRGaqDTdjsm8h6IYA8ir584W3ePzkZfst5xIgDwYrlh9HLg==", + "version": "4.17.10", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/@types/lodash-es/-/lodash-es-4.17.10.tgz", + "integrity": "sha512-YJP+w/2khSBwbUSFdGsSqmDvmnN3cCKoPOL7Zjle6s30ZtemkkqhjVfFqGwPN7ASil5VyjE2GtyU/yqYY6mC0A==", "dev": true, "license": "MIT", "dependencies": { @@ -9053,9 +9053,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "16.18.23", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/@types/node/-/node-16.18.23.tgz", - "integrity": "sha512-XAMpaw1s1+6zM+jn2tmw8MyaRDIJfXxqmIQIS0HfoGYPuf7dUWeiUKopwq13KFX9lEp1+THGtlaaYx39Nxr58g==", + "version": "16.18.54", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/@types/node/-/node-16.18.54.tgz", + "integrity": "sha512-oTmGy68gxZZ21FhTJVVvZBYpQHEBZxHKTsGshobMqm9qWpbqdZsA5jvsuPZcHu0KwpmLrOHWPdEfg7XDpNT9UA==", "license": "MIT" }, "node_modules/@types/parse-json": { @@ -10110,6 +10110,16 @@ "node": ">=8.9.0" } }, + "node_modules/adm-zip": { + "version": "0.5.10", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/adm-zip/-/adm-zip-0.5.10.tgz", + "integrity": "sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, "node_modules/agent-base": { "version": "6.0.2", "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/agent-base/-/agent-base-6.0.2.tgz", @@ -11200,6 +11210,14 @@ "dev": true, "license": "BSD-2-Clause" }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true, + "license": "ISC", + "peer": true + }, "node_modules/browserify-aes": { "version": "1.2.0", "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/browserify-aes/-/browserify-aes-1.2.0.tgz", @@ -11366,24 +11384,6 @@ "ieee754": "^1.1.13" } }, - "node_modules/buffer-alloc": { - "version": "1.2.0", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" - } - }, - "node_modules/buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", - "dev": true, - "license": "MIT" - }, "node_modules/buffer-crc32": { "version": "0.2.13", "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/buffer-crc32/-/buffer-crc32-0.2.13.tgz", @@ -11394,13 +11394,6 @@ "node": "*" } }, - "node_modules/buffer-fill": { - "version": "1.0.0", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==", - "dev": true, - "license": "MIT" - }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/buffer-from/-/buffer-from-1.1.2.tgz", @@ -11550,9 +11543,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001474", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/caniuse-lite/-/caniuse-lite-1.0.30001474.tgz", - "integrity": "sha512-iaIZ8gVrWfemh5DG3T9/YqarVZoYf0r188IjaGwx68j4Pf0SGY6CQkmJUIE+NZHkkecQGohzXmBGEwWDr9aM3Q==", + "version": "1.0.30001539", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/caniuse-lite/-/caniuse-lite-1.0.30001539.tgz", + "integrity": "sha512-hfS5tE8bnNiNvEOEkm8HElUHroYwlqMMENEzELymy77+tJ6m+gA2krtHl5hxJaj71OlpC2cHZbdSMX1/YEqEkA==", "funding": [ { "type": "opencollective", @@ -12046,9 +12039,9 @@ } }, "node_modules/commander": { - "version": "5.1.0", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "version": "6.2.1", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", "devOptional": true, "license": "MIT", "engines": { @@ -13069,16 +13062,16 @@ "license": "MIT" }, "node_modules/cypress": { - "version": "9.7.0", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/cypress/-/cypress-9.7.0.tgz", - "integrity": "sha512-+1EE1nuuuwIt/N1KXRR2iWHU+OiIt7H28jJDyyI4tiUftId/DrXYEwoDa5+kH2pki1zxnA0r6HrUGHV5eLbF5Q==", + "version": "12.17.4", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/cypress/-/cypress-12.17.4.tgz", + "integrity": "sha512-gAN8Pmns9MA5eCDFSDJXWKUpaL3IDd89N9TtIupjYnzLSmlpVr+ZR+vb4U/qaMp+lB6tBvAmt7504c3Z4RU5KQ==", "devOptional": true, "hasInstallScript": true, "license": "MIT", "dependencies": { - "@cypress/request": "^2.88.10", + "@cypress/request": "2.88.12", "@cypress/xvfb": "^1.2.4", - "@types/node": "^14.14.31", + "@types/node": "^16.18.39", "@types/sinonjs__fake-timers": "8.1.1", "@types/sizzle": "^2.3.2", "arch": "^2.2.0", @@ -13090,12 +13083,12 @@ "check-more-types": "^2.24.0", "cli-cursor": "^3.1.0", "cli-table3": "~0.6.1", - "commander": "^5.1.0", + "commander": "^6.2.1", "common-tags": "^1.8.0", "dayjs": "^1.10.4", - "debug": "^4.3.2", + "debug": "^4.3.4", "enquirer": "^2.3.6", - "eventemitter2": "^6.4.3", + "eventemitter2": "6.4.7", "execa": "4.1.0", "executable": "^4.1.1", "extract-zip": "2.0.1", @@ -13108,12 +13101,13 @@ "listr2": "^3.8.3", "lodash": "^4.17.21", "log-symbols": "^4.0.0", - "minimist": "^1.2.6", + "minimist": "^1.2.8", "ospath": "^1.2.2", "pretty-bytes": "^5.6.0", + "process": "^0.11.10", "proxy-from-env": "1.0.0", "request-progress": "^3.0.0", - "semver": "^7.3.2", + "semver": "^7.5.3", "supports-color": "^8.1.1", "tmp": "~0.2.1", "untildify": "^4.0.0", @@ -13123,7 +13117,7 @@ "cypress": "bin/cypress" }, "engines": { - "node": ">=12.0.0" + "node": "^14.0.0 || ^16.0.0 || >=18.0.0" } }, "node_modules/cypress-file-upload": { @@ -13140,17 +13134,21 @@ } }, "node_modules/cypress-mochawesome-reporter": { - "version": "3.3.0", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/cypress-mochawesome-reporter/-/cypress-mochawesome-reporter-3.3.0.tgz", - "integrity": "sha512-X4HU1JpuB62MXLh46660KmIs/L6noWV2KpxaXPDorz1zwgj26NN+BPCLP80D9cCFUwX3hNH0pKFZDwVR7vM8wg==", + "version": "3.6.0", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/cypress-mochawesome-reporter/-/cypress-mochawesome-reporter-3.6.0.tgz", + "integrity": "sha512-NeYpeZVB5YCU10I3a1yA2qHt+YREo0jZw4Gj83JTJ7YX/ZLFfd8MYKl2O19d/yYC8np/fpMufp5gt3ympd9DWQ==", "dev": true, "license": "MIT", "dependencies": { + "commander": "^10.0.1", "fs-extra": "^10.0.1", "mochawesome": "^7.1.3", "mochawesome-merge": "^4.2.1", "mochawesome-report-generator": "^6.2.0" }, + "bin": { + "generate-mochawesome-report": "cli.js" + }, "engines": { "node": ">=14" }, @@ -13161,6 +13159,16 @@ "cypress": ">=6.2.0" } }, + "node_modules/cypress-mochawesome-reporter/node_modules/commander": { + "version": "10.0.1", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, "node_modules/cypress-mochawesome-reporter/node_modules/fs-extra": { "version": "10.1.0", "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/fs-extra/-/fs-extra-10.1.0.tgz", @@ -13177,13 +13185,13 @@ } }, "node_modules/cypress-real-events": { - "version": "1.7.6", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/cypress-real-events/-/cypress-real-events-1.7.6.tgz", - "integrity": "sha512-yP6GnRrbm6HK5q4DH6Nnupz37nOfZu/xn1xFYqsE2o4G73giPWQOdu6375QYpwfU1cvHNCgyD2bQ2hPH9D7NMw==", + "version": "1.10.3", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/cypress-real-events/-/cypress-real-events-1.10.3.tgz", + "integrity": "sha512-YN3fn+CJIAM638sE6uMvv2/n3PsWowdd0rOiN6ZoyezNAMyENfuQHvccLKZpN+apGfQZYetCml6QXLYgDid2fg==", "dev": true, "license": "MIT", "peerDependencies": { - "cypress": "^4.x || ^5.x || ^6.x || ^7.x || ^8.x || ^9.x || ^10.x || ^11.x || ^12.x" + "cypress": "^4.x || ^5.x || ^6.x || ^7.x || ^8.x || ^9.x || ^10.x || ^11.x || ^12.x || ^13.x" } }, "node_modules/cypress-timestamps": { @@ -13196,13 +13204,6 @@ "format-duration": "^2.0.0" } }, - "node_modules/cypress/node_modules/@types/node": { - "version": "14.18.42", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/@types/node/-/node-14.18.42.tgz", - "integrity": "sha512-xefu+RBie4xWlK8hwAzGh3npDz/4VhF6icY/shU+zv/1fNn+ZVG7T7CRwe9LId9sAYRPxI+59QBPuKL3WpyGRg==", - "devOptional": true, - "license": "MIT" - }, "node_modules/cypress/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -13302,6 +13303,35 @@ "node": ">=8" } }, + "node_modules/cypress/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "devOptional": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cypress/node_modules/semver": { + "version": "7.5.4", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "devOptional": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/cypress/node_modules/supports-color": { "version": "8.1.1", "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/supports-color/-/supports-color-8.1.1.tgz", @@ -13318,6 +13348,13 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/cypress/node_modules/yallist": { + "version": "4.0.0", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "devOptional": true, + "license": "ISC" + }, "node_modules/dashdash": { "version": "1.14.1", "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/dashdash/-/dashdash-1.14.1.tgz", @@ -13407,6 +13444,20 @@ } } }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/decimal.js": { "version": "10.4.3", "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/decimal.js/-/decimal.js-10.4.3.tgz", @@ -13423,246 +13474,6 @@ "node": ">=0.10" } }, - "node_modules/decompress": { - "version": "4.2.1", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/decompress/-/decompress-4.2.1.tgz", - "integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "decompress-tar": "^4.0.0", - "decompress-tarbz2": "^4.0.0", - "decompress-targz": "^4.0.0", - "decompress-unzip": "^4.0.1", - "graceful-fs": "^4.1.10", - "make-dir": "^1.0.0", - "pify": "^2.3.0", - "strip-dirs": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/decompress-tar": { - "version": "4.1.1", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/decompress-tar/-/decompress-tar-4.1.1.tgz", - "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "file-type": "^5.2.0", - "is-stream": "^1.1.0", - "tar-stream": "^1.5.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/decompress-tar/node_modules/bl": { - "version": "1.2.3", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/bl/-/bl-1.2.3.tgz", - "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", - "dev": true, - "license": "MIT", - "dependencies": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/decompress-tar/node_modules/is-stream": { - "version": "1.1.0", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decompress-tar/node_modules/isarray": { - "version": "1.0.0", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/decompress-tar/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/decompress-tar/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT" - }, - "node_modules/decompress-tar/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/decompress-tar/node_modules/tar-stream": { - "version": "1.6.2", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/tar-stream/-/tar-stream-1.6.2.tgz", - "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "bl": "^1.0.0", - "buffer-alloc": "^1.2.0", - "end-of-stream": "^1.0.0", - "fs-constants": "^1.0.0", - "readable-stream": "^2.3.0", - "to-buffer": "^1.1.1", - "xtend": "^4.0.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/decompress-tarbz2": { - "version": "4.1.1", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", - "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", - "dev": true, - "license": "MIT", - "dependencies": { - "decompress-tar": "^4.1.0", - "file-type": "^6.1.0", - "is-stream": "^1.1.0", - "seek-bzip": "^1.0.5", - "unbzip2-stream": "^1.0.9" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/decompress-tarbz2/node_modules/file-type": { - "version": "6.2.0", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/file-type/-/file-type-6.2.0.tgz", - "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/decompress-tarbz2/node_modules/is-stream": { - "version": "1.1.0", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decompress-targz": { - "version": "4.1.1", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/decompress-targz/-/decompress-targz-4.1.1.tgz", - "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "decompress-tar": "^4.1.1", - "file-type": "^5.2.0", - "is-stream": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/decompress-targz/node_modules/is-stream": { - "version": "1.1.0", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decompress-unzip": { - "version": "4.0.1", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/decompress-unzip/-/decompress-unzip-4.0.1.tgz", - "integrity": "sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==", - "dev": true, - "license": "MIT", - "dependencies": { - "file-type": "^3.8.0", - "get-stream": "^2.2.0", - "pify": "^2.3.0", - "yauzl": "^2.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/decompress-unzip/node_modules/file-type": { - "version": "3.9.0", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decompress-unzip/node_modules/get-stream": { - "version": "2.3.1", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/get-stream/-/get-stream-2.3.1.tgz", - "integrity": "sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==", - "dev": true, - "license": "MIT", - "dependencies": { - "object-assign": "^4.0.1", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decompress/node_modules/make-dir": { - "version": "1.3.0", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/decompress/node_modules/make-dir/node_modules/pify": { - "version": "3.0.0", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/dedent": { "version": "0.7.0", "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/dedent/-/dedent-0.7.0.tgz", @@ -14957,9 +14768,9 @@ "license": "MIT" }, "node_modules/eventemitter2": { - "version": "6.4.9", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/eventemitter2/-/eventemitter2-6.4.9.tgz", - "integrity": "sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==", + "version": "6.4.7", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/eventemitter2/-/eventemitter2-6.4.7.tgz", + "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==", "devOptional": true, "license": "MIT" }, @@ -15712,16 +15523,6 @@ "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==", "license": "MIT" }, - "node_modules/file-type": { - "version": "5.2.0", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/file-type/-/file-type-5.2.0.tgz", - "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/file-uri-to-path": { "version": "1.0.0", "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", @@ -17888,13 +17689,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-natural-number": { - "version": "4.0.1", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/is-natural-number/-/is-natural-number-4.0.1.tgz", - "integrity": "sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ==", - "dev": true, - "license": "MIT" - }, "node_modules/is-number": { "version": "7.0.0", "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/is-number/-/is-number-7.0.0.tgz", @@ -20811,32 +20605,6 @@ "dev": true, "license": "MIT" }, - "node_modules/jsdom/node_modules/tough-cookie": { - "version": "4.1.2", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/tough-cookie/-/tough-cookie-4.1.2.tgz", - "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsdom/node_modules/universalify": { - "version": "0.2.0", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/jsesc/-/jsesc-2.5.2.tgz", @@ -21178,45 +20946,6 @@ } } }, - "node_modules/load-json-file": { - "version": "2.0.0", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha512-3p6ZOGNbiX4CdvEd1VcE6yi78UrGNpjHO33noGwHCnT/o2fyllJDepsm8+mFFv/DvtwFHht5HIHSyOy5a+ChVQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file/node_modules/parse-json": { - "version": "2.2.0", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "error-ex": "^1.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/load-json-file/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/loader-runner": { "version": "4.3.0", "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/loader-runner/-/loader-runner-4.3.0.tgz", @@ -21266,13 +20995,6 @@ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "license": "MIT" }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", - "dev": true, - "license": "MIT" - }, "node_modules/lodash.isempty": { "version": "4.4.0", "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/lodash.isempty/-/lodash.isempty-4.4.0.tgz", @@ -22315,6 +22037,286 @@ "node": ">=10" } }, + "node_modules/mocha": { + "version": "10.2.0", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/mocha/-/mocha-10.2.0.tgz", + "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", + "ms": "2.1.3", + "nanoid": "3.3.3", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "workerpool": "6.2.1", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/mocha/node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/mocha/node_modules/argparse": { + "version": "2.0.1", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0", + "peer": true + }, + "node_modules/mocha/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/find-up": { + "version": "5.0.0", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/glob": { + "version": "7.2.0", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mocha/node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mocha/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/mocha/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/minimatch": { + "version": "5.0.1", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/minimatch/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/mocha/node_modules/ms": { + "version": "2.1.3", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/mocha/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/mocha/node_modules/yargs": { + "version": "16.2.0", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true, + "license": "ISC", + "peer": true, + "engines": { + "node": ">=10" + } + }, "node_modules/mochawesome": { "version": "7.1.3", "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/mochawesome/-/mochawesome-7.1.3.tgz", @@ -22892,6 +22894,20 @@ "license": "MIT", "optional": true }, + "node_modules/nanoid": { + "version": "3.3.3", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, "node_modules/nanomatch": { "version": "1.2.13", "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/nanomatch/-/nanomatch-1.2.13.tgz", @@ -22992,9 +23008,9 @@ "license": "MIT" }, "node_modules/ng-mocks": { - "version": "14.8.0", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/ng-mocks/-/ng-mocks-14.8.0.tgz", - "integrity": "sha512-bL1qi96/XuwjZijr4lE4R6NHlgeMivLYiCzrzWFh3x93JHeZf2jDLfOsm7BUIQHwXTYODPHyGvnCadEb44k4Rg==", + "version": "14.11.0", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/ng-mocks/-/ng-mocks-14.11.0.tgz", + "integrity": "sha512-6h0TafPogU7iEbWKGQt5npfEtI7IjThsqqnDboMIZ4AJyUY7VHUmhFa39Zkd2e4oOLDLb/6sVnfDIaWCp3oFgQ==", "dev": true, "license": "MIT", "funding": { @@ -23036,9 +23052,9 @@ "license": "MIT" }, "node_modules/node-downloader-helper": { - "version": "2.1.6", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/node-downloader-helper/-/node-downloader-helper-2.1.6.tgz", - "integrity": "sha512-VkOvAXIopI3xMuM/MC5UL7NqqnizQ/9QXZt28jR8FPZ6fHLQm4xe4+YXJ9FqsWwLho5BLXrF51nfOQ0QcohRkQ==", + "version": "2.1.9", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/node-downloader-helper/-/node-downloader-helper-2.1.9.tgz", + "integrity": "sha512-FSvAol2Z8UP191sZtsUZwHIN0eGoGue3uEXGdWIH5228e9KH1YHXT7fN8Oa33UGf+FbqGTQg3sJfrRGzmVCaJA==", "dev": true, "license": "MIT", "bin": { @@ -24566,29 +24582,6 @@ "node": ">=0.10.0" } }, - "node_modules/pinkie": { - "version": "2.0.4", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie-promise": { - "version": "2.0.1", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "pinkie": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/pirates": { "version": "4.0.5", "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/pirates/-/pirates-4.0.5.tgz", @@ -25354,7 +25347,7 @@ "version": "0.11.10", "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/process/-/process-0.11.10.tgz", "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">= 0.6.0" @@ -25576,7 +25569,7 @@ "version": "2.2.0", "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/querystringify/-/querystringify-2.2.0.tgz", "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/queue-microtask": { @@ -25762,64 +25755,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/read-pkg": { - "version": "2.0.0", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha512-eFIBOPW7FGjzBuk3hdXEuNSiTZS/xEMlH49HxMyzb0hyPfu4EhVjT2DH32K1hSSmVq4sebAWnZuuY5auISUTGA==", - "dev": true, - "license": "MIT", - "dependencies": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true, - "license": "ISC" - }, - "node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/read-pkg/node_modules/path-type": { - "version": "2.0.0", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha512-dUnb5dXUf+kzhC/W/F4e5/SkluXIFf5VUHolW1Eg1irn1hGWjPGdsRcvYJ1nD6lhk8Ir7VM0bHJKsYTx8Jx9OQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "pify": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg/node_modules/semver": { - "version": "5.7.1", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/readable-stream/-/readable-stream-3.6.2.tgz", @@ -26488,27 +26423,6 @@ "integrity": "sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==", "license": "MIT" }, - "node_modules/seek-bzip": { - "version": "1.0.6", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/seek-bzip/-/seek-bzip-1.0.6.tgz", - "integrity": "sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "commander": "^2.8.1" - }, - "bin": { - "seek-bunzip": "bin/seek-bunzip", - "seek-table": "bin/seek-bzip-table" - } - }, - "node_modules/seek-bzip/node_modules/commander": { - "version": "2.20.3", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "license": "MIT" - }, "node_modules/select-hose": { "version": "2.0.0", "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/select-hose/-/select-hose-2.0.0.tgz", @@ -27192,29 +27106,68 @@ } }, "node_modules/sonarqube-scanner": { - "version": "2.9.1", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/sonarqube-scanner/-/sonarqube-scanner-2.9.1.tgz", - "integrity": "sha512-UXTEJKAxKBqM7B4iy26svnzEN9dCxzs0aWJATsTTkgTI//WdTZXxoXfSNuQ/D4VXJuivZPJQMKxF1AFjTe8jSQ==", + "version": "3.1.0", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/sonarqube-scanner/-/sonarqube-scanner-3.1.0.tgz", + "integrity": "sha512-7CspErch2pVwFrC9aM7NminyI0+OQmFz0V5IHJtC7FLM0cbKA2MnlsvfGfqZekqxMmxbWcybZ/izou4nQh9nMQ==", "dev": true, "license": "LGPL-3.0", "dependencies": { - "decompress": "^4.2.1", - "extend": "3.0.2", + "adm-zip": "^0.5.10", "fancy-log": "^2.0.0", - "https-proxy-agent": "^5.0.1", - "lodash.get": "^4.4.2", - "lodash.uniq": "^4.5.0", - "mkdirp": "^1.0.4", - "node-downloader-helper": "^2.1.5", + "https-proxy-agent": "^7.0.1", + "mkdirp": "^3.0.1", + "node-downloader-helper": "^2.1.9", "progress": "^2.0.3", - "read-pkg": "2.0.0", - "slugify": "^1.6.5" + "slugify": "^1.6.6" }, "bin": { "sonar-scanner": "src/bin/sonar-scanner" }, "engines": { - "node": ">= 0.10" + "node": ">= 14" + } + }, + "node_modules/sonarqube-scanner/node_modules/agent-base": { + "version": "7.1.0", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/sonarqube-scanner/node_modules/https-proxy-agent": { + "version": "7.0.2", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", + "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/sonarqube-scanner/node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/source-list-map": { @@ -27791,16 +27744,6 @@ "node": ">=8" } }, - "node_modules/strip-dirs": { - "version": "2.1.0", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/strip-dirs/-/strip-dirs-2.1.0.tgz", - "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-natural-number": "^4.0.1" - } - }, "node_modules/strip-final-newline": { "version": "2.0.0", "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/strip-final-newline/-/strip-final-newline-2.0.0.tgz", @@ -28546,13 +28489,6 @@ "dev": true, "license": "MIT" }, - "node_modules/to-buffer": { - "version": "1.1.1", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/to-buffer/-/to-buffer-1.1.1.tgz", - "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", - "dev": true, - "license": "MIT" - }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -28626,17 +28562,29 @@ } }, "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "version": "4.1.3", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", "devOptional": true, "license": "BSD-3-Clause", "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" }, "engines": { - "node": ">=0.8" + "node": ">=6" + } + }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" } }, "node_modules/tr46": { @@ -29232,17 +29180,6 @@ "node": ">=4.2.0" } }, - "node_modules/unbzip2-stream": { - "version": "1.4.3", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", - "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer": "^5.2.1", - "through": "^2.3.8" - } - }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -29509,7 +29446,7 @@ "version": "1.5.10", "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/url-parse/-/url-parse-1.5.10.tgz", "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "querystringify": "^2.1.1", @@ -30554,6 +30491,14 @@ "errno": "~0.1.7" } }, + "node_modules/workerpool": { + "version": "6.2.1", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", + "dev": true, + "license": "Apache-2.0", + "peer": true + }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -30729,6 +30674,48 @@ "node": ">=12" } }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs-unparser/node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, "node_modules/yargs/node_modules/cliui": { "version": "8.0.1", "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/cliui/-/cliui-8.0.1.tgz", @@ -32917,9 +32904,9 @@ } }, "@cypress/request": { - "version": "2.88.11", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/@cypress/request/-/request-2.88.11.tgz", - "integrity": "sha512-M83/wfQ1EkspjkE2lNWNV5ui2Cv7UCv1swW1DqljahbzLVWltcsexQh8jYtuS/vzFXP+HySntGM83ZXA9fn17w==", + "version": "2.88.12", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/@cypress/request/-/request-2.88.12.tgz", + "integrity": "sha512-tOn+0mDZxASFM+cuAP9szGUGPI1HwWVSvdzm7V4cCsPdFTx6qMj29CwaQmRAMIEhORIUBFBsYROYJcveK4uOjA==", "devOptional": true, "requires": { "aws-sign2": "~0.7.0", @@ -32937,7 +32924,7 @@ "performance-now": "^2.1.0", "qs": "~6.10.3", "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", + "tough-cookie": "^4.1.3", "tunnel-agent": "^0.6.0", "uuid": "^8.3.2" } @@ -33690,9 +33677,9 @@ } }, "@cypress/webpack-preprocessor": { - "version": "5.17.0", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/@cypress/webpack-preprocessor/-/webpack-preprocessor-5.17.0.tgz", - "integrity": "sha512-HyFqHkrOrIIYOt4G+r3VK0kVYTcev1tEcqBI/0DJ4AzEuEgW/TB+cX56txy4Cgn60XXdJoul2utclZwUqOsPZA==", + "version": "5.17.1", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/@cypress/webpack-preprocessor/-/webpack-preprocessor-5.17.1.tgz", + "integrity": "sha512-FE/e8ikPc8z4EVopJCaior3RGy0jd2q9Xcp5NtiwNG4XnLfEnUFTZlAGwXe75sEh4fNMPrBJW1KIz77PX5vGAw==", "dev": true, "requires": { "bluebird": "3.7.1", @@ -36952,9 +36939,9 @@ } }, "@types/file-saver": { - "version": "2.0.5", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/@types/file-saver/-/file-saver-2.0.5.tgz", - "integrity": "sha512-zv9kNf3keYegP5oThGLaPk8E081DFDuwfqjtiTzm6PoxChdJ1raSuADf2YGCVIyrSynLrgc8JWv296s7Q7pQSQ==", + "version": "2.0.6", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/@types/file-saver/-/file-saver-2.0.6.tgz", + "integrity": "sha512-Mw671DVqoMHbjw0w4v2iiOro01dlT/WhWp5uwecBa0Wg8c+bcZOjgF1ndBnlaxhtvFCgTRBtsGivSVhrK/vnag==", "dev": true }, "@types/graceful-fs": { @@ -37033,9 +37020,9 @@ "dev": true }, "@types/lodash-es": { - "version": "4.17.6", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/@types/lodash-es/-/lodash-es-4.17.6.tgz", - "integrity": "sha512-R+zTeVUKDdfoRxpAryaQNRKk3105Rrgx2CFRClIgRGaqDTdjsm8h6IYA8ir584W3ePzkZfst5xIgDwYrlh9HLg==", + "version": "4.17.10", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/@types/lodash-es/-/lodash-es-4.17.10.tgz", + "integrity": "sha512-YJP+w/2khSBwbUSFdGsSqmDvmnN3cCKoPOL7Zjle6s30ZtemkkqhjVfFqGwPN7ASil5VyjE2GtyU/yqYY6mC0A==", "dev": true, "requires": { "@types/lodash": "*" @@ -37047,9 +37034,9 @@ "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==" }, "@types/node": { - "version": "16.18.23", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/@types/node/-/node-16.18.23.tgz", - "integrity": "sha512-XAMpaw1s1+6zM+jn2tmw8MyaRDIJfXxqmIQIS0HfoGYPuf7dUWeiUKopwq13KFX9lEp1+THGtlaaYx39Nxr58g==" + "version": "16.18.54", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/@types/node/-/node-16.18.54.tgz", + "integrity": "sha512-oTmGy68gxZZ21FhTJVVvZBYpQHEBZxHKTsGshobMqm9qWpbqdZsA5jvsuPZcHu0KwpmLrOHWPdEfg7XDpNT9UA==" }, "@types/parse-json": { "version": "4.0.0", @@ -37813,6 +37800,12 @@ } } }, + "adm-zip": { + "version": "0.5.10", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/adm-zip/-/adm-zip-0.5.10.tgz", + "integrity": "sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ==", + "dev": true + }, "agent-base": { "version": "6.0.2", "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/agent-base/-/agent-base-6.0.2.tgz", @@ -38574,6 +38567,13 @@ "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", "dev": true }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true, + "peer": true + }, "browserify-aes": { "version": "1.2.0", "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/browserify-aes/-/browserify-aes-1.2.0.tgz", @@ -38693,34 +38693,12 @@ "ieee754": "^1.1.13" } }, - "buffer-alloc": { - "version": "1.2.0", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "dev": true, - "requires": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" - } - }, - "buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", - "dev": true - }, "buffer-crc32": { "version": "0.2.13", "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", "devOptional": true }, - "buffer-fill": { - "version": "1.0.0", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==", - "dev": true - }, "buffer-from": { "version": "1.1.2", "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/buffer-from/-/buffer-from-1.1.2.tgz", @@ -38835,9 +38813,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001474", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/caniuse-lite/-/caniuse-lite-1.0.30001474.tgz", - "integrity": "sha512-iaIZ8gVrWfemh5DG3T9/YqarVZoYf0r188IjaGwx68j4Pf0SGY6CQkmJUIE+NZHkkecQGohzXmBGEwWDr9aM3Q==" + "version": "1.0.30001539", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/caniuse-lite/-/caniuse-lite-1.0.30001539.tgz", + "integrity": "sha512-hfS5tE8bnNiNvEOEkm8HElUHroYwlqMMENEzELymy77+tJ6m+gA2krtHl5hxJaj71OlpC2cHZbdSMX1/YEqEkA==" }, "caseless": { "version": "0.12.0", @@ -39163,9 +39141,9 @@ } }, "commander": { - "version": "5.1.0", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "version": "6.2.1", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", "devOptional": true }, "common-tags": { @@ -39892,14 +39870,14 @@ "dev": true }, "cypress": { - "version": "9.7.0", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/cypress/-/cypress-9.7.0.tgz", - "integrity": "sha512-+1EE1nuuuwIt/N1KXRR2iWHU+OiIt7H28jJDyyI4tiUftId/DrXYEwoDa5+kH2pki1zxnA0r6HrUGHV5eLbF5Q==", + "version": "12.17.4", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/cypress/-/cypress-12.17.4.tgz", + "integrity": "sha512-gAN8Pmns9MA5eCDFSDJXWKUpaL3IDd89N9TtIupjYnzLSmlpVr+ZR+vb4U/qaMp+lB6tBvAmt7504c3Z4RU5KQ==", "devOptional": true, "requires": { - "@cypress/request": "^2.88.10", + "@cypress/request": "2.88.12", "@cypress/xvfb": "^1.2.4", - "@types/node": "^14.14.31", + "@types/node": "^16.18.39", "@types/sinonjs__fake-timers": "8.1.1", "@types/sizzle": "^2.3.2", "arch": "^2.2.0", @@ -39911,12 +39889,12 @@ "check-more-types": "^2.24.0", "cli-cursor": "^3.1.0", "cli-table3": "~0.6.1", - "commander": "^5.1.0", + "commander": "^6.2.1", "common-tags": "^1.8.0", "dayjs": "^1.10.4", - "debug": "^4.3.2", + "debug": "^4.3.4", "enquirer": "^2.3.6", - "eventemitter2": "^6.4.3", + "eventemitter2": "6.4.7", "execa": "4.1.0", "executable": "^4.1.1", "extract-zip": "2.0.1", @@ -39929,24 +39907,19 @@ "listr2": "^3.8.3", "lodash": "^4.17.21", "log-symbols": "^4.0.0", - "minimist": "^1.2.6", + "minimist": "^1.2.8", "ospath": "^1.2.2", "pretty-bytes": "^5.6.0", + "process": "^0.11.10", "proxy-from-env": "1.0.0", "request-progress": "^3.0.0", - "semver": "^7.3.2", + "semver": "^7.5.3", "supports-color": "^8.1.1", "tmp": "~0.2.1", "untildify": "^4.0.0", "yauzl": "^2.10.0" }, "dependencies": { - "@types/node": { - "version": "14.18.42", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/@types/node/-/node-14.18.42.tgz", - "integrity": "sha512-xefu+RBie4xWlK8hwAzGh3npDz/4VhF6icY/shU+zv/1fNn+ZVG7T7CRwe9LId9sAYRPxI+59QBPuKL3WpyGRg==", - "devOptional": true - }, "ansi-styles": { "version": "4.3.0", "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -40016,6 +39989,24 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "devOptional": true }, + "lru-cache": { + "version": "6.0.0", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "devOptional": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.5.4", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "devOptional": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, "supports-color": { "version": "8.1.1", "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/supports-color/-/supports-color-8.1.1.tgz", @@ -40024,6 +40015,12 @@ "requires": { "has-flag": "^4.0.0" } + }, + "yallist": { + "version": "4.0.0", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "devOptional": true } } }, @@ -40035,17 +40032,24 @@ "requires": {} }, "cypress-mochawesome-reporter": { - "version": "3.3.0", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/cypress-mochawesome-reporter/-/cypress-mochawesome-reporter-3.3.0.tgz", - "integrity": "sha512-X4HU1JpuB62MXLh46660KmIs/L6noWV2KpxaXPDorz1zwgj26NN+BPCLP80D9cCFUwX3hNH0pKFZDwVR7vM8wg==", + "version": "3.6.0", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/cypress-mochawesome-reporter/-/cypress-mochawesome-reporter-3.6.0.tgz", + "integrity": "sha512-NeYpeZVB5YCU10I3a1yA2qHt+YREo0jZw4Gj83JTJ7YX/ZLFfd8MYKl2O19d/yYC8np/fpMufp5gt3ympd9DWQ==", "dev": true, "requires": { + "commander": "^10.0.1", "fs-extra": "^10.0.1", "mochawesome": "^7.1.3", "mochawesome-merge": "^4.2.1", "mochawesome-report-generator": "^6.2.0" }, "dependencies": { + "commander": { + "version": "10.0.1", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true + }, "fs-extra": { "version": "10.1.0", "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/fs-extra/-/fs-extra-10.1.0.tgz", @@ -40060,9 +40064,9 @@ } }, "cypress-real-events": { - "version": "1.7.6", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/cypress-real-events/-/cypress-real-events-1.7.6.tgz", - "integrity": "sha512-yP6GnRrbm6HK5q4DH6Nnupz37nOfZu/xn1xFYqsE2o4G73giPWQOdu6375QYpwfU1cvHNCgyD2bQ2hPH9D7NMw==", + "version": "1.10.3", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/cypress-real-events/-/cypress-real-events-1.10.3.tgz", + "integrity": "sha512-YN3fn+CJIAM638sE6uMvv2/n3PsWowdd0rOiN6ZoyezNAMyENfuQHvccLKZpN+apGfQZYetCml6QXLYgDid2fg==", "dev": true, "requires": {} }, @@ -40132,6 +40136,13 @@ "ms": "2.1.2" } }, + "decamelize": { + "version": "4.0.0", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "peer": true + }, "decimal.js": { "version": "10.4.3", "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/decimal.js/-/decimal.js-10.4.3.tgz", @@ -40143,197 +40154,6 @@ "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/decode-uri-component/-/decode-uri-component-0.2.2.tgz", "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==" }, - "decompress": { - "version": "4.2.1", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/decompress/-/decompress-4.2.1.tgz", - "integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==", - "dev": true, - "requires": { - "decompress-tar": "^4.0.0", - "decompress-tarbz2": "^4.0.0", - "decompress-targz": "^4.0.0", - "decompress-unzip": "^4.0.1", - "graceful-fs": "^4.1.10", - "make-dir": "^1.0.0", - "pify": "^2.3.0", - "strip-dirs": "^2.0.0" - }, - "dependencies": { - "make-dir": { - "version": "1.3.0", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, - "requires": { - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true - } - } - } - } - }, - "decompress-tar": { - "version": "4.1.1", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/decompress-tar/-/decompress-tar-4.1.1.tgz", - "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", - "dev": true, - "requires": { - "file-type": "^5.2.0", - "is-stream": "^1.1.0", - "tar-stream": "^1.5.2" - }, - "dependencies": { - "bl": { - "version": "1.2.3", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/bl/-/bl-1.2.3.tgz", - "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", - "dev": true, - "requires": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "readable-stream": { - "version": "2.3.8", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "tar-stream": { - "version": "1.6.2", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/tar-stream/-/tar-stream-1.6.2.tgz", - "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", - "dev": true, - "requires": { - "bl": "^1.0.0", - "buffer-alloc": "^1.2.0", - "end-of-stream": "^1.0.0", - "fs-constants": "^1.0.0", - "readable-stream": "^2.3.0", - "to-buffer": "^1.1.1", - "xtend": "^4.0.0" - } - } - } - }, - "decompress-tarbz2": { - "version": "4.1.1", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", - "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", - "dev": true, - "requires": { - "decompress-tar": "^4.1.0", - "file-type": "^6.1.0", - "is-stream": "^1.1.0", - "seek-bzip": "^1.0.5", - "unbzip2-stream": "^1.0.9" - }, - "dependencies": { - "file-type": { - "version": "6.2.0", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/file-type/-/file-type-6.2.0.tgz", - "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==", - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "dev": true - } - } - }, - "decompress-targz": { - "version": "4.1.1", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/decompress-targz/-/decompress-targz-4.1.1.tgz", - "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", - "dev": true, - "requires": { - "decompress-tar": "^4.1.1", - "file-type": "^5.2.0", - "is-stream": "^1.1.0" - }, - "dependencies": { - "is-stream": { - "version": "1.1.0", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "dev": true - } - } - }, - "decompress-unzip": { - "version": "4.0.1", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/decompress-unzip/-/decompress-unzip-4.0.1.tgz", - "integrity": "sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==", - "dev": true, - "requires": { - "file-type": "^3.8.0", - "get-stream": "^2.2.0", - "pify": "^2.3.0", - "yauzl": "^2.4.2" - }, - "dependencies": { - "file-type": { - "version": "3.9.0", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==", - "dev": true - }, - "get-stream": { - "version": "2.3.1", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/get-stream/-/get-stream-2.3.1.tgz", - "integrity": "sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==", - "dev": true, - "requires": { - "object-assign": "^4.0.1", - "pinkie-promise": "^2.0.0" - } - } - } - }, "dedent": { "version": "0.7.0", "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/dedent/-/dedent-0.7.0.tgz", @@ -41237,9 +41057,9 @@ "dev": true }, "eventemitter2": { - "version": "6.4.9", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/eventemitter2/-/eventemitter2-6.4.9.tgz", - "integrity": "sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==", + "version": "6.4.7", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/eventemitter2/-/eventemitter2-6.4.7.tgz", + "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==", "devOptional": true }, "eventemitter3": { @@ -41791,12 +41611,6 @@ "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/file-saver/-/file-saver-2.0.5.tgz", "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==" }, - "file-type": { - "version": "5.2.0", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/file-type/-/file-type-5.2.0.tgz", - "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==", - "dev": true - }, "file-uri-to-path": { "version": "1.0.0", "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", @@ -43324,12 +43138,6 @@ "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", "dev": true }, - "is-natural-number": { - "version": "4.0.1", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/is-natural-number/-/is-natural-number-4.0.1.tgz", - "integrity": "sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ==", - "dev": true - }, "is-number": { "version": "7.0.0", "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/is-number/-/is-number-7.0.0.tgz", @@ -45299,24 +45107,6 @@ "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/parse5/-/parse5-6.0.1.tgz", "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", "dev": true - }, - "tough-cookie": { - "version": "4.1.2", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/tough-cookie/-/tough-cookie-4.1.2.tgz", - "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==", - "dev": true, - "requires": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - } - }, - "universalify": { - "version": "0.2.0", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true } } }, @@ -45536,35 +45326,6 @@ "wrap-ansi": "^7.0.0" } }, - "load-json-file": { - "version": "2.0.0", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha512-3p6ZOGNbiX4CdvEd1VcE6yi78UrGNpjHO33noGwHCnT/o2fyllJDepsm8+mFFv/DvtwFHht5HIHSyOy5a+ChVQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "parse-json": { - "version": "2.2.0", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true - } - } - }, "loader-runner": { "version": "4.3.0", "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/loader-runner/-/loader-runner-4.3.0.tgz", @@ -45599,12 +45360,6 @@ "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" }, - "lodash.get": { - "version": "4.4.2", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", - "dev": true - }, "lodash.isempty": { "version": "4.4.0", "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/lodash.isempty/-/lodash.isempty-4.4.0.tgz", @@ -46371,6 +46126,206 @@ "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" }, + "mocha": { + "version": "10.2.0", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/mocha/-/mocha-10.2.0.tgz", + "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", + "dev": true, + "peer": true, + "requires": { + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", + "ms": "2.1.3", + "nanoid": "3.3.3", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "workerpool": "6.2.1", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "dependencies": { + "ansi-colors": { + "version": "4.1.1", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "peer": true + }, + "argparse": { + "version": "2.0.1", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "peer": true + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "peer": true + }, + "find-up": { + "version": "5.0.0", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "peer": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "glob": { + "version": "7.2.0", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "peer": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "peer": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "peer": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "peer": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "peer": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "minimatch": { + "version": "5.0.1", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "peer": true, + "requires": { + "brace-expansion": "^2.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "peer": true, + "requires": { + "balanced-match": "^1.0.0" + } + } + } + }, + "ms": { + "version": "2.1.3", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "peer": true + }, + "p-locate": { + "version": "5.0.0", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "peer": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "serialize-javascript": { + "version": "6.0.0", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "peer": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "supports-color": { + "version": "8.1.1", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "peer": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "yargs": { + "version": "16.2.0", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "peer": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.4", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true, + "peer": true + } + } + }, "mochawesome": { "version": "7.1.3", "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/mochawesome/-/mochawesome-7.1.3.tgz", @@ -46796,6 +46751,13 @@ "dev": true, "optional": true }, + "nanoid": { + "version": "3.3.3", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", + "dev": true, + "peer": true + }, "nanomatch": { "version": "1.2.13", "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/nanomatch/-/nanomatch-1.2.13.tgz", @@ -46874,9 +46836,9 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, "ng-mocks": { - "version": "14.8.0", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/ng-mocks/-/ng-mocks-14.8.0.tgz", - "integrity": "sha512-bL1qi96/XuwjZijr4lE4R6NHlgeMivLYiCzrzWFh3x93JHeZf2jDLfOsm7BUIQHwXTYODPHyGvnCadEb44k4Rg==", + "version": "14.11.0", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/ng-mocks/-/ng-mocks-14.11.0.tgz", + "integrity": "sha512-6h0TafPogU7iEbWKGQt5npfEtI7IjThsqqnDboMIZ4AJyUY7VHUmhFa39Zkd2e4oOLDLb/6sVnfDIaWCp3oFgQ==", "dev": true, "requires": {} }, @@ -46902,9 +46864,9 @@ "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==" }, "node-downloader-helper": { - "version": "2.1.6", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/node-downloader-helper/-/node-downloader-helper-2.1.6.tgz", - "integrity": "sha512-VkOvAXIopI3xMuM/MC5UL7NqqnizQ/9QXZt28jR8FPZ6fHLQm4xe4+YXJ9FqsWwLho5BLXrF51nfOQ0QcohRkQ==", + "version": "2.1.9", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/node-downloader-helper/-/node-downloader-helper-2.1.9.tgz", + "integrity": "sha512-FSvAol2Z8UP191sZtsUZwHIN0eGoGue3uEXGdWIH5228e9KH1YHXT7fN8Oa33UGf+FbqGTQg3sJfrRGzmVCaJA==", "dev": true }, "node-forge": { @@ -47999,21 +47961,6 @@ "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/pify/-/pify-2.3.0.tgz", "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==" }, - "pinkie": { - "version": "2.0.4", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, "pirates": { "version": "4.0.5", "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/pirates/-/pirates-4.0.5.tgz", @@ -48459,7 +48406,7 @@ "version": "0.11.10", "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/process/-/process-0.11.10.tgz", "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "dev": true + "devOptional": true }, "process-nextick-args": { "version": "2.0.1", @@ -48635,7 +48582,7 @@ "version": "2.2.0", "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/querystringify/-/querystringify-2.2.0.tgz", "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true + "devOptional": true }, "queue-microtask": { "version": "1.2.3", @@ -48764,52 +48711,6 @@ } } }, - "read-pkg": { - "version": "2.0.0", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha512-eFIBOPW7FGjzBuk3hdXEuNSiTZS/xEMlH49HxMyzb0hyPfu4EhVjT2DH32K1hSSmVq4sebAWnZuuY5auISUTGA==", - "dev": true, - "requires": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - }, - "dependencies": { - "hosted-git-info": { - "version": "2.8.9", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "path-type": { - "version": "2.0.0", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha512-dUnb5dXUf+kzhC/W/F4e5/SkluXIFf5VUHolW1Eg1irn1hGWjPGdsRcvYJ1nD6lhk8Ir7VM0bHJKsYTx8Jx9OQ==", - "dev": true, - "requires": { - "pify": "^2.0.0" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, "readable-stream": { "version": "3.6.2", "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/readable-stream/-/readable-stream-3.6.2.tgz", @@ -49251,23 +49152,6 @@ "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/secure-compare/-/secure-compare-3.0.1.tgz", "integrity": "sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==" }, - "seek-bzip": { - "version": "1.0.6", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/seek-bzip/-/seek-bzip-1.0.6.tgz", - "integrity": "sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==", - "dev": true, - "requires": { - "commander": "^2.8.1" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - } - } - }, "select-hose": { "version": "2.0.0", "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/select-hose/-/select-hose-2.0.0.tgz", @@ -49784,22 +49668,45 @@ } }, "sonarqube-scanner": { - "version": "2.9.1", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/sonarqube-scanner/-/sonarqube-scanner-2.9.1.tgz", - "integrity": "sha512-UXTEJKAxKBqM7B4iy26svnzEN9dCxzs0aWJATsTTkgTI//WdTZXxoXfSNuQ/D4VXJuivZPJQMKxF1AFjTe8jSQ==", + "version": "3.1.0", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/sonarqube-scanner/-/sonarqube-scanner-3.1.0.tgz", + "integrity": "sha512-7CspErch2pVwFrC9aM7NminyI0+OQmFz0V5IHJtC7FLM0cbKA2MnlsvfGfqZekqxMmxbWcybZ/izou4nQh9nMQ==", "dev": true, "requires": { - "decompress": "^4.2.1", - "extend": "3.0.2", + "adm-zip": "^0.5.10", "fancy-log": "^2.0.0", - "https-proxy-agent": "^5.0.1", - "lodash.get": "^4.4.2", - "lodash.uniq": "^4.5.0", - "mkdirp": "^1.0.4", - "node-downloader-helper": "^2.1.5", + "https-proxy-agent": "^7.0.1", + "mkdirp": "^3.0.1", + "node-downloader-helper": "^2.1.9", "progress": "^2.0.3", - "read-pkg": "2.0.0", - "slugify": "^1.6.5" + "slugify": "^1.6.6" + }, + "dependencies": { + "agent-base": { + "version": "7.1.0", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "dev": true, + "requires": { + "debug": "^4.3.4" + } + }, + "https-proxy-agent": { + "version": "7.0.2", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", + "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", + "dev": true, + "requires": { + "agent-base": "^7.0.2", + "debug": "4" + } + }, + "mkdirp": { + "version": "3.0.1", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "dev": true + } } }, "source-list-map": { @@ -50250,15 +50157,6 @@ "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/strip-bom/-/strip-bom-4.0.0.tgz", "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==" }, - "strip-dirs": { - "version": "2.1.0", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/strip-dirs/-/strip-dirs-2.1.0.tgz", - "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", - "dev": true, - "requires": { - "is-natural-number": "^4.0.1" - } - }, "strip-final-newline": { "version": "2.0.0", "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/strip-final-newline/-/strip-final-newline-2.0.0.tgz", @@ -50772,12 +50670,6 @@ "integrity": "sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==", "dev": true }, - "to-buffer": { - "version": "1.1.1", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/to-buffer/-/to-buffer-1.1.1.tgz", - "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", - "dev": true - }, "to-fast-properties": { "version": "2.0.0", "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -50829,13 +50721,23 @@ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" }, "tough-cookie": { - "version": "2.5.0", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "version": "4.1.3", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", "devOptional": true, "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "dependencies": { + "universalify": { + "version": "0.2.0", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "devOptional": true + } } }, "tr46": { @@ -51223,16 +51125,6 @@ "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/typescript/-/typescript-4.8.4.tgz", "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==" }, - "unbzip2-stream": { - "version": "1.4.3", - "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", - "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", - "dev": true, - "requires": { - "buffer": "^5.2.1", - "through": "^2.3.8" - } - }, "unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -51422,7 +51314,7 @@ "version": "1.5.10", "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/url-parse/-/url-parse-1.5.10.tgz", "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, + "devOptional": true, "requires": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" @@ -52181,6 +52073,13 @@ "errno": "~0.1.7" } }, + "workerpool": { + "version": "6.2.1", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", + "dev": true, + "peer": true + }, "wrap-ansi": { "version": "7.0.0", "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -52304,6 +52203,35 @@ "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" }, + "yargs-unparser": { + "version": "2.0.0", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "peer": true, + "requires": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "dependencies": { + "camelcase": { + "version": "6.3.0", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "peer": true + }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "peer": true + } + } + }, "yauzl": { "version": "2.10.0", "resolved": "http://nexus.ozg-sh.de/repository/npm-proxy/yauzl/-/yauzl-2.10.0.tgz", diff --git a/goofy-client/package.json b/goofy-client/package.json index be70ff2f992f202170ab0f9d3b05369c3bdf0652..0eccd787840c4f816483f44c73406bbaa626d8fc 100644 --- a/goofy-client/package.json +++ b/goofy-client/package.json @@ -34,18 +34,11 @@ "help": "nx help", "favicon": "real-favicon generate favicon/faviconDescription.json favicon/faviconData.json src/favicon", "cypress:run": "npx cypress run --project apps/goofy-e2e", - "cypress:run-main": "npx cypress run --project apps/goofy-e2e --config video=false,integrationFolder=./src/integration/main-tests", - "cypress:run-ea": "npx cypress run --project apps/goofy-e2e --config video=false,integrationFolder=./src/integration/einheitlicher-ansprechpartner", - "cypress:run-minimal": "npx cypress run --project apps/goofy-e2e --config video=false", + "cypress:run-main": "npx cypress run --project apps/goofy-e2e --spec apps/goofy-e2e/src/e2e/main-tests", + "cypress:run-ea": "npx cypress run --project apps/goofy-e2e --spec apps/goofy-e2e/src/e2e/einheitlicher-ansprechpartner", "cypress:version": "npx cypress version", "cypress:install": "npx cypress install", "cypress:open": "npx cypress open --project apps/goofy-e2e", - "cypress:ci-run": "npm run cypress:delete-old-reports --REPORT_FOLDER=${npm_config_report_folder} ; NO_COLOR=1 npm run cypress:run -- --config-file ./${npm_config_config_file} ; test=$(echo \"$?\") ; npm run cypress:pre-merge --REPORT_FOLDER=${npm_config_report_folder} ; npm run cypress:generate-report --REPORT_FOLDER=${npm_config_report_folder} ; exit $test", - "cypress:delete-old-reports": "REPORT_FOLDER=${npm_config_report_folder} node apps/goofy-e2e/src/support/delete-old-reports.ts", - "cypress:pre-merge": "REPORT_FOLDER=${npm_config_report_folder} node apps/goofy-e2e/src/support/pre-merge.ts", - "cypress:generate-report": "npm run cypress:merge-report --REPORT_FOLDER=${npm_config_report_folder} ; npm run cypress:generate-html --REPORT_FOLDER=${npm_config_report_folder}", - "cypress:merge-report": "mochawesome-merge apps/goofy-e2e/reports/${npm_config_report_folder}/mochawesome-report/**/*.json > apps/goofy-e2e/reports/${npm_config_report_folder}/report.json", - "cypress:generate-html": "marge apps/goofy-e2e/reports/${npm_config_report_folder}/report.json -f report -o apps/goofy-e2e/reports/${npm_config_report_folder}", "workspace-generator": "nx workspace-generator", "sonar-scanner": "npm test -- --testResultsProcessor='jest-sonar-reporter' && sonar-scanner -Dsonar.host.url=https://sonarqube.ozg-sh.de/ -Dsonar.login=364c6e09430714838730a83f55d3369a7ffda0e9" }, @@ -74,9 +67,9 @@ "date-fns": "^2.29.3", "file-saver": "2.0.5", "include-media": "^1.4.10", - "js-base64": "^3.7.3", + "js-base64": "^3.7.5", "lodash-es": "4.17.21", - "rxjs": "~7.8.0", + "rxjs": "~7.8.1", "sanitize-filename-ts": "^1.0.2", "tslib": "^2.3.0", "typeface-roboto": "1.1.13", @@ -91,8 +84,8 @@ "@angular/compiler-cli": "15.1.4", "@angular/language-service": "15.1.4", "@bahmutov/cypress-extends": "1.1.0", - "@cypress/webpack-batteries-included-preprocessor": "^2.3.0", - "@cypress/webpack-preprocessor": "^5.16.3", + "@cypress/webpack-batteries-included-preprocessor": "^2.4.1", + "@cypress/webpack-preprocessor": "^5.17.1", "@faker-js/faker": "^6.3.1", "@ngrx/schematics": "15.0.0", "@ngrx/store-devtools": "15.0.0", @@ -103,16 +96,16 @@ "@nrwl/linter": "15.6.3", "@nrwl/workspace": "15.6.3", "@testing-library/jest-dom": "5.16.4", - "@types/file-saver": "2.0.5", + "@types/file-saver": "2.0.6", "@types/jest": "28.1.8", - "@types/lodash-es": "4.17.6", + "@types/lodash-es": "4.17.10", "@types/node": "^16.18.1", "@typescript-eslint/eslint-plugin": "5.44.0", "@typescript-eslint/parser": "5.44.0", - "cypress": "^9.7.0", + "cypress": "^12.17.4", "cypress-file-upload": "5.0.8", - "cypress-mochawesome-reporter": "3.3.0", - "cypress-real-events": "^1.7.6", + "cypress-mochawesome-reporter": "3.6.0", + "cypress-real-events": "^1.10.3", "cypress-timestamps": "^1.2.3", "eslint": "8.15.0", "eslint-config-prettier": "8.3.0", @@ -126,10 +119,10 @@ "jest-preset-angular": "12.2.3", "jest-sonar-reporter": "^2.0.0", "mongodb": "4.5.0", - "ng-mocks": "^14.1.0", + "ng-mocks": "^14.11.0", "nx": "15.6.3", "prettier": "2.7.1", - "sonarqube-scanner": "2.9.1", + "sonarqube-scanner": "3.1.0", "ts-jest": "28.0.8", "ts-node": "10.9.1", "typescript": "4.8.4" diff --git a/goofy-client/pom.xml b/goofy-client/pom.xml index d63ae820e5a084c655eede5de0f913b90d464bbc..12c63b3f1c46c5229234d41234f3f98b4d6babd6 100644 --- a/goofy-client/pom.xml +++ b/goofy-client/pom.xml @@ -30,7 +30,7 @@ <parent> <groupId>de.itvsh.ozg</groupId> <artifactId>goofy</artifactId> - <version>1.15.0-SNAPSHOT</version> + <version>1.17.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> @@ -54,83 +54,81 @@ </configuration> </plugin> - <plugin> - <groupId>org.codehaus.mojo</groupId> - <artifactId>exec-maven-plugin</artifactId> - <version>3.0.0</version> - <executions> - - <execution> - <id>test-application</id> - <phase>test</phase> - <configuration> - <workingDirectory>./</workingDirectory> - <executable>npm</executable> - <arguments> - <argument>run</argument> - <argument>test</argument> - </arguments> - </configuration> - <goals> - <goal>exec</goal> - </goals> - </execution> - - <execution> - <id>build-application</id> - <phase>compile</phase> - <configuration> - <workingDirectory>./</workingDirectory> - <executable>npm</executable> - <arguments> - <argument>run</argument> - <argument>ci-build</argument> - </arguments> - </configuration> - <goals> - <goal>exec</goal> - </goals> - </execution> - </executions> - </plugin> - </plugins> - </build> + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>exec-maven-plugin</artifactId> + <version>3.0.0</version> + <executions> + <execution> + <id>test-application</id> + <phase>test</phase> + <configuration> + <workingDirectory>./</workingDirectory> + <executable>npm</executable> + <arguments> + <argument>run</argument> + <argument>test</argument> + </arguments> + <skip>${skipTests}</skip> + </configuration> + <goals> + <goal>exec</goal> + </goals> + </execution> + <execution> + <id>build-application</id> + <phase>compile</phase> + <configuration> + <workingDirectory>./</workingDirectory> + <executable>npm</executable> + <arguments> + <argument>run</argument> + <argument>ci-build</argument> + </arguments> + </configuration> + <goals> + <goal>exec</goal> + </goals> + </execution> + </executions> + </plugin> + </plugins> + </build> - <profiles> - <profile> - <activation> - <property> - <name>!skipNpmInstall</name> - </property> - </activation> - <id>npmInstall</id> - <build> - <plugins> - <plugin> - <groupId>org.codehaus.mojo</groupId> - <artifactId>exec-maven-plugin</artifactId> - <version>3.0.0</version> - <executions> - <execution> - <id>install-dependencies</id> - <phase>generate-sources</phase> - <configuration> - <workingDirectory>./</workingDirectory> - <executable>npm</executable> - <arguments> - <argument>install</argument> - <argument>--legacy-peer-deps</argument> - </arguments> - </configuration> - <goals> - <goal>exec</goal> - </goals> - </execution> - </executions> - </plugin> - </plugins> - </build> - </profile> - </profiles> + <profiles> + <profile> + <activation> + <property> + <name>!skipNpmInstall</name> + </property> + </activation> + <id>npmInstall</id> + <build> + <plugins> + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>exec-maven-plugin</artifactId> + <version>3.0.0</version> + <executions> + <execution> + <id>install-dependencies</id> + <phase>generate-sources</phase> + <configuration> + <workingDirectory>./</workingDirectory> + <executable>npm</executable> + <arguments> + <argument>install</argument> + </arguments> + </configuration> + <goals> + <goal>exec</goal> + </goals> + </execution> + </executions> + </plugin> + </plugins> + </build> + </profile> + </profiles> </project> diff --git a/goofy-server/pom.xml b/goofy-server/pom.xml index 3d10300f55b3f09e2044091cc76ea69c00caf813..d8828e90c1595e36866312085376c49d5d71dfad 100644 --- a/goofy-server/pom.xml +++ b/goofy-server/pom.xml @@ -4,7 +4,7 @@ <parent> <groupId>de.itvsh.ozg</groupId> <artifactId>goofy</artifactId> - <version>1.15.0-SNAPSHOT</version> + <version>1.17.0-SNAPSHOT</version> </parent> <artifactId>goofy-server</artifactId> @@ -15,32 +15,27 @@ <maven.compiler.source>${java.version}</maven.compiler.source> <maven.compiler.target>${java.version}</maven.compiler.target> - <spring-boot.build-image.imageName>docker.ozg-sh.de/goofy:build-latest</spring-boot.build-image.imageName> - </properties> + <spring-boot.build-image.imageName>docker.ozg-sh.de/goofy:build-latest</spring-boot.build-image.imageName> + </properties> - <dependencies> + <dependencies> + <dependency> + <groupId>de.itvsh.ozg</groupId> + <artifactId>alfa-service</artifactId> + <version>${project.version}</version> + </dependency> - <dependency> - <groupId>de.itvsh.ozg</groupId> - <artifactId>alfa-service</artifactId> - <version>${project.version}</version> - </dependency> - <dependency> - <groupId>de.itvsh.ozg</groupId> - <artifactId>alfa-xdomea</artifactId> - <version>${project.version}</version> - </dependency> + <dependency> + <groupId>de.itvsh.ozg</groupId> + <artifactId>alfa-xdomea</artifactId> + <version>${project.version}</version> + </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter</artifactId> - </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-security</artifactId> - </dependency> - - </dependencies> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter</artifactId> + </dependency> + </dependencies> <build> <finalName>${project.artifactId}</finalName> diff --git a/goofy-server/src/main/java/de/ozgcloud/alfa/AlfaServerApplication.java b/goofy-server/src/main/java/de/ozgcloud/alfa/AlfaServerApplication.java index 38814989905b94b6a5996c4d32a92290e55d0fe6..54525b45e9a5b1363132efdcbad4ae8269df23f7 100644 --- a/goofy-server/src/main/java/de/ozgcloud/alfa/AlfaServerApplication.java +++ b/goofy-server/src/main/java/de/ozgcloud/alfa/AlfaServerApplication.java @@ -49,14 +49,14 @@ public class AlfaServerApplication { } @Bean - public FilterRegistrationBean<ForwardedHeaderFilter> forwardedHeaderFilter() { + FilterRegistrationBean<ForwardedHeaderFilter> forwardedHeaderFilter() { FilterRegistrationBean<ForwardedHeaderFilter> bean = new FilterRegistrationBean<>(); bean.setFilter(new ForwardedHeaderFilter()); return bean; } @Bean - public ThreadPoolTaskExecutor threadPoolTaskExecutor() { + ThreadPoolTaskExecutor threadPoolTaskExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setThreadNamePrefix("async-"); @@ -65,12 +65,12 @@ public class AlfaServerApplication { } @Bean - public CallScope callScope() { + CallScope callScope() { return new CallScope(); } @Bean - public BeanFactoryPostProcessor beanFactoryPostProcessor(CallScope callScope) { + BeanFactoryPostProcessor beanFactoryPostProcessor(CallScope callScope) { return new CallBeanFactoryPostProcessor(callScope); } } \ No newline at end of file diff --git a/goofy-server/src/main/resources/application-dev.yml b/goofy-server/src/main/resources/application-dev.yml index be7dc4d1adb0c218ef1d2c908b35b8fbd2142632..66b1bb57668a073ceaeab1e2d50c1f47ed7632fa 100644 --- a/goofy-server/src/main/resources/application-dev.yml +++ b/goofy-server/src/main/resources/application-dev.yml @@ -2,14 +2,14 @@ goofy: production: false keycloak: - auth-server-url: https://sso.dev.by.ozg-cloud.de - realm: by-kiel-dev - resource: alfa + auth-server-url: https://sso.dev.by.ozg-cloud.de + realm: by-kiel-dev + resource: alfa server: error: include-stacktrace: always - + ozgcloud: feature: vorgang-export: true diff --git a/goofy-server/src/main/resources/application-e2e.yml b/goofy-server/src/main/resources/application-e2e.yml index 6b4c84428d26ff921ab8c233062ebd1b8837dce4..50cac7fbb8d11fe5c5ad23487bcdaed4b72a05d0 100644 --- a/goofy-server/src/main/resources/application-e2e.yml +++ b/goofy-server/src/main/resources/application-e2e.yml @@ -1,13 +1,11 @@ keycloak: realm: by-e2e-local-dev - resource: alfa - kop: forwarding: lninfo: url: classpath:files/LandesnetzInfo.html user-manager: - url: http://localhost:9091 + url: http://localhost:9092 ozgcloud: feature: @@ -15,4 +13,4 @@ ozgcloud: createBescheid: true user-assistance: documentation: - url: /assets/benutzerleitfaden/Benutzerleitfaden_2.5.pdf \ No newline at end of file + url: /assets/benutzerleitfaden/benutzerleitfaden.pdf \ No newline at end of file diff --git a/goofy-server/src/main/resources/application-local.yml b/goofy-server/src/main/resources/application-local.yml index 4f0e0f12aab2ad4c7fd4c89d4263a8a03ccaa8e2..48b03024d8f9f74e8c4aa72a27dadeb853eb6739 100644 --- a/goofy-server/src/main/resources/application-local.yml +++ b/goofy-server/src/main/resources/application-local.yml @@ -7,11 +7,6 @@ logging: goofy: production: false -keycloak: - auth-server-url: http://localhost:8088 - realm: sh-kiel-dev #TODO adjust - resource: sh-kiel-dev-goofy #TODO adjust - server: error: include-stacktrace: always @@ -30,4 +25,12 @@ grpc: ozgcloud: feature: - vorgang-export: true \ No newline at end of file + vorgang-export: true + user-assistance: + documentation: + url: /assets/benutzerleitfaden/benutzerleitfaden.pdf + +keycloak: + auth-server-url: http://localhost:8088 + realm: sh-kiel-dev #TODO adjust + resource: sh-kiel-dev-goofy #TODO adjust \ No newline at end of file diff --git a/goofy-server/src/main/resources/application-remotekc.yml b/goofy-server/src/main/resources/application-remotekc.yml index f27d8bf81a26dd58d2b10d44b8b01eb89add3c8f..60e21682a25f6e8445fcc8d21dea502e5de6f890 100644 --- a/goofy-server/src/main/resources/application-remotekc.yml +++ b/goofy-server/src/main/resources/application-remotekc.yml @@ -1,6 +1,4 @@ -keycloak: - realm: by-kiel-dev - resource: alfa - public-client: true - use-resource-role-mappings: true +keycloak: auth-server-url: https://sso.dev.by.ozg-cloud.de + realm: by-kiel-dev + resource: alfa \ No newline at end of file diff --git a/goofy-server/src/main/resources/application.yml b/goofy-server/src/main/resources/application.yml index a84e4da06ffa475b8240b43d5301fe68a85cbbda..711b24897872a68bff0743da9e7f7092de0aaa5d 100644 --- a/goofy-server/src/main/resources/application.yml +++ b/goofy-server/src/main/resources/application.yml @@ -4,12 +4,11 @@ logging: '[de.itvsh]': INFO '[de.ozgcloud]': INFO, '[org.springframework.security]': WARN - '[org.keycloak.adapters]': WARN spring: mvc: pathmatch: - matching-strategy: ant-path-matcher + matching-strategy: ant_path_matcher application: name: Goofy jackson: @@ -19,6 +18,12 @@ spring: multipart: max-file-size: 2GB max-request-size: 2GB + security: + oauth2: + resourceserver: + jwt: + issuer-uri: ${ozgcloud.oauth2.issuer-uri} + jwk-set-uri: ${spring.security.oauth2.resourceserver.jwt.issuer-uri}/protocol/openid-connect/certs server: http2: @@ -51,13 +56,6 @@ management: goofy: production: true - -keycloak: - auth-server-url: http://localhost:8088 - realm: sh-kiel-dev - resource: sh-kiel-dev-goofy - public-client: true - use-resource-role-mappings: true grpc: client: @@ -71,7 +69,7 @@ grpc: kop: auth: token: - secret: XPPWagXn3rDwKG6Ywoir + secret: XPPWagXn3rDwKG6YwoirXPPWagXn3rDwKG6YwoirXPPWagXn3rDwKG6YwoirXPPWagXn3rDwKG6Ywoir validity: 60000 upload: maxFileSize: @@ -79,4 +77,12 @@ kop: wiedervorlageAttachment: 40MB user-manager: profile-template: /api/userProfiles/%s - search-template: /api/userProfiles/?searchBy={searchBy} \ No newline at end of file + search-template: /api/userProfiles/?searchBy={searchBy} + +ozgcloud: + oauth2: + auth-server-url: ${keycloak.auth-server-url} + realm: ${keycloak.realm} + resource: ${keycloak.resource} + principle-attribute: preferred_username + issuer-uri: ${ozgcloud.oauth2.auth-server-url}/realms/${ozgcloud.oauth2.realm} \ No newline at end of file diff --git a/pom.xml b/pom.xml index 46ae5cc7d1bce45bc36dd5ec8bf33208aa7dedea..dede3f5826ca6b39158c118280e90cf83a47082a 100644 --- a/pom.xml +++ b/pom.xml @@ -30,14 +30,14 @@ <groupId>de.itvsh.ozg</groupId> <artifactId>goofy</artifactId> - <version>1.15.0-SNAPSHOT</version> + <version>1.17.0-SNAPSHOT</version> <name>Goofy Parent</name> <packaging>pom</packaging> <parent> <groupId>de.itvsh.kop.common</groupId> <artifactId>kop-common-parent</artifactId> - <version>1.7.0</version> + <version>2.3.1</version> </parent> <modules> @@ -45,20 +45,20 @@ <module>goofy-server</module> <module>alfa-xdomea</module> <module>alfa-service</module> - </modules> + </modules> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> - + <pluto.version>1.13.0</pluto.version> - <kop-common-pdf.version>1.6.4</kop-common-pdf.version> + <kop-common-pdf.version>2.3.1</kop-common-pdf.version> <user-manager.version>1.6.0</user-manager.version> </properties> - + <build> <pluginManagement> - <plugins> + <plugins> <plugin> <groupId>com.mycila</groupId> <artifactId>license-maven-plugin</artifactId> diff --git a/src/main/helm/templates/deployment.yaml b/src/main/helm/templates/deployment.yaml index aff0dfc2523947fd1f62d054291478403089a1c2..a8f02ec54ef44fa7b65ff6472f5184df667f2bef 100644 --- a/src/main/helm/templates/deployment.yaml +++ b/src/main/helm/templates/deployment.yaml @@ -88,6 +88,15 @@ spec: {{- with (.Values.env).customList }} {{ toYaml . | indent 8 }} {{- end }} + {{- if ((.Values.ozgcloud).vorgang).bescheid}} + {{- range $index, $bescheid := ((.Values.ozgcloud).vorgang).bescheid }} + - name: ozgcloud_vorgang_bescheid_{{ $index }}_formId + value: {{ $bescheid.formId }} + - name: ozgcloud_vorgang_bescheid_{{ $index }}_formEngineName + value: {{ $bescheid.formEngineName }} + {{- end }} + {{- end}} + image: "{{ .Values.image.repo }}/{{ .Values.image.name }}:{{ coalesce (.Values.image).tag "latest" }}" imagePullPolicy: Always name: goofy @@ -139,6 +148,8 @@ spec: mountPath: "/bindings/ca-certificates/user-manager-tls-ca.pem" subPath: ca.crt readOnly: true + - name: temp-dir + mountPath: "/tmp" volumes: - name: bindings configMap: @@ -146,6 +157,8 @@ spec: - name: user-manager-tls-certificate secret: secretName: user-manager-tls-cert + - name: temp-dir + emptyDir: {} dnsConfig: {} dnsPolicy: ClusterFirst imagePullSecrets: diff --git a/src/main/helm/templates/ingress.yaml b/src/main/helm/templates/ingress.yaml index 374c0ac57f2964ec534aaac29a92384f312f08c4..da1a9789fb1dc5410f6fb8cf5a65bc58d201eeda 100644 --- a/src/main/helm/templates/ingress.yaml +++ b/src/main/helm/templates/ingress.yaml @@ -35,8 +35,8 @@ metadata: name: {{ include "app.name" . }} namespace: {{ include "app.namespace" . }} spec: - {{- if ne (.Values).cluster_env "dataport"}} - ingressClassName: nginx + {{- if and (.Values.ingress).className (ne (.Values).cluster_env "dataport") }} + ingressClassName: {{ .Values.ingress.className }} {{- end }} rules: - http: diff --git a/src/main/helm/templates/keycloak-client-crd.yaml b/src/main/helm/templates/keycloak-client-crd.yaml index 57e550c3ad005a53cace6b3bb50fc753b8645562..1e5509d9114b14284a7e5f49361332832cff0107 100644 --- a/src/main/helm/templates/keycloak-client-crd.yaml +++ b/src/main/helm/templates/keycloak-client-crd.yaml @@ -1,10 +1,19 @@ {{ range $client := .Values.sso.keycloak_clients }} --- +{{- if $client.kopOperator }} +apiVersion: api.kop-stack.de/v1 +kind: KopKeycloakClient +{{- else }} apiVersion: operator.ozgcloud.de/v1 kind: OzgKeycloakClient +{{- end }} metadata: name: {{ include "app.generateKeycloakClientRessourceName" $client.client_name }} namespace: {{ include "app.namespace" $ }} +{{- if $client.kopOperator }} + annotations: + "helm.sh/resource-policy": keep +{{- end }} spec: keep_after_delete: {{ $.Values.sso.keep_after_delete | default false }} client_name: {{ $client.client_name }} diff --git a/src/main/helm/templates/keycloak-crd.yaml b/src/main/helm/templates/keycloak-crd.yaml index 38f7c679cd10b70cc232ae536317d11f76a8d655..3829005d084993961d01170e63029ee2119803ac 100644 --- a/src/main/helm/templates/keycloak-crd.yaml +++ b/src/main/helm/templates/keycloak-crd.yaml @@ -6,4 +6,4 @@ metadata: namespace: {{ include "app.namespace" . }} spec: keep_after_delete: {{ .Values.sso.keep_after_delete | default false }} - kop_displayname: {{ include "app.ssoRealmDisplayName" . }} + displayName: {{ include "app.ssoRealmDisplayName" . }} diff --git a/src/test/helm/deployment_bindings_test.yaml b/src/test/helm/deployment_bindings_test.yaml index a835a85e2d1a52bbe280128990f521bd1506af65..b10cfb4fffe37fe5749a6cb2e38a6f946d6f304a 100644 --- a/src/test/helm/deployment_bindings_test.yaml +++ b/src/test/helm/deployment_bindings_test.yaml @@ -47,6 +47,11 @@ tests: mountPath: "/bindings/ca-certificates/user-manager-tls-ca.pem" subPath: ca.crt readOnly: true + - contains: + path: spec.template.spec.containers[0].volumeMounts + content: + name: temp-dir + mountPath: "/tmp" - it: should have volume mounts set: usermanagerName: user-manager @@ -62,4 +67,9 @@ tests: content: name: user-manager-tls-certificate secret: - secretName: user-manager-tls-cert \ No newline at end of file + secretName: user-manager-tls-cert + - contains: + path: spec.template.spec.volumes + content: + name: temp-dir + emptyDir: {} \ No newline at end of file diff --git a/src/test/helm/deployment_defaults_annotaion_test.yaml b/src/test/helm/deployment_defaults_annotaion_test.yaml index b310cbf8c7526eff7f784f6ba7862e869dca8cbf..d6e0e9326efbcf9be4203d604b13971435e6b0a2 100644 --- a/src/test/helm/deployment_defaults_annotaion_test.yaml +++ b/src/test/helm/deployment_defaults_annotaion_test.yaml @@ -36,9 +36,8 @@ tests: - equal: path: metadata.annotations.[cert-manager.io/cluster-issuer] value: letsencrypt-prod - - equal: + - isNull: path: spec.ingressClassName - value: nginx - equal: path: spec.tls[0].secretName value: helm-goofy-tls diff --git a/src/test/helm/deployment_defaults_env_test.yaml b/src/test/helm/deployment_defaults_env_test.yaml index f131dc469ec94a9c1d305de7d4e073e1a2fa7c60..473341be65848b9ddef1c42b6992a27c3a357f6b 100644 --- a/src/test/helm/deployment_defaults_env_test.yaml +++ b/src/test/helm/deployment_defaults_env_test.yaml @@ -50,21 +50,7 @@ tests: content: name: spring_profiles_active value: oc, test - - contains: - path: spec.template.spec.containers[0].env - content: - name: keycloak_realm - value: sh-helm-test - - contains: - path: spec.template.spec.containers[0].env - content: - name: keycloak_resource - value: alfa - - contains: - path: spec.template.spec.containers[0].env - content: - name: keycloak_auth-server-url - value: https://sso.sh.ozg-cloud.de + - it: should have service binding root set: usermanagerName: user-manager @@ -74,7 +60,8 @@ tests: content: name: SERVICE_BINDING_ROOT value: "/bindings" - - it: should have user assitance documentation url + + - it: should have user assistance documentation url templates: - templates/deployment.yaml set: @@ -84,4 +71,37 @@ tests: path: spec.template.spec.containers[0].env content: name: ozgcloud_user-assistance_documentation_url - value: http:// \ No newline at end of file + value: http:// + + - it: should have create Bescheid Konfiguration + templates: + - templates/deployment.yaml + set: + ozgcloud: + vorgang: + bescheid: + - formEngineName: AFM + formId: form_id_1 + - formEngineName: FormSolutions + formId: form_id_2 + asserts: + - contains: + path: spec.template.spec.containers[0].env + content: + name: ozgcloud_vorgang_bescheid_0_formId + value: form_id_1 + - contains: + path: spec.template.spec.containers[0].env + content: + name: ozgcloud_vorgang_bescheid_0_formEngineName + value: AFM + - contains: + path: spec.template.spec.containers[0].env + content: + name: ozgcloud_vorgang_bescheid_1_formId + value: form_id_2 + - contains: + path: spec.template.spec.containers[0].env + content: + name: ozgcloud_vorgang_bescheid_1_formEngineName + value: FormSolutions \ No newline at end of file diff --git a/src/test/helm/ingress-nginx-tests.yaml b/src/test/helm/ingress-nginx-tests.yaml index c7edb23088e27c5997a1689c5cfd9473992e1d18..2e897d49e43ecbe692ca4d40770e6ddc0603dfae 100644 --- a/src/test/helm/ingress-nginx-tests.yaml +++ b/src/test/helm/ingress-nginx-tests.yaml @@ -29,11 +29,8 @@ release: templates: - templates/ingress.yaml tests: - - it: should create ingress tls/ingressClass + - it: should create ingress tls asserts: - - equal: - path: spec.ingressClassName - value: nginx - equal: path: spec.tls[0].secretName value: helm-goofy-tls @@ -72,4 +69,15 @@ tests: asserts: - equal: path: metadata.annotations.[nginx.ingress.kubernetes.io/proxy-body-size] - value: 42m \ No newline at end of file + value: 42m + - it: should not set ingressClassName + asserts: + - isNull: + path: spec.ingressClassName + - it: should set ingressClassName + set: + ingress.className: nginx + asserts: + - equal: + path: spec.ingressClassName + value: nginx \ No newline at end of file diff --git a/src/test/helm/keycloak-client-crd-test.yaml b/src/test/helm/keycloak-client-crd-test.yaml index 3140b69cf5f495c90a3d987287c207284c7cc954..37334dedbf0deeb11c289c0a84747793d4877096 100644 --- a/src/test/helm/keycloak-client-crd-test.yaml +++ b/src/test/helm/keycloak-client-crd-test.yaml @@ -51,6 +51,27 @@ tests: - equal: path: metadata.namespace value: by-helm-test + - it: should contain header data for kopOperator + set: + sso: + keycloak_clients: + - client_name: alfa + kopOperator: true + asserts: + - isAPIVersion: + of: api.kop-stack.de/v1 + - isKind: + of: KopKeycloakClient + - it: should have annotations for kopOperator + set: + sso: + keycloak_clients: + - client_name: alfa + kopOperator: true + asserts: + - equal: + path: metadata.annotations.[helm.sh/resource-policy] + value: keep - it: should have default Values set: baseUrl: test.by.ozg-cloud.de diff --git a/src/test/helm/keycloak-crd-test.yaml b/src/test/helm/keycloak-crd-test.yaml index 21631aaa7e7b6265edc1395b7d8130ac09eaa77f..999005b02c3a2b89d1f6886de1d7010f10b63838 100644 --- a/src/test/helm/keycloak-crd-test.yaml +++ b/src/test/helm/keycloak-crd-test.yaml @@ -58,7 +58,7 @@ tests: path: spec.keep_after_delete value: true - equal: - path: spec.kop_displayname + path: spec.displayName value: Realm für Helm (test)