/* (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.geofence.rest;
import org.geoserver.geofence.GeofenceBaseTest;
import org.geoserver.geofence.core.model.AdminRule;
import org.geoserver.geofence.core.dao.DuplicateKeyException;
import org.geoserver.geofence.rest.xml.JaxbAdminRule;
import org.geoserver.geofence.rest.xml.JaxbAdminRuleList;
import org.geoserver.geofence.core.model.enums.AdminGrantType;
import org.geoserver.geofence.services.AdminRuleAdminService;
import org.geoserver.geofence.services.exception.NotFoundServiceEx;
import org.junit.Test;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import java.util.UUID;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.hamcrest.CoreMatchers.nullValue;
import static org.junit.Assert.assertThat;
public class AdminRulesRestControllerTest extends GeofenceBaseTest {
protected AdminRulesRestController controller;
protected AdminRuleAdminService adminService;
@Override
public void oneTimeSetUp() throws Exception {
setValidating(true);
super.oneTimeSetUp();
controller = (AdminRulesRestController) applicationContext.getBean("adminRulesRestController");
adminService = (AdminRuleAdminService) applicationContext.getBean("adminRuleAdminService");
}
@Test
public void testInsertUpdateDelete() {
JaxbAdminRule rule = new JaxbAdminRule();
rule.setPriority(5L);
rule.setUserName("test_user");
rule.setRoleName("test_role");
rule.setWorkspace("workspace");
rule.setAccess(AdminGrantType.ADMIN.name());
long id = controller.insert(rule).getBody();
AdminRule realRule = adminService.get(id);
assertEquals(rule.getPriority().longValue(), realRule.getPriority());
assertEquals(rule.getUserName(), realRule.getUsername());
assertEquals(rule.getRoleName(), realRule.getRolename());
assertEquals(rule.getWorkspace(), realRule.getWorkspace());
assertEquals(rule.getAccess(), realRule.getAccess().name());
// only update the role
JaxbAdminRule ruleMods = new JaxbAdminRule();
ruleMods.setRoleName("acrobaat");
controller.update(id, ruleMods);
realRule = adminService.get(id);
assertEquals(rule.getUserName(), realRule.getUsername());
assertEquals(ruleMods.getRoleName(), realRule.getRolename());
// insert another rule with same priority
JaxbAdminRule rule2 = new JaxbAdminRule();
rule2.setPriority(5L);
rule2.setAccess(AdminGrantType.USER.name());
long id2 = controller.insert(rule2).getBody();
realRule = adminService.get(id);
assertEquals(6L, realRule.getPriority());
//test changing to non-existing priority
JaxbAdminRule rule2Mods = new JaxbAdminRule();
rule2Mods.setPriority(3L);
controller.update(id2, rule2Mods);
realRule = adminService.get(id2);
assertEquals(3L, realRule.getPriority());
//test changing to existing priority
rule2Mods = new JaxbAdminRule();
rule2Mods.setPriority(6L);
controller.update(id2, rule2Mods);
realRule = adminService.get(id2);
assertEquals(6L, realRule.getPriority());
realRule = adminService.get(id);
assertEquals(7L, realRule.getPriority());
//not found - will be translated by spring exception handler to code 404
controller.delete(id);
boolean notfound = false;
try {
adminService.get(id);
} catch (NotFoundServiceEx e) {
notfound = true;
}
assertTrue(notfound);
//conflict - will be translated by spring exception handler to code 409
boolean conflict = false;
try {
controller.insert(rule2);
} catch (DuplicateKeyException e) {
conflict = true;
}
assertTrue(conflict);
}
@Test
public void testMovingRules() {
// create some rules for the test
String prefix = UUID.randomUUID().toString();
adminService.insert(new AdminRule(5, prefix + "-user5", prefix + "-role1", null, null, null, AdminGrantType.ADMIN));
adminService.insert(new AdminRule(2, prefix + "-user2", prefix + "-role1", null, null, null, AdminGrantType.ADMIN));
adminService.insert(new AdminRule(1, prefix + "-user1", prefix + "-role1", null, null, null, AdminGrantType.ADMIN));
adminService.insert(new AdminRule(4, prefix + "-user4", prefix + "-role2", null, null, null, AdminGrantType.ADMIN));
adminService.insert(new AdminRule(3, prefix + "-user3", prefix + "-role2", null, null, null, AdminGrantType.ADMIN));
adminService.insert(new AdminRule(6, prefix + "-user6", prefix + "-role6", null, null, null, AdminGrantType.ADMIN));
// get the rules so we can access their id
JaxbAdminRuleList originalRules = controller.get(0, 6, false, null, null, null, null, null, null);
validateRules(originalRules, prefix, "user1", "user2", "user3", "user4", "user5", "user6");
// check rules per page
validateRules(0, prefix, "user1", "user2");
validateRules(0, 1, 2);
validateRules(1, prefix, "user3", "user4");
validateRules(1, 3, 4);
validateRules(2, prefix, "user5", "user6");
validateRules(2, 5, 6);
// moving rules for user1 and user2 to the last page
ResponseEntity<JaxbAdminRuleList> result = controller.move(7,
originalRules.getRules().get(0).getId() + "," +
originalRules.getRules().get(1).getId());
validateResult(result, HttpStatus.OK, 2);
validateRules(result.getBody(), prefix, "user1", "user2");
validateRules(result.getBody(), 7L, 8L);
// check rules per page
validateRules(0, prefix, "user3", "user4");
validateRules(0, 3, 4);
validateRules(1, prefix, "user5", "user6");
validateRules(1, 5, 6);
validateRules(2, prefix, "user1", "user2");
validateRules(2, 7, 8);
// moving rules for user3 and user4 to the second page
result = controller.move(7,
originalRules.getRules().get(2).getId() + "," +
originalRules.getRules().get(3).getId());
validateResult(result, HttpStatus.OK, 2);
validateRules(result.getBody(), prefix, "user3", "user4");
validateRules(result.getBody(), 7L, 8L);
// check rules per page
validateRules(0, prefix, "user5", "user6");
validateRules(0, 5, 6);
validateRules(1, prefix, "user3", "user4");
validateRules(1, 7, 8);
validateRules(2, prefix, "user1", "user2");
validateRules(2, 9, 10);
// moving rule for user1 to first page
result = controller.move(5, String.valueOf(originalRules.getRules().get(0).getId()));
validateResult(result, HttpStatus.OK, 1);
validateRules(result.getBody(), prefix, "user1");
validateRules(result.getBody(), 5L);
// check rules per page
validateRules(0, prefix, "user1", "user5");
validateRules(0, 5, 6);
validateRules(1, prefix, "user6", "user3");
validateRules(1, 7, 8);
validateRules(2, prefix, "user4", "user2");
validateRules(2, 9, 11);
// moving rules for user2 and user 3 to first and second page
result = controller.move(6,
originalRules.getRules().get(1).getId() + "," +
originalRules.getRules().get(2).getId());
validateResult(result, HttpStatus.OK, 2);
validateRules(result.getBody(), prefix, "user3", "user2");
validateRules(result.getBody(), 6L, 7L);
// check rules per page
validateRules(0, prefix, "user1", "user3");
validateRules(0, 5, 6);
validateRules(1, prefix, "user2", "user5");
validateRules(1, 7, 8);
validateRules(2, prefix, "user6", "user4");
validateRules(2, 9, 11);
}
/**
* Helper method that will validate a move result.
*/
private void validateResult(ResponseEntity<JaxbAdminRuleList> result, HttpStatus expectedHttpStatus, int rules) {
assertThat(result, notNullValue());
assertThat(result.getStatusCode(), is(expectedHttpStatus));
if (rules > 0) {
assertThat(result.getBody(), notNullValue());
assertThat(result.getBody().getRules().size(), is(rules));
} else {
assertThat(result.getBody(), nullValue());
}
}
/**
* Helper method that will validate the rules present in a certain page based on the user id.
*/
private void validateRules(int page, String prefix, String... expectedUsers) {
JaxbAdminRuleList rules = controller.get(page, 2, false, null, null, null, null, null, null);
validateRules(rules, prefix, expectedUsers);
}
/**
* Helper method that will validate that the provided rules will match the provided user ids.
*/
private void validateRules(JaxbAdminRuleList rules, String prefix, String... expectedUsers) {
assertThat(rules, notNullValue());
assertThat(rules.getRules(), notNullValue());
assertThat(rules.getRules().size(), is(expectedUsers.length));
for (int i = 0; i < expectedUsers.length; i++) {
assertThat(rules.getRules().get(i).getUserName(), is(prefix + "-" + expectedUsers[i]));
}
}
/**
* Helper method that will validate the rules present in a certain page based on the priority.
*/
private void validateRules(int page, long... expectedPriorities) {
JaxbAdminRuleList rules = controller.get(page, 2, false, null, null, null, null, null, null);
validateRules(rules, expectedPriorities);
}
/**
* Helper method that will validate that the provided rules will match the provided priorities.
*/
private void validateRules(JaxbAdminRuleList rules, long... expectedPriorities) {
assertThat(rules, notNullValue());
assertThat(rules.getRules(), notNullValue());
assertThat(rules.getRules().size(), is(expectedPriorities.length));
for (int i = 0; i < expectedPriorities.length; i++) {
assertThat(rules.getRules().get(i).getPriority(), is(expectedPriorities[i]));
}
}
}