package jnpf.dmsMapper; import jnpf.dmsDatabase.DmsUuidTypeHandler; import org.apache.ibatis.mapping.BoundSql; import org.apache.ibatis.mapping.MappedStatement; import org.apache.ibatis.session.Configuration; import org.junit.jupiter.api.Test; import java.util.HashMap; import java.util.Map; import java.util.UUID; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; class DmsPermissionResourceMapperSqlTest { @Test void childListIncludesCurrentDocumentVersionPropertiesInOneQuery() { Configuration configuration = new Configuration(); configuration.getTypeHandlerRegistry().register(UUID.class, DmsUuidTypeHandler.class); configuration.addMapper(DmsPermissionResourceMapper.class); MappedStatement statement = configuration.getMappedStatement( DmsPermissionResourceMapper.class.getName() + ".selectChildren"); Map parameters = new HashMap<>(); parameters.put("tenantId", "tenant-1"); parameters.put("parentId", UUID.fromString("018f0000-0000-7000-8000-000000000301")); parameters.put("limit", 100); BoundSql boundSql = statement.getBoundSql(parameters); String sql = boundSql.getSql().replaceAll("\\s+", " ").trim(); assertTrue(sql.contains("LEFT JOIN public.dms_version_states current_state")); assertTrue(sql.contains("current_state.lifecycle_status = 'EFFECTIVE'")); assertTrue(sql.contains("LEFT JOIN public.dms_file_versions current_version")); assertTrue(sql.contains("COALESCE(d.document_no, version_document.document_no) AS document_no")); assertTrue(sql.contains("COALESCE(d.document_type, version_document.document_type) AS document_type")); assertTrue(sql.contains("COALESCE(v.version_label, current_version.version_label) AS version_label")); assertTrue(sql.contains("COALESCE(v.prepared_by, current_version.prepared_by) AS prepared_by")); assertTrue(sql.contains("COALESCE(version_state.effective_to, current_state.effective_to) AS effective_to")); assertTrue(sql.contains("COALESCE(version_state.review_cycle_months, current_state.review_cycle_months) AS review_cycle_months")); assertTrue(sql.contains("COALESCE(version_state.next_review_on, current_state.next_review_on) AS next_review_on")); assertTrue(sql.contains("f.f_delete_mark IS NULL")); assertTrue(sql.contains("CASE WHEN r.resource_type = 'FOLDER' THEN f.sort_code END")); assertTrue(sql.contains("CASE WHEN r.resource_type = 'FOLDER' THEN f.revision END")); assertTrue(sql.contains("CASE WHEN r.resource_type = 'FOLDER' THEN f.sort_code END, name, r.id")); assertTrue(sql.endsWith("LIMIT ?")); assertFalse(sql.contains("SELECT *")); } @Test void fileSearchUsesUnifiedFieldsAcrossFolderSubtreeOrDocument() { Configuration configuration = new Configuration(); configuration.getTypeHandlerRegistry().register(UUID.class, DmsUuidTypeHandler.class); configuration.addMapper(DmsPermissionResourceMapper.class); MappedStatement statement = configuration.getMappedStatement( DmsPermissionResourceMapper.class.getName() + ".searchFiles"); Map parameters = new HashMap<>(); parameters.put("tenantId", "tenant-1"); parameters.put("parentId", UUID.fromString("018f0000-0000-7000-8000-000000000301")); parameters.put("keyword", "report"); parameters.put("limit", 100); String sql = statement.getBoundSql(parameters).getSql().replaceAll("\\s+", " ").trim(); assertTrue(sql.contains("r.resource_type = 'FILE_VERSION'")); assertTrue(sql.contains("WITH RECURSIVE search_folders")); assertTrue(sql.contains("child.parent_id = parent.id")); assertTrue(sql.contains("v.document_id = ? OR version_document.folder_id IN (SELECT id FROM search_folders)")); assertTrue(sql.contains("STRPOS(LOWER(COALESCE(v.file_name, '')), LOWER(?)) > 0")); assertTrue(sql.contains("STRPOS(LOWER(COALESCE(version_document.name, '')), LOWER(?)) > 0")); assertTrue(sql.contains("STRPOS(LOWER(COALESCE(version_document.document_no, '')), LOWER(?)) > 0")); assertTrue(sql.contains("ORDER BY v.file_name, v.id LIMIT ?")); } @Test void rootFileSearchCoversTheWholeTenant() { Configuration configuration = new Configuration(); configuration.getTypeHandlerRegistry().register(UUID.class, DmsUuidTypeHandler.class); configuration.addMapper(DmsPermissionResourceMapper.class); MappedStatement statement = configuration.getMappedStatement( DmsPermissionResourceMapper.class.getName() + ".searchFiles"); Map parameters = new HashMap<>(); parameters.put("tenantId", "tenant-1"); parameters.put("parentId", null); parameters.put("keyword", "report"); parameters.put("limit", 100); String sql = statement.getBoundSql(parameters).getSql().replaceAll("\\s+", " ").trim(); assertTrue(sql.contains("r.tenant_id = ? AND r.resource_type = 'FILE_VERSION'")); assertFalse(sql.contains("v.document_id = ?")); assertFalse(sql.contains("version_document.folder_id IN (SELECT id FROM search_folders)")); } }