/* (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.security.web.data;
import static org.junit.Assert.*;
import java.util.List;
import org.apache.wicket.extensions.markup.html.form.palette.component.Recorder;
import org.apache.wicket.util.tester.FormTester;
import org.geoserver.data.test.MockData;
import org.geoserver.security.AccessMode;
import org.geoserver.security.impl.GeoServerRole;
import org.geoserver.security.impl.DataAccessRule;
import org.geoserver.security.impl.DataAccessRuleDAO;
import org.geoserver.security.web.AbstractSecurityWicketTestSupport;
import org.geoserver.security.web.role.NewRolePage;
import org.geoserver.test.RunTestSetup;
import org.junit.Before;
import org.junit.Test;
public class EditDataAccessRulePageTest extends AbstractSecurityWicketTestSupport {
EditDataAccessRulePage page;
String ruleName = MockData.CITE_PREFIX+
"."+MockData.LAKES.getLocalPart()+"."+AccessMode.WRITE.getAlias();
@Before
public void init() throws Exception {
initializeForXML();
clearServices();
DataAccessRuleDAO.get().clear();
}
@Test
public void testFill() throws Exception {
tester.startPage(page=new EditDataAccessRulePage(getRule(ruleName)));
tester.assertRenderedPage(EditDataAccessRulePage.class);
tester.assertModelValue("form:root", MockData.CITE_PREFIX);
tester.assertModelValue("form:layerContainer:layerAndLabel:layer", MockData.LAKES.getLocalPart());
tester.assertModelValue("form:accessMode", AccessMode.WRITE);
// Does not work with Palette
//tester.assertModelValue("form:roles:roles:recorder", { ROLE_WMS,ROLE_WFS });
tester.assertModelValue("form:roles:anyRole",Boolean.FALSE);
tester.assertComponent("form:roles:palette:recorder", Recorder.class);
FormTester form = tester.newFormTester("form");
form.setValue("roles:anyRole", true);
// open new role dialog again to ensure that the current state is not lost
form.submit("roles:addRole");
tester.assertRenderedPage(NewRolePage.class);
tester.clickLink("form:cancel");
tester.assertRenderedPage(EditDataAccessRulePage.class);
form=tester.newFormTester("form");
form.setValue("roles:anyRole", true);
form.submit("save");
tester.assertErrorMessages(new String[0]);
tester.assertRenderedPage(DataSecurityPage.class);
DataAccessRule rule = getRule(ruleName);
assertNotNull(rule);
assertEquals(1,rule.getRoles().size());
assertEquals(GeoServerRole.ANY_ROLE,rule.getRoles().iterator().next());
}
@Test
@RunTestSetup
public void testEmptyRoles() throws Exception {
//initializeForXML();
initializeServiceRules();
tester.startPage(page=new EditDataAccessRulePage(getRule(ruleName)));
FormTester form = tester.newFormTester("form");
form.setValue("roles:palette:recorder", "");
form.submit("save");
tester.assertRenderedPage(EditDataAccessRulePage.class);
//print(tester.getLastRenderedPage(),true,true);
assertTrue(testErrorMessagesWithRegExp(".*no role.*"));
tester.assertRenderedPage(EditDataAccessRulePage.class);
}
@Test
public void testReadOnlyRoleService() throws Exception{
//initializeForXML();
activateRORoleService();
tester.startPage(page=new EditDataAccessRulePage(getRule(ruleName)));
tester.assertInvisible("form:roles:addRole");
}
protected int indexOf(List<? extends String> strings, String searchValue) {
int index =0;
for (String s : strings) {
if (s.equals(searchValue))
return index;
index++;
}
assertTrue(index!=-1);
return -1;
}
DataAccessRule getRule(String key) {
DataAccessRuleDAO.get().reload();
for (DataAccessRule rule : DataAccessRuleDAO.get().getRules()) {
if (key.equals(rule.getKey())) {
return rule;
}
}
return null;
}
}