刘光辉
15 小时以前 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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
package jnpf.dmsMapper;
 
import jnpf.dmsDatabase.DmsUuidTypeHandler;
import jnpf.dmsPermission.DmsFileCenterQuery;
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.UUID;
 
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
 
class DmsFileCenterMapperSqlTest {
    private Configuration configuration;
 
    @BeforeEach
    void setUp() {
        configuration = new Configuration();
        configuration.getTypeHandlerRegistry().register(UUID.class, DmsUuidTypeHandler.class);
        configuration.addMapper(DmsFileCenterMapper.class);
    }
 
    @Test
    void ordinaryFolderPageFiltersPermissionsBeforeStableLimit() {
        String sql = sql("selectFolders", query(false));
 
        assertTrue(sql.contains("FROM public.dms_file_permissions p"));
        assertTrue(sql.contains("authorized_navigation_ancestors"));
        assertTrue(sql.contains("SELECT granted.id, granted.parent_id"));
        assertTrue(sql.contains("UNION SELECT parent.id, parent.parent_id FROM authorized_navigation_ancestors child"));
        assertTrue(sql.contains("OR f.id IN (SELECT id FROM authorized_navigation_ancestors)"));
        assertTrue(sql.contains("p.principal_type = 'USER'"));
        assertTrue(sql.contains("p.principal_type = 'ORG'"));
        assertTrue(sql.contains("p.principal_type = 'POSITION'"));
        assertTrue(sql.contains("p.principal_type = 'ROLE'"));
        assertTrue(sql.contains("p.principal_type = 'GROUP'"));
        assertTrue(sql.contains("p.resource_scope = 'SUBTREE'"));
        assertTrue(sql.contains("ORDER BY f.name, f.id LIMIT ?"));
        assertTrue(sql.indexOf("dms_file_permissions") < sql.indexOf("LIMIT ?"));
        assertFalse(sql.contains("SELECT *"));
    }
 
    @Test
    void administratorFolderPageDoesNotRequireAllowRows() {
        String sql = sql("selectFolders", query(true));
 
        assertFalse(sql.contains("dms_file_permissions"));
        assertFalse(sql.contains("authorized_navigation_ancestors"));
        assertTrue(sql.contains("ORDER BY f.name, f.id LIMIT ?"));
    }
 
    @Test
    void currentDocumentPageUsesEffectiveWindowFolderReadAndExclusionPriority() {
        String sql = sql("selectCurrentDocuments", query(false));
 
        assertTrue(sql.contains("s.lifecycle_status = 'EFFECTIVE'"));
        assertTrue(sql.contains("s.effective_from <= CURRENT_TIMESTAMP"));
        assertTrue(sql.contains("CURRENT_TIMESTAMP < s.effective_to"));
        assertTrue(sql.contains("NOT EXISTS (SELECT 1 FROM public.dms_access_exclusions e"));
        assertTrue(sql.contains("p.resource_type = 'FOLDER'"));
        assertFalse(sql.contains("p.resource_type = 'DOCUMENT'"));
        assertTrue(sql.contains("ORDER BY d.name, d.id LIMIT ?"));
    }
 
    @Test
    void historicalPageUsesOnlyExplicitTerminalStatesAndMixedKeyset() {
        DmsFileCenterQuery query = query(false);
        query.setCursorName("A");
        query.setCursorDocumentId(UUID.fromString("018f0000-0000-7000-8000-000000000701"));
        query.setCursorVersionNo(3L);
        query.setCursorId(UUID.fromString("018f0000-0000-7000-8000-000000000702"));
 
        String sql = sql("selectHistoricalVersions", query);
 
        assertTrue(sql.contains("IN ('SUPERSEDED', 'EXPIRED', 'REVOKED', 'INVALIDATED', 'OBSOLETE')"));
        assertFalse(sql.contains("PENDING_EFFECTIVE"));
        assertTrue(sql.contains("v.version_no < ?"));
        assertTrue(sql.contains("v.id < ?"));
        assertTrue(sql.contains("ORDER BY d.name, d.id, v.version_no DESC, v.id DESC LIMIT ?"));
    }
 
    @Test
    void sharedPageUsesOnlyDirectDocumentOrVersionAllow() {
        String sql = sql("selectSharedHistoricalVersions", query(false));
 
        assertTrue(sql.contains("p.resource_type = 'DOCUMENT'"));
        assertTrue(sql.contains("p.resource_type = 'FILE_VERSION'"));
        assertFalse(sql.contains("p.resource_type = 'FOLDER'"));
        assertTrue(sql.contains("dms_access_exclusions"));
    }
 
    private DmsFileCenterQuery query(boolean administrator) {
        DmsFileCenterQuery query = new DmsFileCenterQuery();
        query.setTenantId("tenant-1");
        query.setUserId("user-1");
        query.setAdministrator(administrator);
        query.setParentId(UUID.fromString("018f0000-0000-7000-8000-000000000601"));
        query.setFolderId(UUID.fromString("018f0000-0000-7000-8000-000000000601"));
        query.setDocumentId(UUID.fromString("018f0000-0000-7000-8000-000000000602"));
        query.setDirectOrgIds(Arrays.asList("org-1"));
        query.setAncestorOrgIds(Arrays.asList("org-1", "org-root"));
        query.setPositionIds(Arrays.asList("position-1"));
        query.setRoleIds(Arrays.asList("role-1"));
        query.setPermissionGroupIds(Arrays.asList("group-1"));
        query.setLimit(51);
        return query;
    }
 
    private String sql(String method, DmsFileCenterQuery query) {
        MappedStatement statement = configuration.getMappedStatement(
                DmsFileCenterMapper.class.getName() + "." + method);
        BoundSql boundSql = statement.getBoundSql(java.util.Collections.singletonMap("q", query));
        return boundSql.getSql().replaceAll("\\s+", " ").trim();
    }
}