diff --git a/concordion/src/test/java/nl/knaw/huc/textrepo/task/TestFindDocumentMetadataByExternalId.java b/concordion/src/test/java/nl/knaw/huc/textrepo/task/TestFindDocumentMetadataByExternalId.java index bef8ab05..4e2d9ce4 100644 --- a/concordion/src/test/java/nl/knaw/huc/textrepo/task/TestFindDocumentMetadataByExternalId.java +++ b/concordion/src/test/java/nl/knaw/huc/textrepo/task/TestFindDocumentMetadataByExternalId.java @@ -2,13 +2,12 @@ import nl.knaw.huc.textrepo.AbstractConcordionTest; import nl.knaw.huc.textrepo.util.RestUtils; -import org.apache.commons.text.StringEscapeUtils; import static javax.ws.rs.client.Entity.entity; -import static javax.ws.rs.core.MediaType.APPLICATION_JSON_TYPE; import static javax.ws.rs.core.MediaType.TEXT_PLAIN; import static nl.knaw.huc.textrepo.Config.HOST; import static nl.knaw.huc.textrepo.util.TestUtils.asCodeBlock; +import static nl.knaw.huc.textrepo.util.TestUtils.asHeaderLink; import static nl.knaw.huc.textrepo.util.TestUtils.asPrettyJson; import static nl.knaw.huc.textrepo.util.TestUtils.replaceUrlParams; @@ -70,7 +69,4 @@ public RetrieveResult retrieve(Object endpoint, Object docId, Object externalId, return result; } - private String asHeaderLink(String header) { - return StringEscapeUtils.escapeHtml4("Link: " + header + "\n"); - } } diff --git a/concordion/src/test/java/nl/knaw/huc/textrepo/task/TestFindFileContentsByExternalId.java b/concordion/src/test/java/nl/knaw/huc/textrepo/task/TestFindFileContentsByExternalId.java index 1b175963..c28fd886 100644 --- a/concordion/src/test/java/nl/knaw/huc/textrepo/task/TestFindFileContentsByExternalId.java +++ b/concordion/src/test/java/nl/knaw/huc/textrepo/task/TestFindFileContentsByExternalId.java @@ -2,11 +2,10 @@ import nl.knaw.huc.textrepo.AbstractConcordionTest; import nl.knaw.huc.textrepo.util.RestUtils; -import org.apache.commons.text.StringEscapeUtils; import static java.util.Map.of; import static nl.knaw.huc.textrepo.util.TestUtils.asCodeBlock; -import static nl.knaw.huc.textrepo.util.TestUtils.asPrettyJson; +import static nl.knaw.huc.textrepo.util.TestUtils.asHeaderLink; import static nl.knaw.huc.textrepo.util.TestUtils.replaceInUrlAndQueryParams; public class TestFindFileContentsByExternalId extends AbstractConcordionTest { @@ -35,7 +34,8 @@ public static class RetrieveResult { public RetrieveResult retrieve(String endpoint, String externalId, String fileType) { final var response = client - .target(replaceInUrlAndQueryParams(endpoint, of("{externalId}", externalId, "{name}", fileType))) + .target(replaceInUrlAndQueryParams(endpoint, + of("{externalId}", externalId, "{typeName}", fileType))) .request() .get(); @@ -46,7 +46,9 @@ public RetrieveResult retrieve(String endpoint, String externalId, String fileTy result.headers = ""; var links = response.getHeaders().get("Link"); links.forEach((l) -> { - System.out.println("link:" + l.toString());result.headers += asHeaderLink(l.toString());}); + System.out.println("link:" + l.toString()); + result.headers += asHeaderLink(l.toString()); + }); result.versionHistory = links .stream() @@ -74,7 +76,4 @@ public RetrieveResult retrieve(String endpoint, String externalId, String fileTy return result; } - private String asHeaderLink(String header) { - return StringEscapeUtils.escapeHtml4("Link: " + header + "\n"); - } } diff --git a/concordion/src/test/java/nl/knaw/huc/textrepo/task/TestFindFileMetadataByExternalId.java b/concordion/src/test/java/nl/knaw/huc/textrepo/task/TestFindFileMetadataByExternalId.java index 00d9fa0d..fe6dbaa3 100644 --- a/concordion/src/test/java/nl/knaw/huc/textrepo/task/TestFindFileMetadataByExternalId.java +++ b/concordion/src/test/java/nl/knaw/huc/textrepo/task/TestFindFileMetadataByExternalId.java @@ -2,14 +2,13 @@ import nl.knaw.huc.textrepo.AbstractConcordionTest; import nl.knaw.huc.textrepo.util.RestUtils; -import org.apache.commons.text.StringEscapeUtils; import static java.util.Map.of; import static javax.ws.rs.client.Entity.entity; -import static javax.ws.rs.core.MediaType.APPLICATION_JSON_TYPE; import static javax.ws.rs.core.MediaType.TEXT_PLAIN; import static nl.knaw.huc.textrepo.Config.HOST; import static nl.knaw.huc.textrepo.util.TestUtils.asCodeBlock; +import static nl.knaw.huc.textrepo.util.TestUtils.asHeaderLink; import static nl.knaw.huc.textrepo.util.TestUtils.asPrettyJson; import static nl.knaw.huc.textrepo.util.TestUtils.replaceInUrlAndQueryParams; @@ -83,7 +82,4 @@ public RetrieveResult retrieve(String endpoint, String externalId, String fileTy return result; } - private String asHeaderLink(String header) { - return StringEscapeUtils.escapeHtml4("Link: " + header + "\n"); - } } diff --git a/concordion/src/test/java/nl/knaw/huc/textrepo/task/TestImportDocument.java b/concordion/src/test/java/nl/knaw/huc/textrepo/task/TestImportDocument.java new file mode 100644 index 00000000..e4023790 --- /dev/null +++ b/concordion/src/test/java/nl/knaw/huc/textrepo/task/TestImportDocument.java @@ -0,0 +1,150 @@ +package nl.knaw.huc.textrepo.task; + +import com.jayway.jsonpath.DocumentContext; +import nl.knaw.huc.textrepo.AbstractConcordionTest; +import org.glassfish.jersey.media.multipart.FormDataBodyPart; +import org.glassfish.jersey.media.multipart.FormDataContentDisposition; +import org.glassfish.jersey.media.multipart.FormDataMultiPart; +import org.glassfish.jersey.media.multipart.MultiPartFeature; + +import javax.ws.rs.core.Response; +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +import static java.nio.charset.StandardCharsets.UTF_8; +import static java.util.Map.of; +import static javax.ws.rs.client.Entity.entity; +import static javax.ws.rs.core.MediaType.APPLICATION_OCTET_STREAM_TYPE; +import static nl.knaw.huc.textrepo.util.TestUtils.asCodeBlock; +import static nl.knaw.huc.textrepo.util.TestUtils.asHeaderLink; +import static nl.knaw.huc.textrepo.util.TestUtils.asPrettyJson; +import static nl.knaw.huc.textrepo.util.TestUtils.replaceInUrlAndQueryParams; + +public class TestImportDocument extends AbstractConcordionTest { + public static class ImportResult { + public int status; + + public String headers; + public String versionLink; + public String fileLink; + public String documentLink; + public String contentsLink; + + public String body; + public String fileId; + public String documentId; + public String versionId; + public String contentsSha; + + public String isNewVersion; + } + + public ImportResult retrieve(String endpoint, + String externalId, + String typeName, + String content + ) { + final var response = importDocument(endpoint, externalId, content.getBytes(), typeName); + + final var result = new ImportResult(); + result.status = response.getStatus(); + + final var body = response.readEntity(String.class); + result.body = asPrettyJson(body.equals("") ? " " : body); + + result.headers = ""; + final var links = Optional.ofNullable(response.getHeaders().get("Link")) + .orElse(Collections.emptyList()); + links.forEach(l -> result.headers += asHeaderLink(l.toString())); + result.headers = asCodeBlock(result.headers); + + result.versionLink = findLink(links, "version"); + result.fileLink = findLink(links, "file"); + result.documentLink = findLink(links, "document"); + result.contentsLink = findLink(links, "contents"); + + final var json = jsonPath.parse(body); + result.fileId = findValidUUID(json, "fileId"); + result.documentId = findValidUUID(json, "documentId"); + result.versionId = findValidUUID(json, "versionId"); + result.contentsSha = findValidSha(json, "contentsSha"); + result.isNewVersion = findNewVersionInfo(json, "newVersion"); + + return result; + } + + private String findValidUUID(DocumentContext json, String field) { + final String str = json.read("$." + field); + try { + final var uuid = UUID.fromString(str); + return "valid " + field; + } catch (Exception e) { + return "invalid " + field + " (not a UUID)"; + } + } + + private String findValidSha(DocumentContext json, String field) { + final String str = json.read("$." + field); + if (str == null) { + return "missing " + field; + } + if (str.matches("[0-9a-f]{56}")) { + return "valid " + field; + } + return "invalid " + field + " (not a SHA224)"; + } + + private String findNewVersionInfo(DocumentContext json, String field) { + final Boolean isNewVersion = json.read("$." + field); + if (isNewVersion == null) { + return "missing " + field; + } + if (isNewVersion) { + return "a new version was created"; + } + return "no new version was created"; + } + + private String findLink(List links, String type) { + return links.stream() + .map(Object::toString) + .filter(l -> isRelationshipLinkTo(l, type)) + .findFirst() + .map(l -> "restful relationship link to " + type) + .orElse("header link to " + type + " missing"); + } + + private boolean isRelationshipLinkTo(String suspect, String type) { + return suspect.contains("/rest/" + type) + && suspect.endsWith("rel=\"" + type + "\""); + } + + private Response importDocument(String endpoint, String externalId, byte[] content, String typeName) { + var contentDisposition = FormDataContentDisposition + .name("contents") + .fileName(externalId + ".txt") + .size(content.length) + .build(); + + final var multiPart = new FormDataMultiPart() + .bodyPart(new FormDataBodyPart( + contentDisposition, + new String(content, UTF_8), + APPLICATION_OCTET_STREAM_TYPE) + ); + + var importUri = replaceInUrlAndQueryParams(endpoint, of( + "{externalId}", externalId, + "{typeName}", typeName)); + var request = client + .register(MultiPartFeature.class) + .target(importUri) + .request(); + + var entity = entity(multiPart, multiPart.getMediaType()); + return request.post(entity); + + } +} diff --git a/concordion/src/test/java/nl/knaw/huc/textrepo/task/TestIndexFilesByIndexName.java b/concordion/src/test/java/nl/knaw/huc/textrepo/task/TestIndexFilesByIndexName.java index e152ce68..ebfb3149 100644 --- a/concordion/src/test/java/nl/knaw/huc/textrepo/task/TestIndexFilesByIndexName.java +++ b/concordion/src/test/java/nl/knaw/huc/textrepo/task/TestIndexFilesByIndexName.java @@ -65,7 +65,7 @@ public ImportResult importDocs(String fileType) { var result = new ImportResult(); result.status = results.stream().map(String::valueOf).collect(Collectors.joining(", ")); - result.body = asCodeBlock(body.equals("") ? " " : body); + result.body = asPrettyJson(body.equals("") ? " " : body); return result; } diff --git a/concordion/src/test/java/nl/knaw/huc/textrepo/task/TestIndexFilesByType.java b/concordion/src/test/java/nl/knaw/huc/textrepo/task/TestIndexFilesByType.java index fe665afd..acd75b0e 100644 --- a/concordion/src/test/java/nl/knaw/huc/textrepo/task/TestIndexFilesByType.java +++ b/concordion/src/test/java/nl/knaw/huc/textrepo/task/TestIndexFilesByType.java @@ -64,7 +64,7 @@ public ImportResult importDocs(String fileType) { var result = new ImportResult(); result.status = results.stream().map(String::valueOf).collect(Collectors.joining(", ")); - result.body = asCodeBlock(body.equals("") ? " " : body); + result.body = asPrettyJson(body.equals("") ? " " : body); return result; } diff --git a/concordion/src/test/java/nl/knaw/huc/textrepo/util/TestUtils.java b/concordion/src/test/java/nl/knaw/huc/textrepo/util/TestUtils.java index 767913e5..f7fd0d00 100644 --- a/concordion/src/test/java/nl/knaw/huc/textrepo/util/TestUtils.java +++ b/concordion/src/test/java/nl/knaw/huc/textrepo/util/TestUtils.java @@ -2,12 +2,8 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import org.apache.commons.text.StringSubstitutor; +import org.apache.commons.text.StringEscapeUtils; import org.glassfish.jersey.client.JerseyClientBuilder; -import org.glassfish.jersey.media.multipart.FormDataBodyPart; -import org.glassfish.jersey.media.multipart.FormDataContentDisposition; -import org.glassfish.jersey.media.multipart.FormDataMultiPart; -import org.glassfish.jersey.media.multipart.MultiPartFeature; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -16,18 +12,12 @@ import javax.ws.rs.core.UriBuilder; import java.net.URI; import java.net.URISyntaxException; -import java.net.URL; import java.util.Map; -import java.util.Optional; import java.util.UUID; -import java.util.regex.Pattern; import static java.lang.String.format; import static java.util.concurrent.TimeUnit.MILLISECONDS; -import static javax.ws.rs.client.Entity.entity; -import static javax.ws.rs.core.MediaType.APPLICATION_OCTET_STREAM_TYPE; import static nl.knaw.huc.textrepo.Config.HOST; -import static nl.knaw.huc.textrepo.Config.TEXT_TYPE; public class TestUtils { @@ -99,4 +89,7 @@ public static URI replaceInUrlAndQueryParams(Object endpoint, Map