package jnpf.dmsMapper; import jnpf.dmsDatabase.DmsUuidTypeHandler; import jnpf.dmsPermission.DmsFileCenterQuery; import org.apache.ibatis.mapping.BoundSql; import org.apache.ibatis.mapping.MappedStatement; import org.apache.ibatis.session.Configuration; import org.junit.jupiter.api.BeforeEach; 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 DmsFileCenterMapperSqlTest { private Configuration configuration; @BeforeEach void setUp() { configuration = new Configuration(); configuration.getTypeHandlerRegistry().register(UUID.class, DmsUuidTypeHandler.class); configuration.addMapper(DmsFileCenterMapper.class); } @Test void ordinaryFolderPageFiltersPermissionsBeforeStableLimit() { String sql = sql("selectFolders", query(false)); assertTrue(sql.contains("FROM public.dms_file_permissions p")); assertTrue(sql.contains("authorized_navigation_ancestors")); assertTrue(sql.contains("SELECT granted.id, granted.parent_id")); assertTrue(sql.contains("UNION SELECT parent.id, parent.parent_id FROM authorized_navigation_ancestors child")); assertTrue(sql.contains("OR f.id IN (SELECT id FROM authorized_navigation_ancestors)")); assertTrue(sql.contains("p.principal_type = 'USER'")); assertTrue(sql.contains("p.principal_type = 'ORG'")); assertTrue(sql.contains("p.principal_type = 'POSITION'")); assertTrue(sql.contains("p.principal_type = 'ROLE'")); assertTrue(sql.contains("p.principal_type = 'GROUP'")); assertTrue(sql.contains("p.resource_scope = 'SUBTREE'")); assertTrue(sql.contains("ORDER BY f.name, f.id LIMIT ?")); assertTrue(sql.indexOf("dms_file_permissions") < sql.indexOf("LIMIT ?")); assertFalse(sql.contains("SELECT *")); } @Test void administratorFolderPageDoesNotRequireAllowRows() { String sql = sql("selectFolders", query(true)); assertFalse(sql.contains("dms_file_permissions")); assertFalse(sql.contains("authorized_navigation_ancestors")); assertTrue(sql.contains("ORDER BY f.name, f.id LIMIT ?")); } @Test void currentDocumentPageUsesEffectiveWindowFolderReadAndExclusionPriority() { String sql = sql("selectCurrentDocuments", query(false)); assertTrue(sql.contains("s.lifecycle_status = 'EFFECTIVE'")); assertTrue(sql.contains("s.effective_from <= CURRENT_TIMESTAMP")); assertTrue(sql.contains("CURRENT_TIMESTAMP < s.effective_to")); assertTrue(sql.contains("NOT EXISTS (SELECT 1 FROM public.dms_access_exclusions e")); assertTrue(sql.contains("p.resource_type = 'FOLDER'")); assertFalse(sql.contains("p.resource_type = 'DOCUMENT'")); assertTrue(sql.contains("ORDER BY d.name, d.id LIMIT ?")); } @Test void historicalPageUsesOnlyExplicitTerminalStatesAndMixedKeyset() { DmsFileCenterQuery query = query(false); query.setCursorName("A"); query.setCursorDocumentId(UUID.fromString("018f0000-0000-7000-8000-000000000701")); query.setCursorVersionNo(3L); query.setCursorId(UUID.fromString("018f0000-0000-7000-8000-000000000702")); String sql = sql("selectHistoricalVersions", query); assertTrue(sql.contains("IN ('SUPERSEDED', 'EXPIRED', 'REVOKED', 'INVALIDATED', 'OBSOLETE')")); assertFalse(sql.contains("PENDING_EFFECTIVE")); assertTrue(sql.contains("v.version_no < ?")); assertTrue(sql.contains("v.id < ?")); assertTrue(sql.contains("ORDER BY d.name, d.id, v.version_no DESC, v.id DESC LIMIT ?")); } @Test void sharedPageUsesOnlyDirectDocumentOrVersionAllow() { String sql = sql("selectSharedHistoricalVersions", query(false)); assertTrue(sql.contains("p.resource_type = 'DOCUMENT'")); assertTrue(sql.contains("p.resource_type = 'FILE_VERSION'")); assertFalse(sql.contains("p.resource_type = 'FOLDER'")); assertTrue(sql.contains("dms_access_exclusions")); } private DmsFileCenterQuery query(boolean administrator) { DmsFileCenterQuery query = new DmsFileCenterQuery(); query.setTenantId("tenant-1"); query.setUserId("user-1"); query.setAdministrator(administrator); query.setParentId(UUID.fromString("018f0000-0000-7000-8000-000000000601")); query.setFolderId(UUID.fromString("018f0000-0000-7000-8000-000000000601")); query.setDocumentId(UUID.fromString("018f0000-0000-7000-8000-000000000602")); query.setDirectOrgIds(Arrays.asList("org-1")); query.setAncestorOrgIds(Arrays.asList("org-1", "org-root")); query.setPositionIds(Arrays.asList("position-1")); query.setRoleIds(Arrays.asList("role-1")); query.setPermissionGroupIds(Arrays.asList("group-1")); query.setLimit(51); return query; } private String sql(String method, DmsFileCenterQuery query) { MappedStatement statement = configuration.getMappedStatement( DmsFileCenterMapper.class.getName() + "." + method); BoundSql boundSql = statement.getBoundSql(java.util.Collections.singletonMap("q", query)); return boundSql.getSql().replaceAll("\\s+", " ").trim(); } }