package org.gbif.ipt.action.admin; import org.gbif.ipt.config.AppConfig; import org.gbif.ipt.config.ConfigWarnings; import org.gbif.ipt.config.Constants; import org.gbif.ipt.config.DataDir; import org.gbif.ipt.model.Extension; import org.gbif.ipt.service.admin.ExtensionManager; import org.gbif.ipt.service.admin.RegistrationManager; import org.gbif.ipt.service.admin.VocabulariesManager; import org.gbif.ipt.service.manage.ResourceManager; import org.gbif.ipt.service.registry.RegistryManager; import org.gbif.ipt.service.registry.impl.RegistryManagerImpl; import org.gbif.ipt.service.registry.impl.RegistryManagerImplTest; import org.gbif.ipt.struts2.SimpleTextProvider; import org.gbif.utils.HttpUtil; import java.io.IOException; import java.net.MalformedURLException; import java.net.URISyntaxException; import java.net.URL; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParserFactory; import com.google.common.collect.Lists; import org.apache.commons.io.IOUtils; import org.junit.Before; import org.junit.Test; import org.xml.sax.SAXException; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class ExtensionsActionTest { ExtensionsAction action; List<Extension> extensions; @Before public void setup() throws IOException, ParserConfigurationException, SAXException, URISyntaxException { HttpUtil mockHttpUtil = mock(HttpUtil.class); HttpUtil.Response mockResponse = mock(HttpUtil.Response.class); // mock response from Registry listing all registered extensions mockResponse.content = IOUtils.toString(RegistryManagerImplTest.class.getResourceAsStream("/responses/extensions_sandbox.json"), "UTF-8"); when(mockHttpUtil.get(anyString())).thenReturn(mockResponse); // create instance of RegistryManager RegistryManager registryManager = new RegistryManagerImpl(mock(AppConfig.class), mock(DataDir.class), mockHttpUtil, mock(SAXParserFactory.class), mock(ConfigWarnings.class), mock(SimpleTextProvider.class), mock(RegistrationManager.class), mock( ResourceManager.class)); // load list of all registered extensions extensions = registryManager.getExtensions(); // create instance of action action = new ExtensionsAction(mock(SimpleTextProvider.class), mock(AppConfig.class), mock(RegistrationManager.class), mock(ExtensionManager.class), mock(VocabulariesManager.class), registryManager, mock(ConfigWarnings.class)); } @Test public void testGetLatestVersions() throws Exception { // start with 52 extensions assertEquals(52, extensions.size()); // start with 3 extensions with Occurrence rowType assertEquals(3, countOccurrenceExtensions(extensions)); // filter extensions list so that it only includes the latest version of each extension List<Extension> filtered = action.getLatestVersions(extensions); // end with 44 extensions assertEquals(44, filtered.size()); // end with 1 extension with Occurrence rowType assertEquals(1, countOccurrenceExtensions(filtered)); // make sure that Occurrence extension is the right one.. Extension latestOccurrence = getFirstOccurrenceExtension(filtered); assertNotNull(latestOccurrence); assertTrue(latestOccurrence.isLatest()); assertEquals("http://rs.gbif.org/sandbox/core/dwc_occurrence_2015-04-24.xml", latestOccurrence.getUrl().toString()); } @Test public void testUpdateIsLatest() throws MalformedURLException, ParseException { // mock returning list of installed extensions, having Occurrence extension that is NOT latest List<Extension> installed = Lists.newArrayList(); Extension occurrenceCore = new Extension(); occurrenceCore.setUrl(new URL("http://rs.gbif.org/core/dwc_occurrence.xml")); occurrenceCore.setRowType(Constants.DWC_ROWTYPE_OCCURRENCE); installed.add(occurrenceCore); assertNull(occurrenceCore.getIssued()); // do the check action.updateIsLatest(installed); assertFalse(installed.get(0).isLatest()); // Indicates it is NOT the latest version! // mock returning list of installed extensions, having Occurrence extension that IS latest installed.clear(); String dateStr = "2015-04-24"; DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); Date issuedDate = dateFormat.parse(dateStr); occurrenceCore.setIssued(issuedDate); occurrenceCore.setUrl(new URL("http://rs.gbif.org/sandbox/core/dwc_occurrence_2015-04-24.xml")); occurrenceCore.setRowType(Constants.DWC_ROWTYPE_OCCURRENCE); assertNotNull(occurrenceCore.getIssued()); installed.add(occurrenceCore); action.updateIsLatest(installed); assertTrue(installed.get(0).isLatest()); // Now indicates it is latest version! } /** * Method that counts the number of extensions with Occurrence rowType. * * @param extensions list of extensions * * @return number of extensions in list with Occurrence rowType */ private int countOccurrenceExtensions(List<Extension> extensions) { int count = 0; for (Extension extension: extensions) { if (extension.getRowType().equalsIgnoreCase(Constants.DWC_ROWTYPE_OCCURRENCE)) { count++; } } return count; } /** * Method that retrieves the first extensions with Occurrence rowType. * * @param extensions list of extensions * * @return first extensions with Occurrence rowType encountered in list */ private Extension getFirstOccurrenceExtension(List<Extension> extensions) { for (Extension extension: extensions) { if (extension.getRowType().equalsIgnoreCase(Constants.DWC_ROWTYPE_OCCURRENCE)) { return extension; } } return null; } }