/* (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.web.data.store.arcsde;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.io.Serializable;
import java.util.Arrays;
import java.util.List;
import org.apache.wicket.Page;
import org.apache.wicket.feedback.FeedbackMessage;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.model.Model;
import org.apache.wicket.util.tester.FormTester;
import org.geoserver.catalog.Catalog;
import org.geoserver.catalog.CoverageStoreInfo;
import org.geoserver.web.GeoServerApplication;
import org.geoserver.web.GeoServerWicketTestSupport;
import org.geoserver.web.data.store.CoverageStoreEditPage;
import org.geoserver.web.data.store.CoverageStoreNewPage;
import org.geoserver.web.data.store.StoreEditPanel;
import org.geoserver.web.data.store.StoreExtensionPoints;
import org.geoserver.web.data.store.panel.PasswordParamPanel;
import org.geoserver.web.data.store.panel.TextParamPanel;
import org.geotools.arcsde.raster.gce.ArcSDERasterFormat;
import org.geotools.arcsde.session.ArcSDEConnectionConfig;
import org.geotools.arcsde.session.ISession;
import org.geotools.arcsde.session.ISessionPool;
import org.geotools.arcsde.session.ISessionPoolFactory;
import org.geotools.arcsde.session.SessionWrapper;
import org.geotools.arcsde.session.UnavailableConnectionException;
import org.junit.Test;
/**
*
* @author Gabriel Roldan
*/
public class ArcSDECoverageStoreEditPanelTest extends GeoServerWicketTestSupport {
private Page page;
private CoverageStoreInfo storeInfo;
private Form<CoverageStoreInfo> editForm;
@SuppressWarnings("unchecked")
private ArcSDECoverageStoreEditPanel startPanelToEditStore() {
final Catalog catalog = getCatalog();
storeInfo = catalog.getFactory().createCoverageStore();
storeInfo.setDescription("fake arcsde store");
storeInfo.setEnabled(true);
storeInfo.setName("fakeArcsde");
storeInfo.setType(ArcSDERasterFormat.getInstance().getName());
storeInfo.setWorkspace(catalog.getDefaultWorkspace());
storeInfo.setURL("sde://user:pass@localhost:5151/#FAKE.TABLE");
catalog.save(storeInfo);
final String storeId = storeInfo.getId();
login();
page = new CoverageStoreEditPage(storeId);
tester.startPage(page);
editForm = (Form<CoverageStoreInfo>) tester.getComponentFromLastRenderedPage("rasterStoreForm");
ArcSDECoverageStoreEditPanel panel = (ArcSDECoverageStoreEditPanel) tester
.getComponentFromLastRenderedPage("rasterStoreForm:parametersPanel");
return panel;
}
@SuppressWarnings("unchecked")
private ArcSDECoverageStoreEditPanel startPanelForNewStore() {
login();
page = new CoverageStoreNewPage(ArcSDERasterFormat.getInstance().getName());
tester.startPage(page);
editForm = (Form<CoverageStoreInfo>) tester.getComponentFromLastRenderedPage("rasterStoreForm");
ArcSDECoverageStoreEditPanel panel = (ArcSDECoverageStoreEditPanel) tester
.getComponentFromLastRenderedPage("rasterStoreForm:parametersPanel");
return panel;
}
@Test
public void testExtensionPoint() {
storeInfo = getCatalog().getFactory().createCoverageStore();
storeInfo.setType(ArcSDERasterFormat.getInstance().getName());
// need to set name so BaseWicketTester does not fail on storeInfo.toString returning
// null... odd.
storeInfo.setName("test storeInfo Name");
editForm = new Form<CoverageStoreInfo>("formId");
editForm.setModel(new Model<CoverageStoreInfo>(storeInfo));
GeoServerApplication app = getGeoServerApplication();
StoreEditPanel storeEditPanel = StoreExtensionPoints.getStoreEditPanel("id", editForm,
storeInfo, app);
assertNotNull(storeEditPanel);
assertTrue(storeEditPanel instanceof ArcSDECoverageStoreEditPanel);
}
@Test
public void testStartupForNew() {
startPanelForNewStore();
final String base = "rasterStoreForm:parametersPanel:";
tester.assertComponent(base + "connectionPrototype", DropDownChoice.class);
tester.assertComponent(base + "server", TextParamPanel.class);
tester.assertComponent(base + "port", TextParamPanel.class);
tester.assertComponent(base + "instance", TextParamPanel.class);
tester.assertComponent(base + "user", TextParamPanel.class);
tester.assertComponent(base + "password", PasswordParamPanel.class);
tester.assertComponent(base + "tableNamePanel", RasterTableSelectionPanel.class);
}
@Test
public void testStartupForEdit() {
startPanelToEditStore();
// print(page, true, true);
final String base = "rasterStoreForm:parametersPanel:";
tester.assertComponent(base + "connectionPrototype", DropDownChoice.class);
tester.assertComponent(base + "server", TextParamPanel.class);
tester.assertComponent(base + "port", TextParamPanel.class);
tester.assertComponent(base + "instance", TextParamPanel.class);
tester.assertComponent(base + "user", TextParamPanel.class);
tester.assertComponent(base + "password", PasswordParamPanel.class);
// this is a TextParamPanel instead of a RasterTableSelectionPanel when editing instead of
// adding
tester.assertComponent(base + "tableNamePanel", TextParamPanel.class);
tester.assertModelValue(base + "tableNamePanel:border:border_body:paramValue", "FAKE.TABLE");
}
/**
* Connection parameters are not properly set and the refresh raster tables button is hit
*/
@Test
public void testRefreshRasterTableListBadConnectionParams() {
startPanelForNewStore();
final FormTester formTester = tester.newFormTester("rasterStoreForm");
final String base = "rasterStoreForm:parametersPanel:";
RasterTableSelectionPanel tableChooserPanel = (RasterTableSelectionPanel) tester
.getComponentFromLastRenderedPage(base + "tableNamePanel");
tableChooserPanel.setSessionFactory(new ISessionPoolFactory() {
public ISessionPool createPool(final ArcSDEConnectionConfig config) throws IOException {
throw new IOException("can't connect for some reason");
}
});
// print(page, true, true);
// simulate clicking on the refresh button
String submitLink = base + "tableNamePanel:refresh";
tester.executeAjaxEvent(submitLink, "click");
FeedbackMessage feedbackMessage = formTester.getForm().getFeedbackMessages().first();
assertNotNull(feedbackMessage);
Serializable message = feedbackMessage.getMessage();
assertNotNull(message);
String expectedMessage = "Refreshing raster tables list: can't connect for some reason";
assertEquals(expectedMessage, message.toString());
}
/**
* Connection parameters are properly set and the refresh raster tables button is hit, producing
* the DropDownChoice to be filled up with the table names
*/
@Test
public void testRefreshRasterTableList() {
startPanelForNewStore();
final FormTester formTester = tester.newFormTester("rasterStoreForm");
final String base = "rasterStoreForm:parametersPanel:";
RasterTableSelectionPanel tableChooserPanel = (RasterTableSelectionPanel) tester
.getComponentFromLastRenderedPage(base + "tableNamePanel");
final List<String> rasterColumns = Arrays.asList("FAKE.TABLE1", "FAKE.TABLE2",
"FAKE.TABLE3");
tableChooserPanel.setSessionFactory(new ISessionPoolFactory() {
public ISessionPool createPool(final ArcSDEConnectionConfig config) throws IOException {
return new ISessionPool() {
public ISession getSession() throws IOException, UnavailableConnectionException {
return getSession(true);
}
public ISession getSession(final boolean transactional) throws IOException, UnavailableConnectionException {
return new SessionWrapper(null) {
@Override
public List<String> getRasterColumns() throws IOException {
return rasterColumns;
}
@Override
public void dispose() {
// do nothing
}
};
}
public boolean isClosed() {
return false;
}
public int getPoolSize() {
return 1;
}
public int getInUseCount() {
return 0;
}
public ArcSDEConnectionConfig getConfig() {
return config;
}
public int getAvailableCount() {
return 1;
}
public void close() {
// do nothing
}
};
}
});
final String dropDownPath = base + "tableNamePanel:border:border_body:rasterTable";
final DropDownChoice<?> choice = (DropDownChoice<?>) tester
.getComponentFromLastRenderedPage(dropDownPath);
assertTrue(choice.getChoices().isEmpty());
// simulate clicking on the refresh button
String submitLink = base + "tableNamePanel:refresh";
tester.executeAjaxEvent(submitLink, "click");
FeedbackMessage feedbackMessage = formTester.getForm().getFeedbackMessages().first();
assertNull(feedbackMessage);
assertEquals(rasterColumns, choice.getChoices());
}
}