package jnpf.dmsMapper; import jnpf.dmsDatabase.DmsUuidTypeHandler; import jnpf.dmsEntity.permission.form.DmsPersonalFolderBorrowForm; 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.Arrays; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.UUID; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; class DmsPersonalFolderMapperSqlTest { @Test void insertsBorrowSnapshotsIdempotently() { Configuration configuration = configuration(); MappedStatement statement = configuration.getMappedStatement( DmsPersonalFolderMapper.class.getName() + ".insertBorrowSnapshots"); DmsPersonalFolderBorrowForm.FileRelation first = relation( "018f0000-0000-7000-8000-000000000701", "018f0000-0000-7000-8000-000000000702"); DmsPersonalFolderBorrowForm.FileRelation second = relation( "018f0000-0000-7000-8000-000000000703", "018f0000-0000-7000-8000-000000000704"); Map parameters = new HashMap<>(); parameters.put("tenantId", "tenant-1"); parameters.put("userId", "user-1"); parameters.put("files", Arrays.asList(first, second)); BoundSql boundSql = statement.getBoundSql(parameters); String sql = normalizedSql(boundSql); assertTrue(sql.contains("INSERT INTO public.dms_personal_folder_items")); assertTrue(sql.contains("document_id, file_version_id, valid_to")); assertTrue(sql.contains("'BORROW'")); assertEquals(10, boundSql.getParameterMappings().size()); assertEquals(2, boundSql.getParameterMappings().stream() .filter(mapping -> mapping.getProperty().endsWith(".validTo")).count()); assertTrue(sql.contains("DO UPDATE SET valid_to = EXCLUDED.valid_to")); assertTrue(sql.contains("EXCLUDED.valid_to IS NULL AND dms_personal_folder_items.valid_to IS NOT NULL")); assertTrue(sql.contains("dms_personal_folder_items.valid_to = 'infinity'::TIMESTAMPTZ")); assertTrue(sql.endsWith("AND dms_personal_folder_items.valid_to < EXCLUDED.valid_to)")); } @Test void insertsDownloadSnapshotsWithTheirValidity() { Configuration configuration = configuration(); MappedStatement statement = configuration.getMappedStatement( DmsPersonalFolderMapper.class.getName() + ".insertDownloadSnapshots"); Map parameters = new HashMap<>(); parameters.put("tenantId", "tenant-1"); parameters.put("userId", "user-1"); parameters.put("files", Arrays.asList(relation( "018f0000-0000-7000-8000-000000000701", "018f0000-0000-7000-8000-000000000702"))); BoundSql boundSql = statement.getBoundSql(parameters); String sql = normalizedSql(boundSql); assertTrue(sql.contains("'DOWNLOAD'")); assertTrue(sql.contains("document_id, file_version_id, valid_to")); assertEquals(5, boundSql.getParameterMappings().size()); assertTrue(sql.contains("DO UPDATE SET valid_to = EXCLUDED.valid_to")); } @Test void insertsFavoriteSnapshotIdempotentlyWithoutAnExpiry() { Configuration configuration = configuration(); MappedStatement statement = configuration.getMappedStatement( DmsPersonalFolderMapper.class.getName() + ".insertFavoriteSnapshot"); Map parameters = new HashMap<>(); parameters.put("tenantId", "tenant-1"); parameters.put("userId", "user-1"); parameters.put("documentId", UUID.fromString( "018f0000-0000-7000-8000-000000000701")); parameters.put("fileVersionId", UUID.fromString( "018f0000-0000-7000-8000-000000000702")); String sql = normalizedSql(statement.getBoundSql(parameters)); assertTrue(sql.contains("'FAVORITE'")); assertTrue(sql.contains("file_version_id, valid_to")); assertTrue(sql.contains("VALUES (?, ?, 'FAVORITE', ?, ?, NULL)")); assertTrue(sql.endsWith("DO NOTHING")); } @Test void validatesOnlyReadableFileVersionsWithinTheTenant() { Configuration configuration = configuration(); MappedStatement statement = configuration.getMappedStatement( DmsPersonalFolderMapper.class.getName() + ".selectReadableVersions"); Map parameters = new HashMap<>(); parameters.put("tenantId", "tenant-1"); parameters.put("fileVersionIds", Arrays.asList( UUID.fromString("018f0000-0000-7000-8000-000000000702"), UUID.fromString("018f0000-0000-7000-8000-000000000704"))); String sql = normalizedSql(statement.getBoundSql(parameters)); assertTrue(sql.contains("WHERE v.tenant_id = ? AND v.id IN ( ? , ? )")); assertTrue(sql.contains("s.lifecycle_status IN ('EFFECTIVE', 'SUPERSEDED', 'EXPIRED', 'REVOKED', 'OBSOLETE')")); assertTrue(sql.contains("s.lifecycle_status = 'INVALIDATED' AND s.approved_at IS NOT NULL")); } @Test void loadsTheFileVersionSnapshotForTheCurrentTenantUserAndFolderType() { Configuration configuration = configuration(); MappedStatement statement = configuration.getMappedStatement( DmsPersonalFolderMapper.class.getName() + ".selectFiles"); Map parameters = new HashMap<>(); parameters.put("tenantId", "tenant-1"); parameters.put("userId", "user-1"); parameters.put("folderType", "BORROW"); parameters.put("keyword", "report"); parameters.put("limit", 100); BoundSql boundSql = statement.getBoundSql(parameters); String sql = normalizedSql(boundSql); assertTrue(sql.contains("JOIN public.dms_personal_folder_items personal_item")); assertTrue(sql.contains("personal_item.tenant_id = ?")); assertTrue(sql.contains("personal_item.user_id = ?")); assertTrue(sql.contains("personal_item.folder_type = ?")); assertTrue(sql.contains("personal_item.valid_to AS valid_to")); assertFalse(sql.contains("personal_item.valid_to IS NULL OR CURRENT_TIMESTAMP < personal_item.valid_to")); assertTrue(sql.contains("personal_item.file_version_id = r.id")); assertTrue(sql.contains("r.resource_type = 'FILE_VERSION'")); assertTrue(sql.contains("LOWER(COALESCE(v.file_name, ''))")); assertTrue(sql.contains("LOWER(COALESCE(version_document.name, ''))")); assertFalse(sql.contains("personal_item.document_id = r.id")); assertFalse(sql.contains("LOWER(COALESCE(current_version.file_name, ''))")); assertTrue(sql.endsWith("LIMIT ?")); assertFalse(sql.contains("dms_folders child")); } private Configuration configuration() { Configuration configuration = new Configuration(); configuration.getTypeHandlerRegistry().register(UUID.class, DmsUuidTypeHandler.class); configuration.addMapper(DmsPersonalFolderMapper.class); return configuration; } private String normalizedSql(BoundSql boundSql) { return boundSql.getSql().replaceAll("\\s+", " ").trim(); } private DmsPersonalFolderBorrowForm.FileRelation relation( String documentId, String fileVersionId) { DmsPersonalFolderBorrowForm.FileRelation relation = new DmsPersonalFolderBorrowForm.FileRelation(); relation.setDocumentId(UUID.fromString(documentId)); relation.setFileVersionId(UUID.fromString(fileVersionId)); relation.setValidTo(new Date(fileVersionId.endsWith("702") ? 4102444800000L : 4102531200000L)); return relation; } }