/* (c) 2017 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.wms.web.data;
import static org.junit.Assert.assertEquals;
import java.io.File;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import org.geoserver.catalog.Catalog;
import org.geoserver.catalog.StyleInfo;
import org.geoserver.catalog.Styles;
import org.geoserver.data.test.SystemTestData;
import org.geoserver.web.GeoServerWicketTestSupport;
import org.junit.Before;
import org.junit.Test;
/**
* Tests for recovering CSS styles generated by the old (pre-pluggable styles) CSS extension. That extension extension output styles based on
* generated SLD files, without saving a reference to the user's CSS input, and as a result the new style editor treats them as SLD.
*
*/
public class StyleEditCssRecoveryTest extends GeoServerWicketTestSupport {
String oldCssStyle = "OldCssStyle";
String oldCssStyleWithFormatSLD = "OldCssStyle_Format_Set_To_SLD";
String oldCssStyleWithSLDManuallyEdited = "OldCssStyle_SLD_Manually_Edited";
Catalog catalog;
protected void setUpTestData(SystemTestData testData) throws Exception {
super.setUpTestData(testData);
System.out.println("setUpTestData()");
Date t0 = new Date(1483228800000L); // Midnight Jan 1, 2017 UTC
List<String> testStyleNames = Arrays.asList(oldCssStyle, oldCssStyleWithFormatSLD,
oldCssStyleWithSLDManuallyEdited);
for (String styleName : testStyleNames) {
for (String ext : Arrays.asList(".css", ".sld", ".xml")) {
testData.copyTo(this.getClass().getResourceAsStream(styleName + ext),
"styles/" + styleName + ext);
File f = Paths.get(testData.getDataDirectoryRoot().getAbsolutePath(),
"styles/" + styleName + ext).toFile();
f.setLastModified(t0.getTime());
}
}
// Make this SLD file appear as if it was edited after being generated from CSS.
File manuallyEditedSld = Paths.get(testData.getDataDirectoryRoot().getAbsolutePath(),
"styles/" + oldCssStyleWithSLDManuallyEdited + ".sld").toFile();
manuallyEditedSld.setLastModified(t0.getTime() + 1000000L);
}
@Override
protected void onSetUp(SystemTestData testData) throws Exception {
super.onSetUp(testData);
}
@Before
public void setUp() throws Exception {
login();
catalog = getCatalog();
}
/**
* Test recovery of a CSS Style generated by the old CSS Extension, when the StyleInfo has no declared <format> and its filename points to a
* derived SLD.
*/
@Test
public void testRecoverLostCssStyle() throws Exception {
StyleInfo styleInfo = catalog.getStyleByName(oldCssStyle);
StyleEditPage edit = new StyleEditPage(styleInfo);
tester.startPage(edit);
tester.assertRenderedPage(StyleEditPage.class);
tester.assertNoErrorMessage();
// Assert that the page displays the format as css
tester.assertModelValue("styleForm:context:panel:format", "css");
// Assert that the editor text area contains css
String editorContents = (String) tester
.getComponentFromLastRenderedPage(
"styleForm:styleEditor:editorContainer:editorParent:editor")
.getDefaultModelObject();
Styles.handler("css").parse(editorContents, null, null, null);
// Assert that the catalog's StyleInfo is now a css style
StyleInfo si = catalog.getStyleByName(oldCssStyle);
assertEquals("css", si.getFormat());
assertEquals(oldCssStyle + ".css", si.getFilename());
}
/**
* Test recovery of a CSS Style generated by the old CSS Extension, when the StyleInfo declares <format>sld</format> and its filename points to a
* derived SLD.
*/
@Test
public void testRecoverLostCssStyleWithFormatSetToSLD() throws Exception {
StyleInfo styleInfo = catalog.getStyleByName(oldCssStyleWithFormatSLD);
StyleEditPage edit = new StyleEditPage(styleInfo);
tester.startPage(edit);
tester.assertRenderedPage(StyleEditPage.class);
tester.assertNoErrorMessage();
// Assert that the page displays the format as css
tester.assertModelValue("styleForm:context:panel:format", "css");
// Assert that the editor text area contains css
String editorContents = (String) tester
.getComponentFromLastRenderedPage(
"styleForm:styleEditor:editorContainer:editorParent:editor")
.getDefaultModelObject();
Styles.handler("css").parse(editorContents, null, null, null);
// Assert that the catalog's StyleInfo is now a css style
StyleInfo si = catalog.getStyleByName(oldCssStyleWithFormatSLD);
assertEquals("css", si.getFormat());
assertEquals(oldCssStyleWithFormatSLD + ".css", si.getFilename());
}
/**
* Test that the recovery code does not overwrite generated SLD styles if they were subsequently edited.
*/
@Test
public void testIgnoreCssStyleIfSLDWasEdited() throws Exception {
StyleInfo styleInfo = catalog.getStyleByName(oldCssStyleWithSLDManuallyEdited);
StyleEditPage edit = new StyleEditPage(styleInfo);
tester.startPage(edit);
tester.assertRenderedPage(StyleEditPage.class);
tester.assertNoErrorMessage();
// Assert that the page displays the format as SLD
tester.assertModelValue("styleForm:context:panel:format", "sld");
// Assert that the editor text area contains SLD
String editorContents = (String) tester
.getComponentFromLastRenderedPage(
"styleForm:styleEditor:editorContainer:editorParent:editor")
.getDefaultModelObject();
Styles.handler("sld").parse(editorContents, null, null, null);
// Assert that the catalog's StyleInfo is still a SLD style
StyleInfo si = catalog.getStyleByName(oldCssStyleWithSLDManuallyEdited);
assertEquals("sld", si.getFormat());
assertEquals(oldCssStyleWithSLDManuallyEdited + ".sld", si.getFilename());
}
}