package jnpf.dmsMapper; import jnpf.dmsEntity.permission.entity.DmsAccessExclusionEntity; 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.BeforeEach; 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 DmsAccessExclusionMapperSqlTest { private Configuration configuration; @BeforeEach void setUp() { configuration = new Configuration(); configuration.getTypeHandlerRegistry().register(UUID.class, DmsUuidTypeHandler.class); configuration.addMapper(DmsAccessExclusionMapper.class); } @Test void rendersWholeCreateBatchAsOneInsertStatement() { Map parameters = new HashMap<>(); parameters.put("items", Arrays.asList(entity(UUID.randomUUID()), entity(UUID.randomUUID()))); String sql = sql("insertBatch", parameters); assertTrue(sql.startsWith("INSERT INTO public.dms_access_exclusions")); assertEquals(2, occurrences(sql, "uuidv7()")); assertFalse(sql.contains("SELECT *")); } @Test void rendersWholeRevocationBatchAsOneUpdateStatement() { Map parameters = new HashMap<>(); parameters.put("tenantId", "tenant-1"); parameters.put("ids", Arrays.asList(UUID.randomUUID(), UUID.randomUUID())); parameters.put("actorType", "USER"); parameters.put("actorId", "admin-1"); parameters.put("reason", "revoke"); String sql = sql("revokeBatch", parameters); assertTrue(sql.startsWith("UPDATE public.dms_access_exclusions")); assertTrue(sql.contains("id IN ( ? , ? )")); assertEquals(1, occurrences(sql, "UPDATE public.dms_access_exclusions")); } private String sql(String method, Map parameters) { MappedStatement statement = configuration.getMappedStatement( DmsAccessExclusionMapper.class.getName() + "." + method); BoundSql boundSql = statement.getBoundSql(parameters); return boundSql.getSql().replaceAll("\\s+", " ").trim(); } private DmsAccessExclusionEntity entity(UUID resourceId) { DmsAccessExclusionEntity result = new DmsAccessExclusionEntity(); result.setTenantId("tenant-1"); result.setResourceType("DOCUMENT"); result.setResourceId(resourceId); result.setUserId("user-1"); result.setActionCode("READ"); result.setSourceType("MANUAL"); result.setSourceId("source-1"); result.setValidFrom(new Date()); result.setExcludedByType("USER"); result.setExcludedById("admin-1"); return result; } private int occurrences(String value, String token) { int result = 0; int offset = 0; while ((offset = value.indexOf(token, offset)) >= 0) { result++; offset += token.length(); } return result; } }