package com.emotion.controller;

import com.emotion.service.AuthService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.test.web.servlet.MockMvc;

import static org.mockito.Mockito.when;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;

/**
 * AuthController 测试类
 * 
 * @author huazhongmin
 * @date 2025-07-26
 */
@WebMvcTest(AuthController.class)
public class AuthControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private AuthService authService;

    @Test
    public void testCheckAccountExists() throws Exception {
        // 模拟账户存在的情况
        when(authService.existsByAccount("existingUser")).thenReturn(true);

        mockMvc.perform(get("/auth/check-account")
                .param("account", "existingUser"))
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.code").value(200))
                .andExpect(jsonPath("$.data").value(true));
    }

    @Test
    public void testCheckAccountNotExists() throws Exception {
        // 模拟账户不存在的情况
        when(authService.existsByAccount("nonExistingUser")).thenReturn(false);

        mockMvc.perform(get("/auth/check-account")
                .param("account", "nonExistingUser"))
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.code").value(200))
                .andExpect(jsonPath("$.data").value(false));
    }

    @Test
    public void testCheckEmailExists() throws Exception {
        // 模拟邮箱存在的情况
        when(authService.existsByEmail("existing@example.com")).thenReturn(true);

        mockMvc.perform(get("/auth/check-email")
                .param("email", "existing@example.com"))
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.code").value(200))
                .andExpect(jsonPath("$.data").value(true));
    }

    @Test
    public void testCheckEmailNotExists() throws Exception {
        // 模拟邮箱不存在的情况
        when(authService.existsByEmail("nonexisting@example.com")).thenReturn(false);

        mockMvc.perform(get("/auth/check-email")
                .param("email", "nonexisting@example.com"))
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.code").value(200))
                .andExpect(jsonPath("$.data").value(false));
    }

    @Test
    public void testCheckPhoneExists() throws Exception {
        // 模拟手机号存在的情况
        when(authService.existsByPhone("13800138000")).thenReturn(true);

        mockMvc.perform(get("/auth/check-phone")
                .param("phone", "13800138000"))
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.code").value(200))
                .andExpect(jsonPath("$.data").value(true));
    }

    @Test
    public void testCheckPhoneNotExists() throws Exception {
        // 模拟手机号不存在的情况
        when(authService.existsByPhone("13900139000")).thenReturn(false);

        mockMvc.perform(get("/auth/check-phone")
                .param("phone", "13900139000"))
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.code").value(200))
                .andExpect(jsonPath("$.data").value(false));
    }
}
