package com.xyw.console.common;

import static org.junit.jupiter.api.Assertions.assertEquals;

import java.sql.SQLIntegrityConstraintViolationException;
import java.sql.SQLSyntaxErrorException;
import org.junit.jupiter.api.Test;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.jdbc.BadSqlGrammarException;

/** 文件用途（白话）：验证未处理的数据库异常会被转换成页面可以直接展示的统一错误消息。 */
class GlobalExceptionHandlerTest {
  /** 代码作用（白话）：证明手机号唯一约束冲突不会泄露底层 SQL，而是返回手机号已存在；关联文件：GlobalExceptionHandler.java、PhoneAssetService.java；关联逻辑（调用链/数据流）：手机号新增 -> DuplicateKeyException -> Advice -> ApiResponse -> 页面提示。 */
  @Test void phoneNumberDuplicateReturnsBusinessMessage() {
    GlobalExceptionHandler handler = new GlobalExceptionHandler();
    DuplicateKeyException error = new DuplicateKeyException("duplicate", new SQLIntegrityConstraintViolationException("Duplicate entry for key 'as_phone_asset.uk_phone_asset_phone_number_delete_time'"));
    ApiResponse<Void> response = handler.duplicate(error);
    assertEquals(409, response.code());
    assertEquals("手机号已存在，请勿重复新增", response.message());
  }

  /** 代码作用（白话）：证明缺失数据库列会返回字段未同步提示，而不是被页面误判为登录问题；关联文件：GlobalExceptionHandler.java、WecomAccountService.java；关联逻辑（调用链/数据流）：企微新增 -> BadSqlGrammarException -> Advice -> ApiResponse -> 页面提示。 */
  @Test void missingColumnReturnsMigrationMessage() {
    GlobalExceptionHandler handler = new GlobalExceptionHandler();
    BadSqlGrammarException error = new BadSqlGrammarException("insert", "INSERT", new SQLSyntaxErrorException("Unknown column 'phone_link_mode' in 'field list'"));
    ApiResponse<Void> response = handler.badSqlGrammar(error);
    assertEquals(500, response.code());
    assertEquals("数据库字段未同步，请完成数据库迁移后重试", response.message());
  }
}
