/* (c) 2014 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.user;
import static org.junit.Assert.*;
import java.util.SortedSet;
import org.apache.wicket.extensions.markup.html.form.palette.component.Recorder;
import org.apache.wicket.feedback.FeedbackMessage;
import org.geoserver.security.impl.GeoServerRole;
import org.geoserver.security.impl.GeoServerUser;
import org.geoserver.security.impl.GeoServerUserGroup;
import org.geoserver.security.web.AbstractSecurityPage;
import org.geoserver.security.web.SecurityNamedServiceEditPage;
import org.geoserver.security.web.UserGroupRoleServicesPage;
import org.junit.Before;
import org.junit.Test;
public class NewUserPageTest extends AbstractUserPageTest {
protected void initializeTester() {
AbstractSecurityPage returnPage = initializeForUGServiceNamed(getUserGroupServiceName());
tester.startPage(page=(AbstractUserPage)
new NewUserPage(getUserGroupServiceName()).setReturnPage(returnPage));
}
@Before
public void init() throws Exception {
doInitialize();
clearServices();
}
protected void doInitialize() throws Exception {
initializeForXML();
}
@Test
public void testFill() throws Exception{
doTestFill();
}
protected void doTestFill() throws Exception {
insertValues();
initializeTester();
tester.assertRenderedPage(NewUserPage.class);
newFormTester();
form.setValue("username", "testuser");
form.setValue("password", "pwd");
form.setValue("confirmPassword", "pwd");
assertTrue(((GeoServerUser)page.get("form").getDefaultModelObject()).isEnabled());
form.setValue("enabled", false);
//addUserProperty("coord", "10 10");
assertTrue(page.userGroupPalette.isEnabled());
tester.assertComponent("form:roles:palette:recorder", Recorder.class);
addNewRole("ROLE_NEW");
tester.assertRenderedPage(NewUserPage.class);
tester.assertNoErrorMessage();
assignRole("ROLE_NEW");
// reopen new role dialog again to ensure that the current state is not lost
openCloseRolePanel(NewUserPage.class);
tester.assertNoErrorMessage();
addNewGroup("testgroup");
assignGroup("testgroup");
tester.assertNoErrorMessage();
openCloseGroupPanel(NewUserPage.class);
tester.assertNoErrorMessage();
assertCalculatedRoles(new String[] { "ROLE_NEW" });
form.submit("save");
tester.assertNoErrorMessage();
tester.assertRenderedPage(SecurityNamedServiceEditPage.class);
GeoServerUser user = ugService.getUserByUsername("testuser");
assertNotNull(user);
assertFalse(user.isEnabled());
//assertEquals(1,user.getProperties().size());
//assertEquals("10 10",user.getProperties().get("coord"));
SortedSet<GeoServerUserGroup> groupList = ugService.getGroupsForUser(user);
assertEquals(1,groupList.size());
assertEquals("testgroup",groupList.iterator().next().getGroupname());
SortedSet<GeoServerRole> roleList = gaService.getRolesForUser("testuser");
assertEquals(1,roleList.size());
assertEquals("ROLE_NEW",roleList.iterator().next().getAuthority());
}
@Test
public void testFill3() throws Exception{
doTestFill3();
}
protected void doTestFill3() throws Exception {
insertValues();
initializeTester();
tester.assertRenderedPage(NewUserPage.class);
newFormTester();
form.setValue("username", "testuser");
form.setValue("password", "pwd");
form.setValue("confirmPassword", "pwd");
// TODO: this is a dummy call for the formtester to store
// the above vaules in the model, otherwise we would
// lose the values due to the assingRole call
openCloseGroupPanel(NewUserPage.class);
assignRole("ROLE_WMS");
assertCalculatedRoles(new String[] { "ROLE_AUTHENTICATED","ROLE_WMS" });
form.submit("save");
tester.assertErrorMessages(new String[0]);
tester.assertRenderedPage(SecurityNamedServiceEditPage.class);
GeoServerUser user = ugService.getUserByUsername("testuser");
assertNotNull(user);
assertTrue(user.isEnabled());
SortedSet<GeoServerUserGroup> groupList = ugService.getGroupsForUser(user);
assertEquals(0,groupList.size());
SortedSet<GeoServerRole> roleList = gaService.getRolesForUser("testuser");
assertEquals(1,roleList.size());
assertTrue(roleList.contains(gaService.createRoleObject("ROLE_WMS")));
user = (GeoServerUser) ugService.loadUserByUsername("testuser");
assertEquals(2,user.getAuthorities().size());
assertTrue(user.getAuthorities().contains(gaService.createRoleObject("ROLE_AUTHENTICATED")));
assertTrue(user.getAuthorities().contains(gaService.createRoleObject("ROLE_WMS")));
}
@Test
public void testFill2() throws Exception{
//initializeForXML();
doTestFill2();
}
protected void doTestFill2() throws Exception {
insertValues();
addAdditonalData();
initializeTester();
tester.assertRenderedPage(NewUserPage.class);
newFormTester();
form.setValue("username", "testuser");
form.setValue("password", "pwd");
form.setValue("confirmPassword", "pwd");
// TODO: this is a dummy call for the formtester to store
// the above vaules in the model, otherwise we would
// lose the values due to the assingGroup call
openCloseGroupPanel(NewUserPage.class);
assignGroup("group1");
assertCalculatedRoles(new String[] { "ROLE_AUTHENTICATED","ROLE_WFS","ROLE_WMS" });
form.submit("save");
tester.assertErrorMessages(new String[0]);
tester.assertRenderedPage(SecurityNamedServiceEditPage.class);
GeoServerUser user = ugService.getUserByUsername("testuser");
assertNotNull(user);
assertTrue(user.isEnabled());
SortedSet<GeoServerUserGroup> groupList = ugService.getGroupsForUser(user);
assertEquals(1,groupList.size());
assertEquals("group1",groupList.iterator().next().getGroupname());
SortedSet<GeoServerRole> roleList = gaService.getRolesForUser("testuser");
assertEquals(0,roleList.size());
user = (GeoServerUser) ugService.loadUserByUsername("testuser");
assertEquals(3,user.getAuthorities().size());
assertTrue(user.getAuthorities().contains(gaService.createRoleObject("ROLE_AUTHENTICATED")));
assertTrue(user.getAuthorities().contains(gaService.createRoleObject("ROLE_WFS")));
assertTrue(user.getAuthorities().contains(gaService.createRoleObject("ROLE_WMS")));
}
@Test
public void testUserNameConflict() throws Exception {
insertValues();
initializeTester();
tester.assertRenderedPage(NewUserPage.class);
newFormTester();
form.setValue("username", "user1");
form.setValue("password", "pwd");
form.setValue("confirmPassword", "pwd");
form.submit("save");
assertTrue(testErrorMessagesWithRegExp(".*user1.*"));
tester.getMessages(FeedbackMessage.ERROR);
tester.assertRenderedPage(NewUserPage.class);
}
@Test
public void testInvalidWorkflow() throws Exception{
activateROUGService();
AbstractSecurityPage returnPage = initializeForUGServiceNamed(getROUserGroupServiceName());
boolean fail = true;
try {
tester.startPage(page=(AbstractUserPage)
new NewUserPage(getROUserGroupServiceName()).setReturnPage(returnPage));
} catch (RuntimeException ex) {
fail = false;
}
if (fail)
fail("No runtime exception for read only UserGroupService");
}
@Test
public void testPasswordsDontMatch() throws Exception {
super.doTestPasswordsDontMatch(NewUserPage.class);
}
}