yeg
2026-09-14 ad495196188cd3d80654edaa21b04c11a9f75865
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
75
76
77
78
79
80
81
82
83
84
package com.talentcard.server.business.payment.huifu;
 
import static org.assertj.core.api.Assertions.assertThat;
 
import java.util.HashMap;
import java.util.Map;
 
import org.junit.jupiter.api.Test;
 
/**
 * 结算记录查询的两个真实约束。
 *
 * <p>一是通道对 {@code pageSize} 的上限:实测传 51 或 100 会返回 {@code 00000003}
 * 「基础参数校验失败:【pageSize-分页条数】不能为空,且最小值为0,最大值为50」,
 * 一条流水都拿不到。后台「结算记录」页原来默认传 100,于是页面永远空白——通道里其实有流水
 * (商户 6666000226048687 在 2026-08-26 / 08-29 各结过一次)。所以越界值必须在网关内收敛。
 *
 * <p>二是回执解析:结算流水以 JSON 字符串放在 {@code trans_log_result_list} 里,
 * 翻页总数在 {@code result_count}。这两处解析错了,后台同样看不到流水。
 */
class HuifuSettlementRecordGatewayTests {
 
    @Test
    void aPageSizeAboveTheProviderLimitIsClampedBeforeItReachesTheProvider() {
        // 100 与 51 都是通道明确拒绝的取值,必须被压到 50。
        assertThat(HuifuSettlementRecordGateway.pageSizeWithinProviderLimit(100))
                .isEqualTo(HuifuSettlementRecordGateway.PROVIDER_MAX_PAGE_SIZE);
        assertThat(HuifuSettlementRecordGateway.pageSizeWithinProviderLimit(51))
                .isEqualTo(HuifuSettlementRecordGateway.PROVIDER_MAX_PAGE_SIZE);
 
        // 上限内保持原样,0 与负数兜到 1。
        assertThat(HuifuSettlementRecordGateway.pageSizeWithinProviderLimit(50)).isEqualTo(50);
        assertThat(HuifuSettlementRecordGateway.pageSizeWithinProviderLimit(20)).isEqualTo(20);
        assertThat(HuifuSettlementRecordGateway.pageSizeWithinProviderLimit(1)).isEqualTo(1);
        assertThat(HuifuSettlementRecordGateway.pageSizeWithinProviderLimit(0)).isEqualTo(1);
        assertThat(HuifuSettlementRecordGateway.pageSizeWithinProviderLimit(-5)).isEqualTo(1);
    }
 
    @Test
    void theBuiltRequestCarriesTheClampedPageSizeAndTheQueryWindow() {
        var request = HuifuSettlementRecordGateway.buildRequest("6666000226048687", "20260815", "20260914", 100);
 
        assertThat(request.getPageSize()).isEqualTo("50");
        assertThat(request.getHuifuId()).isEqualTo("6666000226048687");
        assertThat(request.getBeginDate()).isEqualTo("20260815");
        assertThat(request.getEndDate()).isEqualTo("20260914");
    }
 
    @Test
    void theSettlementRecordsReplyIsReadFromTheProviderPayload() {
        String records = "[{\"trans_date\":\"20260829\",\"trans_amt\":\"0.01\",\"settle_cycle\":\"D1\",\"trans_stat\":\"S\"}]";
        Map<String, Object> data = new HashMap<>();
        data.put("resp_code", "00000000");
        data.put("resp_desc", "成功");
        data.put("result_count", "2");
        data.put("trans_log_result_list", records);
        Map<String, Object> payload = new HashMap<>();
        payload.put("data", data);
 
        HuifuSettlementRecordGateway.SettlementRecords result = HuifuSettlementRecordGateway.SettlementRecords.from(payload);
 
        assertThat(result.succeeded()).isTrue();
        assertThat(result.code()).isEqualTo("00000000");
        assertThat(result.total()).isEqualTo(2);
        assertThat(result.rawRecords()).isEqualTo(records);
    }
 
    @Test
    void aProviderParameterFailureIsReportedAsAnUnsuccessfulQuery() {
        Map<String, Object> data = new HashMap<>();
        data.put("resp_code", "00000003");
        data.put("resp_desc", "基础参数校验失败:【pageSize-分页条数】不能为空,且最小值为0,最大值为50");
        data.put("result_count", "0");
        Map<String, Object> payload = new HashMap<>();
        payload.put("data", data);
 
        HuifuSettlementRecordGateway.SettlementRecords result = HuifuSettlementRecordGateway.SettlementRecords.from(payload);
 
        // 解析层如实报失败,让调用方把它展示成 failures,而不是静默当成"没有流水"。
        assertThat(result.succeeded()).isFalse();
        assertThat(result.total()).isZero();
        assertThat(result.rawRecords()).isEmpty();
    }
}