package no.difi.datahotel.resources; import com.sun.jersey.api.core.HttpRequestContext; import no.difi.datahotel.BaseTest; import no.difi.datahotel.logic.ChunkBean; import no.difi.datahotel.logic.DataBean; import no.difi.datahotel.logic.FieldBean; import no.difi.datahotel.logic.SearchBean; import no.difi.datahotel.model.FieldLight; import no.difi.datahotel.model.Metadata; import no.difi.datahotel.model.MetadataLight; import no.difi.datahotel.model.Result; import no.difi.datahotel.util.DatahotelException; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.mockito.Mockito; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; public class BrowseResourceTest extends BaseTest { private DataBean dataBean; private FieldBean fieldBean; private ChunkBean chunkBean; private SearchBean searchBean; private BrowseResource browseResource; private UriInfo uriInfo; private HttpRequestContext httpRequestContext; private MultivaluedMap<String, String> parameterMap; private Metadata metadata; private no.difi.datahotel.model.Field field1; private no.difi.datahotel.model.Field field2; private ArrayList<FieldLight> fields; private Result result; @SuppressWarnings("unchecked") @Before public void before() throws Exception { metadata = new Metadata(); metadata.setLocation("dataset"); field1 = new no.difi.datahotel.model.Field("field1", false); field2 = new no.difi.datahotel.model.Field("field2", true); field2.setGroupable(true); fields = new ArrayList<FieldLight>(); fields.add(new FieldLight(field1)); fields.add(new FieldLight(field2)); result = new Result(); dataBean = Mockito.mock(DataBean.class); Mockito.when(dataBean.getChild("")).thenReturn(metadata); Mockito.when(dataBean.getChild(metadata.getLocation())).thenReturn(metadata); fieldBean = Mockito.mock(FieldBean.class); chunkBean = Mockito.mock(ChunkBean.class); searchBean = Mockito.mock(SearchBean.class); parameterMap = Mockito.mock(MultivaluedMap.class); Mockito.when(parameterMap.containsKey("query")).thenReturn(false); Mockito.when(parameterMap.containsKey("callback")).thenReturn(false); Mockito.when(parameterMap.containsKey("page")).thenReturn(false); uriInfo = Mockito.mock(UriInfo.class); Mockito.when(uriInfo.getQueryParameters()).thenReturn(parameterMap); httpRequestContext = Mockito.mock(HttpRequestContext.class); Mockito.when(httpRequestContext.getHeaderValue(HttpHeaders.IF_NONE_MATCH)).thenReturn(null); browseResource = new BrowseResource(); browseResource.setDataEJB(dataBean); browseResource.setFieldEJB(fieldBean); browseResource.setChunkEJB(chunkBean); browseResource.setSearchEJB(searchBean); Field uriInfoField = BaseResource.class.getDeclaredField("uriInfo"); uriInfoField.setAccessible(true); uriInfoField.set(browseResource, uriInfo); Field requestField = BaseResource.class.getDeclaredField("request"); requestField.setAccessible(true); requestField.set(browseResource, httpRequestContext); } @Test public void testGetAllDatasetsSimple() { ArrayList<Metadata> metadatas = new ArrayList<Metadata>(); metadatas.add(new Metadata()); metadatas.add(new Metadata()); Mockito.when(dataBean.getDatasets()).thenReturn(metadatas); Response response = browseResource.getAllDatasets("xml"); Assert.assertNotNull(response); } @Test public void testGetAllDatasetsNoResult() { Mockito.when(dataBean.getDatasets()).thenReturn(new ArrayList<Metadata>()); DatahotelException ex = null; try { browseResource.getAllDatasets("xml"); Assert.fail(); } catch (DatahotelException e) { ex = e; } Assert.assertNotNull(ex); Assert.assertEquals(404, ex.getStatus()); Assert.assertEquals("No elements found.", ex.getMessage()); } @Test public void testGetAllDatasetsInactiveParent() { ArrayList<Metadata> metadatas = new ArrayList<Metadata>(); Metadata toBeActiveParent = new Metadata(); toBeActiveParent.setActive(true); Metadata toBeActive = new Metadata(); toBeActive.setParent(toBeActiveParent); toBeActive.setLocation("tobeactive"); Metadata toBeInactiveParent = new Metadata(); toBeInactiveParent.setActive(false); Metadata toBeInactive = new Metadata(); toBeInactive.setParent(toBeInactiveParent); toBeInactive.setLocation("tobeinactive"); metadatas.add(toBeActive); metadatas.add(toBeInactive); Mockito.when(dataBean.getDatasets()).thenReturn(metadatas); Response response = browseResource.getAllDatasets("xml"); Assert.assertNotNull(response); Assert.assertTrue(response.getEntity().toString().contains("tobeactive")); Assert.assertFalse(response.getEntity().toString().contains("tobeinactive")); } @Test public void testGetAllDatasetsException() { Mockito.when(dataBean.getDatasets()).thenThrow(new RuntimeException("Catch me!")); DatahotelException ex = null; try { browseResource.getAllDatasets("xml"); Assert.fail(); } catch (DatahotelException e) { ex = e; } Assert.assertNotNull(ex); Assert.assertEquals(500, ex.getStatus()); Assert.assertEquals("Catch me!", ex.getMessage()); } @Test public void testGetFieldsSimple() { Mockito.when(fieldBean.getFields(metadata)).thenReturn(fields); Response response = browseResource.getFields("xml", metadata.getLocation()); Assert.assertEquals(response.getStatus(), 200); Assert.assertTrue(response.getEntity().toString().contains("field1")); Assert.assertTrue(response.getEntity().toString().contains("field2")); Assert.assertTrue(response.getEntity().toString().contains("searchable")); } @Test public void testGetFieldsEmpty() { Mockito.when(fieldBean.getFields(metadata)).thenReturn(new ArrayList<FieldLight>()); DatahotelException ex = null; try { browseResource.getFields("xml", metadata.getLocation()); Assert.fail(); } catch (DatahotelException e) { ex = e; } Assert.assertNotNull(ex); Assert.assertEquals(404, ex.getStatus()); Assert.assertEquals("Metadata with that name could not be found.", ex.getMessage()); } @Test public void testGetFieldsException() { Mockito.when(fieldBean.getFields(metadata)).thenThrow(new RuntimeException("Catch me!")); DatahotelException ex = null; try { browseResource.getFields("xml", metadata.getLocation()); Assert.fail(); } catch (DatahotelException e) { ex = e; } Assert.assertNotNull(ex); Assert.assertEquals(500, ex.getStatus()); Assert.assertEquals("Catch me!", ex.getMessage()); } @Test public void testGetMetaSimple() { Response response = browseResource.getMeta("xml", metadata.getLocation()); Assert.assertEquals(response.getStatus(), 200); Assert.assertTrue(response.getEntity().toString().contains("dataset")); Assert.assertTrue(response.getEntity().toString().contains("false")); } @Test public void testGetMetaCallback() { Mockito.when(parameterMap.containsKey("callback")).thenReturn(true); Mockito.when(parameterMap.getFirst("callback")).thenReturn("my_function"); Response response = browseResource.getMeta("jsonp", metadata.getLocation()); Assert.assertEquals(response.getStatus(), 200); Assert.assertTrue(response.getEntity().toString().contains("dataset")); Assert.assertTrue(response.getEntity().toString().contains("false")); Assert.assertTrue(response.getEntity().toString().contains("my_function")); } @Test public void testGetMetaEmptyCallback() { Mockito.when(parameterMap.containsKey("callback")).thenReturn(true); Mockito.when(parameterMap.getFirst("callback")).thenReturn(""); Response response = browseResource.getMeta("jsonp", metadata.getLocation()); Assert.assertEquals(response.getStatus(), 200); Assert.assertTrue(response.getEntity().toString().contains("dataset")); Assert.assertTrue(response.getEntity().toString().contains("false")); Assert.assertTrue(response.getEntity().toString().contains("callback")); } @Test public void testGetMetaModified() { Mockito.when(httpRequestContext.getHeaderValue(HttpHeaders.IF_NONE_MATCH)).thenReturn("123456789"); Response response = browseResource.getMeta("xml", metadata.getLocation()); Assert.assertEquals(response.getStatus(), 200); Assert.assertTrue(response.getEntity().toString().contains("dataset")); Assert.assertTrue(response.getEntity().toString().contains("false")); } @Test public void testGetMetaNotModified() { Mockito.when(httpRequestContext.getHeaderValue(HttpHeaders.IF_NONE_MATCH)).thenReturn(String.valueOf(metadata.getUpdated())); DatahotelException ex = null; try { browseResource.getMeta("xml", metadata.getLocation()); Assert.fail(); } catch (DatahotelException e) { ex = e; } Assert.assertNotNull(ex); Assert.assertEquals(304, ex.getStatus()); Assert.assertEquals("Not modified", ex.getMessage()); } @Test public void testGetMetaException() { Mockito.when(dataBean.getChild(metadata.getLocation())).thenThrow(new RuntimeException("Catch me!")); DatahotelException ex = null; try { browseResource.getMeta("xml", metadata.getLocation()); Assert.fail(); } catch (DatahotelException e) { ex = e; } Assert.assertNotNull(ex); Assert.assertEquals(500, ex.getStatus()); Assert.assertEquals("Catch me!", ex.getMessage()); } @Test public void testGetRootSimple() { Mockito.when(dataBean.getChildren("")).thenReturn(new ArrayList<MetadataLight>()); Response response = browseResource.getRoot("xml"); Assert.assertEquals(200, response.getStatus()); } @Test public void testGetRootNoChildren() { Mockito.when(dataBean.getChildren("")).thenReturn(null); DatahotelException ex = null; try { browseResource.getRoot("xml"); Assert.fail(); } catch (DatahotelException e) { ex = e; } Assert.assertNotNull(ex); Assert.assertEquals(404, ex.getStatus()); Assert.assertEquals("No elements found.", ex.getMessage()); } @Test public void testGetDatasetException() { Mockito.when(dataBean.getChild(metadata.getLocation())).thenThrow(new RuntimeException("Catch me!")); DatahotelException ex = null; try { browseResource.getDataset("xml", metadata.getLocation()); Assert.fail(); } catch (DatahotelException e) { ex = e; } Assert.assertNotNull(ex); Assert.assertEquals(500, ex.getStatus()); Assert.assertEquals("Catch me!", ex.getMessage()); } @Test public void testGetDatasetSimple() { metadata.setDataset(true); Mockito.when(fieldBean.getFields(metadata)).thenReturn(fields); Mockito.when(chunkBean.get(metadata, 1)).thenReturn(result); Response response = browseResource.getDataset("xml", metadata.getLocation()); Assert.assertEquals(200, response.getStatus()); } @Test public void testGetDatasetNoResult() { metadata.setDataset(true); Mockito.when(fieldBean.getFields(metadata)).thenReturn(fields); Mockito.when(chunkBean.get(metadata, 1)).thenReturn(null); DatahotelException ex = null; try { browseResource.getDataset("xml", metadata.getLocation()); Assert.fail(); } catch (DatahotelException e) { ex = e; } Assert.assertNotNull(ex); Assert.assertEquals(500, ex.getStatus()); Assert.assertEquals("No data retrieved.", ex.getMessage()); } @Test public void testGetDatasetPageEmpty() { metadata.setDataset(true); Mockito.when(fieldBean.getFields(metadata)).thenReturn(fields); Mockito.when(chunkBean.get(metadata, 1)).thenReturn(result); Mockito.when(parameterMap.containsKey("page")).thenReturn(true); Mockito.when(parameterMap.getFirst("page")).thenReturn(""); Response response = browseResource.getDataset("xml", metadata.getLocation()); Assert.assertEquals(200, response.getStatus()); } @Test public void testGetDatasetPageTwo() { metadata.setDataset(true); Mockito.when(fieldBean.getFields(metadata)).thenReturn(fields); Mockito.when(chunkBean.get(metadata, 2)).thenReturn(result); Mockito.when(parameterMap.containsKey("page")).thenReturn(true); Mockito.when(parameterMap.getFirst("page")).thenReturn("2"); Response response = browseResource.getDataset("xml", metadata.getLocation()); Assert.assertEquals(200, response.getStatus()); } @Test public void testGetDatasetQuery() { metadata.setDataset(true); Mockito.when(fieldBean.getFields(metadata)).thenReturn(fields); Mockito.when(searchBean.find(metadata, "myquery", new HashMap<String, String>(), 1)).thenReturn(result); Mockito.when(parameterMap.containsKey("query")).thenReturn(true); Mockito.when(parameterMap.getFirst("query")).thenReturn("myquery"); Response response = browseResource.getDataset("xml", metadata.getLocation()); Assert.assertEquals(200, response.getStatus()); } @Test public void testGetDatasetQueryEmpty() { metadata.setDataset(true); Mockito.when(fieldBean.getFields(metadata)).thenReturn(fields); Mockito.when(chunkBean.get(metadata, 1)).thenReturn(result); Mockito.when(parameterMap.containsKey("query")).thenReturn(true); Mockito.when(parameterMap.getFirst("query")).thenReturn(""); Response response = browseResource.getDataset("xml", metadata.getLocation()); Assert.assertEquals(200, response.getStatus()); } @Test public void testGetDatasetLookup() { metadata.setDataset(true); Map<String, String> lookup = new HashMap<String, String>(); lookup.put("field2", "myvalue"); Mockito.when(fieldBean.getFields(metadata)).thenReturn(fields); Mockito.when(searchBean.find(metadata, null, lookup, 1)).thenReturn(result); Mockito.when(parameterMap.containsKey("field2")).thenReturn(true); Mockito.when(parameterMap.getFirst("field2")).thenReturn("myvalue"); Response response = browseResource.getDataset("xml", metadata.getLocation()); Assert.assertEquals(200, response.getStatus()); } @Test public void testGetDatasetLookupEmpty() { metadata.setDataset(true); Mockito.when(fieldBean.getFields(metadata)).thenReturn(fields); Mockito.when(chunkBean.get(metadata, 1)).thenReturn(result); Mockito.when(parameterMap.containsKey("field2")).thenReturn(true); Mockito.when(parameterMap.getFirst("field2")).thenReturn(""); Response response = browseResource.getDataset("xml", metadata.getLocation()); Assert.assertEquals(200, response.getStatus()); } @Test public void testGetDatasetLookupAndQuery() { metadata.setDataset(true); Map<String, String> lookup = new HashMap<String, String>(); lookup.put("field2", "myvalue"); Mockito.when(fieldBean.getFields(metadata)).thenReturn(fields); Mockito.when(searchBean.find(metadata, "myquery", lookup, 1)).thenReturn(result); Mockito.when(parameterMap.containsKey("field2")).thenReturn(true); Mockito.when(parameterMap.getFirst("field2")).thenReturn("myvalue"); Mockito.when(parameterMap.containsKey("query")).thenReturn(true); Mockito.when(parameterMap.getFirst("query")).thenReturn("myquery"); Response response = browseResource.getDataset("xml", metadata.getLocation()); Assert.assertEquals(200, response.getStatus()); } }