package no.met.metadataeditor.datastore;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.List;
import no.met.metadataeditor.EditorException;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import com.googlecode.sardine.Sardine;
import com.googlecode.sardine.SardineFactory;
/**
* These test depend on a WebDAV server being available and configured in the
* properties file.
*
* @author oysteint
*
*/
public class WebDAVDataStoreTest {
private static Sardine webdavConn;
private static String webdavHost = "dev-vm087/svn/unittest";
private static String webdavProtocol = "http";
private static final String WEBDAV_USERNAME = "dummy";
private static final String WEBDAV_PASSWORD = "xxx";
@BeforeClass
public static void setupWebDAV () throws IOException {
webdavConn = SardineFactory.begin(WEBDAV_USERNAME, WEBDAV_PASSWORD);
// create the structure in the WebDAV required for the tests.
webdavConn.createDirectory( webdavPath("project1" ) );
webdavConn.createDirectory(webdavPath("project1", "config"));
webdavConn.createDirectory(webdavPath("project1", "XML"));
webdavConn.createDirectory(webdavPath("project1", "resources"));
webdavConn.put(webdavPath("project1", "XML", "record1.xml"), "<metadata />".getBytes() );
String isoMetadata = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
isoMetadata += "<gmd:MD_Metadata xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:gmd=\"http://www.isotc211.org/2005/gmd\" ";
isoMetadata += "xmlns:dif=\"http://gcmd.gsfc.nasa.gov/Aboutus/xml/dif/\" xmlns:gco=\"http://www.isotc211.org/2005/gco\" ";
isoMetadata += "xsi:schemaLocation=\"http://www.isotc211.org/2005/gmd http://www.isotc211.org/2005/gmd/gmd.xsd\">";
isoMetadata += "</gmd:MD_Metadata>";
webdavConn.put(webdavPath("project1", "XML", "iso1.xml"), isoMetadata.getBytes() );
String mm2Metadata = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
mm2Metadata += "<MM2 xmlns=\"http://www.met.no/schema/metamod/MM2\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" ";
mm2Metadata += "xsi:schemaLocation=\"http://www.met.no/schema/metamod/MM2 https://wiki.met.no/_media/metamod/mm2.xsd\">";
mm2Metadata += "</MM2>";
webdavConn.put(webdavPath("project1", "XML", "mm2_1.xml"), mm2Metadata.getBytes() );
InputStream setup = DataStoreUtilsTest.class.getResourceAsStream("/datastore/diskdatastore/testProject/config/setup.xml");
webdavConn.put(webdavPath("project1", "config", "setup.xml"), setup);
webdavConn.put(webdavPath("project1", "config", "MM2Editor.xml"), "Editor config".getBytes() );
webdavConn.put(webdavPath("project1", "config", "MM2Template.xml"), "Template contents".getBytes() );
webdavConn.put(webdavPath("project1", "resources", "resource1.txt"), "Resource contents".getBytes() );
}
@AfterClass
public static void teardownWebDAV() throws IOException {
webdavConn.delete( webdavPath("project1"));
}
@Test
public void testMetadataExists() {
WebDAVDataStore datastore = getDataStore();
assertFalse("Non-existant record in non-existant project does not exist", datastore.metadataExists("test") );
assertFalse("Non-existant record in existant project", datastore.metadataExists("dummy"));
assertTrue("Existant record in existant project", datastore.metadataExists("record1"));
}
@Test
public void testSupportedFormatsExist() {
WebDAVDataStore datastore = getDataStore();
List<SupportedFormat> formats = datastore.getSupportedFormats();
assertEquals(4, formats.size());
}
@Test(expected=EditorException.class)
public void testReadMetadataNoRecord(){
WebDAVDataStore datastore = getDataStore();
datastore.readMetadata("dummy");
}
@Test
public void testReadMetadata() {
WebDAVDataStore datastore = getDataStore();
assertEquals("Metadata content as expected", "<metadata />", datastore.readMetadata("record1"));
}
@Test(expected=EditorException.class)
public void testReadTemplateNoRecord() {
WebDAVDataStore datastore = getDataStore();
datastore.readTemplate("dummy");
}
@Test(expected=EditorException.class)
public void testReadTemplateUnsupportedFormat() {
WebDAVDataStore datastore = getDataStore();
datastore.readTemplate("record1");
}
@Test(expected=EditorException.class)
public void testReadTemplateNoTemplate() {
WebDAVDataStore datastore = getDataStore();
datastore.readTemplate("iso1");
}
@Test
public void testReadTemplate() {
WebDAVDataStore datastore = getDataStore();
assertEquals("Template for MM2 file", "Template contents", datastore.readTemplate("mm2_1"));
}
@Test(expected=EditorException.class)
public void testReadTemplateForFormatUnsupportedFormat() {
WebDAVDataStore datastore = getDataStore();
datastore.readTemplate(new SupportedFormat("dummy", "", "", null));
}
@Test(expected=EditorException.class)
public void testReadTemplateForFormatNoTemplate() {
WebDAVDataStore datastore = getDataStore();
datastore.readTemplate(new SupportedFormat("MM2COMBINED", "mmCombinedMM2", "http://www.met.no/schema/metamod/mmCombined", null));
}
@Test
public void testReadTemplateForFormat() {
WebDAVDataStore datastore = getDataStore();
assertEquals("Template for MM2 file", "Template contents", datastore.readTemplate(new SupportedFormat("MM2", "MM2", "http://www.met.no/schema/metamod/MM2", null)));
}
@Test(expected=EditorException.class)
public void testReadConfigurationNoRecord() {
WebDAVDataStore datastore = getDataStore();
datastore.readEditorConfiguration("dummy");
}
@Test(expected=EditorException.class)
public void testReadConfigurationUnsupportedFormat() {
WebDAVDataStore datastore = getDataStore();
datastore.readTemplate("record1");
}
@Test(expected=EditorException.class)
public void testReadConfigurationNoTemplate() {
WebDAVDataStore datastore = getDataStore();
datastore.readEditorConfiguration("iso1");
}
@Test
public void testReadConfiguration() {
WebDAVDataStore datastore = getDataStore();
assertEquals("Editor configuration for MM2 file", "Editor config", datastore.readEditorConfiguration("mm2_1"));
}
@Test(expected=EditorException.class)
public void testReadNonExistantResource() {
WebDAVDataStore datastore = getDataStore();
datastore.readResource("dummyResource");
}
@Test
public void testReadResource() {
WebDAVDataStore datastore = getDataStore();
assertEquals("Resource content", "Resource contents", datastore.readResource("resource1.txt"));
}
@Test
public void testWriteMetadata() throws IOException{
WebDAVDataStore datastore = getDataStore();
datastore.writeMetadata("write1", "Some xml", WEBDAV_USERNAME, WEBDAV_PASSWORD);
assertEquals("Data read is same as written", "Some xml", datastore.readMetadata("write1"));
// remove the created file to prevent problems in testAvailableMetadata()
webdavConn.delete( webdavPath("project1/XML/write1.xml"));
}
@Test
public void testUserHasWriteAccess(){
WebDAVDataStore datastore = getDataStore();
assertFalse("Unknown user does not have write access", datastore.userHasWriteAccess("unknown", "dummy"));
assertFalse("Wrong password does not give write access", datastore.userHasWriteAccess(WEBDAV_USERNAME, "asdfadsfasfdfsa"));
assertTrue("Correct username and password gives write access", datastore.userHasWriteAccess(WEBDAV_USERNAME, WEBDAV_PASSWORD));
}
@Test
public void testAvailableMetadata(){
WebDAVDataStore datastore = getDataStore();
List<String> expected = Arrays.asList("iso1", "mm2_1", "record1" );
assertEquals("Available metadata found as expected", expected, datastore.availableMetadata());
}
@Test
public void testDeleteMetadata(){
WebDAVDataStore datastore = getDataStore();
String id = "a-new-record-to-delete";
datastore.writeMetadata(id, "<MM2/>", WEBDAV_USERNAME, WEBDAV_PASSWORD);
assertTrue("New metadata record created", datastore.metadataExists(id));
assertTrue("Delete returns true on delete", datastore.deleteMetadata(id, WEBDAV_USERNAME, WEBDAV_PASSWORD));
assertFalse("New metadata record deleted", datastore.metadataExists(id));
}
private static String webdavPath(String... paths){
File fullPath = new File(webdavHost);
for( int i = 0; i < paths.length; i++ ){
fullPath = new File(fullPath, paths[i]);
}
return webdavProtocol + "://" + fullPath.toString();
}
private WebDAVDataStore getDataStore(){
return new WebDAVDataStore(webdavProtocol, webdavHost + "/project1", WEBDAV_USERNAME, WEBDAV_PASSWORD);
}
}