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)); } }