刘光辉
4 小时以前 06f314545ac3514d7ce28939920866ae8188d31c
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
package jnpf.dmsMapper;
 
import jnpf.dmsEntity.fenfa.DmsWenjianChongdaFasong;
import org.apache.ibatis.builder.xml.XMLMapperBuilder;
import org.apache.ibatis.mapping.Environment;
import org.apache.ibatis.session.*;
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;
import org.junit.jupiter.api.*;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
import java.sql.*;
import java.util.Date;
import java.nio.charset.StandardCharsets;
import static org.junit.jupiter.api.Assertions.*;
 
/** 生产Mapper及迁移在连接内临时表验证;不写public业务表,关闭连接自动销毁。 */
@EnabledIfEnvironmentVariable(named="DMS_LEDGER_TEST_JDBC_URL", matches=".+")
class DmsWenjianChongdaMapperPostgresTest {
    Connection connection;
    SqlSession session;
    DmsWenjianChongdaMapper mapper;
    @BeforeEach void setup() throws Exception {
        connection=DriverManager.getConnection(System.getenv("DMS_LEDGER_TEST_JDBC_URL"),System.getenv("DMS_LEDGER_TEST_DB_USER"),System.getenv("DMS_LEDGER_TEST_DB_PASSWORD"));
        connection.setAutoCommit(false);
        try(var s=connection.createStatement()) {
            s.execute("SET LOCAL search_path TO pg_temp");
            s.execute("CREATE TEMP TABLE dms_wenjian_bupingheng_dengji(f_id varchar(64),f_tenant_id varchar(64),f_delete_mark integer,zhixing_shijian timestamp,f_version integer)");
            s.execute("CREATE TEMP TABLE lims_sign(f_id text,f_tenant_id text,f_creator_user_id text,f_delete_mark integer,meta_data text)");
            try(var input=getClass().getResourceAsStream("/forms/original-serial-reprint/schema.sql")) {
                String schema=new String(input.readAllBytes(),StandardCharsets.UTF_8).replace("CREATE TABLE IF NOT EXISTS dms_wenjian_chongda_fasong", "CREATE TEMP TABLE IF NOT EXISTS dms_wenjian_chongda_fasong");
                s.execute(schema);
            }
        }
        Configuration c=new Configuration();
        c.setEnvironment(new Environment("test",new JdbcTransactionFactory(),new org.apache.ibatis.datasource.unpooled.UnpooledDataSource()));
        try(var xml=getClass().getResourceAsStream("/mapper/DmsWenjianChongdaMapper.xml")) {
            new XMLMapperBuilder(xml,c,"mapper/DmsWenjianChongdaMapper.xml",c.getSqlFragments()).parse();
        }
        session=new SqlSessionFactoryBuilder().build(c).openSession(connection);mapper=session.getMapper(DmsWenjianChongdaMapper.class);
    }
    @AfterEach void cleanup() throws Exception { if(connection!=null&&!connection.isClosed()) connection.rollback();if(session!=null)session.close();if(connection!=null)connection.close(); }
    DmsWenjianChongdaFasong attempt(String id) {
        var a=new DmsWenjianChongdaFasong();a.setId(id);a.setTenantId("test");a.setPrintRecordId("copy");a.setTaskId("task");a.setFileVersionId("version");a.setUserId("actor");a.setCopies(1);a.setState("OPEN");a.setBatchesJson("[]");a.setNumbersJson("[{\"serialNumber\":\"original\"}]");a.setReason("reason");a.setBizSign("sign-"+id);a.setCreatedAt(new Date());return a;
    }
    @Test void persistsAndMapsFrozenAttemptThenCompletesNativeDocument() throws Exception {
        var a=attempt("request");assertEquals(1,mapper.insertAttempt(a));
        var read=mapper.selectActive("test","copy");assertEquals("actor",read.getUserId());assertEquals(a.getNumbersJson(),read.getNumbersJson());assertEquals(1,read.getCopies());
        try(var s=connection.createStatement()) {s.execute("INSERT INTO dms_wenjian_bupingheng_dengji(f_id,f_tenant_id,chongda_fasong_id) VALUES ('doc','test','request')");}
        a.setSubmittedAt(new Date());a.setDocumentId(mapper.findDocument("test","request").getDocumentId());
        assertEquals(1,mapper.completeDocument(a));assertEquals(0,mapper.completeDocument(a));a.setState("CLOSED");assertEquals(1,mapper.updateAttempt(a));
        assertNull(mapper.selectActive("test","copy"));assertEquals("doc",mapper.selectAttempt("test","request").getDocumentId());
        assertEquals(1,mapper.insertAttempt(attempt("request2")));
    }
    @Test void cancellationPersistsAndReleasesActiveSlot() {
        var a=attempt("cancelled");mapper.insertAttempt(a);a.setPageCount(8);a.setState("CANCELLED");a.setCancelledAt(new Date());mapper.updateAttempt(a);
        var read=mapper.selectAttempt("test","cancelled");assertEquals(8,read.getPageCount());assertNotNull(read.getCancelledAt());assertNull(mapper.selectActive("test","copy"));
        assertEquals(1,mapper.insertAttempt(attempt("next")));
    }
    @Test void activeAttemptUniquenessRejectsParallelRequests() {mapper.insertAttempt(attempt("one"));assertThrows(Exception.class,()->mapper.insertAttempt(attempt("two")));}
    @Test void nativeAssociationRemainsUniqueAfterSoftDelete() throws Exception {
        try(var s=connection.createStatement()) {
            s.execute("INSERT INTO dms_wenjian_bupingheng_dengji(f_id,f_tenant_id,chongda_fasong_id,f_delete_mark) VALUES ('deleted','test','request',1)");
            assertThrows(SQLException.class,()->s.execute("INSERT INTO dms_wenjian_bupingheng_dengji(f_id,f_tenant_id,chongda_fasong_id) VALUES ('second','test','request')"));
        }
    }
    @Test void signatureBindsActorRequestCopyReasonAndMeasure() throws Exception {
        String data="{\"biz_form_id\":\"37a318b30d7c4daf9670d141b33ed1b7\",\"biz_data\":[{\"chongda_fasong_id\":\"request\",\"bupingheng_mingxi\":[{\"dayin_jilu_id\":\"copy\",\"cuoshi\":\"cuoshi3\",\"yuanyin\":\" reason \"}]}]}";
        try(var s=connection.prepareStatement("INSERT INTO lims_sign VALUES ('sign','test','actor',NULL,?)")) {s.setString(1,data);s.executeUpdate();}
        assertNotNull(mapper.validSignature("test","actor","sign","copy","request","reason"));
        assertNull(mapper.validSignature("test","other","sign","copy","request","reason"));
        assertNull(mapper.validSignature("test","actor","sign","copy","another","reason"));
        assertNull(mapper.validSignature("test","actor","sign","copy","request","changed"));
        assertNull(mapper.validSignature("test","actor","sign","other","request","reason"));
    }
}