刘光辉
14 小时以前 34981c30a78e8bbd7791131059a9210f9928b62c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
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<String, Object> 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<String, Object> 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<String, Object> 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;
    }
}