/*
* JBoss, Home of Professional Open Source
*
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.picketlink.test.idm.basic;
import org.junit.Test;
import org.picketlink.idm.IdentityManagementException;
import org.picketlink.idm.IdentityManager;
import org.picketlink.idm.RelationshipManager;
import org.picketlink.idm.model.basic.BasicModel;
import org.picketlink.idm.model.basic.Group;
import org.picketlink.idm.model.basic.GroupMembership;
import org.picketlink.idm.model.basic.Realm;
import org.picketlink.idm.model.basic.Role;
import org.picketlink.idm.model.basic.User;
import org.picketlink.idm.query.RelationshipQuery;
import org.picketlink.test.idm.Configuration;
import org.picketlink.test.idm.testers.FileStoreConfigurationTester;
import org.picketlink.test.idm.testers.IdentityConfigurationTester;
import org.picketlink.test.idm.testers.JDBCStoreConfigurationTester;
import org.picketlink.test.idm.testers.JPAStoreConfigurationTester;
import org.picketlink.test.idm.testers.LDAPStoreConfigurationTester;
import org.picketlink.test.idm.testers.LDAPUserGroupJPARoleConfigurationTester;
import org.picketlink.test.idm.testers.SingleConfigLDAPJPAStoreConfigurationTester;
import java.util.Date;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertNull;
import static junit.framework.Assert.assertTrue;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
/**
* <p>
* Test case for the {@link Group} basic management operations using only the default realm.
* </p>
*
* @author <a href="mailto:psilva@redhat.com">Pedro Silva</a>
*
*/
@Configuration(include = {JPAStoreConfigurationTester.class, FileStoreConfigurationTester.class,
SingleConfigLDAPJPAStoreConfigurationTester.class, LDAPStoreConfigurationTester.class})
public class GroupManagementTestCase extends AbstractIdentityTypeTestCase<Group> {
public GroupManagementTestCase(IdentityConfigurationTester builder) {
super(builder);
}
@Test
public void testCreate() throws Exception {
Group newGroup = createGroup("someGroup", null);
Group storedGroup = getGroup(newGroup.getName());
assertNotNull(storedGroup);
assertEquals(newGroup.getId(), storedGroup.getId());
assertEquals(newGroup.getName(), storedGroup.getName());
assertNotNull(storedGroup.getPartition());
assertEquals(Realm.DEFAULT_REALM, storedGroup.getPartition().getName());
assertTrue(storedGroup.isEnabled());
assertNull(storedGroup.getExpirationDate());
assertNotNull(storedGroup.getCreatedDate());
assertTrue(new Date().compareTo(storedGroup.getCreatedDate()) >= 0);
}
@Test (expected=IdentityManagementException.class)
public void testFailCreateWithSameName() throws Exception {
IdentityManager identityManager = getIdentityManager();
Group group = new Group("group");
identityManager.add(group);
Group groupWithSameName = new Group("group");
identityManager.add(groupWithSameName);
}
@Test
@Configuration (exclude = {SingleConfigLDAPJPAStoreConfigurationTester.class, JDBCStoreConfigurationTester.class})
public void testCreateWithSameName() throws Exception {
Group managerGroup = createGroup("managers", null);
// the QA Group was mapped to a different DN. See the LDAP test suite configuration.
Group qaManagerGroup = createGroup("managers", "QA Group");
Group storedManagerGroup = getGroup(managerGroup.getPath());
assertNotNull(storedManagerGroup);
assertEquals(managerGroup.getId(), storedManagerGroup.getId());
assertNull(storedManagerGroup.getParentGroup());
Group storedQAManagerGroup = getGroup(qaManagerGroup.getPath());
assertNotNull(storedQAManagerGroup);
assertEquals(qaManagerGroup.getId(), storedQAManagerGroup.getId());
assertEquals(qaManagerGroup.getPath(), storedQAManagerGroup.getPath());
assertFalse(storedQAManagerGroup.getId().equals(storedManagerGroup.getId()));
assertNotNull(storedQAManagerGroup.getParentGroup());
}
@Test
@Configuration (exclude = SingleConfigLDAPJPAStoreConfigurationTester.class)
public void testCreateWithMultipleParentGroups() {
Group groupA = createGroup("QA Group", null);
Group groupB = createGroupWithParent("groupB", groupA);
Group groupC = createGroupWithParent("groupC", groupB);
Group groupD = createGroupWithParent("groupD", groupC);
Group storedGroupD = getGroup("/QA Group/groupB/groupC/groupD");
assertNotNull(storedGroupD);
assertEquals(storedGroupD.getId(), groupD.getId());
assertNotNull(storedGroupD.getParentGroup());
assertEquals(storedGroupD.getParentGroup().getId(), groupC.getId());
assertNotNull(storedGroupD.getParentGroup().getParentGroup());
assertEquals(storedGroupD.getParentGroup().getParentGroup().getId(), groupB.getId());
assertNotNull(storedGroupD.getParentGroup().getParentGroup().getParentGroup());
assertEquals(storedGroupD.getParentGroup().getParentGroup().getParentGroup().getId(), groupA.getId());
}
@Test
@Configuration (exclude = {LDAPUserGroupJPARoleConfigurationTester.class, SingleConfigLDAPJPAStoreConfigurationTester.class})
public void testDefaultHierarchyDepthConfiguration() {
Group groupRoot = createGroup("Root Group", null);
Group groupA = createGroupWithParent("QA Group", groupRoot);
Group groupB = createGroupWithParent("groupB", groupA);
Group groupC = createGroupWithParent("groupC", groupB);
Group groupD = createGroupWithParent("groupD", groupC);
Group storedGroupD = getGroup("/Root Group/QA Group/groupB/groupC/groupD");
assertNotNull(storedGroupD);
assertEquals(storedGroupD.getId(), groupD.getId());
assertNotNull(storedGroupD.getParentGroup());
assertEquals(storedGroupD.getParentGroup().getId(), groupC.getId());
assertNotNull(storedGroupD.getParentGroup().getParentGroup());
assertEquals(storedGroupD.getParentGroup().getParentGroup().getId(), groupB.getId());
assertNotNull(storedGroupD.getParentGroup().getParentGroup().getParentGroup());
assertEquals(storedGroupD.getParentGroup().getParentGroup().getParentGroup().getId(), groupA.getId());
assertNotNull(storedGroupD.getParentGroup().getParentGroup().getParentGroup().getParentGroup());
}
@Test
@Configuration (exclude = SingleConfigLDAPJPAStoreConfigurationTester.class)
public void testGetGroupPath() throws Exception {
IdentityManager identityManager = getIdentityManager();
Group groupA = createGroup("groupA", null);
Group groupB = createGroupWithParent("groupB", groupA);
Group groupC = createGroupWithParent("groupC", groupB);
Group groupD = createGroupWithParent("groupD", groupC);
Group storedGroupD = getGroup("/groupA/groupB/groupC/groupD");
assertEquals(storedGroupD.getId(), groupD.getId());
assertEquals("/groupA/groupB/groupC/groupD", storedGroupD.getPath());
Group storedGroupB = getGroup("/groupA/groupB");
assertEquals(storedGroupB.getId(), groupB.getId());
assertEquals("/groupA/groupB", storedGroupB.getPath());
Group storedGroupA = getGroup("/groupA");
assertEquals(storedGroupA.getId(), groupA.getId());
assertEquals("/groupA", storedGroupA.getPath());
storedGroupA = getGroup("groupA");
assertEquals(storedGroupA.getId(), groupA.getId());
assertEquals("/groupA", storedGroupA.getPath());
}
@Test
@Configuration (exclude = SingleConfigLDAPJPAStoreConfigurationTester.class)
public void testCreateWithParentGroup() throws Exception {
Group childGroup = createGroup("childGroup", "parentGroup");
Group storedChildGroup = getGroup(childGroup.getPath());
assertNotNull(storedChildGroup);
assertEquals(childGroup.getName(), storedChildGroup.getName());
assertNotNull(storedChildGroup.getParentGroup());
assertEquals(childGroup.getParentGroup().getId(), storedChildGroup.getParentGroup().getId());
}
@Test
@Configuration (exclude = SingleConfigLDAPJPAStoreConfigurationTester.class)
public void testGetWithParent() throws Exception {
Group storedGroup = createIdentityType();
Group parentGroup = getGroup("Test Parent Group");
assertNotNull(parentGroup);
assertNotNull("Test Parent Group", parentGroup.getName());
assertNotNull("/Test Parent Group", parentGroup.getPath());
storedGroup = getGroup("Test Group", parentGroup);
assertNotNull(storedGroup);
assertNotNull(storedGroup.getParentGroup());
assertEquals("Test Group", storedGroup.getName());
Group invalidParentGroup = createGroup("invalidParentGroup", null);
Group invalidGroup = getGroup("Test Group", invalidParentGroup);
assertNull(invalidGroup);
}
@Test
public void testRemove() throws Exception {
Group storedGroup = createIdentityType();
assertNotNull(storedGroup);
IdentityManager identityManager = getIdentityManager();
identityManager.remove(storedGroup);
Group removedGroup = getGroup(storedGroup.getName());
assertNull(removedGroup);
User anotherUser = createUser("user");
Role role = createRole("role");
Group group = createGroup("group", null);
RelationshipManager relationshipManager = getPartitionManager().createRelationshipManager();
BasicModel.addToGroup(relationshipManager, anotherUser, group);
RelationshipQuery<?> relationshipQuery = relationshipManager.createRelationshipQuery(GroupMembership.class);
relationshipQuery.setParameter(GroupMembership.GROUP, group);
assertFalse(relationshipQuery.getResultList().isEmpty());
identityManager.remove(group);
relationshipQuery = relationshipManager.createRelationshipQuery(GroupMembership.class);
relationshipQuery.setParameter(GroupMembership.GROUP, group);
assertTrue(relationshipQuery.getResultList().isEmpty());
}
@Override
protected Group createIdentityType() {
return createGroup("Test Group", "Test Parent Group");
}
@Override
protected Group getIdentityType() {
return getGroup("Test Group", getGroup("Test Parent Group"));
}
@Test
public void testEqualsMethod() {
Group instanceA = createGroup("groupA");
Group instanceB = createGroup("groupB");
assertFalse(instanceA.equals(instanceB));
IdentityManager identityManager = getIdentityManager();
assertTrue(instanceA.getName().equals(getGroup(instanceA.getPath()).getName()));
}
}