/* (c) 2016 Open Source Geospatial Foundation - all rights reserved
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.inspire;
import org.geoserver.catalog.MetadataMap;
import org.geoserver.config.ServiceInfo;
import org.geoserver.test.GeoServerSystemTestSupport;
import org.geoserver.wms.WMSInfo;
import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import static org.geoserver.inspire.InspireMetadata.CREATE_EXTENDED_CAPABILITIES;
import static org.geoserver.inspire.InspireMetadata.LANGUAGE;
import static org.geoserver.inspire.InspireMetadata.SERVICE_METADATA_TYPE;
import static org.geoserver.inspire.InspireMetadata.SERVICE_METADATA_URL;
import static org.geoserver.inspire.InspireSchema.COMMON_NAMESPACE;
import static org.geoserver.inspire.InspireSchema.VS_SCHEMA;
import static org.geoserver.inspire.InspireTestSupport.assertInspireCommonScenario1Response;
import static org.geoserver.inspire.InspireTestSupport.assertInspireMetadataUrlResponse;
import static org.geoserver.inspire.InspireTestSupport.assertSchemaLocationContains;
import static org.geoserver.inspire.InspireTestSupport.clearInspireMetadata;
import static org.junit.Assert.assertEquals;
public abstract class ViewServicesTestSupport extends GeoServerSystemTestSupport {
protected abstract String getGetCapabilitiesRequestPath();
protected abstract String getMetadataUrl();
protected abstract String getMetadataType();
protected abstract String getLanguage();
protected abstract String getAlternateMetadataType();
protected abstract ServiceInfo getServiceInfo();
protected abstract String getInspireNameSpace();
protected abstract String getInspireSchema();
@Test
public void testNoInspireSettings() throws Exception {
final ServiceInfo serviceInfo = getServiceInfo();
final MetadataMap metadata = serviceInfo.getMetadata();
clearInspireMetadata(metadata);
getGeoServer().save(serviceInfo);
final Document dom = getAsDOM(getGetCapabilitiesRequestPath());
final NodeList nodeList = dom.getElementsByTagNameNS(getInspireNameSpace(), "ExtendedCapabilities");
assertEquals("Number of INSPIRE ExtendedCapabilities elements", 0, nodeList.getLength());
}
@Test
public void testCreateExtCapsOff() throws Exception {
final ServiceInfo serviceInfo = getServiceInfo();
final MetadataMap metadata = serviceInfo.getMetadata();
clearInspireMetadata(metadata);
metadata.put(CREATE_EXTENDED_CAPABILITIES.key, false);
metadata.put(SERVICE_METADATA_URL.key, getMetadataUrl());
metadata.put(SERVICE_METADATA_TYPE.key, getMetadataType());
metadata.put(LANGUAGE.key, getLanguage());
getGeoServer().save(serviceInfo);
final Document dom = getAsDOM(getGetCapabilitiesRequestPath());
final NodeList nodeList = dom.getElementsByTagNameNS(getInspireNameSpace(), "ExtendedCapabilities");
assertEquals("Number of INSPIRE ExtendedCapabilities elements", 0, nodeList.getLength());
}
@Test
public void testExtCapsWithFullSettings() throws Exception {
final ServiceInfo serviceInfo = getServiceInfo();
final MetadataMap metadata = serviceInfo.getMetadata();
clearInspireMetadata(metadata);
metadata.put(CREATE_EXTENDED_CAPABILITIES.key, true);
metadata.put(SERVICE_METADATA_URL.key, getMetadataUrl());
metadata.put(SERVICE_METADATA_TYPE.key, getMetadataType());
metadata.put(LANGUAGE.key, getLanguage());
getGeoServer().save(serviceInfo);
final Document dom = getAsDOM(getGetCapabilitiesRequestPath());
NodeList nodeList = dom.getElementsByTagNameNS(getInspireNameSpace(), "ExtendedCapabilities");
assertEquals("Number of INSPIRE ExtendedCapabilities elements", 1, nodeList.getLength());
String schemaLocation = dom.getDocumentElement().getAttribute("xsi:schemaLocation");
assertSchemaLocationContains(schemaLocation, getInspireNameSpace(), getInspireSchema());
final Element extendedCaps = (Element) nodeList.item(0);
assertInspireCommonScenario1Response(extendedCaps, getMetadataUrl(), getMetadataType(), getLanguage());
}
@Test
public void testReloadSettings() throws Exception {
final ServiceInfo serviceInfo = getServiceInfo();
final MetadataMap metadata = serviceInfo.getMetadata();
clearInspireMetadata(metadata);
metadata.put(CREATE_EXTENDED_CAPABILITIES.key, true);
metadata.put(SERVICE_METADATA_URL.key, getMetadataUrl());
metadata.put(SERVICE_METADATA_TYPE.key, getMetadataType());
metadata.put(LANGUAGE.key, getLanguage());
getGeoServer().save(serviceInfo);
getGeoServer().reload();
final Document dom = getAsDOM(getGetCapabilitiesRequestPath());
NodeList nodeList = dom.getElementsByTagNameNS(getInspireNameSpace(), "ExtendedCapabilities");
assertEquals("Number of INSPIRE ExtendedCapabilities elements after settings reload", 1, nodeList.getLength());
}
// Test ExtendedCapabilities is not produced if required settings missing
@Test
public void testNoMetadataUrl() throws Exception {
final ServiceInfo serviceInfo = getServiceInfo();
final MetadataMap metadata = serviceInfo.getMetadata();
clearInspireMetadata(metadata);
metadata.put(CREATE_EXTENDED_CAPABILITIES.key, true);
metadata.put(SERVICE_METADATA_TYPE.key, getMetadataType());
metadata.put(LANGUAGE.key, getLanguage());
getGeoServer().save(serviceInfo);
final Document dom = getAsDOM(getGetCapabilitiesRequestPath());
final NodeList nodeList = dom.getElementsByTagNameNS(getInspireNameSpace(), "ExtendedCapabilities");
assertEquals("Number of INSPIRE ExtendedCapabilities elements", 0, nodeList.getLength());
}
// Test ExtendedCapabilities response when optional settings missing
@Test
public void testNoMediaType() throws Exception {
final ServiceInfo serviceInfo = getServiceInfo();
final MetadataMap metadata = serviceInfo.getMetadata();
clearInspireMetadata(metadata);
metadata.put(CREATE_EXTENDED_CAPABILITIES.key, true);
metadata.put(SERVICE_METADATA_URL.key, getMetadataUrl());
metadata.put(LANGUAGE.key, getLanguage());
getGeoServer().save(serviceInfo);
final Document dom = getAsDOM(getGetCapabilitiesRequestPath());
NodeList nodeList = dom.getElementsByTagNameNS(getInspireNameSpace(), "ExtendedCapabilities");
assertEquals("Number of INSPIRE ExtendedCapabilities elements", 1, nodeList.getLength());
nodeList = dom.getElementsByTagNameNS(COMMON_NAMESPACE, "MediaType");
assertEquals("Number of MediaType elements", 0, nodeList.getLength());
}
// If settings were created with older version of INSPIRE extension before
// the on/off check box setting existed we create the extended capabilities
// if the other required settings exist and don't if they don't
@Test
public void testCreateExtCapMissingWithRequiredSettings() throws Exception {
final ServiceInfo serviceInfo = getServiceInfo();
final MetadataMap metadata = serviceInfo.getMetadata();
clearInspireMetadata(metadata);
metadata.put(SERVICE_METADATA_URL.key, getMetadataUrl());
metadata.put(SERVICE_METADATA_TYPE.key, getMetadataType());
metadata.put(LANGUAGE.key, getLanguage());
getGeoServer().save(serviceInfo);
final Document dom = getAsDOM(getGetCapabilitiesRequestPath());
NodeList nodeList = dom.getElementsByTagNameNS(getInspireNameSpace(), "ExtendedCapabilities");
assertEquals("Number of INSPIRE ExtendedCapabilities elements", 1, nodeList.getLength());
}
@Test
public void testCreateExtCapMissingWithoutRequiredSettings() throws Exception {
final ServiceInfo serviceInfo = getServiceInfo();
final MetadataMap metadata = serviceInfo.getMetadata();
clearInspireMetadata(metadata);
metadata.put(SERVICE_METADATA_TYPE.key, getMetadataType());
metadata.put(LANGUAGE.key, getLanguage());
getGeoServer().save(serviceInfo);
final Document dom = getAsDOM(getGetCapabilitiesRequestPath());
final NodeList nodeList = dom.getElementsByTagNameNS(getInspireNameSpace(), "ExtendedCapabilities");
assertEquals("Number of INSPIRE ExtendedCapabilities elements", 0, nodeList.getLength());
}
@Test
public void testChangeMediaType() throws Exception {
final ServiceInfo serviceInfo = getServiceInfo();
final MetadataMap metadata = serviceInfo.getMetadata();
clearInspireMetadata(metadata);
metadata.put(CREATE_EXTENDED_CAPABILITIES.key, true);
metadata.put(SERVICE_METADATA_URL.key, getMetadataUrl());
metadata.put(SERVICE_METADATA_TYPE.key, getMetadataType());
metadata.put(LANGUAGE.key, getLanguage());
getGeoServer().save(serviceInfo);
Document dom = getAsDOM(getGetCapabilitiesRequestPath());
NodeList nodeList = dom.getElementsByTagNameNS(COMMON_NAMESPACE, "MetadataUrl");
assertEquals("Number of MediaType elements", 1, nodeList.getLength());
Element mdUrl = (Element) nodeList.item(0);
assertInspireMetadataUrlResponse(mdUrl, getMetadataUrl(), getMetadataType());
serviceInfo.getMetadata().put(SERVICE_METADATA_TYPE.key, getAlternateMetadataType());
getGeoServer().save(serviceInfo);
dom = getAsDOM(getGetCapabilitiesRequestPath());
nodeList = dom.getElementsByTagNameNS(COMMON_NAMESPACE, "MetadataUrl");
assertEquals("Number of MediaType elements", 1, nodeList.getLength());
mdUrl = (Element) nodeList.item(0);
assertInspireMetadataUrlResponse(mdUrl, getMetadataUrl(), getAlternateMetadataType());
}
}