/* (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.geogig.geoserver.web.data.store.geogig;
import static org.geogig.geoserver.config.GeoServerGeoGigRepositoryResolver.getURI;
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 static org.locationtech.geogig.model.impl.RevObjectTestSupport.hashString;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.io.IOException;
import java.io.Serializable;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;
import org.apache.wicket.Component;
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.geogig.geoserver.config.RepositoryInfo;
import org.geogig.geoserver.config.RepositoryManager;
import org.geoserver.catalog.Catalog;
import org.geoserver.catalog.DataStoreInfo;
import org.geoserver.data.test.SystemTestData;
import org.geoserver.web.GeoServerApplication;
import org.geoserver.web.GeoServerWicketTestSupport;
import org.geoserver.web.data.store.DataAccessEditPage;
import org.geoserver.web.data.store.DataAccessNewPage;
import org.geoserver.web.data.store.StoreEditPanel;
import org.geoserver.web.data.store.StoreExtensionPoints;
import org.geoserver.web.data.store.panel.CheckBoxParamPanel;
import org.junit.Before;
import org.junit.Test;
import org.locationtech.geogig.geotools.data.GeoGigDataStoreFactory;
import org.locationtech.geogig.model.ObjectId;
import org.locationtech.geogig.model.Ref;
import com.google.common.base.Suppliers;
public class GeoGigDataStoreEditPanelTest extends GeoServerWicketTestSupport {
private static final String BASE = "dataStoreForm:parametersPanel";
private Page page;
private DataStoreInfo storeInfo;
private Form<DataStoreInfo> editForm;
private RepositoryManager mockManager;
@Before
public void beforeTest() {
mockManager = mock(RepositoryManager.class);
}
@Override
protected void setUpTestData(SystemTestData testData) throws Exception {
//
}
private <T extends Component> T getComponent(String path, Class<T> clazz) {
return clazz.cast(tester.getComponentFromLastRenderedPage(path));
}
private GeoGigDataStoreEditPanel startPanelForNewStore() {
login();
page = new DataAccessNewPage(GeoGigDataStoreFactory.DISPLAY_NAME);
tester.startPage(page);
editForm = getComponent("dataStoreForm", Form.class);
editForm.getModelObject().getConnectionParameters()
.put(GeoGigDataStoreFactory.REPOSITORY.key, null);
GeoGigDataStoreEditPanel panel = getComponent(BASE, GeoGigDataStoreEditPanel.class);
return panel;
}
private GeoGigDataStoreEditPanel startPanelToEditStore() {
final Catalog catalog = getCatalog();
storeInfo = catalog.getFactory().createDataStore();
storeInfo.setDescription("dummy geogig store");
storeInfo.setEnabled(true);
storeInfo.setName("dummy_geogig");
storeInfo.setType(GeoGigDataStoreFactory.DISPLAY_NAME);
storeInfo.setWorkspace(catalog.getDefaultWorkspace());
storeInfo.getConnectionParameters().put(GeoGigDataStoreFactory.BRANCH.key, "alpha");
storeInfo.getConnectionParameters().put(GeoGigDataStoreFactory.REPOSITORY.key, null);
catalog.save(storeInfo);
final String storeId = storeInfo.getId();
login();
page = new DataAccessEditPage(storeId);
tester.startPage(page);
editForm = getComponent("dataStoreForm", Form.class);
GeoGigDataStoreEditPanel panel = getComponent(BASE, GeoGigDataStoreEditPanel.class);
return panel;
}
private void assertCommonComponents() {
tester.assertComponent(BASE + ":geogig_repository", DropDownChoice.class);
tester.assertComponent(BASE + ":branch", BranchSelectionPanel.class);
tester.assertComponent(BASE + ":autoIndexing", CheckBoxParamPanel.class);
}
@Test
public void testExtensionPoint() {
storeInfo = getCatalog().getFactory().createDataStore();
storeInfo.setType(GeoGigDataStoreFactory.DISPLAY_NAME);
editForm = new Form("formid");
editForm.setModel(new Model(storeInfo));
GeoServerApplication app = getGeoServerApplication();
StoreEditPanel storeEditPanel = StoreExtensionPoints.getStoreEditPanel("id", editForm,
storeInfo, app);
assertNotNull(storeEditPanel);
assertTrue(storeEditPanel instanceof GeoGigDataStoreEditPanel);
}
@Test
public void testStartupForNew() {
startPanelForNewStore();
assertCommonComponents();
}
@Test
public void testStartupForEdit() {
startPanelToEditStore();
assertCommonComponents();
tester.assertModelValue(BASE + ":branch:branchDropDown", "alpha");
}
@Test
public void testRefreshBranchListWithBadConnectionParams() throws Exception {
startPanelForNewStore();
editForm.getModelObject().getConnectionParameters()
.put(GeoGigDataStoreFactory.REPOSITORY.key, getURI("dummy_repo_2"));
final FormTester formTester = tester.newFormTester("dataStoreForm");
BranchSelectionPanel branchPanel = getComponent(BASE + ":branch", BranchSelectionPanel.class);
RepositoryInfo repoInfo = mock(RepositoryInfo.class);
when(repoInfo.getId()).thenReturn(UUID.randomUUID().toString());
when(mockManager.getByRepoName("dummy_repo_2")).thenReturn(repoInfo);
when(mockManager.listBranches(anyString())).thenThrow(new IOException("Could not connect"));
branchPanel.setRepositoryManager(Suppliers.ofInstance(mockManager));
String submitLink = BASE + ":branch:refresh";
tester.executeAjaxEvent(submitLink, "click");
FeedbackMessage feedbackMessage = formTester.getForm().getFeedbackMessages().first();
assertNotNull(feedbackMessage);
Serializable message = feedbackMessage.getMessage();
assertNotNull(message);
String expectedMessage = "Could not list branches: Could not connect";
assertEquals(expectedMessage, message.toString());
}
@Test
public void testRefreshBranchList() throws Exception {
startPanelForNewStore();
editForm.getModelObject().getConnectionParameters()
.put(GeoGigDataStoreFactory.REPOSITORY.key, getURI("dummy_repo_3"));
final FormTester formTester = tester.newFormTester("dataStoreForm");
BranchSelectionPanel branchPanel = getComponent(BASE + ":branch", BranchSelectionPanel.class);
assertNotNull(branchPanel);
ObjectId dummyId = hashString("dummy");
final List<Ref> branches = Arrays.asList(new Ref("master", dummyId),
new Ref("alpha", dummyId), new Ref("sandbox", dummyId));
RepositoryInfo repoInfo = mock(RepositoryInfo.class);
when(repoInfo.getId()).thenReturn(UUID.randomUUID().toString());
branchPanel.setRepositoryManager(Suppliers.ofInstance(mockManager));
when(mockManager.getByRepoName("dummy_repo_3")).thenReturn(repoInfo);
when(mockManager.listBranches(anyString())).thenReturn(branches);
String dropDownPath = BASE + ":branch:branchDropDown";
final DropDownChoice choice = getComponent(dropDownPath, DropDownChoice.class);
assertTrue(choice.getChoices().isEmpty());
String submitLink = BASE + ":branch:refresh";
tester.executeAjaxEvent(submitLink, "click");
FeedbackMessage feedbackMessage = formTester.getForm().getFeedbackMessages().first();
assertNull(feedbackMessage);
assertEquals(Arrays.asList("master", "alpha", "sandbox"), choice.getChoices());
}
}