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<String, Object> 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<String, Object> 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<String, Object> 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<String, Object> 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<String, Object> 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;
|
}
|
}
|