//package com.greenorange.promotion.junit;
//
//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
//import com.greenorange.promotion.model.dto.userInfo.UserInfoMiniPasswordLoginRequest;
//import com.greenorange.promotion.model.entity.UserInfo;
//import com.greenorange.promotion.service.userInfo.impl.UserInfoServiceImpl;
//import com.greenorange.promotion.utils.JWTUtils;
//import org.junit.jupiter.api.BeforeEach;
//import org.junit.jupiter.api.Test;
//import org.junit.jupiter.api.extension.ExtendWith;
//import org.mockito.*;
//import org.mockito.junit.jupiter.MockitoExtension;
//
//import java.util.Map;
//
//import static org.junit.jupiter.api.Assertions.*;
//import static org.mockito.ArgumentMatchers.any;
//import static org.mockito.Mockito.*;
//
//@ExtendWith(MockitoExtension.class)
//class UserInfoServiceImplTest {
//
//    @Spy
//    @InjectMocks
//    private UserInfoServiceImpl userService;   // 真实的 ServiceImpl，部分方法用 spy
//
//    @Mock
//    private JWTUtils jwtUtils;                  // 用来生成 token 的工具
//
//    @BeforeEach
//    void setUp() {
//        // MockitoAnnotations.openMocks(this); // @ExtendWith 已自动初始化
//    }
//
//    private UserInfoMiniPasswordLoginRequest buildRequest(String phone, String pwd) {
//        UserInfoMiniPasswordLoginRequest req = new UserInfoMiniPasswordLoginRequest();
//        req.setPhoneNumber(phone);
//        req.setUserPassword(pwd);
//        return req;
//    }
//
//    /** 1. 手机号格式无效，应直接抛参数错误 */
//    @Test
//    void givenInvalidPhone_whenLoginByPwd_thenThrow() {
//        UserInfoMiniPasswordLoginRequest req = buildRequest("not-a-phone", "whatever");
//        assertThrows(RuntimeException.class, () -> userService.userInfoMiniLoginByPwd(req));
//    }
//
//    /** 2. 手机号未注册，应抛操作错误 */
//    @Test
//    void givenUnregisteredPhone_whenLoginByPwd_thenThrow() {
//        // stub 第一次 getOne(...) 返回 null
//        doReturn(null)
//            .when(userService).getOne(any(LambdaQueryWrapper.class));
//
//        UserInfoMiniPasswordLoginRequest req = buildRequest("13812345678", "pwd");
//        assertThrows(RuntimeException.class, () -> userService.userInfoMiniLoginByPwd(req));
//    }
//
//    /** 3. 密码不正确，应抛操作错误 */
//    @Test
//    void givenWrongPassword_whenLoginByPwd_thenThrow() {
//        UserInfo dummy = new UserInfo();
//        dummy.setPhoneNumber("13812345678");
//        dummy.setUserPassword("rightPwd");
//
//        // stub 第一次 getOne(...) 返回非 null（手机号存在）
//        // stub 第二次 getOne(...) 返回 null（密码校验失败）
//        doReturn(dummy, null)
//            .when(userService).getOne(any(LambdaQueryWrapper.class));
//
//        UserInfoMiniPasswordLoginRequest req = buildRequest("13812345678", "wrongPwd");
//        assertThrows(RuntimeException.class, () -> userService.userInfoMiniLoginByPwd(req));
//    }
//
//    /** 4. 成功场景：正确手机号 + 密码，返回 token，并验证 jwtUtils 调用 */
//    @Test
//    void givenValidCredentials_whenLoginByPwd_thenReturnToken() {
//        UserInfo dummy = new UserInfo();
//        dummy.setPhoneNumber("13812345678");
//        dummy.setUserPassword("rightPwd");
//
//        // stub getOne(...) 两次都返回同一个 dummy（表示手机号存在且密码正确）
//        doReturn(dummy, dummy)
//            .when(userService).getOne(any(LambdaQueryWrapper.class));
//
//        // stub jwtUtils.generateToken(...)
//        String expectedToken = "jwt-token-xyz";
//        when(jwtUtils.generateToken(anyMap())).thenReturn(expectedToken);
//
//        UserInfoMiniPasswordLoginRequest req = buildRequest("13812345678", "rightPwd");
//        String token = userService.userInfoMiniLoginByPwd(req);
//
//        assertEquals(expectedToken, token);
//
//        // 验证 payload 内容正确
//        ArgumentCaptor<Map<String, String>> captor = ArgumentCaptor.forClass(Map.class);
//        verify(jwtUtils, times(1)).generateToken(captor.capture());
//        Map<String, String> payload = captor.getValue();
//        assertEquals("13812345678", payload.get("userAccount"));
//        assertEquals("rightPwd",      payload.get("userPassword"));
//    }
//}
