package test.util;

import org.junit.Test;
import util.DatabaseUtil;

import java.sql.Connection;
import java.sql.SQLException;

import static org.junit.Assert.*;

/**
 * DatabaseUtil类的单元测试
 */
public class DatabaseUtilTest {

    /**
     * 测试获取数据库连接
     */
    @Test
    public void testGetConnection() {
        try (Connection conn = DatabaseUtil.getConnection()) {
            // 验证连接不为空
            assertNotNull("数据库连接不应该为空", conn);
            // 验证连接是否有效
            assertTrue("数据库连接应该是有效的", !conn.isClosed());
        } catch (SQLException e) {
            fail("获取数据库连接时发生异常: " + e.getMessage());
        }
    }

    /**
     * 测试连接自动关闭
     */
    @Test
    public void testConnectionAutoClose() {
        Connection conn = null;
        try {
            // 在try-with-resources块中获取连接
            try (Connection autoCloseConn = DatabaseUtil.getConnection()) {
                assertNotNull("数据库连接不应该为空", autoCloseConn);
                assertTrue("连接应该是开启状态", !autoCloseConn.isClosed());
            }
            // try-with-resources块结束后，获取一个新连接来测试
            conn = DatabaseUtil.getConnection();
            assertNotNull("新的数据库连接不应该为空", conn);
            assertTrue("新的连接应该是开启状态", !conn.isClosed());
        } catch (SQLException e) {
            fail("测试连接自动关闭时发生异常: " + e.getMessage());
        } finally {
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 测试多次获取连接
     */
    @Test
    public void testMultipleConnections() {
        try (Connection conn1 = DatabaseUtil.getConnection();
             Connection conn2 = DatabaseUtil.getConnection()) {
            
            assertNotNull("第一个数据库连接不应该为空", conn1);
            assertNotNull("第二个数据库连接不应该为空", conn2);
            
            // 验证获取到的是两个不同的连接对象
            assertNotEquals("两个连接对象应该是不同的实例", conn1, conn2);
            
            // 验证两个连接都是有效的
            assertTrue("第一个连接应该是有效的", !conn1.isClosed());
            assertTrue("第二个连接应该是有效的", !conn2.isClosed());
        } catch (SQLException e) {
            fail("测试多个连接时发生异常: " + e.getMessage());
        }
    }
}
