刘光辉
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
package jnpf.dmsMapper;
 
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.Test;
 
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
 
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
 
class DmsVersionStateMapperSqlTest {
 
    @Test
    void directUploadCreatesImmediatelyEffectiveLifecycleState() {
        Configuration configuration = new Configuration();
        configuration.getTypeHandlerRegistry().register(UUID.class, DmsUuidTypeHandler.class);
        configuration.addMapper(DmsVersionStateMapper.class);
        MappedStatement statement = configuration.getMappedStatement(
                DmsVersionStateMapper.class.getName() + ".insertDirectEffective");
 
        Map<String, Object> parameters = new HashMap<>();
        parameters.put("tenantId", "tenant-1");
        parameters.put("documentId", UUID.fromString("018f0000-0000-7000-8000-000000000301"));
        parameters.put("fileVersionId", UUID.fromString("018f0000-0000-7000-8000-000000000302"));
        parameters.put("userId", "user-1");
        BoundSql boundSql = statement.getBoundSql(parameters);
        String sql = boundSql.getSql().replaceAll("\\s+", " ").trim();
 
        assertTrue(sql.startsWith("INSERT INTO public.dms_version_states"));
        assertTrue(sql.contains("'EFFECTIVE'"));
        assertTrue(sql.contains("'DIRECT'"));
        assertTrue(sql.contains("CURRENT_TIMESTAMP"));
        assertTrue(sql.contains("CAST(? AS TEXT)"));
        assertFalse(sql.contains("SELECT *"));
    }
 
    @Test
    void revisionSupersedesOnlyTheExpectedCurrentVersion() {
        String sql = sql("supersedeCurrent", revisionParameters());
 
        assertTrue(sql.startsWith("UPDATE public.dms_version_states"));
        assertTrue(sql.contains("lifecycle_status = 'SUPERSEDED'"));
        assertTrue(sql.contains("file_version_id = ?"));
        assertTrue(sql.contains("lifecycle_status = 'EFFECTIVE'"));
        assertTrue(sql.contains("effective_to = CURRENT_TIMESTAMP"));
        assertTrue(sql.contains("revision = revision + 1"));
    }
 
    @Test
    void revisionCreatesNewEffectiveStateWithIdempotencySource() {
        String sql = sql("insertRevisionEffective", revisionParameters());
 
        assertTrue(sql.startsWith("INSERT INTO public.dms_version_states"));
        assertTrue(sql.contains("'EFFECTIVE'"));
        assertTrue(sql.contains("CONCAT('revision:', CAST(? AS TEXT), ':', ?)"));
        assertTrue(sql.contains("CURRENT_TIMESTAMP"));
        assertFalse(sql.contains("SELECT *"));
    }
 
    private String sql(String method, Map<String, Object> parameters) {
        Configuration configuration = new Configuration();
        configuration.getTypeHandlerRegistry().register(UUID.class, DmsUuidTypeHandler.class);
        configuration.addMapper(DmsVersionStateMapper.class);
        MappedStatement statement = configuration.getMappedStatement(
                DmsVersionStateMapper.class.getName() + "." + method);
        return statement.getBoundSql(parameters).getSql().replaceAll("\\s+", " ").trim();
    }
 
    private Map<String, Object> revisionParameters() {
        Map<String, Object> parameters = new HashMap<>();
        parameters.put("tenantId", "tenant-1");
        parameters.put("documentId", UUID.fromString("018f0000-0000-7000-8000-000000000301"));
        parameters.put("baseFileVersionId", UUID.fromString("018f0000-0000-7000-8000-000000000302"));
        parameters.put("fileVersionId", UUID.fromString("018f0000-0000-7000-8000-000000000303"));
        parameters.put("sourceId", "revision-1");
        parameters.put("revisionReason", "更新质量职责");
        parameters.put("newVersionLabel", "D(01)");
        parameters.put("userId", "user-1");
        return parameters;
    }
}