From 67a2f50d85d3c241c5f28c0b87338e4731782574 Mon Sep 17 00:00:00 2001 From: Oliver Bertuch Date: Wed, 28 Jul 2021 16:01:01 +0200 Subject: [PATCH] refactor(export): cleanup DDIExporterTest, convert to JUnit 5, make atomic - Test testCitation() has been removed as obsolete, due to the existance of DataCitationTest by @pkiraly - Test testExportDataset() has been changed to actually do an export and now checks for invalid XML as output. It prints a severe warning as the produced DDI Codebook is not valid according to DDI Codebook 2.5 XSD. - The test cases are now atomic by moving to JUnit 5 and setting up lots of mocks (BrandingUtil, SettingsService) IQSS/dataverse#3648 --- .../iq/dataverse/export/DDIExporterTest.java | 222 +++++++++--------- 1 file changed, 109 insertions(+), 113 deletions(-) diff --git a/src/test/java/edu/harvard/iq/dataverse/export/DDIExporterTest.java b/src/test/java/edu/harvard/iq/dataverse/export/DDIExporterTest.java index 3a5ef60a0e4..7fe4df5d49b 100644 --- a/src/test/java/edu/harvard/iq/dataverse/export/DDIExporterTest.java +++ b/src/test/java/edu/harvard/iq/dataverse/export/DDIExporterTest.java @@ -1,40 +1,120 @@ package edu.harvard.iq.dataverse.export; +import com.google.gson.Gson; import edu.harvard.iq.dataverse.ControlledVocabularyValue; -import edu.harvard.iq.dataverse.Dataset; import edu.harvard.iq.dataverse.DatasetFieldType; import edu.harvard.iq.dataverse.DatasetFieldType.FieldType; +import edu.harvard.iq.dataverse.branding.BrandingUtilTest; +import edu.harvard.iq.dataverse.export.ddi.DdiExportUtil; import edu.harvard.iq.dataverse.mocks.MockDatasetFieldSvc; import edu.harvard.iq.dataverse.DatasetVersion; -import edu.harvard.iq.dataverse.Dataverse; +import edu.harvard.iq.dataverse.settings.SettingsServiceBean; +import edu.harvard.iq.dataverse.util.json.JsonParseException; import edu.harvard.iq.dataverse.util.json.JsonParser; import edu.harvard.iq.dataverse.util.xml.XmlPrinter; import java.io.ByteArrayOutputStream; import java.io.File; +import java.io.IOException; import java.io.StringReader; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; +import java.nio.file.Path; import java.nio.file.Paths; -import java.time.Year; import java.util.Arrays; import java.util.HashSet; import java.util.Set; +import java.util.logging.Logger; import javax.json.Json; import javax.json.JsonObject; import javax.json.JsonReader; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; -import org.junit.Before; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.xmlunit.assertj3.XmlAssert; public class DDIExporterTest { - MockDatasetFieldSvc datasetFieldTypeSvc = null; + private static final Logger logger = Logger.getLogger(DDIExporterTest.class.getCanonicalName()); + private static final SettingsServiceBean settingsService = Mockito.mock(SettingsServiceBean.class); + private static final MockDatasetFieldSvc datasetFieldTypeSvc = new MockDatasetFieldSvc(); + private static final Gson gson = new Gson(); + + /* + * Setup and teardown mocks for BrandingUtil for atomicity. + * Setup the mocked DatasetFieldSvc + * Setup and teardown the mocked SettingsServiceBean + */ + @BeforeAll + private static void setUpAll() { + BrandingUtilTest.setupMocks(); + mockDatasetFieldSvc(); + DdiExportUtil.injectSettingsService(settingsService); + } + @AfterAll + private static void tearDownAll() { + BrandingUtilTest.tearDownMocks(); + DdiExportUtil.injectSettingsService(null); + } + + @Test + public void testExportDataset() throws JsonParseException, IOException, ExportException { + //given + String datasetDtoJsonString = Files.readString(Path.of("src/test/java/edu/harvard/iq/dataverse/export/ddi/dataset-finch1.json"), StandardCharsets.UTF_8); + + JsonObject datasetDtoJson = Json.createReader(new StringReader(datasetDtoJsonString)).readObject(); + DatasetVersion datasetVersion = gson.fromJson(datasetDtoJson.getJsonObject("datasetVersion").toString(), DatasetVersion.class); + + //when + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + new DDIExporter().exportDataset(datasetVersion, datasetDtoJson, byteArrayOutputStream); + + // then + String xml = XmlPrinter.prettyPrintXml(byteArrayOutputStream.toString(StandardCharsets.UTF_8)); + XmlAssert.assertThat(xml).isInvalid(); + logger.severe("DDIExporterTest.testExportDataset() creates XML but it's invalid. Fixing in DDIExportUtil required."); + } + + @Test + public void testExportDatasetContactEmailPresent() throws Exception { + File datasetVersionJson = new File("src/test/java/edu/harvard/iq/dataverse/export/ddi/datasetContactEmailPresent.json"); + String datasetVersionAsJson = new String(Files.readAllBytes(Paths.get(datasetVersionJson.getAbsolutePath()))); + + JsonReader jsonReader = Json.createReader(new StringReader(datasetVersionAsJson)); + JsonObject json = jsonReader.readObject(); + JsonParser jsonParser = new JsonParser(datasetFieldTypeSvc, null, null); + DatasetVersion version = jsonParser.parseDatasetVersion(json.getJsonObject("datasetVersion")); + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + DDIExporter instance = new DDIExporter(); + instance.exportDataset(version, json, byteArrayOutputStream); + + logger.fine(XmlPrinter.prettyPrintXml(byteArrayOutputStream.toString())); + assertTrue(byteArrayOutputStream.toString().contains("finch@mailinator.com")); + + } - @Before - public void setUp() { - datasetFieldTypeSvc = new MockDatasetFieldSvc(); + @Test + public void testExportDatasetContactEmailAbsent() throws Exception { + File datasetVersionJson = new File("src/test/java/edu/harvard/iq/dataverse/export/ddi/datasetContactEmailAbsent.json"); + String datasetVersionAsJson = new String(Files.readAllBytes(Paths.get(datasetVersionJson.getAbsolutePath()))); + JsonReader jsonReader = Json.createReader(new StringReader(datasetVersionAsJson)); + JsonObject json = jsonReader.readObject(); +// JsonParser jsonParser = new JsonParser(datasetFieldTypeSvc, null, settingsSvc); + JsonParser jsonParser = new JsonParser(datasetFieldTypeSvc, null, null); + DatasetVersion version = jsonParser.parseDatasetVersion(json.getJsonObject("datasetVersion")); + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + DDIExporter instance = new DDIExporter(); + instance.exportDataset(version, json, byteArrayOutputStream); + + logger.fine(XmlPrinter.prettyPrintXml(byteArrayOutputStream.toString())); + assertFalse(byteArrayOutputStream.toString().contains("finch@mailinator.com")); + + } + + private static void mockDatasetFieldSvc() { DatasetFieldType titleType = datasetFieldTypeSvc.add(new DatasetFieldType("title", FieldType.TEXTBOX, false)); DatasetFieldType authorType = datasetFieldTypeSvc.add(new DatasetFieldType("author", FieldType.TEXT, true)); Set authorChildTypes = new HashSet<>(); @@ -44,17 +124,17 @@ public void setUp() { DatasetFieldType authorIdentifierSchemeType = datasetFieldTypeSvc.add(new DatasetFieldType("authorIdentifierScheme", FieldType.TEXT, false)); authorIdentifierSchemeType.setAllowControlledVocabulary(true); authorIdentifierSchemeType.setControlledVocabularyValues(Arrays.asList( - // Why aren't these enforced? Should be ORCID, etc. - new ControlledVocabularyValue(1l, "ark", authorIdentifierSchemeType), - new ControlledVocabularyValue(2l, "doi", authorIdentifierSchemeType), - new ControlledVocabularyValue(3l, "url", authorIdentifierSchemeType) + // Why aren't these enforced? Should be ORCID, etc. + new ControlledVocabularyValue(1l, "ark", authorIdentifierSchemeType), + new ControlledVocabularyValue(2l, "doi", authorIdentifierSchemeType), + new ControlledVocabularyValue(3l, "url", authorIdentifierSchemeType) )); authorChildTypes.add(datasetFieldTypeSvc.add(authorIdentifierSchemeType)); for (DatasetFieldType t : authorChildTypes) { t.setParentDatasetFieldType(authorType); } authorType.setChildDatasetFieldTypes(authorChildTypes); - + DatasetFieldType datasetContactType = datasetFieldTypeSvc.add(new DatasetFieldType("datasetContact", FieldType.TEXT, true)); Set datasetContactTypes = new HashSet<>(); datasetContactTypes.add(datasetFieldTypeSvc.add(new DatasetFieldType("datasetContactEmail", FieldType.TEXT, false))); @@ -64,7 +144,7 @@ public void setUp() { t.setParentDatasetFieldType(datasetContactType); } datasetContactType.setChildDatasetFieldTypes(datasetContactTypes); - + DatasetFieldType dsDescriptionType = datasetFieldTypeSvc.add(new DatasetFieldType("dsDescription", FieldType.TEXT, true)); Set dsDescriptionTypes = new HashSet<>(); dsDescriptionTypes.add(datasetFieldTypeSvc.add(new DatasetFieldType("dsDescriptionValue", FieldType.TEXT, false))); @@ -72,118 +152,34 @@ public void setUp() { t.setParentDatasetFieldType(dsDescriptionType); } dsDescriptionType.setChildDatasetFieldTypes(dsDescriptionTypes); - + DatasetFieldType keywordType = datasetFieldTypeSvc.add(new DatasetFieldType("keyword", DatasetFieldType.FieldType.TEXT, true)); DatasetFieldType descriptionType = datasetFieldTypeSvc.add(new DatasetFieldType("description", DatasetFieldType.FieldType.TEXTBOX, false)); - + DatasetFieldType subjectType = datasetFieldTypeSvc.add(new DatasetFieldType("subject", DatasetFieldType.FieldType.TEXT, true)); subjectType.setAllowControlledVocabulary(true); subjectType.setControlledVocabularyValues(Arrays.asList( - new ControlledVocabularyValue(1l, "mgmt", subjectType), - new ControlledVocabularyValue(2l, "law", subjectType), - new ControlledVocabularyValue(3l, "cs", subjectType) + new ControlledVocabularyValue(1l, "mgmt", subjectType), + new ControlledVocabularyValue(2l, "law", subjectType), + new ControlledVocabularyValue(3l, "cs", subjectType) )); - + DatasetFieldType pubIdType = datasetFieldTypeSvc.add(new DatasetFieldType("publicationIdType", DatasetFieldType.FieldType.TEXT, false)); pubIdType.setAllowControlledVocabulary(true); pubIdType.setControlledVocabularyValues(Arrays.asList( - new ControlledVocabularyValue(1l, "ark", pubIdType), - new ControlledVocabularyValue(2l, "doi", pubIdType), - new ControlledVocabularyValue(3l, "url", pubIdType) + new ControlledVocabularyValue(1l, "ark", pubIdType), + new ControlledVocabularyValue(2l, "doi", pubIdType), + new ControlledVocabularyValue(3l, "url", pubIdType) )); - + DatasetFieldType compoundSingleType = datasetFieldTypeSvc.add(new DatasetFieldType("coordinate", DatasetFieldType.FieldType.TEXT, true)); Set childTypes = new HashSet<>(); childTypes.add(datasetFieldTypeSvc.add(new DatasetFieldType("lat", DatasetFieldType.FieldType.TEXT, false))); childTypes.add(datasetFieldTypeSvc.add(new DatasetFieldType("lon", DatasetFieldType.FieldType.TEXT, false))); - + for (DatasetFieldType t : childTypes) { t.setParentDatasetFieldType(compoundSingleType); } compoundSingleType.setChildDatasetFieldTypes(childTypes); } - - @Test - public void testExportDataset() throws Exception { - System.out.println("exportDataset"); - - // FIXME: switch ddi/dataset-finch1.json - //File datasetVersionJson = new File("src/test/java/edu/harvard/iq/dataverse/export/ddi/dataset-finch1.json"); - File datasetVersionJson = new File("src/test/resources/json/dataset-finch1.json"); - String datasetVersionAsJson = new String(Files.readAllBytes(Paths.get(datasetVersionJson.getAbsolutePath()))); - - JsonReader jsonReader = Json.createReader(new StringReader(datasetVersionAsJson)); - JsonObject json = jsonReader.readObject(); - JsonParser jsonParser = new JsonParser(datasetFieldTypeSvc, null, null); - DatasetVersion version = jsonParser.parseDatasetVersion(json.getJsonObject("datasetVersion")); - - ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); - DDIExporter instance = new DDIExporter(); - boolean nullPointerFixed = false; - if (nullPointerFixed) { - instance.exportDataset(version, json, byteArrayOutputStream); - } - - System.out.println("out: " + XmlPrinter.prettyPrintXml(byteArrayOutputStream.toString())); - - } - - @Test - public void testCitation() throws Exception { - System.out.println("testCitation"); - - File datasetVersionJson = new File("src/test/resources/json/dataset-finch1.json"); - String datasetVersionAsJson = new String(Files.readAllBytes(Paths.get(datasetVersionJson.getAbsolutePath()))); - - JsonReader jsonReader = Json.createReader(new StringReader(datasetVersionAsJson)); - JsonObject json = jsonReader.readObject(); - JsonParser jsonParser = new JsonParser(datasetFieldTypeSvc, null, null); - DatasetVersion version = jsonParser.parseDatasetVersion(json.getJsonObject("datasetVersion")); - version.setVersionState(DatasetVersion.VersionState.DRAFT); - Dataset dataset = new Dataset(); - version.setDataset(dataset); - dataset.setOwner(new Dataverse()); - String citation = version.getCitation(); - System.out.println("citation: " + citation); - int currentYear = Year.now().getValue(); - assertEquals("Finch, Fiona, " + currentYear + ", \"Darwin's Finches\", LibraScholar, DRAFT VERSION", citation); - } - - @Test - public void testExportDatasetContactEmailPresent() throws Exception { - File datasetVersionJson = new File("src/test/java/edu/harvard/iq/dataverse/export/ddi/datasetContactEmailPresent.json"); - String datasetVersionAsJson = new String(Files.readAllBytes(Paths.get(datasetVersionJson.getAbsolutePath()))); - - JsonReader jsonReader = Json.createReader(new StringReader(datasetVersionAsJson)); - JsonObject json = jsonReader.readObject(); - JsonParser jsonParser = new JsonParser(datasetFieldTypeSvc, null, null); - DatasetVersion version = jsonParser.parseDatasetVersion(json.getJsonObject("datasetVersion")); - ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); - DDIExporter instance = new DDIExporter(); - instance.exportDataset(version, json, byteArrayOutputStream); - - System.out.println(XmlPrinter.prettyPrintXml(byteArrayOutputStream.toString())); - assertTrue(byteArrayOutputStream.toString().contains("finch@mailinator.com")); - - } - - @Test - public void testExportDatasetContactEmailAbsent() throws Exception { - File datasetVersionJson = new File("src/test/java/edu/harvard/iq/dataverse/export/ddi/datasetContactEmailAbsent.json"); - String datasetVersionAsJson = new String(Files.readAllBytes(Paths.get(datasetVersionJson.getAbsolutePath()))); - - JsonReader jsonReader = Json.createReader(new StringReader(datasetVersionAsJson)); - JsonObject json = jsonReader.readObject(); -// JsonParser jsonParser = new JsonParser(datasetFieldTypeSvc, null, settingsSvc); - JsonParser jsonParser = new JsonParser(datasetFieldTypeSvc, null, null); - DatasetVersion version = jsonParser.parseDatasetVersion(json.getJsonObject("datasetVersion")); - ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); - DDIExporter instance = new DDIExporter(); - instance.exportDataset(version, json, byteArrayOutputStream); - - System.out.println(XmlPrinter.prettyPrintXml(byteArrayOutputStream.toString())); - assertFalse(byteArrayOutputStream.toString().contains("finch@mailinator.com")); - - } - }