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();
|
}
|
}
|