刘光辉
117 分钟以前 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
package jnpf.dmsMapper;
 
import jnpf.dmsDatabase.DmsUuidTypeHandler;
import jnpf.dmsEntity.banben.DmsWenjianBanbenJiesuanModel;
import org.apache.ibatis.builder.xml.XMLMapperBuilder;
import org.apache.ibatis.datasource.unpooled.UnpooledDataSource;
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.io.StringReader;
import java.nio.charset.StandardCharsets;
import java.util.*;
import static org.junit.jupiter.api.Assertions.*;
 
/** Production mapper SQL against connection-local tables; no business rows modified. */
@EnabledIfEnvironmentVariable(named="DMS_READ_TEST_URL",matches=".+")
class DmsReuseRecordMetadataPostgresTest {
    SqlSession session;
    final UUID center=UUID.fromString("20000000-0000-0000-0000-000000000001");
    final UUID document=UUID.fromString("10000000-0000-0000-0000-000000000001");
    final UUID object=UUID.fromString("30000000-0000-0000-0000-000000000001");
    void sql(String text) throws Exception {try(var statement=session.getConnection().createStatement()){statement.execute(text);}}
    @BeforeEach void setup() throws Exception {
        var ds=new UnpooledDataSource("org.postgresql.Driver",System.getenv("DMS_READ_TEST_URL"),System.getenv("DMS_READ_TEST_USER"),System.getenv("DMS_READ_TEST_PASSWORD"));
        var config=new Configuration(new Environment("reuse",new JdbcTransactionFactory(),ds));
        config.getTypeHandlerRegistry().register(UUID.class,DmsUuidTypeHandler.class);
        for(String name:List.of("DmsFileVersionMapper","DmsWenjianBanbenMapper","DmsWenjianZiyuanMapper")) {
            String path="mapper/"+name+".xml";
            try(var input=getClass().getResourceAsStream("/"+path)) {
                String xml=new String(Objects.requireNonNull(input).readAllBytes(),StandardCharsets.UTF_8).replace("public.","pg_temp.");
                new XMLMapperBuilder(new StringReader(xml),config,path,config.getSqlFragments()).parse();
            }
        }
        session=new SqlSessionFactoryBuilder().build(config).openSession(false);
        for(String table:List.of("dms_wenjian_ziyuan","dms_wenjian_banben","dms_file_versions","dms_file_objects","dms_version_states"))
            sql("CREATE TEMP TABLE "+table+" ON COMMIT DROP AS SELECT * FROM public."+table+" WITH NO DATA");
        sql("INSERT INTO dms_wenjian_ziyuan(f_tenant_id,f_id,dangqian_banben_id,wenjian_leixing,biz_status,shifou_shoukong) VALUES('test','file','version','jilu','effective','no')");
        sql("INSERT INTO dms_wenjian_banben(f_tenant_id,f_id,wenjian_id,wenjian_leixing,biz_status,shifou_shoukong,wenjian_neirong,banbenhao,wenjian_zhongxin_banben_id,wenjian_duixiang_id,laiyuan_danju_leixing,laiyuan_yewu_jian) VALUES('test','version','file','jilu','effective','no','original','D(00)','"+center+"','"+object+"','xinzeng_shenhe','source')");
        sql("INSERT INTO dms_file_versions(tenant_id,id,document_id,version_no,shifou_shoukong) VALUES('test','"+center+"','"+document+"',1,'no')");
        sql("INSERT INTO dms_file_objects(tenant_id,id,file_version_id,source_id) VALUES('test','"+object+"','"+center+"','source')");
        sql("INSERT INTO dms_version_states(tenant_id,document_id,file_version_id,lifecycle_status,effective_from) VALUES('test','"+document+"','"+center+"','EFFECTIVE',CURRENT_TIMESTAMP-interval '1 day')");
    }
    @AfterEach void close(){if(session!=null){try{session.rollback(true);}finally{session.close();}}}
    @Test void metadataUpdatePreservesAttachmentAndAllReadersUseUpdatedMode() throws Exception {
        var model=new DmsWenjianBanbenJiesuanModel();model.setTenantId("test");model.setWenjianId("file");
        model.setYuanWenjianBanbenId("version");model.setShifouShoukong("yes");model.setWenjianMingcheng("new name");model.setGuishuBumenId("department");model.setUserId("user");
        assertEquals(1,session.getMapper(DmsWenjianBanbenMapper.class).updateReusedRecordMetadata(model));
        assertEquals(1,session.getMapper(DmsWenjianZiyuanMapper.class).updateReusedRecordMetadata(model));
        var mapper=session.getMapper(DmsFileVersionMapper.class);
        assertEquals("yes",mapper.selectByTenantAndId("test",center).getShifouShoukong());
        assertEquals("yes",mapper.selectReadableByTenantAndId("test",center).getShifouShoukong());
        assertEquals("yes",mapper.selectCurrentEffective("test",document).getShifouShoukong());
        assertEquals("yes",mapper.selectByTenantAndIds("test",List.of(center)).get(0).getShifouShoukong());
        var business=session.getMapper(DmsWenjianBanbenMapper.class).selectById("test","version");
        assertEquals("original",business.getWenjianNeirong());assertEquals("D(00)",business.getBanbenhao());
        try(var s=session.getConnection().createStatement();var r=s.executeQuery("SELECT shifou_shoukong FROM dms_file_versions")){assertTrue(r.next());assertEquals("no",r.getString(1));}
        model.setYuanWenjianBanbenId("stale");
        assertEquals(0,session.getMapper(DmsWenjianBanbenMapper.class).updateReusedRecordMetadata(model));
        assertEquals(0,session.getMapper(DmsWenjianZiyuanMapper.class).updateReusedRecordMetadata(model));
    }
    @Test void unrelatedRegistrationKeepsOriginalMode() throws Exception {
        sql("UPDATE dms_file_objects SET source_id='unrelated'");
        sql("UPDATE dms_wenjian_banben SET shifou_shoukong='yes'");
        assertEquals("no",session.getMapper(DmsFileVersionMapper.class).selectByTenantAndId("test",center).getShifouShoukong());
        assertNull(session.getMapper(DmsFileVersionMapper.class).selectByTenantAndId("other",center));
    }
}