package jnpf.dmsPermission; import jnpf.dmsEntity.permission.entity.DmsFilePermissionEntity; import jnpf.dmsEntity.permission.model.DmsResourcePath; import jnpf.dmsEntity.permission.model.DmsSubjectSet; import org.junit.jupiter.api.Test; import java.util.Arrays; import java.util.UUID; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; class DmsPermissionMatcherTest { private final DmsPermissionMatcher matcher = new DmsPermissionMatcher(); private final UUID root = UUID.randomUUID(); private final UUID child = UUID.randomUUID(); private final UUID document = UUID.randomUUID(); private final UUID version = UUID.randomUUID(); @Test void folderSelfCoversDirectDocumentButNotChildFolder() { DmsFilePermissionEntity permission = permission("FOLDER", root, "SELF", "USER", "u1", false); DmsSubjectSet subjects = user("u1"); assertTrue(matcher.matches(permission, documentPath(root), subjects)); assertFalse(matcher.matches(permission, folderPath(child, root), subjects)); } @Test void folderSubtreeCoversDescendantVersion() { DmsFilePermissionEntity permission = permission("FOLDER", root, "SUBTREE", "USER", "u1", false); assertTrue(matcher.matches(permission, versionPath(child, root), user("u1"))); } @Test void documentSelfCoversAllItsVersions() { DmsFilePermissionEntity permission = permission("DOCUMENT", document, "SELF", "USER", "u1", false); assertTrue(matcher.matches(permission, versionPath(child, root), user("u1"))); } @Test void fileVersionDoesNotCoverAnotherVersion() { DmsFilePermissionEntity permission = permission("FILE_VERSION", version, "SELF", "USER", "u1", false); DmsResourcePath other = versionPath(child, root); other.setActualResourceId(UUID.randomUUID()); assertFalse(matcher.matches(permission, other, user("u1"))); } @Test void childOrganizationRequiresIncludeChildOrgs() { DmsSubjectSet subjects = user("u1"); subjects.getDirectOrgIds().add("child-org"); subjects.getAncestorOrgIds().addAll(Arrays.asList("child-org", "root-org")); DmsFilePermissionEntity directOnly = permission("DOCUMENT", document, "SELF", "ORG", "root-org", false); DmsFilePermissionEntity descendants = permission("DOCUMENT", document, "SELF", "ORG", "root-org", true); assertFalse(matcher.matches(directOnly, documentPath(child), subjects)); assertTrue(matcher.matches(descendants, documentPath(child), subjects)); } @Test void dmsGroupUsesResolvedPermissionGroupsOnly() { DmsSubjectSet subjects = user("u1"); subjects.getPlatformGroupIds().add("g1"); DmsFilePermissionEntity permission = permission("DOCUMENT", document, "SELF", "GROUP", "g1", false); assertFalse(matcher.matches(permission, documentPath(child), subjects)); subjects.getPermissionGroupIds().add("g1"); assertTrue(matcher.matches(permission, documentPath(child), subjects)); } private DmsFilePermissionEntity permission(String type, UUID resourceId, String scope, String principalType, String principalId, boolean childOrgs) { DmsFilePermissionEntity result = new DmsFilePermissionEntity(); result.setResourceType(type); result.setResourceId(resourceId); result.setResourceScope(scope); result.setPrincipalType(principalType); result.setPrincipalId(principalId); result.setIncludeChildOrgs(childOrgs); return result; } private DmsSubjectSet user(String id) { DmsSubjectSet result = new DmsSubjectSet(); result.setUserId(id); return result; } private DmsResourcePath folderPath(UUID actual, UUID... ancestors) { DmsResourcePath result = new DmsResourcePath(); result.setActualResourceType("FOLDER"); result.setActualResourceId(actual); result.setDirectFolderId(actual); result.getFolderPath().add(actual); result.getFolderPath().addAll(Arrays.asList(ancestors)); return result; } private DmsResourcePath documentPath(UUID folder) { DmsResourcePath result = new DmsResourcePath(); result.setActualResourceType("DOCUMENT"); result.setActualResourceId(document); result.setDocumentId(document); result.setDirectFolderId(folder); result.getFolderPath().add(folder); return result; } private DmsResourcePath versionPath(UUID folder, UUID... ancestors) { DmsResourcePath result = new DmsResourcePath(); result.setActualResourceType("FILE_VERSION"); result.setActualResourceId(version); result.setDocumentId(document); result.setDirectFolderId(folder); result.getFolderPath().add(folder); result.getFolderPath().addAll(Arrays.asList(ancestors)); return result; } }