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

Merge branch 'master' into OZG-6990-VorgangAufInArchivierungSetzen

# Conflicts:
#	bescheid-manager/pom.xml
#	vorgang-manager-server/pom.xml
parents c5e8c274 7105c28e
No related branches found
No related tags found
No related merge requests found
Showing
with 384 additions and 71 deletions
......@@ -5,20 +5,20 @@
<parent>
<groupId>de.ozgcloud.common</groupId>
<artifactId>ozgcloud-common-parent</artifactId>
<version>4.6.0-SNAPSHOT</version>
<version>4.7.0-SNAPSHOT</version>
<relativePath />
</parent>
<groupId>de.ozgcloud.bescheid</groupId>
<artifactId>bescheid-manager</artifactId>
<name>OZG-Cloud Bescheid Manager</name>
<version>1.21.0-SNAPSHOT</version>
<version>1.22.0-SNAPSHOT</version>
<properties>
<vorgang-manager.version>2.18.0-SNAPSHOT</vorgang-manager.version>
<vorgang-manager.version>2.19.0-SNAPSHOT</vorgang-manager.version>
<nachrichten-manager.version>2.14.0</nachrichten-manager.version>
<document-manager.version>1.1.0-SNAPSHOT</document-manager.version>
<api-lib.version>0.14.0-SNAPSHOT</api-lib.version>
<document-manager.version>1.1.0</document-manager.version>
<api-lib.version>0.14.0</api-lib.version>
<spring-cloud-config-client.version>4.1.3</spring-cloud-config-client.version>
</properties>
......
......@@ -29,7 +29,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>de.ozgcloud.vorgang</groupId>
<artifactId>vorgang-manager</artifactId>
<version>2.18.0-SNAPSHOT</version>
<version>2.19.0-SNAPSHOT</version>
<name>OZG-Cloud Vorgang Manager</name>
<packaging>pom</packaging>
......
......@@ -12,7 +12,7 @@
<groupId>de.ozgcloud.vorgang</groupId>
<artifactId>vorgang-manager-base</artifactId>
<version>2.18.0-SNAPSHOT</version>
<version>2.19.0-SNAPSHOT</version>
<name>OZG-Cloud Vorgang Manager Base</name>
......
......@@ -10,7 +10,7 @@
<groupId>de.ozgcloud.command</groupId>
<artifactId>command-manager</artifactId>
<version>2.18.0-SNAPSHOT</version>
<version>2.19.0-SNAPSHOT</version>
<name>OZG-Cloud Command Manager</name>
<properties>
......
/*
* Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
*
* Lizenziert unter der EUPL, Version 1.2 oder - sobald
* diese von der Europäischen Kommission genehmigt wurden -
* Folgeversionen der EUPL ("Lizenz");
* Sie dürfen dieses Werk ausschließlich gemäß
* dieser Lizenz nutzen.
* Eine Kopie der Lizenz finden Sie hier:
*
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
*
* Sofern nicht durch anwendbare Rechtsvorschriften
* gefordert oder in schriftlicher Form vereinbart, wird
* die unter der Lizenz verbreitete Software "so wie sie
* ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
* ausdrücklich oder stillschweigend - verbreitet.
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
package de.ozgcloud.command;
public class VorgangUnlockedEvent extends CommandExecutedEvent {
public VorgangUnlockedEvent(Command command) {
super(command);
}
}
......@@ -36,7 +36,7 @@
<groupId>de.ozgcloud.vorgang</groupId>
<artifactId>vorgang-manager-interface</artifactId>
<version>2.18.0-SNAPSHOT</version>
<version>2.19.0-SNAPSHOT</version>
<name>OZG-Cloud Vorgang Manager gRPC Interface</name>
<description>Interface (gRPC) for Vorgang Manager Server</description>
......
......@@ -32,13 +32,13 @@
<parent>
<groupId>de.ozgcloud.common</groupId>
<artifactId>ozgcloud-common-parent</artifactId>
<version>4.6.0-SNAPSHOT</version>
<version>4.7.0-SNAPSHOT</version>
<relativePath />
</parent>
<groupId>de.ozgcloud.vorgang</groupId>
<artifactId>vorgang-manager-server</artifactId>
<version>2.18.0-SNAPSHOT</version>
<version>2.19.0-SNAPSHOT</version>
<name>OZG-Cloud Vorgang Manager Server</name>
<description>Server Implementierung des VorgangManagers</description>
......@@ -53,14 +53,14 @@
<zufi-manager-interface.version>1.4.0</zufi-manager-interface.version>
<user-manager-interface.version>2.9.0</user-manager-interface.version>
<bescheid-manager.version>1.21.0-SNAPSHOT</bescheid-manager.version>
<bescheid-manager.version>1.22.0-SNAPSHOT</bescheid-manager.version>
<processor-manager.version>0.5.0</processor-manager.version>
<nachrichten-manager.version>2.14.0</nachrichten-manager.version>
<api-lib.version>0.14.0-SNAPSHOT</api-lib.version>
<nachrichten-manager.version>2.14.1</nachrichten-manager.version>
<ozgcloud-starter.version>0.14.0</ozgcloud-starter.version>
<notification-manager.version>2.12.0</notification-manager.version>
<collaboration-manager.version>0.5.0-SNAPSHOT</collaboration-manager.version>
<collaboration-manager.version>0.5.0</collaboration-manager.version>
<archive-manager.version>0.1.0-SNAPSHOT</archive-manager.version>
<document-manager.version>1.1.0-SNAPSHOT</document-manager.version>
<document-manager.version>1.1.0</document-manager.version>
<zip.version>2.11.5</zip.version>
<jsoup.version>1.15.3</jsoup.version>
......
......@@ -72,14 +72,14 @@ public class CommandService {
private CurrentUserService userService;
public Command createCommand(CreateCommandRequest request) {
validateVorgang(request.getVorgangId());
validateVorgang(request.getVorgangId(), request.getOrder());
var persisted = saveCommand(buildCommand(request));
publisher.publishEvent(new CommandCreatedEvent(persisted));
return persisted;
}
void validateVorgang(String vorgangId) {
if (vorgangService.isVorgangLocked(vorgangId)) {
void validateVorgang(String vorgangId, String order) {
if (!Order.UNLOCK_VORGANG.isMeant(order) && vorgangService.isVorgangLocked(vorgangId)) {
throw new TechnicalException("Cannot create command. Vorgang %s is locked.".formatted(vorgangId));
}
}
......
......@@ -41,6 +41,7 @@ public enum Order {
VORGANG_ZUM_LOESCHEN_MARKIEREN,
VORGANG_LOESCHEN,
LOCK_VORGANG,
UNLOCK_VORGANG,
ASSIGN_USER,
......
......@@ -26,7 +26,6 @@ package de.ozgcloud.vorgang.vorgang;
import java.util.Collections;
import java.util.function.Predicate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
......@@ -38,41 +37,43 @@ import de.ozgcloud.command.CommandFailedEvent;
import de.ozgcloud.command.CommandRevokeFailedEvent;
import de.ozgcloud.command.CommandRevokedEvent;
import de.ozgcloud.command.RevokeCommandEvent;
import de.ozgcloud.command.VorgangUnlockedEvent;
import de.ozgcloud.vorgang.command.CommandService;
import de.ozgcloud.vorgang.command.Order;
import de.ozgcloud.vorgang.files.FileService;
import de.ozgcloud.vorgang.status.StatusService;
import de.ozgcloud.vorgang.vorgang.redirect.VorgangForwardFailedEvent;
import de.ozgcloud.vorgang.vorgang.redirect.VorgangRedirectedEvent;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
@Component
@RequiredArgsConstructor
@Log4j2
public class VorgangEventListener {
private static final String IS_ASSIGN_COMMAND_CONDITION = "{T(de.ozgcloud.vorgang.vorgang.VorgangEventListener).IS_ASSIGN_COMMAND.test(event.getSource())}";
private static final String IS_LOESCHEN_COMMAND_CONDITION = "{T(de.ozgcloud.vorgang.vorgang.VorgangEventListener).IS_LOESCHEN_COMMAND.test(event.getSource())}";
private static final String IS_SET_AKTENZEICHEN_COMMAND_CONDITION = "{T(de.ozgcloud.vorgang.vorgang.VorgangEventListener).IS_SET_AKTENZEICHEN_COMMAND.test(event.getSource())}";
public static final Predicate<Command> IS_ASSIGN_COMMAND = command -> Order.ASSIGN_USER.isMeant(command.getOrder());
private static final String IS_LOESCHEN_COMMAND_CONDITION = "{T(de.ozgcloud.vorgang.vorgang.VorgangEventListener).IS_LOESCHEN_COMMAND.test(event.getSource())}";
public static final Predicate<Command> IS_LOESCHEN_COMMAND = command -> Order.VORGANG_LOESCHEN.isMeant(command.getOrder());
private static final String IS_SET_AKTENZEICHEN_COMMAND_CONDITION = "{T(de.ozgcloud.vorgang.vorgang.VorgangEventListener).IS_SET_AKTENZEICHEN_COMMAND.test(event.getSource())}";
public static final Predicate<Command> IS_SET_AKTENZEICHEN_COMMAND = command -> Order.SET_AKTENZEICHEN.isMeant(command.getOrder());
private static final String IS_LOCK_VORGANG_COMMAND = "{T(de.ozgcloud.vorgang.vorgang.VorgangEventListener).IS_LOCK_VORGANG_ORDER.test(event.getSource())}";
public static final Predicate<Command> IS_LOCK_VORGANG_ORDER = command -> Order.LOCK_VORGANG.isMeant(command.getOrder());
@Autowired
private StatusService statusService;
@Autowired
private VorgangService vorgangService;
@Autowired
private VorgangHeaderService vorgangHeaderService;
@Autowired
private FileService fileService;
@Autowired
private CommandService commandService;
private static final String IS_UNLOCK_VORGANG_COMMAND_CONDITION = "{T(de.ozgcloud.vorgang.vorgang.VorgangEventListener).IS_UNLOCK_VORGANG_COMMAND.test(event.getSource())}";
public static final Predicate<Command> IS_UNLOCK_VORGANG_COMMAND = command -> Order.UNLOCK_VORGANG.isMeant(command.getOrder());
@Autowired
private ApplicationEventPublisher publisher;
private final StatusService statusService;
private final VorgangService vorgangService;
private final VorgangHeaderService vorgangHeaderService;
private final FileService fileService;
private final CommandService commandService;
private final ApplicationEventPublisher publisher;
@EventListener
public void updateStatus(VorgangRedirectedEvent event) {
......@@ -153,4 +154,16 @@ public class VorgangEventListener {
private String getAktenzeichen(String vorgangId) {
return vorgangHeaderService.getById(vorgangId).getAktenzeichen();
}
@EventListener(condition = IS_UNLOCK_VORGANG_COMMAND_CONDITION)
public void onUnlockVorgang(CommandCreatedEvent event) {
var command = event.getSource();
try {
vorgangService.unlockVorgang(command);
publisher.publishEvent(new VorgangUnlockedEvent(command));
} catch (RuntimeException e) {
LOG.error("Error unlocking vorgang.", e);
publisher.publishEvent(new CommandFailedEvent(command.getId(), e.getMessage()));
}
}
}
\ No newline at end of file
......@@ -73,10 +73,25 @@ class VorgangRepository {
}
public void patch(String vorgangId, long version, Map<String, Object> patch) {
var update = new Update().inc(Vorgang.MONGODB_FIELDNAME_VERSION, 1);
updateFirst(vorgangId, whereIdAndVersion(vorgangId, version), createPatchUpdate(patch));
}
private Update createPatchUpdate(Map<String, Object> patch) {
var update = createVersionIncUpdate();
patch.forEach(update::set);
return update;
}
public void removeLock(String vorgangId, long version) {
updateFirst(vorgangId, whereIdAndVersion(vorgangId, version), createUnlockUpdate());
}
private Update createUnlockUpdate() {
return createVersionIncUpdate().unset(VorgangService.KEY_HEADER_LOCK);
}
updateFirst(vorgangId, whereIdAndVersion(vorgangId, version), update);
private Update createVersionIncUpdate() {
return new Update().inc(Vorgang.MONGODB_FIELDNAME_VERSION, 1);
}
public void setAktenzeichen(String vorgangId, long version, String akteneinsicht) {
......
......@@ -38,7 +38,6 @@ import jakarta.validation.Valid;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.Pair;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.stereotype.Service;
......@@ -55,33 +54,28 @@ import de.ozgcloud.vorgang.clientattribute.ClientAttributesMap;
import de.ozgcloud.vorgang.common.errorhandling.NotFoundException;
import de.ozgcloud.vorgang.servicekonto.ServiceKonto;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
@Validated
@Service
@RequiredArgsConstructor
public class VorgangService {
private static final String BODY_ASSIGNED_TO_FIELD = "assignedTo";
public static final String BODY_OBJECT_AKTENZEICHEN = "aktenzeichen";
static final String KEY_HEADER_LOCK = "%s.%s".formatted(Vorgang.MONGODB_FIELDNAME_HEADER, VorgangHead.FIELD_LOCK);
@Autowired
private VorgangAuthorizationService vorgangAuthenticationService;
@Autowired
private VorgangRepository repository;
private final VorgangAuthorizationService vorgangAuthenticationService;
private final VorgangRepository repository;
@Autowired
private ApplicationEventPublisher publisher;
@Autowired
private AktenzeichenProvider aktenzeichenProvider;
private final ApplicationEventPublisher publisher;
private final AktenzeichenProvider aktenzeichenProvider;
@Autowired
private ClientAttributeReadPermitted readIsPermitted;
private final ClientAttributeReadPermitted readIsPermitted;
@Autowired
private LabelProcessor kopControlDataMapper;
private final LabelProcessor kopControlDataMapper;
@Autowired
private VorgangStubMapper stubMapper;
private final VorgangStubMapper stubMapper;
public Vorgang startCreation(@Valid Eingang eingang) {
var mappedEingang = kopControlDataMapper.moveLabelsToControlData(eingang);
......@@ -261,8 +255,24 @@ public class VorgangService {
}
public void unlockVorgang(Command command) {
// TODO wird implementiert in OZG-6992
// publisher.publishEvent(new CommandRevokedEvent(command));
throw new UnsupportedOperationException("Not yet implemented");
validateUnlockingClient(command);
repository.removeLock(command.getVorgangId(), command.getRelationVersion());
}
void validateUnlockingClient(Command command) {
var vorgang = repository.findById(command.getVorgangId()).orElseThrow(() -> new NotFoundException(Vorgang.class, command.getVorgangId()));
validateClientName(command.getCreatedByClientName(), Optional.ofNullable(vorgang.getHeader().getLock()));
}
void validateClientName(String commandClientName, Optional<Lock> lock) {
if (hasNoPermissionToUnlock(commandClientName, lock)) {
throw new AccessDeniedException(
"Vorgang was locked by %s, but client name is %s!".formatted(lock.get().getClientName(), commandClientName));
}
}
boolean hasNoPermissionToUnlock(String clientName, Optional<Lock> lock) {
return lock.map(Lock::getClientName).filter(lockingClient -> !lockingClient.equals(clientName)).isPresent();
}
}
\ No newline at end of file
......@@ -90,7 +90,7 @@ class CommandServiceTest {
void shouldCallValidateVorgang() {
service.createCommand(request);
verify(service).validateVorgang(VorgangTestFactory.ID);
verify(service).validateVorgang(VorgangTestFactory.ID, CreateCommandRequestTestFactory.ORDER.name());
}
@Test
......@@ -182,16 +182,29 @@ class CommandServiceTest {
@Test
void shouldCallIsVorgangLocked() {
service.validateVorgang(VorgangTestFactory.ID);
service.validateVorgang(VorgangTestFactory.ID, Order.ASSIGN_USER.name());
verify(vorgangService).isVorgangLocked(VorgangTestFactory.ID);
}
@Test
void shouldThrowExceptionIfVorgangLocked() {
var order = Order.ASSIGN_USER.name();
when(vorgangService.isVorgangLocked(anyString())).thenReturn(true);
Assertions.assertThrows(TechnicalException.class, () -> service.validateVorgang(VorgangTestFactory.ID));
Assertions.assertThrows(TechnicalException.class, () -> service.validateVorgang(VorgangTestFactory.ID, order));
}
@Test
void shouldNotCallIsVorgangLockedForUnlockVorgangOrder() {
service.validateVorgang(VorgangTestFactory.ID, Order.UNLOCK_VORGANG.name());
verify(vorgangService, never()).isVorgangLocked(any());
}
@Test
void shouldNotThrowExceptionIfOrderIsUnlockVorgang() {
Assertions.assertDoesNotThrow(() -> service.validateVorgang(VorgangTestFactory.ID, Order.UNLOCK_VORGANG.name()));
}
}
......
......@@ -29,11 +29,12 @@ import java.util.Map;
import com.thedeanda.lorem.LoremIpsum;
import de.ozgcloud.vorgang.command.CommandTestFactory;
import de.ozgcloud.vorgang.vorgang.Lock.LockBuilder;
public class LockTestFactory {
public static final String CLIENT_NAME = LoremIpsum.getInstance().getFirstName() + "-Client";
public static final String CLIENT_NAME = CommandTestFactory.CREATED_BY_CLIENT;
public static final String REASON = LoremIpsum.getInstance().getWords(5);
public static final String LOCKED_SINCE_STR = ZonedDateTime.now().withNano(0).format(DateTimeFormatter.ISO_INSTANT);
public static final ZonedDateTime LOCKED_SINCE = ZonedDateTime.parse(LOCKED_SINCE_STR);
......@@ -53,7 +54,6 @@ public class LockTestFactory {
return Map.of(
Lock.FIELD_CLIENT_NAME, CLIENT_NAME,
Lock.FIELD_LOCKED_SINCE, LOCKED_SINCE,
Lock.FIELD_REASON, REASON
);
Lock.FIELD_REASON, REASON);
}
}
......@@ -44,11 +44,13 @@ import org.springframework.context.ApplicationEventPublisher;
import com.thedeanda.lorem.LoremIpsum;
import de.ozgcloud.command.Command;
import de.ozgcloud.command.CommandCreatedEvent;
import de.ozgcloud.command.CommandExecutedEvent;
import de.ozgcloud.command.CommandFailedEvent;
import de.ozgcloud.command.CommandRevokeFailedEvent;
import de.ozgcloud.command.CommandRevokedEvent;
import de.ozgcloud.command.RevokeCommandEvent;
import de.ozgcloud.command.VorgangUnlockedEvent;
import de.ozgcloud.common.errorhandling.TechnicalException;
import de.ozgcloud.vorgang.command.CommandCreatedEventTestFactory;
import de.ozgcloud.vorgang.command.CommandService;
......@@ -307,4 +309,52 @@ class VorgangEventListenerTest {
});
}
}
@Nested
class TestOnUnlockVorgang {
private final Command command = CommandTestFactory.create();
@Captor
private ArgumentCaptor<VorgangUnlockedEvent> vorgangUnlockedEventCaptor;
@Captor
private ArgumentCaptor<CommandFailedEvent> commandFailedEventCaptor;
@Test
void shouldUnlockVorgangOnUnlockVorgangOrder() {
onUnlockVorgang();
verify(service).unlockVorgang(command);
}
@Test
void shouldPublishVorgangUnlockedEvent() {
onUnlockVorgang();
verify(publisher).publishEvent(vorgangUnlockedEventCaptor.capture());
assertThat(vorgangUnlockedEventCaptor.getValue()).satisfies(event -> {
assertThat(event).isInstanceOf(VorgangUnlockedEvent.class);
assertThat(event.getCommand()).isEqualTo(command);
});
}
@Test
void shouldPublishCommandFailedEvent() {
var errorMessage = "error message";
doThrow(new RuntimeException(errorMessage)).when(service).unlockVorgang(command);
onUnlockVorgang();
verify(publisher).publishEvent(commandFailedEventCaptor.capture());
assertThat(commandFailedEventCaptor.getValue()).satisfies(event -> {
assertThat(event.getSource()).isEqualTo(CommandTestFactory.ID);
assertThat(event.getErrorMessage()).isEqualTo(errorMessage);
});
}
private void onUnlockVorgang() {
listener.onUnlockVorgang(new CommandCreatedEvent(command));
}
}
}
\ No newline at end of file
......@@ -382,5 +382,57 @@ class VorgangRepositoryITCase {
assertThat(isLocked).isFalse();
}
@Test
void shouldReturnFalseAfterLockRemoved() {
var vorgang = mongoOperations.save(
VorgangTestFactory.createBuilder().id(null).version(0).header(VorgangHeadTestFactory.create()).build());
repository.removeLock(vorgang.getId(), 0);
var isLocked = repository.isVorgangLocked(vorgang.getId());
assertThat(isLocked).isFalse();
}
}
@Nested
class TestRemoveLock {
private final Vorgang vorgang = VorgangTestFactory.createBuilder()
.header(VorgangHeadTestFactory.create())
.build();
@BeforeEach
void persistVorgang() {
repository.save(vorgang);
}
@Test
void shouldRemoveLock() {
removeLock();
assertThat(getVorgang().getHeader().getLock()).isNull();
}
@Test
void shouldIncrementVersion() {
removeLock();
assertThat(getVorgang().getVersion()).isEqualTo(VorgangTestFactory.VERSION + 1);
}
private void removeLock() {
repository.removeLock(VorgangTestFactory.ID, VorgangTestFactory.VERSION);
}
@Test
void shouldThrowExceptionByCollision() {
assertThrows(ConcurrentModificationException.class,
() -> repository.removeLock(VorgangTestFactory.ID, VorgangTestFactory.VERSION + 1));
}
private Vorgang getVorgang() {
return mongoOperations.findById(VorgangTestFactory.ID, Vorgang.class);
}
}
}
\ No newline at end of file
......@@ -24,6 +24,7 @@
package de.ozgcloud.vorgang.vorgang;
import static org.assertj.core.api.Assertions.*;
import static org.assertj.core.api.InstanceOfAssertFactories.*;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
......@@ -632,4 +633,131 @@ class VorgangServiceTest {
assertThat(result).isTrue();
}
}
@Nested
class TestUnlockVorgang {
private final Command command = CommandTestFactory.create();
@BeforeEach
void mock() {
doNothing().when(service).validateUnlockingClient(any());
}
@Test
void shouldCallValidateUnlockingClient() {
unlockVorgang();
verify(service).validateUnlockingClient(command);
}
@Test
void shouldCallRepository() {
unlockVorgang();
verify(repository).removeLock(VorgangTestFactory.ID, CommandTestFactory.RELATION_VERSION);
}
private void unlockVorgang() {
service.unlockVorgang(command);
}
}
@Nested
class TestValidateUnlockingClient {
private final Vorgang vorgang = VorgangTestFactory.createBuilder().header(VorgangHeadTestFactory.create()).build();
private final Command command = CommandTestFactory.create();
@Test
void shouldGetVorgangFromRepository() {
givenRepositoryReturnsVorgang();
validateUnlockingClient();
verify(repository).findById(VorgangTestFactory.ID);
}
@Test
void shouldThrowNotFoundException() {
when(repository.findById(VorgangTestFactory.ID)).thenReturn(Optional.empty());
assertThrows(NotFoundException.class, () -> validateUnlockingClient());
}
@Test
void shouldCallValidateClientName() {
givenRepositoryReturnsVorgang();
validateUnlockingClient();
verify(service).validateClientName(CommandTestFactory.CREATED_BY_CLIENT, Optional.of(VorgangHeadTestFactory.LOCK));
}
private void givenRepositoryReturnsVorgang() {
when(repository.findById(VorgangTestFactory.ID)).thenReturn(Optional.of(vorgang));
}
private void validateUnlockingClient() {
service.validateUnlockingClient(command);
}
}
@Nested
class TestValidateClientName {
private final Lock lock = LockTestFactory.create();
@Test
void shouldCallHasNoPermissionToUnlock() {
doReturn(false).when(service).hasNoPermissionToUnlock(any(), any());
validateClientName();
verify(service).hasNoPermissionToUnlock(CommandTestFactory.CREATED_BY_CLIENT, Optional.of(lock));
}
@Test
void shouldThrowAccessDeniedException() {
doReturn(true).when(service).hasNoPermissionToUnlock(any(), any());
assertThrows(AccessDeniedException.class, () -> validateClientName());
}
@Test
void shouldNotThrowException() {
doReturn(false).when(service).hasNoPermissionToUnlock(any(), any());
assertDoesNotThrow(() -> validateClientName());
}
private void validateClientName() {
service.validateClientName(CommandTestFactory.CREATED_BY_CLIENT, Optional.of(lock));
}
}
@Nested
class TestHasNoPermissionToUnlock {
@Test
void shouldReturnFalseIfLockEmpty() {
var result = service.hasNoPermissionToUnlock(CommandTestFactory.CREATED_BY_CLIENT, Optional.empty());
assertThat(result).isFalse();
}
@Test
void shouldReturnTrueIfLockPresentAndClientNameNotMatching() {
var result = service.hasNoPermissionToUnlock("wrong name", Optional.of(LockTestFactory.create()));
assertThat(result).isTrue();
}
@Test
void shouldReturnFalseIfLockPresentAndClientNameMatching() {
var result = service.hasNoPermissionToUnlock(LockTestFactory.CLIENT_NAME, Optional.of(LockTestFactory.create()));
assertThat(result).isFalse();
}
}
}
\ No newline at end of file
......@@ -37,7 +37,7 @@
<groupId>de.ozgcloud.vorgang</groupId>
<artifactId>vorgang-manager-utils</artifactId>
<name>OZG-Cloud Vorgang Manager Utils</name>
<version>2.18.0-SNAPSHOT</version>
<version>2.19.0-SNAPSHOT</version>
<properties>
<maven-compiler-plugin.version>3.10.1</maven-compiler-plugin.version>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment