刘光辉
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
70
71
72
73
package jnpf.dmsMapper;
 
import org.apache.ibatis.builder.xml.XMLMapperBuilder;
import org.apache.ibatis.mapping.Environment;
import org.apache.ibatis.session.*;
import org.junit.jupiter.api.*;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.transaction.SpringManagedTransactionFactory;
import org.springframework.jdbc.datasource.SingleConnectionDataSource;
import java.io.StringReader;
import java.nio.charset.StandardCharsets;
import java.sql.*;
import java.util.*;
import static org.junit.jupiter.api.Assertions.*;
 
/** Real shared usage predicate and native picker; only session-private TEMP tables are written. */
@EnabledIfEnvironmentVariable(named="DMS_OCCUPANCY_TEST_URL",matches=".+")
class DmsNumberUsagePostgresTest {
    private Connection connection;
    private SingleConnectionDataSource source;
    private SqlSessionTemplate sessions;
    private DmsWenjianBianhaoMapper mapper;
    private final String tenant="number-usage-"+UUID.randomUUID();
    @BeforeEach void setup() throws Exception {
        connection=DriverManager.getConnection(System.getenv("DMS_OCCUPANCY_TEST_URL"),
                System.getenv("DMS_OCCUPANCY_TEST_USER"),System.getenv("DMS_OCCUPANCY_TEST_PASSWORD"));
        source=new SingleConnectionDataSource(connection,true);
        for(String table:List.of("dms_wenjian_bianhao","dms_wenjian_ziyuan","dms_wenjian_xinzeng_shenhe",
                "dms_documents","dms_wenjian_mingcheng_biangeng_shenqing")) {
            try(var statement=connection.createStatement()) {
                statement.execute("CREATE TEMP TABLE "+table+" AS SELECT * FROM public."+table+" WITH NO DATA");
            }
        }
        Configuration config=new Configuration(new Environment("test",new SpringManagedTransactionFactory(),source));
        for(String resource:List.of("mapper/BusinessFileOccupancyMapper.xml","mapper/DmsWenjianBianhaoMapper.xml")) {
            try(var in=getClass().getClassLoader().getResourceAsStream(resource)) {
                String xml=new String(Objects.requireNonNull(in).readAllBytes(),StandardCharsets.UTF_8).replace("public.","pg_temp.");
                new XMLMapperBuilder(new StringReader(xml),config,resource,config.getSqlFragments()).parse();
            }
        }
        sessions=new SqlSessionTemplate(new SqlSessionFactoryBuilder().build(config));
        mapper=sessions.getMapper(DmsWenjianBianhaoMapper.class);
        execute("INSERT INTO dms_wenjian_bianhao(f_id,f_tenant_id,wenjian_bianhao,biz_status) VALUES ('number',?,'N-001','using')",tenant);
    }
    @AfterEach void close() throws Exception {if(source!=null)source.destroy();else if(connection!=null)connection.close();}
    private void execute(String sql,Object...values) throws SQLException {
        try(var p=connection.prepareStatement(sql)){for(int i=0;i<values.length;i++)p.setObject(i+1,values[i]);p.execute();}
    }
    private List<?> candidates(String id) {
        return sessions.selectList(DmsWenjianBianhaoMapper.class.getName()+".selectNameChangeAvailablePage",
                Map.of("tenantId",tenant,"bianhaoId",id,"keyword",""));
    }
    @Test void unusedNumberIsAvailableButSavedReviewDraftBlocksEvenExactIdLookup() throws Exception {
        assertFalse(mapper.numberAlreadyUsed(tenant,"number"));assertEquals(1,candidates("").size());
        execute("INSERT INTO dms_wenjian_xinzeng_shenhe(f_id,f_tenant_id,wenjian_bianhao_id,f_flow_state) VALUES ('draft',?,'number',0)",tenant);
        assertTrue(mapper.numberAlreadyUsed(tenant,"number"));assertTrue(candidates("").isEmpty());assertTrue(candidates("number").isEmpty());
    }
    @Test void ExactNumberUseAlsoBlocksAndOtherTenantDoesNot() throws Exception {
        execute("INSERT INTO dms_wenjian_xinzeng_shenhe(f_id,f_tenant_id,wenjian_bianhao,f_flow_state) VALUES ('draft',?,'N-001',0)","other-tenant");
        assertFalse(mapper.numberAlreadyUsed(tenant,"number"));
        execute("UPDATE dms_wenjian_xinzeng_shenhe SET f_tenant_id=?",tenant);
        assertTrue(mapper.numberAlreadyUsed(tenant,"number"));
    }
    @Test void historicalResourceStillCountsAsUsed() throws Exception {
        execute("INSERT INTO dms_wenjian_ziyuan(f_id,f_tenant_id,wenjian_bianhao,biz_status,f_delete_mark) VALUES ('file',?,'N-001','expired',1)",tenant);
        assertTrue(mapper.numberAlreadyUsed(tenant,"number"));assertTrue(candidates("").isEmpty());
    }
    @Test void centerDocumentCountsAsUsed() throws Exception {
        execute("INSERT INTO dms_documents(id,tenant_id,document_no) VALUES (?::uuid,?,'N-001')",UUID.randomUUID().toString(),tenant);
        assertTrue(mapper.numberAlreadyUsed(tenant,"number"));assertTrue(candidates("").isEmpty());
    }
}