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

Merge branch 'release'

parents 5563b3bb 26429172
No related branches found
No related tags found
No related merge requests found
Showing
with 495 additions and 172 deletions
......@@ -6,6 +6,7 @@
<groupId>de.itvsh.ozg.pluto</groupId>
<artifactId>pluto-interface</artifactId>
<version>0.24.0-SNAPSHOT</version>
<name>Pluto Interface</name>
<description>Interface (gRPC) for Pluto Server</description>
......
......@@ -14,6 +14,7 @@
<groupId>de.itvsh.ozg.pluto</groupId>
<artifactId>pluto-server</artifactId>
<version>0.24.0-SNAPSHOT</version>
<name>Pluto Server</name>
<description>Server Implementierung des VorgangManagers (Pluto)</description>
......
......@@ -19,7 +19,6 @@ import com.mongodb.client.gridfs.GridFSBuckets;
import com.mongodb.client.gridfs.model.GridFSUploadOptions;
import de.itvsh.kop.common.errorhandling.TechnicalException;
import de.itvsh.ozg.mail.postfach.PostfachMail;
import io.mongock.api.annotations.ChangeUnit;
import io.mongock.api.annotations.Execution;
import io.mongock.api.annotations.RollbackExecution;
......@@ -67,7 +66,7 @@ public class M001_MigrateMailServiceAttachmentsToGridFs { // NOSONAR
@SuppressWarnings("unchecked")
private List<String> getAttachmentIds(Document attachedItem) {
return (List<String>) attachedItem.get(ATTACHED_ITEM, Document.class).get(PostfachMail.FIELD_ATTACHMENTS);
return (List<String>) attachedItem.get(ATTACHED_ITEM, Document.class).get("attachments");
}
private void doMigration(final MongoTemplate template, GridFSBucket gridFs, String attachment) {
......
......@@ -36,7 +36,7 @@ public class M003_MigrateVorgangAttachmentsAndRepresentationsToGridFs { // NOSON
private static final String FILES_FIELD = "files";
static final String CLIENT = "client";
static final String CLIENT_VALUE = "goofy";
static final String CLIENT_VALUE = "eingangManager";
static final String CONTENT_TYPE = "contentType";
static final String FILE_FIELD_NAME = "fieldName";
static final String ATTACHMENT_FIELD_NAME_VALUE = "vorgangAttachment";
......@@ -57,7 +57,6 @@ public class M003_MigrateVorgangAttachmentsAndRepresentationsToGridFs { // NOSON
getAttachments(vorgang).stream().flatMap(attachment -> getFiles(attachment).stream())
.filter(Objects::nonNull)
.forEach(file -> doMigration(template, gridFsBucket, file, vorgang, ATTACHMENT_FIELD_NAME_VALUE));
getRepresentations(vorgang).stream()
.forEach(file -> doMigration(template, gridFsBucket, file, vorgang, REPRESENTATION_FIELD_NAME_VALUE));
});
......
......@@ -7,7 +7,7 @@ import lombok.ToString;
@Builder
@Getter
@ToString(exclude = "content")
@ToString
public class IncomingFile {
private FileId id;
......@@ -15,5 +15,4 @@ public class IncomingFile {
private String name;
private String contentType;
private long size;
private byte[] content;
}
......@@ -5,10 +5,12 @@ import java.io.IOException;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.MimeTypeUtils;
import de.itvsh.ozg.mail.common.errorhandling.TechnicalException;
import de.itvsh.ozg.pluto.files.FileService;
import de.itvsh.ozg.pluto.vorgang.Eingang;
import de.itvsh.ozg.pluto.vorgang.IncomingFile;
import de.itvsh.ozg.pluto.vorgang.IncomingFileGroup;
......@@ -21,6 +23,9 @@ import net.lingala.zip4j.model.enums.EncryptionMethod;
@Service
class ZipBuilderService {
@Autowired
private FileService fileService;
public ByteArrayOutputStream buildVorgangZip(Vorgang vorgang, char[] password, boolean encrypted) {
return new ZipBuilder(vorgang, encrypted).buildZip(password);
}
......@@ -89,7 +94,7 @@ class ZipBuilderService {
try {
zipOut.putNextEntry(buildZipParameter(fileName));
IOUtils.write(file.getContent(), zipOut);
IOUtils.copy(fileService.getUploadedFileStream(file.getId()), zipOut);
zipOut.closeEntry();
} catch (IOException e) {
throw new TechnicalException("Error writing zip entry", e);
......
......@@ -6,9 +6,12 @@ import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
import java.io.IOException;
import java.io.InputStream;
import org.apache.commons.lang3.StringUtils;
import org.bson.Document;
import org.bson.types.ObjectId;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.mockito.Spy;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -20,17 +23,9 @@ import org.springframework.data.mongodb.gridfs.GridFsTemplate;
import com.mongodb.client.gridfs.model.GridFSFile;
import de.itvsh.kop.common.test.DataITCase;
import de.itvsh.kop.common.test.TestUtils;
import de.itvsh.ozg.pluto.files.OzgFileTestFactory;
import de.itvsh.ozg.pluto.vorgang.Eingang;
import de.itvsh.ozg.pluto.vorgang.EingangTestFactory;
import de.itvsh.ozg.pluto.vorgang.IncomingFileTestFactory;
import de.itvsh.ozg.pluto.vorgang.Vorgang;
import de.itvsh.ozg.pluto.vorgang.VorgangTestFactory;
@DataITCase
class M003_MigrateVorgangAttachmentsAndRepresentationsToGridFsITCase {// NOSONAR
private static final String METADATA_VORGANG_ID = "metadata.vorgangId";
@Spy
private M003_MigrateVorgangAttachmentsAndRepresentationsToGridFs migrator = new M003_MigrateVorgangAttachmentsAndRepresentationsToGridFs();
......@@ -40,150 +35,252 @@ class M003_MigrateVorgangAttachmentsAndRepresentationsToGridFsITCase {// NOSONAR
@Autowired
private GridFsTemplate gridFsTemplate;
private Vorgang migratedVorgang;
private Vorgang notMigratedVorgang;
private ObjectId vorgangId;
@BeforeEach
public void init() {
template.dropCollection(GRID_FS_FILE_COLLECTION);
template.dropCollection(VORGANG_COLLECTION);
void init() {
migratedVorgang = template.save(VorgangTestFactory.createBuilder().id(null).build());
template.dropCollection(MigrationTestUtils.GRID_FS_FILES_COLLECTION);
template.dropCollection(MigrationTestUtils.GRID_FS_CHUNKS_COLLECTION);
template.dropCollection(MigrationTestUtils.VORGANG_COLLECTION);
Eingang eingangWithout = EingangTestFactory.createBuilder().clearAttachments().clearRepresentations().build();
notMigratedVorgang = template.save(VorgangTestFactory.createBuilder().id(null).clearEingangs().eingang(eingangWithout).build());
var vorgang = template.insert(MigrationVorgangTestFactory.createVorgang(), VORGANG_COLLECTION);
vorgangId = MigrationTestUtils.getObjectId(vorgang);
}
@Test
void shouldHaveAttachmentFilePath() {
migrate();
void shouldNotStopOnExceptionWhenMigrationASecondTime() {
doMigration();
var expectedPath = createFilePath(ATTACHMENT_FIELD_NAME_VALUE, IncomingFileTestFactory.NAME);
doMigration();
var migratedPath = getMigratedAttachmentFile().getFilename();
assertThat(migratedPath).isEqualTo(expectedPath);
assertThatNoException().isThrownBy(this::doMigration);
}
@Test
void shouldHaveAttachmentFileId() {
migrate();
var attachments = getMigratedVorgang().getEingangs().get(0).getAttachments();
var fileId = attachments.get(0).getFiles().get(0).getId().toString();
void shouldThrowException() throws IOException {
doThrow(new IOException("Test Migration Exception")).when(migrator).storeToGridFs(any(), any(), any(), any());
var migratedFileId = getMigratedAttachmentFile().getId().asObjectId().getValue().toHexString();
assertThat(migratedFileId).isEqualTo(fileId);
assertThatThrownBy(this::doMigration).isInstanceOf(IllegalStateException.class);
}
@Nested
class TestAttachmentMigration {
@Nested
class TestFirstAttachmentFile {
private final static String NAME = MigrationAttachmentTestFactory.ATTACHMENT_FILE_NAME;
@Test
void shouldHaveRepresentationFilePath() {
migrate();
void shouldKeepDataInVorgangAttachment() {
doMigration();
var attachment = getAttachment(getIdOfCreatedGridFsFile(ATTACHMENT_FIELD_NAME_VALUE, NAME));
assertThat(attachment.getString(MigrationIncomingFileTestFactory.FIELD_CONTENT_TYPE))
.isEqualTo(MigrationIncomingFileTestFactory.CONTENT_TYPE);
assertThat(attachment.getString(MigrationIncomingFileTestFactory.FIELD_NAME)).isEqualTo(NAME);
assertThat(attachment.getLong(MigrationIncomingFileTestFactory.FIELD_SIZE)).isEqualTo(MigrationIncomingFileTestFactory.SIZE);
}
var expectedPath = createFilePath(REPRESENTATION_FIELD_NAME_VALUE, IncomingFileTestFactory.NAME);
@Test
void shouldUpdateAttachmentFileId() {
doMigration();
var migratedPath = getMigratedRepresentationFile().getFilename();
assertThat(migratedPath).isEqualTo(expectedPath);
var gridFsFileId = getIdOfCreatedGridFsFile(ATTACHMENT_FIELD_NAME_VALUE, NAME);
var attachment = getAttachment(gridFsFileId);
assertThat(gridFsFileId).isEqualTo(attachment.getString(OBJECT_ID));
}
@Nested
class TestCreatedGridFs {
@Test
void shouldHaveRepresentationFileId() {
migrate();
var representations = getMigratedVorgang().getEingangs().get(0).getRepresentations();
var fileId = representations.get(0).getId().toString();
void shouldHaveAttachmentFilePath() {
doMigration();
var migratedFileId = getMigratedRepresentationFile().getId().asObjectId().getValue().toHexString();
assertThat(migratedFileId).isEqualTo(fileId);
var expectedFilename = buildAttachmentFilename(NAME);
var migratedFilename = getGridFsFile(expectedFilename).getFilename();
assertThat(migratedFilename).isEqualTo(expectedFilename);
}
@Test
void shouldHaveAttachmentMetadata() {
migrate();
void shouldHaveGridFsFileMetadata() {
doMigration();
var metadata = getMigratedAttachmentFile().getMetadata();
var gridFsFile = getGridFsFile(buildAttachmentFilename(NAME));
var metadata = gridFsFile.getMetadata();
assertThat(metadata.getString(CLIENT)).isEqualTo(CLIENT_VALUE);
assertThat(metadata.getString(VORGANG_ID)).isEqualTo(migratedVorgang.getId());
assertThat(metadata.getString(VORGANG_ID)).isEqualTo(vorgangId.toHexString());
assertThat(metadata.getString(FILE_FIELD_NAME)).isEqualTo(ATTACHMENT_FIELD_NAME_VALUE);
assertThat(metadata.getString(CONTENT_TYPE)).isEqualTo(OzgFileTestFactory.CONTENT_TYPE);
assertThat(metadata.getString(FILE_NAME)).isEqualTo(IncomingFileTestFactory.NAME);
}
@Test
void shouldHaveRepresentationMetadata() {
migrate();
void shouldHaveAttachmentContent() throws IOException {
doMigration();
var metadata = getMigratedRepresentationFile().getMetadata();
assertThat(metadata.getString(CLIENT)).isEqualTo(CLIENT_VALUE);
assertThat(metadata.getString(VORGANG_ID)).isEqualTo(migratedVorgang.getId());
assertThat(metadata.getString(FILE_FIELD_NAME)).isEqualTo(REPRESENTATION_FIELD_NAME_VALUE);
assertThat(metadata.getString(CONTENT_TYPE)).isEqualTo(OzgFileTestFactory.CONTENT_TYPE);
assertThat(metadata.getString(FILE_NAME)).isEqualTo(IncomingFileTestFactory.NAME);
var gridFsFileContent = getGridFsFileContent(getGridFsFile(buildAttachmentFilename(NAME)));
assertThat(gridFsFileContent).isEqualTo(MigrationIncomingFileTestFactory.CONTENT);
}
}
}
@Nested
class TestSecondAttachmentFile {
private final static String NAME = MigrationAttachmentTestFactory.ATTACHMENT_FILE_NAME2;
@Test
void shouldKeepDataInVorgang() {
doMigration();
var attachment = getAttachment(getIdOfCreatedGridFsFile(ATTACHMENT_FIELD_NAME_VALUE, NAME));
assertThat(attachment.getString(MigrationIncomingFileTestFactory.FIELD_CONTENT_TYPE))
.isEqualTo(MigrationIncomingFileTestFactory.CONTENT_TYPE);
assertThat(attachment.getString(MigrationIncomingFileTestFactory.FIELD_NAME)).isEqualTo(NAME);
assertThat(attachment.getLong(MigrationIncomingFileTestFactory.FIELD_SIZE)).isEqualTo(MigrationIncomingFileTestFactory.SIZE);
}
@Test
void shouldUpdateAttachmentFileId() {
doMigration();
var gridFsFileId = getIdOfCreatedGridFsFile(ATTACHMENT_FIELD_NAME_VALUE, NAME);
var attachment = getAttachment(gridFsFileId);
assertThat(gridFsFileId).isEqualTo(attachment.getString(OBJECT_ID).toString());
}
@Nested
class TestCreatedGridFs {
@Test
void shouldHaveAttachmentFilePath() {
doMigration();
var expectedFilename = buildAttachmentFilename(NAME);
var gridFsFile = getGridFsFile(expectedFilename);
var migratedFilename = gridFsFile.getFilename();
assertThat(migratedFilename).isEqualTo(expectedFilename);
}
@Test
void shouldHaveGridFsFileMetadata() {
doMigration();
var gridFsFileMetadata = getGridFsFile(buildAttachmentFilename(NAME)).getMetadata();
assertThat(gridFsFileMetadata.getString(CLIENT)).isEqualTo(CLIENT_VALUE);
assertThat(gridFsFileMetadata.getString(VORGANG_ID)).isEqualTo(vorgangId.toHexString());
assertThat(gridFsFileMetadata.getString(FILE_FIELD_NAME)).isEqualTo(ATTACHMENT_FIELD_NAME_VALUE);
}
@Test
void shouldHaveAttachmentContent() throws IOException {
migrate();
doMigration();
InputStream in = TestUtils.loadFile(IncomingFileTestFactory.NAME);
byte[] fileData = new byte[in.available()];
in.read(fileData);
var gridFsFileContent = getGridFsFileContent(getGridFsFile(buildAttachmentFilename(NAME)));
assertThat(gridFsFileContent).isEqualTo(MigrationIncomingFileTestFactory.CONTENT);
}
}
}
var content = gridFsTemplate
.getResource(getMigratedAttachmentFile())
.getContent().readAllBytes();
assertThat(content).isEqualTo(fileData);
private Document getAttachment(String gridFsFileId) {
var attachments = getVorgang().getList(MigrationVorgangTestFactory.FIELD_EINGANGS, Document.class).get(0)
.getList(MigrationEingangTestFactory.FIELD_ATTACHMENTS, Document.class);
return attachments.stream()
.flatMap(oneattachment -> oneattachment.getList("files", Document.class).stream())
.filter(attachmentFile -> StringUtils.equals(attachmentFile.getString(OBJECT_ID), gridFsFileId))
.toList().get(0);
}
}
@Nested
class TestRepresentationMigration {
private GridFSFile getMigratedAttachmentFile() {
return getGridFsFile(createFilePath(ATTACHMENT_FIELD_NAME_VALUE, getAttachmentName(migratedVorgang)));
private final static String NAME = MigrationIncomingFileTestFactory.NAME;
@Test
void shouldKeepDataInVorgang() {
doMigration();
var representation = getRepresentation(getVorgang(), getIdOfCreatedGridFsFile());
assertThat(representation.getString(MigrationIncomingFileTestFactory.FIELD_CONTENT_TYPE))
.isEqualTo(MigrationIncomingFileTestFactory.CONTENT_TYPE);
assertThat(representation.getString(MigrationIncomingFileTestFactory.FIELD_NAME)).isEqualTo(NAME);
assertThat(representation.getLong(MigrationIncomingFileTestFactory.FIELD_SIZE)).isEqualTo(MigrationIncomingFileTestFactory.SIZE);
}
@Test
void shouldHaveRepresentationContent() throws IOException {
migrate();
void shouldUpdateRepresentationFileId() {
doMigration();
InputStream in = TestUtils.loadFile(IncomingFileTestFactory.NAME);
byte[] fileData = new byte[in.available()];
in.read(fileData);
var gridFsFileId = getIdOfCreatedGridFsFile();
var representation = getRepresentation(getVorgang(), gridFsFileId);
assertThat(gridFsFileId).isEqualTo(representation.getString(OBJECT_ID));
}
var content = gridFsTemplate
.getResource(getMigratedRepresentationFile())
.getContent().readAllBytes();
assertThat(content).isEqualTo(fileData);
private String getIdOfCreatedGridFsFile() {
var gridFsFile = getGridFsFile(buildRepresentationFilename());
var gridFsFileId = gridFsFile.getId().asObjectId().getValue().toHexString();
return gridFsFileId;
}
private GridFSFile getMigratedRepresentationFile() {
return getGridFsFile(createFilePath(REPRESENTATION_FIELD_NAME_VALUE, getRepresentationName(migratedVorgang)));
@Nested
class TestCreatedGridFs {
@Test
void shouldHaveRepresentationFilePath() {
doMigration();
var expectedFilename = buildRepresentationFilename();
var gridFsFile = getGridFsFile(buildRepresentationFilename());
var migratedFilename = gridFsFile.getFilename();
assertThat(migratedFilename).isEqualTo(expectedFilename);
}
@Test
void shouldNotDeleteAttachment() {
migrate();
void shouldSetGridFsFileMetadata() {
doMigration();
assertThat(getMigratedVorgang().getEingangs().get(0).getAttachments().get(0).getFiles()).isNotEmpty();
var gridFsFile = getGridFsFile(buildRepresentationFilename());
var metadata = gridFsFile.getMetadata();
assertThat(metadata.getString(CLIENT)).isEqualTo(CLIENT_VALUE);
assertThat(metadata.getString(VORGANG_ID)).isEqualTo(vorgangId.toHexString());
assertThat(metadata.getString(FILE_FIELD_NAME)).isEqualTo(REPRESENTATION_FIELD_NAME_VALUE);
}
@Test
void shouldNotDeleteRepresentation() {
migrate();
void shouldHaveRepresentationContent() throws IOException {
doMigration();
assertThat(getMigratedVorgang().getEingangs().get(0).getRepresentations()).isNotEmpty();
var gridFsFileContent = getGridFsFileContent(getGridFsFile(buildRepresentationFilename()));
assertThat(gridFsFileContent).isEqualTo(MigrationIncomingFileTestFactory.CONTENT);
}
}
private Vorgang getMigratedVorgang() {
return template.findOne(Query.query(Criteria.where(OBJECT_ID).is(migratedVorgang.getId())), Vorgang.class);
private Document getRepresentation(Document vorgang, String gridFsFileId) {
var representations = vorgang.getList(MigrationVorgangTestFactory.FIELD_EINGANGS, Document.class).get(0)
.getList(MigrationEingangTestFactory.FIELD_REPRESENTATIONS, Document.class);
return representations.stream()
.filter(representationFile -> StringUtils.equals(representationFile.getString(OBJECT_ID), gridFsFileId))
.toList().get(0);
}
private String buildRepresentationFilename() {
return buildFilename(REPRESENTATION_FIELD_NAME_VALUE, NAME);
}
}
private String getAttachmentName(Vorgang vorgang) {
return vorgang.getEingangs().get(0).getAttachments().get(0).getFiles().get(0).getName();
private byte[] getGridFsFileContent(GridFSFile gridFsFile) throws IOException {
return gridFsTemplate.getResource(gridFsFile).getContent().readAllBytes();
}
private String getRepresentationName(Vorgang vorgang) {
return vorgang.getEingangs().get(0).getRepresentations().get(0).getName();
private Document getVorgang() {
return template.findById(vorgangId, Document.class, VORGANG_COLLECTION);
}
private String createFilePath(String fieldValue, String name) {
private String buildFilename(String fieldValue, String name) {
return String.format("%s/%s/%s/%s",
migratedVorgang.getId(),
vorgangId.toHexString(),
CLIENT_VALUE,
fieldValue,
name);
......@@ -193,32 +290,16 @@ class M003_MigrateVorgangAttachmentsAndRepresentationsToGridFsITCase {// NOSONAR
return gridFsTemplate.findOne(Query.query(Criteria.where(GRISFS_FILE_NAME_FIELD).is(filename)));
}
@Test
void shouldNotStopOnExceptionWhenMigrationASecondTime() {
migrate();
migrate();
assertThatNoException().isThrownBy(this::migrate);
private String getIdOfCreatedGridFsFile(String fieldName, String name) {
var filename = buildFilename(fieldName, name);
return getGridFsFile(filename).getId().asObjectId().getValue().toHexString();
}
@Test
void shouldThrowException() throws IOException {
doThrow(new IOException("Test")).when(migrator).storeToGridFs(any(), any(), any(), any());
assertThatThrownBy(this::migrate).isInstanceOf(IllegalStateException.class);
}
@Test
void shouldNotMigrate() {
migrate();
GridFSFile migratedFile = gridFsTemplate.findOne(Query.query(Criteria.where(METADATA_VORGANG_ID).is(notMigratedVorgang.getId())));
assertThat(migratedFile).isNull();
private String buildAttachmentFilename(String name) {
return buildFilename(ATTACHMENT_FIELD_NAME_VALUE, name);
}
private void migrate() {
private void doMigration() {
migrator.migrationMethod(template);
}
}
\ No newline at end of file
package de.itvsh.ozg.pluto.common.migration;
import java.util.List;
import java.util.UUID;
import org.bson.Document;
import com.thedeanda.lorem.LoremIpsum;
class MigrationAttachmentTestFactory {
static final String FIELD_NAME = "name";
static final String NAME = LoremIpsum.getInstance().getName();
static final String FIELD_FILES = "files";
static final String ATTACHMENT_FILE_ID = UUID.randomUUID().toString();
static final String ATTACHMENT_FILE_NAME = LoremIpsum.getInstance().getName();
static final String ATTACHMENT_FILE_ID2 = UUID.randomUUID().toString();
static final String ATTACHMENT_FILE_NAME2 = LoremIpsum.getInstance().getName();
static Document create() {
var incomingFileGroup = new Document();
incomingFileGroup.put(FIELD_NAME, NAME);
incomingFileGroup.put(FIELD_FILES, List.of(
createAttachment(ATTACHMENT_FILE_ID, ATTACHMENT_FILE_NAME),
createAttachment(ATTACHMENT_FILE_ID2, ATTACHMENT_FILE_NAME2)));
return incomingFileGroup;
}
private static Document createAttachment(String id, String name) {
var attachmentFile = MigrationIncomingFileTestFactory.create();
attachmentFile.remove(MigrationIncomingFileTestFactory.FIELD_ID);
attachmentFile.put(MigrationIncomingFileTestFactory.FIELD_ID, id);
attachmentFile.remove(MigrationIncomingFileTestFactory.FIELD_NAME);
attachmentFile.put(MigrationIncomingFileTestFactory.FIELD_NAME, name);
return attachmentFile;
}
}
\ No newline at end of file
package de.itvsh.ozg.pluto.common.migration;
import java.util.HashMap;
import java.util.List;
import java.util.UUID;
import org.bson.Document;
class MigrationEingangTestFactory {
static final String FIELD_ID = "_id";
static final String ID = UUID.randomUUID().toString();
static final String FIELD_HEADER = "header";
static final String FIELD_ANTRAGSTELLER = "antragsteller";
static final String FIELD_ZUSTAENDIDGESTELLE = "zustaendigeStelle";
static final String FIELD_REPRESENTATIONS = "representations";
static final String FIELD_NUMBER_OF_REPRESENTATIONS = "numberOfRepresentations";
static final String FIELD_ATTACHMENTS = "attachments";
static final String FIELD_NUMBER_OF_ATTACHMENTS = "numberOfAttachments";
static final String FIELD_FORMDATA = "formData";
static Document create() {
var eingang = new Document();
eingang.put(FIELD_ID, ID);
eingang.put(FIELD_HEADER, new Document());
eingang.put(FIELD_ANTRAGSTELLER, new Document());
eingang.put(FIELD_ZUSTAENDIDGESTELLE, new Document());
eingang.put(FIELD_ATTACHMENTS, List.of(MigrationAttachmentTestFactory.create()));
eingang.put(FIELD_NUMBER_OF_ATTACHMENTS, 2);
eingang.put(FIELD_REPRESENTATIONS, List.of(MigrationIncomingFileTestFactory.create()));
eingang.put(FIELD_NUMBER_OF_REPRESENTATIONS, 1);
eingang.put(FIELD_FORMDATA, new HashMap<String, Object>());
return eingang;
}
}
package de.itvsh.ozg.pluto.common.migration;
import java.io.IOException;
import java.io.InputStream;
import org.bson.Document;
import org.bson.types.Binary;
import org.bson.types.ObjectId;
import de.itvsh.kop.common.test.TestUtils;
class MigrationIncomingFileTestFactory {
static final String FIELD_ID = "_id";
static final String ID = new ObjectId().toHexString();
static final String FIELD_NAME = "name";
static final String NAME = "TestDoc.docx";
static final String FIELD_CONTENT_TYPE = "contentType";
static final String CONTENT_TYPE = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
static final String FIELD_SIZE = "size";
static final long SIZE;
static final String FIELD_CONTENT = "content";
static final byte[] CONTENT;
static {
CONTENT = initContent();
SIZE = CONTENT.length;
}
private static byte[] initContent() {
try (InputStream in = TestUtils.loadFile(NAME)) {
byte[] fileData = new byte[in.available()];
in.read(fileData);
return fileData;
} catch (IOException e) {
throw new IllegalStateException("Error reading test file " + NAME);
}
}
static Document create() {
var incomingFile = new Document();
incomingFile.put(FIELD_ID, ID);
incomingFile.put(FIELD_NAME, NAME);
incomingFile.put(FIELD_CONTENT_TYPE, CONTENT_TYPE);
incomingFile.put(FIELD_SIZE, SIZE);
incomingFile.put(FIELD_CONTENT, new Binary(CONTENT));
return incomingFile;
}
}
\ No newline at end of file
package de.itvsh.ozg.pluto.common.migration;
import java.io.InputStream;
import org.bson.Document;
import org.bson.types.ObjectId;
class MigrationTestUtils {
static final String FIELD_OBJECT_ID = "_id";
static final String GRID_FS_CHUNKS_COLLECTION = "fs.chunk";
static final String GRID_FS_FILES_COLLECTION = "fs.files";
static final String VORGANG_COLLECTION = "vorgang";
static ObjectId getObjectId(Document doc) {
return doc.getObjectId(MigrationTestUtils.FIELD_OBJECT_ID);
}
static InputStream loadFile(final String fileName) {
var stream = MigrationTestUtils.class.getClassLoader().getResourceAsStream(fileName);
if (stream == null) {
throw new RuntimeException("File '" + fileName + "' not found."); // NOSONAR
}
return stream;
}
}
\ No newline at end of file
package de.itvsh.ozg.pluto.common.migration;
import java.util.List;
import org.bson.Document;
class MigrationVorgangTestFactory {
static final String COLLECTION_NAME = "vorgang";
static final String FIELD_NAME = "name";
static final String NAME = "Test Vorgang";
static final String FIELD_NUMMER = "nummer";
static final String NUMMER = "2342454345654";
static final String FIELD_STATUS = "status";
static final String STATUS = "NEU";
static final String FIELD_VERSION = "version";
static final String VERSION = "0";
static final String FIELD_EINGANGS = "eingangs";
static final String FIELD_FORWARDINGS = "forwardings";
static final String FIELD_IN_CREATION = "inCreation";
static final boolean IN_CREATION = false;
static Document createVorgang() {
var vorgang = new Document();
vorgang.put(FIELD_NAME, NAME);
vorgang.put(FIELD_NUMMER, NUMMER);
vorgang.put(FIELD_STATUS, STATUS);
vorgang.put(FIELD_VERSION, VERSION);
vorgang.put(FIELD_EINGANGS, List.of(MigrationEingangTestFactory.create()));
vorgang.put(FIELD_IN_CREATION, IN_CREATION);
return vorgang;
}
}
\ No newline at end of file
......@@ -180,7 +180,6 @@ class FileITCase {
assertThat(attachment1.getName()).isEqualTo(IncomingFileTestFactory.NAME);
assertThat(attachment1.getContentType()).isEqualTo(IncomingFileTestFactory.CONTENT_TYPE_STR);
assertThat(attachment1.getSize()).isEqualTo(IncomingFileTestFactory.SIZE);
assertThat(attachment1.getContent().toByteArray()).isEqualTo(IncomingFileTestFactory.CONTENT);
}
@Test
......@@ -192,7 +191,6 @@ class FileITCase {
assertThat(representation.getName()).isEqualTo(IncomingFileTestFactory.NAME);
assertThat(representation.getContentType()).isEqualTo(IncomingFileTestFactory.CONTENT_TYPE_STR);
assertThat(representation.getSize()).isEqualTo(IncomingFileTestFactory.SIZE);
assertThat(representation.getContent().toByteArray()).isEqualTo(IncomingFileTestFactory.CONTENT);
}
private void callServiceGetFileData(GrpcGetOzgFileDataRequest request) {
......
......@@ -126,7 +126,7 @@ class FilesRepositoryITCase {
void validateGetAttachmentData() {
Optional<OzgFileData> file = repository.getFileContent(IncomingFileTestFactory.ID);
assertThat(file).get().usingRecursiveComparison().isEqualTo(OzgFileDataTestFactory.create());
assertThat(file).get().usingRecursiveComparison().isEqualTo(OzgFileDataTestFactory.createBuilder().content(null).build());
}
@Test
......@@ -134,7 +134,7 @@ class FilesRepositoryITCase {
Optional<OzgFileData> file = repository.getFileContent(IncomingFileTestFactory.ID);
assertThat(file).isPresent().get().usingRecursiveComparison()
.isEqualTo(OzgFileDataTestFactory.createBuilder().name(IncomingFileTestFactory.NAME).build());
.isEqualTo(OzgFileDataTestFactory.createBuilder().content(null).name(IncomingFileTestFactory.NAME).build());
}
}
}
......@@ -36,8 +36,7 @@ public class IncomingFileTestFactory {
.vendorId(VENDOR_ID)
.name(NAME)
.contentType(CONTENT_TYPE_STR)
.size(SIZE)
.content(CONTENT);
.size(SIZE);
}
public static InputStream createContentStream(int sizeInMB) {
......
......@@ -4,6 +4,13 @@ import static org.assertj.core.api.Assertions.*;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
import java.io.ByteArrayInputStream;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
......@@ -24,13 +31,20 @@ import de.itvsh.ozg.pluto.command.CommandStatus;
import de.itvsh.ozg.pluto.command.GrpcCreateCommandRequestTestFactory;
import de.itvsh.ozg.pluto.command.GrpcVorgangCommandService;
import de.itvsh.ozg.pluto.common.solr.SolrEventListener;
import de.itvsh.ozg.pluto.files.FileId;
import de.itvsh.ozg.pluto.files.FileService;
import de.itvsh.ozg.pluto.files.OzgFileTestFactory;
import de.itvsh.ozg.pluto.files.UploadedFilesReferenceTestFactory;
import de.itvsh.ozg.pluto.grpc.command.GrpcCommandResponse;
import de.itvsh.ozg.pluto.grpc.command.GrpcCreateCommandRequest;
import de.itvsh.ozg.pluto.grpc.command.GrpcOrder;
import de.itvsh.ozg.pluto.grpc.command.GrpcRedirectRequest;
import de.itvsh.ozg.pluto.vorgang.EingangTestFactory;
import de.itvsh.ozg.pluto.vorgang.IncomingFileGroupTestFactory;
import de.itvsh.ozg.pluto.vorgang.IncomingFileTestFactory;
import de.itvsh.ozg.pluto.vorgang.Vorgang;
import de.itvsh.ozg.pluto.vorgang.Vorgang.Status;
import de.itvsh.ozg.pluto.vorgang.VorgangTestFactory;
import de.itvsh.ozg.pluto.vorgang.VorgangService;
import io.grpc.stub.StreamObserver;
@DataITCase
......@@ -52,13 +66,19 @@ class ForwardVorgangITCase {
private String vorgangId;
@Autowired
private VorgangService vorgangService;
@Autowired
private FileService fileService;
@MockBean
private StreamObserver<GrpcCommandResponse> responseObserver;
@Captor
private ArgumentCaptor<GrpcCommandResponse> responseCapture;
@BeforeEach
void init() {
void init() throws InterruptedException, ExecutionException, TimeoutException {
cleanDatabase();
prepareVorgang();
}
......@@ -68,11 +88,26 @@ class ForwardVorgangITCase {
mongoOperations.dropCollection(Command.class);
}
private void prepareVorgang() {
var vorgang = VorgangTestFactory.createBuilder().id(null).status(Status.NEU).build();
private void prepareVorgang() throws InterruptedException, ExecutionException, TimeoutException {
Vorgang vorgang = vorgangService.startCreation(EingangTestFactory.createBuilder().clearAttachments().clearRepresentations().build());
FileId attachmentFileId = storeFileInGridFs(vorgang);
FileId representationFileId = storeFileInGridFs(vorgang);
var attachments = List.of(IncomingFileGroupTestFactory.createBuilder().clearFiles().file(
IncomingFileTestFactory.createBuilder().id(attachmentFileId).build()).build());
var representations = List.of(IncomingFileTestFactory.createBuilder().id(representationFileId).build());
vorgangService.finishCreation(vorgang.getId(), attachments, representations);
this.vorgangId = vorgang.getId();
}
var persisted = mongoOperations.save(vorgang);
this.vorgangId = persisted.getId();
private FileId storeFileInGridFs(Vorgang vorgang) throws InterruptedException, ExecutionException, TimeoutException {
return fileService
.uploadFileStream(UploadedFilesReferenceTestFactory.createBuilder().vorgangId(vorgang.getId()).build(),
OzgFileTestFactory.create(), Optional.empty(), new ByteArrayInputStream(IncomingFileTestFactory.CONTENT))
.get(5, TimeUnit.SECONDS);
}
@Nested
......@@ -149,7 +184,7 @@ class ForwardVorgangITCase {
return GrpcCreateCommandRequestTestFactory.createBuilder()
.clearOrder().setOrder(GrpcOrder.REDIRECT_VORGANG)
.clearRelationId().setRelationId(vorgangId)
.clearRelationVersion().setRelationVersion(VorgangTestFactory.VERSION)
.clearRelationVersion().setRelationVersion(0)
.setRedirectRequest(buildRedirectRequest())
.build();
}
......
......@@ -4,6 +4,7 @@ import static org.assertj.core.api.Assertions.*;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
......@@ -20,6 +21,8 @@ import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.springframework.test.util.ReflectionTestUtils;
import de.itvsh.ozg.pluto.files.FileId;
import de.itvsh.ozg.pluto.files.FileService;
import de.itvsh.ozg.pluto.vorgang.IncomingFileGroupTestFactory;
import de.itvsh.ozg.pluto.vorgang.IncomingFileTestFactory;
import de.itvsh.ozg.pluto.vorgang.VorgangTestFactory;
......@@ -39,8 +42,12 @@ class ZipBuilderServiceTest {
@Mock
private ZipOutputStream zipOut;
@Mock
private FileService fileService;
@BeforeEach
void init() {
when(fileService.getUploadedFileStream(any(FileId.class))).thenReturn(new ByteArrayInputStream(IncomingFileTestFactory.CONTENT));
builder = spy(service.new ZipBuilder(VorgangTestFactory.create(), true));
ReflectionTestUtils.setField(builder, "zipOut", zipOut);
......
......@@ -6,6 +6,7 @@
<groupId>de.itvsh.ozg</groupId>
<artifactId>pluto</artifactId>
<version>0.24.0-SNAPSHOT</version>
<name>Pluto Parent</name>
<packaging>pom</packaging>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment