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