package jnpf.dmsPermission; import jnpf.dmsEntity.permission.model.DmsSubjectSet; import jnpf.dmsMapper.DmsPermissionGroupMapper; import jnpf.permission.entity.PermissionGroupEntity; import org.junit.jupiter.api.Test; import java.util.Arrays; import java.util.Collections; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; class DmsPermissionGroupMembershipResolverTest { @Test void resolvesMultipleSubjectsWithOneGroupLoad() { DmsPermissionGroupMapper mapper = mock(DmsPermissionGroupMapper.class); DmsPermissionGroupMembershipResolver resolver = new DmsPermissionGroupMembershipResolver(mapper); when(mapper.selectEnabled(11)).thenReturn(Arrays.asList( group("group-all", 0, null), group("group-user-1", 1, "user-1--user"), group("group-position-2", 1, "position-2--pos"))); DmsSubjectSet first = subject("user-1", null); DmsSubjectSet second = subject("user-2", "position-2"); resolver.resolveAll(Arrays.asList(first, second), 10); assertEquals(set("group-all", "group-user-1"), first.getPermissionGroupIds()); assertEquals(set("group-all", "group-position-2"), second.getPermissionGroupIds()); verify(mapper, times(1)).selectEnabled(11); } @Test void singleSubjectEntryPointRemainsCompatible() { DmsPermissionGroupMapper mapper = mock(DmsPermissionGroupMapper.class); DmsPermissionGroupMembershipResolver resolver = new DmsPermissionGroupMembershipResolver(mapper); when(mapper.selectEnabled(6)).thenReturn(Collections.singletonList( group("group-user", 1, "user-1--user"))); DmsSubjectSet subject = subject("user-1", null); resolver.resolveAll(subject, 5); assertEquals(set("group-user"), subject.getPermissionGroupIds()); verify(mapper, times(1)).selectEnabled(6); } @Test void rejectsGroupScanOverflowBeforeMutatingSubjects() { DmsPermissionGroupMapper mapper = mock(DmsPermissionGroupMapper.class); DmsPermissionGroupMembershipResolver resolver = new DmsPermissionGroupMembershipResolver(mapper); when(mapper.selectEnabled(2)).thenReturn(Arrays.asList( group("group-1", 0, null), group("group-2", 0, null))); DmsSubjectSet subject = subject("user-1", null); DmsPermissionException error = assertThrows(DmsPermissionException.class, () -> resolver.resolveAll(Collections.singletonList(subject), 1)); assertEquals(DmsPermissionError.INVALID_REQUEST, error.getError()); assertEquals(Collections.emptySet(), subject.getPermissionGroupIds()); } @Test void matchesPlatformHierarchyScopesWithoutTreatingAncestorsAsDirectMembers() { DmsPermissionGroupMapper mapper = mock(DmsPermissionGroupMapper.class); DmsPermissionGroupMembershipResolver resolver = new DmsPermissionGroupMembershipResolver(mapper); when(mapper.selectEnabled(30)).thenReturn(Arrays.asList( group("raw-user", 1, "user-1"), group("raw-org", 1, "org-child"), group("raw-position", 1, "position-child"), group("direct-org", 1, "org-child--org"), group("parent-not-direct-org", 1, "org-parent--org"), group("parent-sub-org", 1, "org-parent--subOrg"), group("root-not-sub-org", 1, "org-root--subOrg"), group("root-progeny-org", 1, "org-root--progenyOrg"), group("direct-position", 1, "position-child--pos"), group("parent-not-direct-position", 1, "position-parent--pos"), group("parent-sub-position", 1, "position-parent--subPos"), group("root-not-sub-position", 1, "position-root--subPos"), group("root-progeny-position", 1, "position-root--progenyPos"), group("direct-user-role", 1, "role-direct--role"), group("effective-only-role", 1, "role-inherited--role"), group("platform-group", 1, "platform-group-1--group"))); DmsSubjectSet subject = subject("user-1", "position-child"); subject.getDirectOrgIds().add("org-child"); subject.getImmediateParentOrgIds().add("org-parent"); subject.getAncestorOrgIds().addAll(Arrays.asList("org-root", "org-parent", "org-child")); subject.getImmediateParentPositionIds().add("position-parent"); subject.getAncestorPositionIds().addAll(Arrays.asList( "position-root", "position-parent", "position-child")); subject.getRoleIds().addAll(Arrays.asList("role-direct", "role-inherited")); subject.getDirectUserRoleIds().add("role-direct"); subject.getPlatformGroupIds().add("platform-group-1"); resolver.resolveAll(subject, 29); assertEquals(set("raw-user", "direct-org", "parent-sub-org", "root-progeny-org", "direct-position", "parent-sub-position", "root-progeny-position", "direct-user-role", "platform-group"), subject.getPermissionGroupIds()); } private DmsSubjectSet subject(String userId, String positionId) { DmsSubjectSet result = new DmsSubjectSet(); result.setUserId(userId); if (positionId != null) { result.getPositionIds().add(positionId); } return result; } private PermissionGroupEntity group(String id, Integer type, String members) { PermissionGroupEntity result = new PermissionGroupEntity(); result.setId(id); result.setType(type); result.setPermissionMember(members); return result; } private java.util.LinkedHashSet set(String... values) { return new java.util.LinkedHashSet<>(Arrays.asList(values)); } }