package com.talentcard.server.business.admin;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.util.List;
import java.util.Map;
import com.talentcard.server.business.payment.huifu.HuifuSettlementRecordGateway;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.bean.override.mockito.MockitoBean;
/**
* 「结算记录」页的选择与筛选:哪些商户会被拿去问通道,以及查询条件对结果的约束。
*
*
只用通道侧收款能力已核实且正常的商户去问通道:被关停({@code mer_stat=CANCEL})、
* 快照从没核实过、取现不可用的商户问过去只会被拒(实测被关闭的子商户回「客户与产品关系已关闭」),
* 页面每次打开都白多一条失败提示。反过来,本地没有微信/实名进度记录、通道侧却已核实且正常的商户
* 必须照查——存量商户就长这样,它仍在真实结算;只看本地进度会把它从监控里摘掉,等于看不见钱。
*
*
商家、联系电话、商家类型是本地商户字段,先筛掉不匹配的商户再去问通道;状态是通道流水的结算状态,
* 只能等通道把流水给回来之后再筛。
*/
@SpringBootTest
@ActiveProfiles("test")
class MerchantSettlementAdminServiceTests {
@Autowired
private JdbcTemplate jdbc;
@Autowired
private MerchantSettlementAdminService settlementAdminService;
@MockitoBean
private HuifuSettlementRecordGateway settlementRecordGateway;
private String suffix;
private String openMerchantName;
private String openHuifuId;
private String closedHuifuId;
private String unverifiedHuifuId;
private String noCashHuifuId;
@BeforeEach
void prepareMerchants() {
suffix = String.valueOf(System.nanoTime());
// 四家商户都不写 merchant_onboarding_progress:通道侧是否正常只由能力快照回答。
openMerchantName = "Settlement open merchant " + suffix;
openHuifuId = approveMerchant(openMerchantName, "NORMAL", "1", true, "OPEN", "餐饮服务", "13800000001");
closedHuifuId = approveMerchant("Settlement closed merchant " + suffix, "CANCEL", "1", true, "CLOSED", "住宿服务", "13800000002");
unverifiedHuifuId = approveMerchant("Settlement unverified merchant " + suffix, "NORMAL", "1", false, "UNVERIFIED", "购车服务", "13800000003");
noCashHuifuId = approveMerchant("Settlement no-cash merchant " + suffix, "NORMAL", "0", true, "NOCASH", "金融服务", "13800000004");
stubProvider();
}
@Test
void onlyMerchantsWithAVerifiedNormalProviderCapabilityAreQueried() {
Map view = fetch(null, null, null, null);
verify(settlementRecordGateway).query(eq(openHuifuId), eq("20260801"), eq("20260918"), anyInt());
verify(settlementRecordGateway, never()).query(eq(closedHuifuId), any(), any(), anyInt());
verify(settlementRecordGateway, never()).query(eq(unverifiedHuifuId), any(), any(), anyInt());
verify(settlementRecordGateway, never()).query(eq(noCashHuifuId), any(), any(), anyInt());
// 没问通道就不会有失败提示——被关停的商户正是原来那条警告的来源。
assertThat(failuresOf(view)).isEmpty();
}
@Test
void aQueriedMerchantKeepsItsSettlementRows() {
List