import unittest
from typing import Any
from unittest.mock import MagicMock, patch

from langchain_community.graphs import NebulaGraph


class TestNebulaGraph(unittest.TestCase):
    def setUp(self) -> None:
        self.space = "test_space"
        self.username = "test_user"
        self.password = "test_password"
        self.address = "test_address"
        self.port = 1234
        self.session_pool_size = 10

    @patch("nebula3.gclient.net.SessionPool.SessionPool")
    def test_init(self, mock_session_pool: Any) -> None:
        mock_session_pool.return_value = MagicMock()
        nebula_graph = NebulaGraph(
            self.space,
            self.username,
            self.password,
            self.address,
            self.port,
            self.session_pool_size,
        )
        self.assertEqual(nebula_graph.space, self.space)
        self.assertEqual(nebula_graph.username, self.username)
        self.assertEqual(nebula_graph.password, self.password)
        self.assertEqual(nebula_graph.address, self.address)
        self.assertEqual(nebula_graph.port, self.port)
        self.assertEqual(nebula_graph.session_pool_size, self.session_pool_size)

    @patch("nebula3.gclient.net.SessionPool.SessionPool")
    def test_get_session_pool(self, mock_session_pool: Any) -> None:
        mock_session_pool.return_value = MagicMock()
        nebula_graph = NebulaGraph(
            self.space,
            self.username,
            self.password,
            self.address,
            self.port,
            self.session_pool_size,
        )
        session_pool = nebula_graph._get_session_pool()
        self.assertIsInstance(session_pool, MagicMock)

    @patch("nebula3.gclient.net.SessionPool.SessionPool")
    def test_del(self, mock_session_pool: Any) -> None:
        mock_session_pool.return_value = MagicMock()
        nebula_graph = NebulaGraph(
            self.space,
            self.username,
            self.password,
            self.address,
            self.port,
            self.session_pool_size,
        )
        nebula_graph.__del__()
        mock_session_pool.return_value.close.assert_called_once()

    @patch("nebula3.gclient.net.SessionPool.SessionPool")
    def test_execute(self, mock_session_pool: Any) -> None:
        mock_session_pool.return_value = MagicMock()
        nebula_graph = NebulaGraph(
            self.space,
            self.username,
            self.password,
            self.address,
            self.port,
            self.session_pool_size,
        )
        query = "SELECT * FROM test_table"
        result = nebula_graph.execute(query)
        self.assertIsInstance(result, MagicMock)

    @patch("nebula3.gclient.net.SessionPool.SessionPool")
    def test_refresh_schema(self, mock_session_pool: Any) -> None:
        mock_session_pool.return_value = MagicMock()
        nebula_graph = NebulaGraph(
            self.space,
            self.username,
            self.password,
            self.address,
            self.port,
            self.session_pool_size,
        )
        nebula_graph.refresh_schema()
        self.assertNotEqual(nebula_graph.get_schema, "")
