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

Merge pull request 'OZG-5839 Nachricht lässt sich nicht an BayernID schicken'...

Merge pull request 'OZG-5839 Nachricht lässt sich nicht an BayernID schicken' (#7) from OZG-5839-Nachricht-laesst-sich-nicht-an-BayernID-schicken into master

Reviewed-on: https://git.ozg-sh.de/ozgcloud-app/nachrichten-manager/pulls/7


Reviewed-by: default avatarOZGCloud <ozgcloud@mgm-tp.com>
parents 5db4662d 9d4a9cbe
Branches
Tags
No related merge requests found
...@@ -101,6 +101,10 @@ class FileSender { ...@@ -101,6 +101,10 @@ class FileSender {
requestObserver.onNext(chunk); requestObserver.onNext(chunk);
} }
public boolean isDone() {
return done.get();
}
@RequiredArgsConstructor @RequiredArgsConstructor
class StreamReader { class StreamReader {
......
...@@ -27,6 +27,7 @@ import static java.util.Objects.*; ...@@ -27,6 +27,7 @@ import static java.util.Objects.*;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Optional;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.BiFunction; import java.util.function.BiFunction;
...@@ -62,7 +63,8 @@ public class MessageWithFilesSender { ...@@ -62,7 +63,8 @@ public class MessageWithFilesSender {
private final BiFunction<byte[], Integer, GrpcSendBayernIdMessageRequest> chunkBuilder; private final BiFunction<byte[], Integer, GrpcSendBayernIdMessageRequest> chunkBuilder;
private CallStreamObserver<GrpcSendBayernIdMessageRequest> requestObserver; private CallStreamObserver<GrpcSendBayernIdMessageRequest> requestObserver;
private List<FileSender> fileSenders; private int currentAttachmentIndex = 0;
private FileSender currentFileSender;
public MessageWithFilesSender send() { public MessageWithFilesSender send() {
var responseStreamObserver = BinaryFileUploadStreamObserver.create(resultFuture, this::sendNext); var responseStreamObserver = BinaryFileUploadStreamObserver.create(resultFuture, this::sendNext);
...@@ -99,18 +101,40 @@ public class MessageWithFilesSender { ...@@ -99,18 +101,40 @@ public class MessageWithFilesSender {
} }
void sendAttachments() { void sendAttachments() {
if (isNull(fileSenders)) { if (attachmentIds.isEmpty()) {
fileSenders = createFileSenders(); completeRequest();
} else {
sendData();
} }
fileSenders.forEach(FileSender::send);
completeRequest();
} }
List<FileSender> createFileSenders() { void sendData() {
return attachmentIds.stream().map(toAttachment).map(this::buildFileSender).toList(); Optional<FileSender> fileSender;
while ((fileSender = getFileSender()).isPresent() && requestObserver.isReady()) {
fileSender.get().send();
}
if (fileSender.isEmpty()) {
completeRequest();
}
}
Optional<FileSender> getFileSender() {
if (isNull(currentFileSender)) {
currentFileSender = buildNextFileSender();
return Optional.of(currentFileSender);
}
if (!currentFileSender.isDone()) {
return Optional.of(currentFileSender);
}
if (currentAttachmentIndex < attachmentIds.size()) {
currentFileSender = buildNextFileSender();
return Optional.of(currentFileSender);
}
return Optional.empty();
} }
FileSender buildFileSender(BayernIdAttachment attachment) { FileSender buildNextFileSender() {
var attachment = toAttachment.apply(attachmentIds.get(currentAttachmentIndex++));
return new FileSender(chunkBuilder, requestObserver, attachmentMetadataMapper.apply(attachment), attachment.getContent()); return new FileSender(chunkBuilder, requestObserver, attachmentMetadataMapper.apply(attachment), attachment.getContent());
} }
......
...@@ -28,11 +28,13 @@ import static org.mockito.Mockito.*; ...@@ -28,11 +28,13 @@ import static org.mockito.Mockito.*;
import java.io.InputStream; import java.io.InputStream;
import java.util.List; import java.util.List;
import java.util.Optional;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.BiFunction; import java.util.function.BiFunction;
import java.util.function.Function; import java.util.function.Function;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.mockito.Mock; import org.mockito.Mock;
...@@ -178,149 +180,239 @@ class MessageWithFilesSenderTest { ...@@ -178,149 +180,239 @@ class MessageWithFilesSenderTest {
@Nested @Nested
class TestSendAttachments { class TestSendAttachments {
private String attachmentId = "id1"; @Test
void shouldCallCompleteRequest() {
doNothing().when(messageWithFilesSender).completeRequest();
messageWithFilesSender.sendAttachments();
verify(messageWithFilesSender).completeRequest();
}
@Test
void shouldCallSendData() {
ReflectionTestUtils.setField(messageWithFilesSender, "attachmentIds", List.of("attachmentId"));
doNothing().when(messageWithFilesSender).sendData();
messageWithFilesSender.sendAttachments();
verify(messageWithFilesSender).sendData();
}
}
@Nested
class TestSendData {
@Mock @Mock
private FileSender fileSender; private FileSender fileSender;
@Mock
private CallStreamObserver<GrpcSendBayernIdMessageRequest> requestObserver;
@BeforeEach @BeforeEach
void setup() { void setup() {
ReflectionTestUtils.setField(messageWithFilesSender, "attachmentIds", List.of(attachmentId)); ReflectionTestUtils.setField(messageWithFilesSender, "requestObserver", requestObserver);
doNothing().when(messageWithFilesSender).completeRequest();
} }
@Test @Test
void shouldCallCreateFileSenders() { void shouldCallGetFileSender() {
doReturn(fileSender).when(messageWithFilesSender).buildFileSender(any()); doReturn(Optional.of(fileSender)).when(messageWithFilesSender).getFileSender();
messageWithFilesSender.sendAttachments(); messageWithFilesSender.sendData();
verify(messageWithFilesSender).createFileSenders(); verify(messageWithFilesSender).getFileSender();
} }
@Test @Test
void shouldNotRecreateFileSenders() { void shouldCallSendOnFileSender() {
ReflectionTestUtils.setField(messageWithFilesSender, "fileSenders", List.of(fileSender)); doReturn(Optional.of(fileSender)).when(messageWithFilesSender).getFileSender();
when(requestObserver.isReady()).thenReturn(true, false);
messageWithFilesSender.sendAttachments(); messageWithFilesSender.sendData();
verify(messageWithFilesSender, never()).createFileSenders(); verify(fileSender).send();
} }
@Test @Test
void shouldCallSendOnFileSender() { @DisplayName("should not complete request if attachments not sent")
doReturn(fileSender).when(messageWithFilesSender).buildFileSender(any()); void shouldNotCompleteIfNotDone() {
doReturn(Optional.of(fileSender)).when(messageWithFilesSender).getFileSender();
when(requestObserver.isReady()).thenReturn(true, false);
messageWithFilesSender.sendAttachments(); messageWithFilesSender.sendData();
verify(fileSender).send(); verify(messageWithFilesSender, never()).completeRequest();
} }
@Test @Test
void shouldCallCompleteRequest() { void shouldCompleteRequest() {
doReturn(fileSender).when(messageWithFilesSender).buildFileSender(any()); doReturn(Optional.empty()).when(messageWithFilesSender).getFileSender();
messageWithFilesSender.sendAttachments(); messageWithFilesSender.sendData();
verify(messageWithFilesSender).completeRequest(); verify(messageWithFilesSender).completeRequest();
} }
} }
@Nested @Nested
class TestCreateFileSenders { class TestGetFileSender {
private String attachmentId = "id1";
@Mock @Mock
private FileSender fileSender; private FileSender fileSender;
@BeforeEach @Nested
void setup() { class TestCreateFirstFileSender {
doReturn(fileSender).when(messageWithFilesSender).buildFileSender(any());
ReflectionTestUtils.setField(messageWithFilesSender, "attachmentIds", List.of(attachmentId));
}
@Test @BeforeEach
void shouldCalToAttachment() { void setup() {
messageWithFilesSender.createFileSenders(); doReturn(fileSender).when(messageWithFilesSender).buildNextFileSender();
}
@Test
void shouldCallBuildNextSender() {
messageWithFilesSender.getFileSender();
verify(messageWithFilesSender).buildNextFileSender();
}
@Test
void shouldSetCurrentFileSender() {
messageWithFilesSender.getFileSender();
assertThat(messageWithFilesSender).extracting("currentFileSender").isSameAs(fileSender);
}
@Test
void shouldReturnCurrentFileSender() {
var result = messageWithFilesSender.getFileSender();
assertThat(result).containsSame(fileSender);
}
verify(toAttachment).apply(attachmentId);
} }
@Test @Nested
void shouldCallBuildFileSender() { class TestReturnCurrentFileSender {
messageWithFilesSender.createFileSenders();
@BeforeEach
void setup() {
ReflectionTestUtils.setField(messageWithFilesSender, "currentFileSender", fileSender);
}
@Test
void shouldReturnCurrentFileSender() {
var result = messageWithFilesSender.getFileSender();
verify(messageWithFilesSender).buildFileSender(any()); assertThat(result).containsSame(fileSender);
}
@Test
void shouldNotCallBuildNextSender() {
messageWithFilesSender.getFileSender();
verify(messageWithFilesSender, never()).buildNextFileSender();
}
} }
@Test @Nested
void shouldReturnFileSenders() { class TestCreateNextFileSender {
var result = messageWithFilesSender.createFileSenders();
@Mock
private FileSender nextFileSender;
@BeforeEach
void setup() {
when(fileSender.isDone()).thenReturn(true);
ReflectionTestUtils.setField(messageWithFilesSender, "currentFileSender", fileSender);
ReflectionTestUtils.setField(messageWithFilesSender, "attachmentIds", List.of("attachmentId"));
doReturn(nextFileSender).when(messageWithFilesSender).buildNextFileSender();
}
@Test
void shouldCallBuildNextSender() {
messageWithFilesSender.getFileSender();
verify(messageWithFilesSender).buildNextFileSender();
}
@Test
void shouldSetCurrentFileSender() {
messageWithFilesSender.getFileSender();
assertThat(messageWithFilesSender).extracting("currentFileSender").isSameAs(nextFileSender);
}
@Test
void shouldReturnCurrentFileSender() {
var result = messageWithFilesSender.getFileSender();
assertThat(result).containsExactly(fileSender); assertThat(result).containsSame(nextFileSender);
}
} }
} }
@Nested @Nested
class TestBuildFileSender { class TestBuildNextFileSender {
private String attachmentId = "id1"; private final String attachmentId = "id1";
@Mock @Mock
private CallStreamObserver<GrpcSendBayernIdMessageRequest> requestObserver; private CallStreamObserver<GrpcSendBayernIdMessageRequest> requestObserver;
@Mock @Mock
private GrpcSendBayernIdMessageRequest attachmentMetadata; private GrpcSendBayernIdMessageRequest attachmentMetadata;
@Mock
private BayernIdAttachment attachment;
@Mock @Mock
private InputStream inputStream; private InputStream inputStream;
private final BayernIdAttachment attachment = BayernIdAttachmentTestFactory.create();
@BeforeEach @BeforeEach
void setup() { void setup() {
ReflectionTestUtils.setField(messageWithFilesSender, "requestObserver", requestObserver); ReflectionTestUtils.setField(messageWithFilesSender, "attachmentIds", List.of(attachmentId));
when(toAttachment.apply(any())).thenReturn(attachment);
}
@Test
void shouldCallToAttachment() {
messageWithFilesSender.buildNextFileSender();
verify(toAttachment).apply(attachmentId);
} }
@Test @Test
void shouldSetChunkBuilder() { void shouldSetChunkBuilder() {
var result = messageWithFilesSender.buildFileSender(attachment); var result = messageWithFilesSender.buildNextFileSender();
assertThat(result).extracting("chunkBuilder").isSameAs(chunkBuilder); assertThat(result).extracting("chunkBuilder").isSameAs(chunkBuilder);
} }
@Test @Test
void shouldSetRequestObserver() { void shouldSetRequestObserver() {
var result = messageWithFilesSender.buildFileSender(attachment); ReflectionTestUtils.setField(messageWithFilesSender, "requestObserver", requestObserver);
var result = messageWithFilesSender.buildNextFileSender();
assertThat(result).extracting("requestObserver").isSameAs(requestObserver); assertThat(result).extracting("requestObserver").isSameAs(requestObserver);
} }
@Test @Test
void shouldCallAttachmentMetadataMapper() { void shouldCallAttachmentMetadataMapper() {
ReflectionTestUtils.setField(messageWithFilesSender, "attachmentMetadataMapper", attachmentMetadataMapper);
messageWithFilesSender.buildFileSender(attachment); messageWithFilesSender.buildNextFileSender();
verify(attachmentMetadataMapper).apply(attachment); verify(attachmentMetadataMapper).apply(attachment);
} }
@Test @Test
void shouldSetAttachmentMetadata() { void shouldSetAttachmentMetadata() {
ReflectionTestUtils.setField(messageWithFilesSender, "attachmentMetadataMapper", attachmentMetadataMapper);
when(attachmentMetadataMapper.apply(any())).thenReturn(attachmentMetadata); when(attachmentMetadataMapper.apply(any())).thenReturn(attachmentMetadata);
var result = messageWithFilesSender.buildFileSender(attachment); var result = messageWithFilesSender.buildNextFileSender();
assertThat(result).extracting("metadata").isSameAs(attachmentMetadata); assertThat(result).extracting("metadata").isSameAs(attachmentMetadata);
} }
@Test
void shouldGetContent() {
messageWithFilesSender.buildFileSender(attachment);
verify(attachment).getContent();
}
} }
@Nested @Nested
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment