/* (c) 2014 - 2016 Open Source Geospatial Foundation - all rights reserved * (c) 2001 - 2013 OpenPlans * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geoserver.rest.catalog; import static org.custommonkey.xmlunit.XMLAssert.assertXpathEvaluatesTo; import static org.custommonkey.xmlunit.XMLAssert.assertXpathExists; import static org.hamcrest.Matchers.endsWith; import static org.hamcrest.Matchers.equalTo; import static org.junit.Assert.*; import net.sf.json.JSON; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import org.geoserver.catalog.Catalog; import org.geoserver.catalog.LayerGroupInfo; import org.geoserver.catalog.PublishedInfo; import org.geoserver.catalog.StyleInfo; import org.geoserver.rest.RestBaseController; import org.geotools.geometry.jts.ReferencedEnvelope; import org.geotools.referencing.CRS; import org.junit.Before; import org.junit.Test; import org.w3c.dom.Document; import org.springframework.mock.web.MockHttpServletResponse; import java.util.List; public class LayerGroupControllerTest extends CatalogRESTTestSupport { @Before public void revertChanges() throws Exception { removeLayerGroup(null, "nestedLayerGroupTest"); removeLayerGroup(null, "sfLayerGroup"); removeLayerGroup(null, "citeLayerGroup"); removeLayerGroup("sf", "workspaceLayerGroup"); removeLayerGroup(null, "newLayerGroup"); removeLayerGroup(null, "newLayerGroupWithTypeCONTAINER"); removeLayerGroup(null, "newLayerGroupWithTypeEO"); LayerGroupInfo lg = catalog.getFactory().createLayerGroup(); lg.setName("sfLayerGroup"); lg.getLayers().add(catalog.getLayerByName("sf:PrimitiveGeoFeature")); lg.getLayers().add(catalog.getLayerByName("sf:AggregateGeoFeature")); lg.getStyles().add(catalog.getStyleByName(StyleInfo.DEFAULT_POINT)); lg.getStyles().add(catalog.getStyleByName(StyleInfo.DEFAULT_POINT)); lg.setBounds(new ReferencedEnvelope(-180, -90, 180, 90, CRS.decode("EPSG:4326"))); catalog.add(lg); LayerGroupInfo lg2 = catalog.getFactory().createLayerGroup(); lg2.setName("citeLayerGroup"); List<PublishedInfo> layers = lg2.getLayers(); layers.add(catalog.getLayerByName("cite:Bridges")); layers.add(catalog.getLayerByName("cite:Buildings")); layers.add(catalog.getLayerByName("cite:Forests")); layers.add(catalog.getLayerByName("cite:Lakes")); layers.add(catalog.getLayerByName("cite:Ponds")); layers.add(catalog.getLayerByName("cite:Streams")); List<StyleInfo> styles = lg2.getStyles(); styles.add(null); styles.add(null); styles.add(null); styles.add(null); styles.add(null); styles.add(null); lg2.setBounds(new ReferencedEnvelope(-180, -90, 180, 90, CRS.decode("EPSG:4326"))); catalog.add(lg2); } @Test public void testGetAllAsXML() throws Exception { Document dom = getAsDOM( RestBaseController.ROOT_PATH + "/layergroups.xml"); assertEquals( catalog.getLayerGroups().size(), dom.getElementsByTagName( "layerGroup").getLength()); } @Test public void testGetAllAsHTML() throws Exception { getAsDOM( RestBaseController.ROOT_PATH + "/layergroups.html"); } @Test public void testGetAllFromWorkspace() throws Exception { Document dom = getAsDOM( RestBaseController.ROOT_PATH + "/workspaces/sf/layergroups.xml" ); assertEquals("layerGroups", dom.getDocumentElement().getNodeName()); assertXpathEvaluatesTo("0", "count(//layerGroup)", dom); addLayerGroupToWorkspace(); dom = getAsDOM( RestBaseController.ROOT_PATH + "/workspaces/sf/layergroups.xml" ); assertEquals("layerGroups", dom.getDocumentElement().getNodeName()); assertXpathEvaluatesTo("1", "count(//layerGroup)", dom); assertXpathExists("//layerGroup/name[text() = 'workspaceLayerGroup']", dom); } void addLayerGroupToWorkspace() { Catalog cat = getCatalog(); LayerGroupInfo lg = cat.getFactory().createLayerGroup(); lg.setName("workspaceLayerGroup"); lg.setWorkspace(cat.getWorkspaceByName("sf")); lg.getLayers().add(cat.getLayerByName("sf:PrimitiveGeoFeature")); lg.getStyles().add(null); cat.add(lg); } @Test public void testGetAsXML() throws Exception { print(get(RestBaseController.ROOT_PATH + "/layergroups/sfLayerGroup.xml")); Document dom = getAsDOM( RestBaseController.ROOT_PATH + "/layergroups/sfLayerGroup.xml"); print(dom); assertEquals( "layerGroup", dom.getDocumentElement().getNodeName() ); assertXpathEvaluatesTo("sfLayerGroup", "/layerGroup/name", dom ); assertXpathEvaluatesTo( "2", "count(//published)", dom ); assertXpathEvaluatesTo( "2", "count(//style)", dom ); // check layer link assertThat(xp.evaluate("//published[name='PrimitiveGeoFeature']/atom:link/@href", dom), endsWith(RestBaseController.ROOT_PATH + "/layers/PrimitiveGeoFeature.xml")); assertThat(xp.evaluate("//published[name='PrimitiveGeoFeature']/atom:link/@type", dom), equalTo("application/xml")); // check style link assertThat(xp.evaluate("//style[1]/atom:link/@href", dom), endsWith(RestBaseController.ROOT_PATH + "/styles/point.xml")); assertThat(xp.evaluate("//style[1]/atom:link/@type", dom), equalTo("application/xml")); dom = getAsDOM( RestBaseController.ROOT_PATH + "/layergroups/citeLayerGroup.xml"); assertEquals( "layerGroup", dom.getDocumentElement().getNodeName() ); assertXpathEvaluatesTo("citeLayerGroup", "/layerGroup/name", dom ); assertXpathEvaluatesTo( "6", "count(//published)", dom ); assertXpathEvaluatesTo( "6", "count(//style)", dom ); } @Test public void testGetAsJSON() throws Exception { print(get(RestBaseController.ROOT_PATH + "/layergroups/sfLayerGroup.json")); JSON json = getAsJSON( RestBaseController.ROOT_PATH + "/layergroups/sfLayerGroup.json"); JSONArray arr = ((JSONObject)json).getJSONObject("layerGroup").getJSONObject("publishables").getJSONArray("published"); assertEquals(2, arr.size()); arr = ((JSONObject)json).getJSONObject("layerGroup").getJSONObject("styles").getJSONArray("style"); assertEquals(2, arr.size()); print(get(RestBaseController.ROOT_PATH + "/layergroups/citeLayerGroup.json")); json = getAsJSON( RestBaseController.ROOT_PATH + "/layergroups/citeLayerGroup.json"); arr = ((JSONObject)json).getJSONObject("layerGroup").getJSONObject("publishables").getJSONArray("published"); assertEquals(6, arr.size()); arr = ((JSONObject)json).getJSONObject("layerGroup").getJSONObject("styles").getJSONArray("style"); assertEquals(6, arr.size()); //GEOS-7873 LayerGroupInfo lg2 = catalog.getLayerGroupByName("citeLayerGroup"); List<StyleInfo> styles = lg2.getStyles(); styles.set(1, catalog.getStyleByName( StyleInfo.DEFAULT_POINT ) ); styles.set(3, catalog.getStyleByName( StyleInfo.DEFAULT_POINT ) ); catalog.save(lg2); print(get(RestBaseController.ROOT_PATH + "/layergroups/citeLayerGroup.json")); json = getAsJSON( RestBaseController.ROOT_PATH + "/layergroups/citeLayerGroup.json"); arr = ((JSONObject)json).getJSONObject("layerGroup").getJSONObject("publishables").getJSONArray("published"); assertEquals(6, arr.size()); arr = ((JSONObject)json).getJSONObject("layerGroup").getJSONObject("styles").getJSONArray("style"); assertEquals(6, arr.size()); } @Test public void testGetAsHTML() throws Exception { getAsDOM( RestBaseController.ROOT_PATH + "/layergroups/sfLayerGroup.html"); } @Test public void testRoundTripXML() throws Exception { LayerGroupInfo before = getCatalog().getLayerGroupByName( "sfLayerGroup"); // get and re-write, does not go boom String xml = getAsString( RestBaseController.ROOT_PATH + "/layergroups/sfLayerGroup.xml"); MockHttpServletResponse response = putAsServletResponse(RestBaseController.ROOT_PATH + "/layergroups/sfLayerGroup", xml, "text/xml"); assertEquals(200, response.getStatus()); // check nothing actually changed LayerGroupInfo after = getCatalog().getLayerGroupByName( "sfLayerGroup"); assertEquals(before, after); } @Test public void testRoundTripJSON() throws Exception { LayerGroupInfo before = getCatalog().getLayerGroupByName( "sfLayerGroup"); // get and re-write, does not go boom String json = getAsString( RestBaseController.ROOT_PATH + "/layergroups/sfLayerGroup.json"); MockHttpServletResponse response = putAsServletResponse(RestBaseController.ROOT_PATH + "/layergroups/sfLayerGroup", json, "application/json"); assertEquals(200, response.getStatus()); // check nothing actually changed LayerGroupInfo after = getCatalog().getLayerGroupByName( "sfLayerGroup"); assertEquals(before, after); } @Test public void testWorkspaceRoundTripXML() throws Exception { addLayerGroupToWorkspace(); LayerGroupInfo before = getCatalog().getLayerGroupByName( "workspaceLayerGroup"); // get and re-write, does not go boom String xml = getAsString( RestBaseController.ROOT_PATH + "/workspaces/sf/layergroups/workspaceLayerGroup.xml"); MockHttpServletResponse response = putAsServletResponse(RestBaseController.ROOT_PATH + "/workspaces/sf/layergroups/workspaceLayerGroup", xml, "text/xml"); assertEquals(200, response.getStatus()); // check nothing actually changed LayerGroupInfo after = getCatalog().getLayerGroupByName( "workspaceLayerGroup"); assertEquals(before, after); } @Test public void testWorkspaceRoundTripJSON() throws Exception { addLayerGroupToWorkspace(); LayerGroupInfo before = getCatalog().getLayerGroupByName( "workspaceLayerGroup"); // get and re-write, does not go boom String json = getAsString( RestBaseController.ROOT_PATH + "/workspaces/sf/layergroups/workspaceLayerGroup.json"); MockHttpServletResponse response = putAsServletResponse(RestBaseController.ROOT_PATH + "/workspaces/sf/layergroups/workspaceLayerGroup", json, "application/json"); assertEquals(200, response.getStatus()); // check nothing actually changed LayerGroupInfo after = getCatalog().getLayerGroupByName( "workspaceLayerGroup"); assertEquals(before, after); } @Test public void testGetWrongLayerGroup() throws Exception { // Parameters for the request String ws = "sf"; String lg = "foooooo"; // Request path String requestPath = RestBaseController.ROOT_PATH + "/layergroups/" + lg + ".html"; String requestPath2 = RestBaseController.ROOT_PATH + "/workspaces/" + ws + "/layergroups/" + lg + ".html"; // Exception path String exception = "No such layer group " + lg; String exception2 = "No such layer group "+ lg +" in workspace " + ws; // CASE 1: No workspace set // First request should thrown an exception MockHttpServletResponse response = getAsServletResponse(requestPath); assertEquals(404, response.getStatus()); assertTrue(response.getContentAsString().contains( exception)); // Same request with ?quietOnNotFound should not throw an exception response = getAsServletResponse(requestPath + "?quietOnNotFound=true"); assertEquals(404, response.getStatus()); assertFalse(response.getContentAsString().contains( exception)); // No exception thrown assertTrue(response.getContentAsString().isEmpty()); // CASE 2: workspace set // First request should thrown an exception response = getAsServletResponse(requestPath2); assertEquals(404, response.getStatus()); assertTrue(response.getContentAsString().contains( exception2)); // Same request with ?quietOnNotFound should not throw an exception response = getAsServletResponse(requestPath2 + "?quietOnNotFound=true"); assertEquals(404, response.getStatus()); assertFalse(response.getContentAsString().contains( exception2)); // No exception thrown assertTrue(response.getContentAsString().isEmpty()); } @Test public void testGetFromWorkspace() throws Exception { MockHttpServletResponse resp = getAsServletResponse(RestBaseController.ROOT_PATH + "/workspaces/sf/layergroups/workspaceLayerGroup.xml"); assertEquals(404, resp.getStatus()); addLayerGroupToWorkspace(); resp = getAsServletResponse(RestBaseController.ROOT_PATH + "/workspaces/sf/layergroups/workspaceLayerGroup.xml"); assertEquals(200, resp.getStatus()); Document dom = getAsDOM(RestBaseController.ROOT_PATH + "/workspaces/sf/layergroups/workspaceLayerGroup.xml"); assertXpathEvaluatesTo("workspaceLayerGroup", "/layerGroup/name", dom); assertXpathEvaluatesTo("sf", "/layerGroup/workspace/name", dom); } @Test public void testPost() throws Exception { String xml = "<layerGroup>" + "<name>newLayerGroup</name>" + "<layers>" + "<layer>Ponds</layer>" + "<layer>Forests</layer>" + "</layers>" + "<styles>" + "<style>polygon</style>" + "<style>point</style>" + "</styles>" + "</layerGroup>"; MockHttpServletResponse response = postAsServletResponse(RestBaseController.ROOT_PATH + "/layergroups", xml ); assertEquals( 201, response.getStatus() ); assertNotNull( response.getHeader( "Location") ); assertTrue( response.getHeader("Location").endsWith( "/layergroups/newLayerGroup" ) ); LayerGroupInfo lg = catalog.getLayerGroupByName( "newLayerGroup"); assertNotNull( lg ); assertEquals( 2, lg.getLayers().size() ); assertEquals( "Ponds", lg.getLayers().get( 0 ).getName() ); assertEquals( "Forests", lg.getLayers().get( 1 ).getName() ); assertEquals( 2, lg.getStyles().size() ); assertEquals( "polygon", lg.getStyles().get( 0 ).getName() ); assertEquals( "point", lg.getStyles().get( 1 ).getName() ); assertNotNull( lg.getBounds() ); } @Test public void testPostWithNestedGroups() throws Exception { String xml = "<layerGroup>" + "<name>nestedLayerGroupTest</name>" + "<publishables>" + "<published type=\"layer\">Ponds</published>" + "<published type=\"layer\">Forests</published>" + "<published type=\"layerGroup\">sfLayerGroup</published>" + "</publishables>" + "<styles>" + "<style>polygon</style>" + "<style>point</style>" + "<style></style>" + "</styles>" + "</layerGroup>"; MockHttpServletResponse response = postAsServletResponse(RestBaseController.ROOT_PATH + "/layergroups", xml ); assertEquals( 201, response.getStatus() ); assertNotNull( response.getHeader( "Location") ); assertTrue( response.getHeader("Location").endsWith( "/layergroups/nestedLayerGroupTest" ) ); LayerGroupInfo lg = catalog.getLayerGroupByName( "nestedLayerGroupTest"); assertNotNull( lg ); assertEquals( 3, lg.getLayers().size() ); assertEquals( "Ponds", lg.getLayers().get( 0 ).getName() ); assertEquals( "Forests", lg.getLayers().get( 1 ).getName() ); assertEquals( "sfLayerGroup", lg.getLayers().get( 2 ).getName() ); assertEquals( 3, lg.getStyles().size() ); assertEquals( "polygon", lg.getStyles().get( 0 ).getName() ); assertEquals( "point", lg.getStyles().get( 1 ).getName() ); assertNull( lg.getStyles().get( 2 ) ); assertNotNull( lg.getBounds() ); } @Test public void testPostWithTypeContainer() throws Exception { String xml = "<layerGroup>" + "<name>newLayerGroupWithTypeCONTAINER</name>" + "<mode>CONTAINER</mode>" + "<layers>" + "<layer>Ponds</layer>" + "<layer>Forests</layer>" + "</layers>" + "<styles>" + "<style>polygon</style>" + "<style>point</style>" + "</styles>" + "</layerGroup>"; MockHttpServletResponse response = postAsServletResponse(RestBaseController.ROOT_PATH + "/layergroups", xml); assertEquals(201, response.getStatus()); LayerGroupInfo lg = catalog.getLayerGroupByName("newLayerGroupWithTypeCONTAINER"); assertNotNull(lg); assertEquals(LayerGroupInfo.Mode.CONTAINER, lg.getMode()); } @Test public void testPostWithTypeEO() throws Exception { String xml = "<layerGroup>" + "<name>newLayerGroupWithTypeEO</name>" + "<mode>EO</mode>" + "<rootLayer>Ponds</rootLayer>" + "<rootLayerStyle>polygon</rootLayerStyle>" + "<layers>" + "<layer>Forests</layer>" + "</layers>" + "<styles>" + "<style>point</style>" + "</styles>" + "</layerGroup>"; MockHttpServletResponse response = postAsServletResponse(RestBaseController.ROOT_PATH + "/layergroups", xml); assertEquals(201, response.getStatus()); LayerGroupInfo lg = catalog.getLayerGroupByName("newLayerGroupWithTypeEO"); assertNotNull(lg); assertEquals(LayerGroupInfo.Mode.EO, lg.getMode()); assertEquals("Ponds", lg.getRootLayer().getName()); assertEquals("polygon", lg.getRootLayerStyle().getName()); } @Test public void testPostNoStyles() throws Exception { String xml = "<layerGroup>" + "<name>newLayerGroup</name>" + "<layers>" + "<layer>Ponds</layer>" + "<layer>Forests</layer>" + "</layers>" + "</layerGroup>"; MockHttpServletResponse response = postAsServletResponse(RestBaseController.ROOT_PATH + "/layergroups", xml ); assertEquals( 201, response.getStatus() ); LayerGroupInfo lg = catalog.getLayerGroupByName( "newLayerGroup"); assertNotNull( lg ); assertEquals( 2, lg.getLayers().size() ); assertEquals( "Ponds", lg.getLayers().get( 0 ).getName() ); assertEquals( "Forests", lg.getLayers().get( 1 ).getName() ); assertEquals( 2, lg.getStyles().size() ); assertNull(lg.getStyles().get( 0 )); assertNull(lg.getStyles().get( 1 )); } @Test public void testPostToWorkspace() throws Exception { Catalog cat = getCatalog(); assertNotNull(cat.getWorkspaceByName("sf")); assertNull(cat.getLayerGroupByName("sf", "workspaceLayerGroup")); String xml = "<layerGroup>" + "<name>workspaceLayerGroup</name>" + "<layers>" + "<layer>PrimitiveGeoFeature</layer>" + "</layers>" + "</layerGroup>"; MockHttpServletResponse response = postAsServletResponse(RestBaseController.ROOT_PATH + "/workspaces/sf/layergroups", xml); assertEquals(201, response.getStatus()); assertNotNull(cat.getLayerGroupByName("sf", "workspaceLayerGroup")); } @Test public void testPut() throws Exception { String xml = "<layerGroup>" + "<name>sfLayerGroup</name>" + "<styles>" + "<style>polygon</style>" + "<style>line</style>" + "</styles>" + "<attribution>" + " <logoWidth>101</logoWidth>" + " <logoHeight>102</logoHeight>" + "</attribution>" + "<metadataLinks> " + "<metadataLink>" + " <id>1</id>" + " <type>text/html</type>" + " <metadataType>FGDC</metadataType>" + " <content>http://my/metadata/link/1</content>" + "</metadataLink> " + "<metadataLink>" + " <id>2</id>" + " <type>text/html</type>" + " <metadataType>FGDC</metadataType>" + " <content>http://my/metadata/link/2</content>" + "</metadataLink> " + "</metadataLinks>" + "</layerGroup>"; MockHttpServletResponse response = putAsServletResponse(RestBaseController.ROOT_PATH + "/layergroups/sfLayerGroup", xml, "text/xml" ); assertEquals( 200, response.getStatus() ); LayerGroupInfo lg = catalog.getLayerGroupByName( "sfLayerGroup" ); assertEquals( 2, lg.getLayers().size() ); assertEquals( 2, lg.getStyles().size() ); assertEquals( "polygon", lg.getStyles().get( 0 ).getName() ); assertEquals( "line", lg.getStyles().get( 1 ).getName() ); assertEquals( 101, lg.getAttribution().getLogoWidth() ); assertEquals( 102, lg.getAttribution().getLogoHeight() ); assertEquals( 2, lg.getMetadataLinks().size() ); } @Test public void testPutNonDestructive() throws Exception { LayerGroupInfo lg = catalog.getLayerGroupByName( "sfLayerGroup" ); boolean isQueryDisabled = lg.isQueryDisabled(); lg.setQueryDisabled(true); catalog.save(lg); String xml = "<layerGroup>" + "<name>sfLayerGroup</name>" + "</layerGroup>"; MockHttpServletResponse response = putAsServletResponse(RestBaseController.ROOT_PATH + "/layergroups/sfLayerGroup", xml, "text/xml" ); assertEquals( 200, response.getStatus() ); lg = catalog.getLayerGroupByName( "sfLayerGroup" ); assertTrue(lg.isQueryDisabled()); lg.setQueryDisabled(isQueryDisabled); catalog.save(lg); } @Test public void testPutToWorkspace() throws Exception { testPostToWorkspace(); Catalog cat = getCatalog(); assertNull(cat.getLayerGroupByName("sf", "workspaceLayerGroup").getStyles().get(0)); String xml = "<layerGroup>" + "<styles>" + "<style>line</style>" + "</styles>" + "</layerGroup>"; MockHttpServletResponse response = putAsServletResponse(RestBaseController.ROOT_PATH + "/workspaces/sf/layergroups/workspaceLayerGroup", xml, "application/xml"); assertEquals(200, response.getStatus()); assertEquals("line", cat.getLayerGroupByName("sf", "workspaceLayerGroup").getStyles().get(0).getName()); } @Test public void testPutToWorkspaceChangeWorkspace() throws Exception { testPostToWorkspace(); String xml = "<layerGroup>" + "<workspace>cite</workspace>" + "</layerGroup>"; MockHttpServletResponse response = putAsServletResponse(RestBaseController.ROOT_PATH + "/workspaces/sf/layergroups/workspaceLayerGroup", xml, "application/xml"); assertEquals(403, response.getStatus()); } @Test public void testDelete() throws Exception { MockHttpServletResponse response = deleteAsServletResponse( RestBaseController.ROOT_PATH + "/layergroups/sfLayerGroup"); assertEquals( 200, response.getStatus() ); response = deleteAsServletResponse( RestBaseController.ROOT_PATH + "/layergroups/citeLayerGroup"); assertEquals( 200, response.getStatus() ); assertEquals( 0, catalog.getLayerGroups().size() ); } @Test public void testDeleteFromWorkspace() throws Exception { testPostToWorkspace(); Catalog cat = getCatalog(); assertNotNull(cat.getLayerGroupByName("sf", "workspaceLayerGroup")); MockHttpServletResponse response = deleteAsServletResponse(RestBaseController.ROOT_PATH + "/workspaces/sf/layergroups/workspaceLayerGroup"); assertEquals(200, response.getStatus()); assertNull(cat.getLayerGroupByName("sf", "workspaceLayerGroup")); } public void testLayersStylesInWorkspace() throws Exception { testPostToWorkspace(); Catalog cat = getCatalog(); StyleInfo s = cat.getFactory().createStyle(); s.setName("s1"); s.setWorkspace(cat.getWorkspaceByName("sf")); s.setFilename("s1.sld"); cat.add(s); s = cat.getFactory().createStyle(); s.setName("s2"); s.setWorkspace(cat.getWorkspaceByName("sf")); s.setFilename("s2.sld"); cat.add(s); String xml = "<layerGroup>" + "<layers>" + "<layer>PrimitiveGeoFeature</layer>" + "<layer>AggregateGeoFeature</layer>" + "</layers>" + "<styles>" + "<style>" + "<name>s1</name>" + "<workspace>sf</workspace>" + "</style>" + "<style>" + "<name>s2</name>" + "<workspace>sf</workspace>" + "</style>" + "</styles>" + "</layerGroup>"; MockHttpServletResponse response = putAsServletResponse(RestBaseController.ROOT_PATH + "/workspaces/sf/layergroups/workspaceLayerGroup", xml, "text/xml" ); assertEquals( 200, response.getStatus() ); LayerGroupInfo lg = cat.getLayerGroupByName("sf", "workspaceLayerGroup"); assertEquals(2, lg.getLayers().size()); assertEquals(2, lg.getStyles().size()); assertEquals("PrimitiveGeoFeature", lg.getLayers().get(0).getName()); assertEquals("AggregateGeoFeature", lg.getLayers().get(1).getName()); assertEquals("s1", lg.getStyles().get(0).getName()); assertNotNull(lg.getStyles().get(0).getWorkspace()); assertEquals("sf", lg.getStyles().get(0).getWorkspace().getName()); assertEquals("s2", lg.getStyles().get(1).getName()); assertNotNull(lg.getStyles().get(1).getWorkspace()); assertEquals("sf", lg.getStyles().get(1).getWorkspace().getName()); Document dom = getAsDOM(RestBaseController.ROOT_PATH + "/workspaces/sf/layergroups/workspaceLayerGroup.xml"); assertXpathEvaluatesTo(RestBaseController.ROOT_PATH + "/workspaces/sf/styles/s1.xml", "//style[name = 's1']/atom:link/@href", dom ); assertXpathEvaluatesTo(RestBaseController.ROOT_PATH + "/workspaces/sf/styles/s2.xml", "//style[name = 's2']/atom:link/@href", dom ); } }