package edu.ucsb.nceas.osti_elink; import edu.ucsb.nceas.osti_elink.v1.OSTIService; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.junit.Before; import org.junit.Test; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.util.Properties; /** * Test the OSTIElinkService class * @author tao * */ public class OSTIServiceV1Test { public static final String PASSWORD_FILE_PROP_NAME = "ostiService.passwordFilePath"; private static OSTIElinkService ostiService = null; private static String username = ""; private static String password = ""; public static final String BASEURL = "https://www.osti.gov/elinktest/2416api"; protected static Log log = LogFactory.getLog(OSTIServiceV1Test.class); @Before public void setUp() throws Exception { try (InputStream is = getClass().getClassLoader().getResourceAsStream("test.properties")) { Properties prop = new Properties(); prop.load(is); String passwordFile = prop.getProperty(PASSWORD_FILE_PROP_NAME); try (InputStream passwordStream = new FileInputStream(new File(passwordFile))) { Properties passwordProp = new Properties(); passwordProp.load(passwordStream); username = passwordProp.getProperty(OSTIElinkClient.USER_NAME_PROPERTY); password = passwordProp.getProperty(OSTIElinkClient.PASSWORD_PROPERTY); } } ostiService = new OSTIService(username, password, BASEURL); } /** * Test the buildMinimalMetadata method * @throws Exception */ @Test public void testBuildMinimalMetadata() throws Exception { String result = ostiService.buildMinimalMetadata("KNB"); assertTrue(result.contains("")); assertTrue(result.contains("")); assertTrue(result.contains("KNB")); //The default one will be ess-dive result = ostiService.buildMinimalMetadata(null); assertTrue(result.contains("")); assertTrue(result.contains("")); assertTrue(result.contains("ESS-DIVE")); result = ostiService.buildMinimalMetadata("ESS-DIVE"); assertTrue(result.contains("")); assertTrue(result.contains("")); assertTrue(result.contains("ESS-DIVE")); result = ostiService.buildMinimalMetadata("KNB"); assertTrue(result.contains("")); assertTrue(result.contains("")); assertTrue(result.contains("KNB")); } /** * Test the mintIdentifier method * @throws Exception */ @Test public void testMintIdentifier() throws Exception { String identifier = ostiService.mintIdentifier(null); assertTrue(identifier.startsWith("doi:10.")); identifier = ostiService.removeDOI(identifier); String metadata = ostiService.getMetadata(identifier); assertTrue(metadata.contains(identifier)); try { identifier = ostiService.mintIdentifier("KNB"); fail("The test can't get here"); } catch (Exception e) { assertTrue(e instanceof OSTIElinkException); } } /** * Test the getMetadata method * @throws Exception */ @Test public void testGetMetadata() throws Exception { String doi = "10.15485/1523924"; String metadata = ostiService.getMetadata(doi); assertTrue(metadata.contains(doi)); String doiWithPrefix = "doi:" + doi; metadata = ostiService.getMetadata(doiWithPrefix); assertTrue(metadata.contains(doi)); try { String doi2 = "11.15df485/1523924"; metadata = ostiService.getMetadata(doi2); fail("The test can't get here"); } catch (Exception e) { //e.printStackTrace(); assertTrue(e instanceof OSTIElinkNotFoundException); } try { String doi3 = "doi"; metadata = ostiService.getMetadata(doi3); fail("The test can't get here"); } catch (Exception e) { //e.printStackTrace(); assertTrue(e instanceof OSTIElinkNotFoundException); } try { String doi5 = "doi:11.15df485/1523924"; metadata = ostiService.getMetadata(doi5); fail("The test can't get here"); } catch (Exception e) { //e.printStackTrace(); assertTrue(e instanceof OSTIElinkNotFoundException); } try { String doi6 = "1523924"; metadata = ostiService.getMetadata(doi6); fail("The test can't get here"); } catch (Exception e) { //e.printStackTrace(); assertTrue(e instanceof OSTIElinkNotFoundException); } } /** * Test the getMetadataFromOstiId method * @throws Exception */ @Test public void testGetMetadataFromOstiId() throws Exception { String ostiId = "1523924"; String metadata = ostiService.getMetadataFromOstiId(ostiId); assertTrue(metadata.contains(ostiId)); try { String ostiId2 = "1567894851523924"; metadata = ostiService.getMetadataFromOstiId(ostiId2); fail("The test can't get here"); } catch (Exception e) { //e.printStackTrace(); assertTrue(e instanceof OSTIElinkNotFoundException); } try { String doi5 = "doi:11.15df485/1523924"; metadata = ostiService.getMetadataFromOstiId(doi5); fail("The test can't get here"); } catch (Exception e) { //e.printStackTrace(); assertTrue(e instanceof OSTIElinkException); } try { String doi5 = "10.15485/1523924"; metadata = ostiService.getMetadataFromOstiId(doi5); fail("The test can't get here"); } catch (Exception e) { //e.printStackTrace(); assertTrue(e instanceof OSTIElinkException); } } /** * Test the getOstiId method * @throws Exception */ @Test public void testGetOstiId() throws Exception { String prefix = "10.15485"; String doi = "10.15485/1523924"; String ostiId = ostiService.getOstiId(doi, prefix); assertTrue(ostiId.equals("1523924")); prefix = "10.15485"; doi = "doi:10.15485/1523924"; ostiId = ostiService.getOstiId(doi, prefix); assertTrue(ostiId.equals("1523924")); prefix = "10.15485/"; doi = "10.15485/1523924"; ostiId = ostiService.getOstiId(doi, prefix); assertTrue(ostiId.equals("1523924")); prefix = "10.15485/"; doi = "doi:10.15485/1523924"; ostiId = ostiService.getOstiId(doi, prefix); assertTrue(ostiId.equals("1523924")); prefix = "doi:10.15485"; doi = "10.15485/1523924"; ostiId = ostiService.getOstiId(doi, prefix); assertTrue(ostiId.equals("1523924")); prefix = "doi:10.15485"; doi = "doi:10.15485/1523924"; ostiId = ostiService.getOstiId(doi, prefix); assertTrue(ostiId.equals("1523924")); prefix = "doi:10.15485/"; doi = "10.15485/1523924"; ostiId = ostiService.getOstiId(doi, prefix); assertTrue(ostiId.equals("1523924")); prefix = "doi:10.15485/"; doi = "10.15485/1523924"; ostiId = ostiService.getOstiId(doi, prefix); assertTrue(ostiId.equals("1523924")); prefix = null; doi = "10.15485/1523924"; ostiId = ostiService.getOstiId(doi, prefix); assertTrue(ostiId.equals("1523924")); doi = "doi:10.15485/1523924"; ostiId = ostiService.getOstiId(doi, prefix); assertTrue(ostiId.equals("1523924")); doi = "11.15df485/1523924"; try { ostiId = ostiService.getOstiId(doi, prefix); fail("The test can't get here"); } catch (Exception e) { //e.printStackTrace(); assertTrue(e instanceof OSTIElinkNotFoundException); } doi = "doi:11.15df485/1523924"; try { ostiId = ostiService.getOstiId(doi, prefix); fail("The test can't get here"); } catch (Exception e) { //e.printStackTrace(); assertTrue(e instanceof OSTIElinkNotFoundException); } prefix = "doi:10.15485/"; doi = "11.15df485/1523924"; try { ostiId = ostiService.getOstiId(doi, prefix); fail("The test can't get here"); } catch (Exception e) { //e.printStackTrace(); assertTrue(e instanceof OSTIElinkNotFoundException); } doi = "doi:11.15df485/1523924"; try { ostiId = ostiService.getOstiId(doi, prefix); fail("The test can't get here"); } catch (Exception e) { //e.printStackTrace(); assertTrue(e instanceof OSTIElinkNotFoundException); } prefix = "doi:11.15df485/"; doi = "11.15df485/1523924"; ostiId = ostiService.getOstiId(doi, prefix); assertTrue(ostiId.equals("1523924")); doi = "doi:11.15df485/1523924"; ostiId = ostiService.getOstiId(doi, prefix); assertTrue(ostiId.equals("1523924")); doi = "10.15485/1523924"; ostiId = ostiService.getOstiId(doi, prefix); assertTrue(ostiId.equals("1523924")); doi = "doi:10.15485/1523924"; ostiId = ostiService.getOstiId(doi, prefix); assertTrue(ostiId.equals("1523924")); } /** * Test the setMetadata method * @throws Exception */ @Test public void testSetMetadata() throws Exception { String identifier = ostiService.mintIdentifier(null); assertTrue(identifier.startsWith("doi:10.")); identifier = ostiService.removeDOI(identifier); //System.out.println("the doi identifier is " + identifier); String metadata = ostiService.getMetadata(identifier); assertTrue(metadata.contains(identifier)); assertTrue(metadata.contains("unknown")); try (InputStream is = getClass().getClassLoader().getResourceAsStream("test-files/input-two-osti-id.xml")) { String newMetadata = toString(is); //System.out.println("the new metadata is " + newMetadata); try { ostiService.setMetadata(identifier, null, newMetadata); fail("Test can't reach here"); } catch (Exception e) { //e.printStackTrace(); assertTrue(e instanceof OSTIElinkException); } metadata = ostiService.getMetadata(identifier); assertTrue(metadata.contains(identifier)); assertTrue(metadata.contains("unknown")); } try (InputStream is = getClass().getClassLoader().getResourceAsStream("test-files/input-no-osti-id.xml")) { String newMetadata = toString(is); ostiService.setMetadata(identifier, null, newMetadata); metadata = ostiService.getMetadata(identifier); assertTrue(metadata.contains(identifier)); assertTrue(metadata.contains("0 - Data from Raczka et al., Interactions between")); } try (InputStream is = getClass().getClassLoader().getResourceAsStream("test-files/input-one-osti-id.xml")) { String newMetadata = toString(is); ostiService.setMetadata(identifier, null, newMetadata); metadata = ostiService.getMetadata(identifier); assertTrue(metadata.contains(identifier)); assertTrue(metadata.contains("<title>1 - Data from Raczka et al., Interactions between")); } } /** * Test the getStatus method * @throws Exception */ @Test public void testGetStatus() throws Exception { String doi = "10.15485/1523924"; String status = ostiService.getStatus(doi); assertTrue(status.equals("Pending")); String withDOI = "doi:" + doi; status = ostiService.getStatus(withDOI); assertTrue(status.equals("Pending")); } /** * Read a input stream object to a string * @param inputStream the source of input * @return the string presentation of the input stream * @throws Exception */ protected static String toString(InputStream inputStream) throws Exception { int bufferSize = 1024; char[] buffer = new char[bufferSize]; StringBuilder textBuilder = new StringBuilder(); try (Reader reader = new InputStreamReader(inputStream, Charset.forName(StandardCharsets.UTF_8.name()))) { for (int numRead; (numRead = reader.read(buffer, 0, buffer.length)) > 0; ) { textBuilder.append(buffer, 0, numRead); } } return textBuilder.toString(); } }