diff --git a/ccm-core/src/test/java/org/libreccm/core/PermissionRepositoryTest.java b/ccm-core/src/test/java/org/libreccm/core/PermissionRepositoryTest.java new file mode 100644 index 000000000..48a1ea654 --- /dev/null +++ b/ccm-core/src/test/java/org/libreccm/core/PermissionRepositoryTest.java @@ -0,0 +1,320 @@ +/* + * Copyright (C) 2015 LibreCCM Foundation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ +package org.libreccm.core; + +import static org.hamcrest.Matchers.*; + +import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.arquillian.junit.Arquillian; +import org.jboss.arquillian.junit.InSequence; +import org.jboss.arquillian.persistence.PersistenceTest; +import org.jboss.arquillian.persistence.UsingDataSet; +import org.jboss.arquillian.transaction.api.annotation.TransactionMode; +import org.jboss.arquillian.transaction.api.annotation.Transactional; +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.asset.EmptyAsset; +import org.jboss.shrinkwrap.api.spec.WebArchive; +import org.jboss.shrinkwrap.resolver.api.maven.Maven; +import org.jboss.shrinkwrap.resolver.api.maven.PomEquippedResolveStage; +import org.junit.After; +import org.junit.AfterClass; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; +import org.junit.experimental.categories.Category; +import org.junit.runner.RunWith; +import org.libreccm.tests.categories.IntegrationTest; + +import java.io.File; +import java.util.Comparator; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import javax.inject.Inject; + +/** + * + * @author Jens Pelzetter + */ +@Category(IntegrationTest.class) +@RunWith(Arquillian.class) +@PersistenceTest +@Transactional(TransactionMode.COMMIT) +public class PermissionRepositoryTest { + + @Inject + private transient PermissionRepository permissionRepository; + + @Inject + private transient UserRepository userRepository; + + @Inject + private transient GroupRepository groupRepository; + + @Inject + private transient CcmObjectRepository ccmObjectRepository; + + public PermissionRepositoryTest() { + } + + @BeforeClass + public static void setUpClass() { + } + + @AfterClass + public static void tearDownClass() { + } + + @Before + public void setUp() { + } + + @After + public void tearDown() { + } + + @Deployment + public static WebArchive createDeployment() { + final PomEquippedResolveStage pom = Maven + .resolver() + .loadPomFromFile("pom.xml"); + final PomEquippedResolveStage dependencies = pom. + importCompileAndRuntimeDependencies(); + final File[] libs = dependencies.resolve().withTransitivity().asFile(); + + for (File lib : libs) { + System.err.printf("Adding file '%s' to test archive...%n", + lib.getName()); + } + + return ShrinkWrap + .create(WebArchive.class, + "LibreCCM-org.libreccm.core.UserRepositoryTest.war") + .addPackage(User.class.getPackage()) + .addPackage(org.libreccm.web.Application.class.getPackage()) + .addPackage(org.libreccm.categorization.Category.class. + getPackage()) + .addPackage(org.libreccm.l10n.LocalizedString.class.getPackage()). + addPackage(org.libreccm.jpa.EntityManagerProducer.class + .getPackage()) + .addPackage(org.libreccm.jpa.utils.MimeTypeConverter.class + .getPackage()) + .addPackage(org.libreccm.testutils.EqualsVerifier.class. + getPackage()) + .addPackage(org.libreccm.tests.categories.IntegrationTest.class + .getPackage()) + .addAsLibraries(libs) + .addAsResource("test-persistence.xml", + "META-INF/persistence.xml") + .addAsWebInfResource("test-web.xml", "WEB-INF/web.xml") + .addAsWebInfResource(EmptyAsset.INSTANCE, "WEB-INF/beans.xml"); + } + + @Test + @UsingDataSet( + "datasets/org/libreccm/core/PermissionRepositoryTest/data.json") + @InSequence(10) + public void findPermissionsForSubject() { + final User jdoe = userRepository.findByScreenName("jdoe"); + final User mmuster = userRepository.findByScreenName("mmuster"); + final Group admins = groupRepository.findByGroupName("admins"); + final Group users = groupRepository.findByGroupName("users"); + final Group authors = groupRepository.findByGroupName("authors"); + + assertThat(jdoe, is(not(nullValue()))); + assertThat(mmuster, is(not(nullValue()))); + assertThat(admins, is(not(nullValue()))); + assertThat(users, is(not(nullValue()))); + assertThat(authors, is(not(nullValue()))); + + final List permissionsJdoe = permissionRepository + .findPermissionsForSubject(jdoe); + assertThat(permissionsJdoe.size(), is(1)); + assertThat(permissionsJdoe.get(0).getObject().getDisplayName(), + is(equalTo("Test Object 2"))); + assertThat(permissionsJdoe.get(0).getGrantedPrivilege().getPrivilege(), + is(equalTo("read"))); + + final List permissionsMmuster = permissionRepository + .findPermissionsForSubject(mmuster); + assertThat(permissionsMmuster.size(), is(0)); + + final List permissionsAdmins = permissionRepository + .findPermissionsForSubject(admins); + assertThat(permissionsAdmins.size(), is(1)); + assertThat(permissionsAdmins.get(0).getObject(), is(nullValue())); + assertThat(permissionsAdmins.get(0).getGrantedPrivilege().getPrivilege(), + is("admin")); + + final List permissionsUsers = permissionRepository + .findPermissionsForSubject(users); + assertThat(permissionsUsers.size(), is(1)); + assertThat(permissionsUsers.get(0).getObject().getDisplayName(), + is(equalTo("Test Object 1"))); + assertThat(permissionsUsers.get(0).getGrantedPrivilege().getPrivilege(), + is(equalTo("read"))); + + final List permissionsAuthors = permissionRepository + .findPermissionsForSubject(authors); + assertThat(permissionsAuthors.size(), is(2)); + assertThat(permissionsAuthors.get(0).getObject().getDisplayName(), + is(equalTo("Test Object 1"))); + assertThat(permissionsAuthors.get(1).getObject().getDisplayName(), + is(equalTo("Test Object 1"))); + final Set privileges = new HashSet<>(); + privileges.add(permissionsAuthors.get(0).getGrantedPrivilege() + .getPrivilege()); + privileges.add(permissionsAuthors.get(1).getGrantedPrivilege() + .getPrivilege()); + assertThat(privileges, hasItem("read")); + assertThat(privileges, hasItem("write")); + } + + @Test + @UsingDataSet( + "datasets/org/libreccm/core/PermissionRepositoryTest/data.json") + @InSequence(20) + public void findPermissionsForUser() { + final User jdoe = userRepository.findByScreenName("jdoe"); + final User mmuster = userRepository.findByScreenName("mmuster"); + assertThat(jdoe, is(not(nullValue()))); + assertThat(mmuster, is(not(nullValue()))); + + final List jdoePermissions = permissionRepository + .findPermissionsForUser(jdoe); + assertThat(jdoePermissions.size(), is(4)); + jdoePermissions.sort(new Comparator() { + + @Override + public int compare(final Permission permission1, + final Permission permission2) { + int result = permission1.getGrantedPrivilege().getPrivilege() + .compareToIgnoreCase(permission2.getGrantedPrivilege() + .getPrivilege()); + + if (result == 0) { + result = permission1.getObject().getDisplayName().compareTo( + permission2.getObject().getDisplayName()); + } else { + return result; + } + + if (result == 0) { + return permission1.getGrantee().getClass().getName() + .compareTo(permission2.getGrantee().getClass().getName()); + } else { + return result; + } + + } + + }); + + assertThat(jdoePermissions.get(0).getGrantedPrivilege().getPrivilege(), + is(equalTo("read"))); + assertThat(jdoePermissions.get(0).getObject().getDisplayName(), + is(equalTo("Test Object 1"))); + assertThat(jdoePermissions.get(1).getGrantedPrivilege().getPrivilege(), + is(equalTo("read"))); + assertThat(jdoePermissions.get(1).getObject().getDisplayName(), + is(equalTo("Test Object 1"))); + assertThat(jdoePermissions.get(2).getGrantedPrivilege().getPrivilege(), + is(equalTo("read"))); + assertThat(jdoePermissions.get(2).getObject().getDisplayName(), + is(equalTo("Test Object 2"))); + assertThat(jdoePermissions.get(3).getGrantedPrivilege().getPrivilege(), + is(equalTo("write"))); + assertThat(jdoePermissions.get(3).getObject().getDisplayName(), + is(equalTo("Test Object 1"))); + + final List mmusterPermissions = permissionRepository + .findPermissionsForUser(mmuster); + assertThat(mmusterPermissions.size(), is(1)); + assertThat(mmusterPermissions.get(0).getGrantedPrivilege() + .getPrivilege(), + is(equalTo("admin"))); + assertThat(mmusterPermissions.get(0).getObject(), is(nullValue())); + } + + @Test + @UsingDataSet( + "datasets/org/libreccm/core/PermissionRepositoryTest/data.json") + @InSequence(30) + public void findPermissionsForCcmObject() { + final CcmObject object1 = ccmObjectRepository.findById(-10L); + final CcmObject object2 = ccmObjectRepository.findById(-20L); + final CcmObject object3 = ccmObjectRepository.findById(-30L); + + final List object1Permissions = permissionRepository + .findPermissionsForCcmObject(object1); + assertThat(object1Permissions.size(), is(3)); + object1Permissions.sort(new Comparator() { + + @Override + public int compare(final Permission permission1, + final Permission permission2) { + return Long.compare(permission1.getPermissionId(), + permission2.getPermissionId()); + } + + }); + assertThat(object1Permissions.get(0).getGrantedPrivilege() + .getPrivilege(), + is(equalTo("read"))); + assertThat(object1Permissions.get(0).getGrantee(), + is(instanceOf(Group.class))); + assertThat(((Group) object1Permissions.get(0).getGrantee()).getName(), + is(equalTo("authors"))); + assertThat(object1Permissions.get(1).getGrantedPrivilege() + .getPrivilege(), + is(equalTo("write"))); + assertThat(object1Permissions.get(1).getGrantee(), + is(instanceOf(Group.class))); + assertThat(((Group) object1Permissions.get(1).getGrantee()).getName(), + is(equalTo("authors"))); + assertThat(object1Permissions.get(2).getGrantedPrivilege() + .getPrivilege(), + is(equalTo("read"))); + assertThat(object1Permissions.get(2).getGrantee(), + is(instanceOf(Group.class))); + assertThat(((Group) object1Permissions.get(2).getGrantee()).getName(), + is(equalTo("users"))); + + final List object2Permissions = permissionRepository + .findPermissionsForCcmObject(object2); + assertThat(object2Permissions.size(), is(1)); + assertThat(object2Permissions.get(0).getGrantedPrivilege() + .getPrivilege(), + is(equalTo("read"))); + assertThat(object2Permissions.get(0).getGrantee(), + is(instanceOf(User.class))); + assertThat(((User) object2Permissions.get(0).getGrantee()) + .getScreenName(), + is(equalTo("jdoe"))); + + final List object3Permissions = permissionRepository + .findPermissionsForCcmObject(object3); + assertThat(object3Permissions, is(empty())); + } + +}