package nl.ipo.cds.metadata;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.nio.file.Files;
import java.util.Set;
import nl.ipo.cds.domain.MetadataDocumentType;
import nl.ipo.cds.metadata.MetadataManager;
import nl.ipo.cds.metadata.XMLRewriter;
import org.apache.axiom.attachments.utils.IOUtils;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.fail;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
public class MetadataManagerTest {
static File tempDir;
static MetadataManager manager;
@BeforeClass
public static void setUp() throws Exception {
tempDir = Files.createTempDirectory("MetadataManagerTest").toFile();
manager = new MetadataManager(tempDir);
}
@AfterClass
public static void deleteTempDir() {
tempDir.delete();
}
@After
public void cleanUpTempDir() {
for(File f : tempDir.listFiles()) {
if(!f.delete()) {
fail("cleanup failed");
}
}
}
private InputStream getInputStream(String documentName) throws Exception {
return getClass().getClassLoader().getResourceAsStream("nl/ipo/cds/metadata/" + documentName);
}
private XMLRewriter getRewriter(String documentName) throws Exception {
InputStream inputStream = getInputStream(documentName);
assertNotNull(inputStream);
XMLRewriter rewriter = manager.createRewriter(inputStream);
assertNotNull(rewriter);
return rewriter;
}
@Test
public void testUpdate() throws Exception {
manager.updateDatasetMetadata(getRewriter("protectedSites.xml"), "");
manager.updateServiceMetadata(getRewriter("protectedSitesView.xml"), "");
}
@Test
public void testStore() throws Exception {
String documentName = "protectedSites.xml";
File f = new File(tempDir, documentName);
assertFalse(f.exists());
manager.storeDocument(documentName, IOUtils.getStreamAsByteArray(getInputStream(documentName)));
assertTrue(f.exists());
}
@Test
public void testList() throws Exception {
String documentName = "protectedSites.xml";
Set<String> documentNames = manager.listDocuments();
assertNotNull(documentNames);
assertTrue(documentNames.isEmpty());
File f = new File(tempDir, documentName);
assertTrue(f.createNewFile());
documentNames = manager.listDocuments();
assertNotNull(documentNames);
assertEquals(1, documentNames.size());
assertTrue(documentNames.contains(documentName));
}
@Test
public void testDelete() throws Exception {
String documentName = "protectedSites.xml";
File f = new File(tempDir, documentName);
assertTrue(f.createNewFile());
Set<String> documentNames = manager.listDocuments();
assertNotNull(documentNames);
assertEquals(1, documentNames.size());
assertTrue(documentNames.contains(documentName));
manager.deleteDocument(documentName);
documentNames = manager.listDocuments();
assertNotNull(documentNames);
assertTrue(documentNames.isEmpty());
}
@Test
public void testRetrieve() throws Exception {
String documentName = "protectedSites.xml";
File f = new File(tempDir, documentName);
FileOutputStream fos = new FileOutputStream(f);
fos.write(42);
fos.close();
byte[] content = manager.retrieveDocument(documentName);
assertNotNull(content);
assertEquals(1, content.length);
assertEquals(42, content[0]);
}
@Test
public void testValidateNotWellFormed() throws UnsupportedEncodingException {
ValidationResult result = manager.validateDocument("<xml>/xml>".getBytes("utf-8"), MetadataDocumentType.DATASET);
assertNotNull(result);
assertEquals(ValidationResult.NOT_WELL_FORMED, result);
}
@Test
public void testValidateSchemaViolation() throws Exception {
InputStream inputStream = getInputStream("protectedSitesSchemaViolation.xml");
assertNotNull(inputStream);
ValidationResult result = manager.validateDocument(IOUtils.getStreamAsByteArray(inputStream), MetadataDocumentType.DATASET);
assertNotNull(result);
assertEquals(ValidationResult.SCHEMA_VIOLATION, result);
}
@Test
public void testValidateGmd() throws Exception {
InputStream inputStream = getInputStream("protectedSites.xml");
assertNotNull(inputStream);
ValidationResult result = manager.validateDocument(IOUtils.getStreamAsByteArray(inputStream), MetadataDocumentType.DATASET);
assertNotNull(result);
assertEquals(ValidationResult.VALID, result);
}
@Test
public void testValidateSrv() throws Exception {
InputStream inputStream = getInputStream("protectedSitesView.xml");
assertNotNull(inputStream);
ValidationResult result = manager.validateDocument(IOUtils.getStreamAsByteArray(inputStream), MetadataDocumentType.SERVICE);
assertNotNull(result);
assertEquals(ValidationResult.VALID, result);
}
@Test
public void testValidateDatePathMissing() throws Exception {
InputStream inputStream = getInputStream("protectedSitesDateMissing.xml");
assertNotNull(inputStream);
ValidationResult result = manager.validateDocument(IOUtils.getStreamAsByteArray(inputStream), MetadataDocumentType.DATASET);
assertNotNull(result);
assertEquals(ValidationResult.DATE_PATH_MISSING, result);
}
}