package com.sinata.appointment.service; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.sinata.appointment.entity.AppointmentOrder; import com.sinata.appointment.entity.BizVisitReason; import com.sinata.appointment.entity.MpUser; import com.sinata.appointment.integration.WechatMiniGateway; import com.sinata.appointment.mapper.ApprovalTaskMapper; import com.sinata.appointment.mapper.BizVisitReasonMapper; import com.sinata.appointment.mapper.MpUserMapper; import java.time.LocalDate; import java.util.Map; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.junit.jupiter.api.extension.ExtendWith; @ExtendWith(MockitoExtension.class) class IntegrationWechatServiceTest { @Mock private WechatMiniGateway wechatMiniGateway; @Mock private MpUserMapper mpUserMapper; @Mock private ApprovalTaskMapper approvalTaskMapper; @Mock private BizVisitReasonMapper bizVisitReasonMapper; private IntegrationWechatService integrationWechatService; @BeforeEach void setUp() { integrationWechatService = new IntegrationWechatService( wechatMiniGateway, mpUserMapper, approvalTaskMapper, bizVisitReasonMapper); } @Test void shouldSendApprovalResultSubscribeMessage() { AppointmentOrder order = new AppointmentOrder(); order.setSubmitterId(2L); order.setOrderNo("YY20260424001"); order.setVisitStartDate(LocalDate.of(2026, 4, 24)); order.setVisitReasonCode("BUSINESS"); order.setVisitTimeMode("SINGLE"); order.setVisitTimeSlot("AM"); MpUser submitter = new MpUser(); submitter.setId(2L); submitter.setOpenId("openid-123"); submitter.setNickName("张三"); BizVisitReason reason = new BizVisitReason(); reason.setReasonCode("BUSINESS"); reason.setReasonName("商务洽谈"); when(mpUserMapper.selectOne(any(LambdaQueryWrapper.class))).thenReturn(submitter); when(bizVisitReasonMapper.selectOne(any(LambdaQueryWrapper.class))).thenReturn(reason); integrationWechatService.notifyApprovalFinalResult(order, true); @SuppressWarnings("unchecked") ArgumentCaptor> dataCaptor = ArgumentCaptor.forClass(Map.class); verify(wechatMiniGateway) .sendSubscribeMessage( eq("openid-123"), eq("4FQovCBNFM7rth42AWHTusHajO788eT9VpplSN4ZG2s"), eq("pages/record/index"), dataCaptor.capture()); Map payload = dataCaptor.getValue(); assertEquals("审核通过", payload.get("thing1")); assertEquals("张三", payload.get("thing2")); assertEquals("2026-04-24 09:00", payload.get("time3")); assertEquals("商务洽谈", payload.get("thing4")); } @Test void shouldSkipWhenSubmitterHasNoOpenId() { AppointmentOrder order = new AppointmentOrder(); order.setSubmitterId(2L); order.setOrderNo("YY20260424001"); MpUser submitter = new MpUser(); submitter.setId(2L); submitter.setOpenId(""); when(mpUserMapper.selectOne(any(LambdaQueryWrapper.class))).thenReturn(submitter); integrationWechatService.notifyApprovalFinalResult(order, false); verify(wechatMiniGateway, never()) .sendSubscribeMessage(any(), any(), any(), any()); } }