176 lines
6.7 KiB
Python
176 lines
6.7 KiB
Python
# -*- coding: utf-8 -*-
|
|
""" Python sql query test."""
|
|
import unittest
|
|
from unittest.mock import MagicMock, patch
|
|
|
|
from agentscope.service.sql_query.mongodb import query_mongodb
|
|
|
|
from agentscope.service.sql_query.mysql import query_mysql
|
|
from agentscope.service.service_response import ServiceExecStatus
|
|
from agentscope.service.sql_query.sqlite import query_sqlite
|
|
|
|
|
|
class TestSQLQueries(unittest.TestCase):
|
|
"""ExampleTest for a unit test."""
|
|
|
|
@patch("agentscope.service.sql_query.mysql.pymysql.connect")
|
|
def test_query_mysql_success(self, mock_connect: MagicMock) -> None:
|
|
"""Test query mysql success"""
|
|
# Set up a mock connection and cursor
|
|
mock_cursor = mock_connect.return_value.cursor.return_value
|
|
mock_cursor.fetchall.return_value = [("data1",), ("data2",)]
|
|
|
|
# Call the query_mysql function
|
|
response = query_mysql(
|
|
database="test_mysql_db",
|
|
query="SELECT * FROM my_table",
|
|
host="localhost",
|
|
user="user",
|
|
password="pass",
|
|
port=3306,
|
|
allow_change_data=False,
|
|
maxcount_results=10,
|
|
)
|
|
|
|
# Assert that the query_mysql function returned the expected results
|
|
self.assertEqual(response.status, ServiceExecStatus.SUCCESS)
|
|
self.assertEqual(response.content, [("data1",), ("data2",)])
|
|
|
|
# Ensure that the SQL query was executed correctly
|
|
mock_cursor.execute.assert_called_once_with(
|
|
"SELECT * FROM my_table LIMIT 10",
|
|
)
|
|
# Ensure that all results were fetched
|
|
mock_cursor.fetchall.assert_called_once()
|
|
|
|
@patch("agentscope.service.sql_query.mysql.pymysql.connect")
|
|
def test_query_mysql_failure(self, mock_connect: MagicMock) -> None:
|
|
"""Test query mysql failure"""
|
|
# Set up pymysql.connect to raise an exception
|
|
mock_connect.side_effect = Exception("Connection Error")
|
|
|
|
# Call the query_mysql function
|
|
response = query_mysql(
|
|
database="test_mysql_db",
|
|
query="SELECT * FROM my_table",
|
|
host="localhost",
|
|
user="user",
|
|
password="pass",
|
|
port=3306,
|
|
)
|
|
|
|
# Assert that the query_mysql function handled the exception
|
|
self.assertEqual(response.status, ServiceExecStatus.ERROR)
|
|
self.assertIn("Connection Error", str(response.content))
|
|
|
|
# Test for mongodb
|
|
@patch("agentscope.service.sql_query.mongodb.pymongo.MongoClient")
|
|
def test_query_mongodb_success(self, mock_mongo_client: MagicMock) -> None:
|
|
"""Test query mongodb success"""
|
|
# Set up a mock connection
|
|
mock_collection = MagicMock()
|
|
mock_collection.find.return_value.limit.return_value = [
|
|
{"_id": 1, "data": "test"},
|
|
]
|
|
mock = MagicMock()
|
|
mock_db = MagicMock()
|
|
mock.__getitem__.return_value = mock_db
|
|
mock_db.__getitem__.return_value = mock_collection
|
|
|
|
mock_client = MagicMock()
|
|
mock_mongo_client.return_value.__enter__.return_value = mock_client
|
|
mock_client.__getitem__.return_value = mock_db
|
|
|
|
# Call the query_mongodb function
|
|
response = query_mongodb(
|
|
database="db_name",
|
|
collection="collection_name",
|
|
query={"data": "test"},
|
|
host="localhost",
|
|
port=27017,
|
|
maxcount_results=10,
|
|
)
|
|
|
|
# Ensure that the query_mongodb returned the expected results
|
|
self.assertEqual(response.status, ServiceExecStatus.SUCCESS)
|
|
self.assertEqual(response.content, [{"_id": 1, "data": "test"}])
|
|
|
|
# Ensure that the query was executed correctly
|
|
mock_db.__getitem__.assert_called_with("collection_name")
|
|
mock_collection.find.assert_called_with({"data": "test"})
|
|
mock_collection.find.return_value.limit.assert_called_with(10)
|
|
|
|
@patch("agentscope.service.sql_query.mongodb.pymongo.MongoClient")
|
|
def test_query_mongodb_failure(self, mock_mongo_client: MagicMock) -> None:
|
|
"""Test query mongodb failure"""
|
|
# Configure the mock to raise a connection error
|
|
mock_mongo_client.side_effect = Exception("Connection Error")
|
|
|
|
# Call the query_mongodb function
|
|
response = query_mongodb(
|
|
database="test_db",
|
|
collection="test_collection",
|
|
query={"name": "Test Data"},
|
|
host="localhost",
|
|
port=27017,
|
|
)
|
|
|
|
# Assert that the function handled the exception
|
|
self.assertEqual(response.status, ServiceExecStatus.ERROR)
|
|
self.assertIn("Connection Error", str(response.content))
|
|
|
|
# Test for sqlite
|
|
@patch("agentscope.service.sql_query.sqlite.sqlite3.connect")
|
|
def test_query_sqlite_success(self, mock_connect: MagicMock) -> None:
|
|
"""Test successful SELECT query without data modification"""
|
|
# Mock sqlite connection and cursor
|
|
mock_cursor = MagicMock()
|
|
mock_cursor.fetchall.return_value = [("data1",), ("data2",)]
|
|
|
|
mock_connection = MagicMock()
|
|
mock_connection.cursor.return_value = mock_cursor
|
|
|
|
mock_connect.return_value = mock_connection
|
|
|
|
# Execute the query_sqlite function
|
|
response = query_sqlite(
|
|
database="test_db.sqlite",
|
|
query="SELECT * FROM my_table",
|
|
allow_change_data=False,
|
|
maxcount_results=10,
|
|
)
|
|
|
|
# Assert the query_sqlite function returned expected results
|
|
self.assertEqual(response.status, ServiceExecStatus.SUCCESS)
|
|
self.assertEqual(response.content, [("data1",), ("data2",)])
|
|
|
|
# Verify the correct SQL query was executed
|
|
mock_cursor.execute.assert_called_with(
|
|
"SELECT * FROM my_table LIMIT 10",
|
|
)
|
|
# Ensure all results were fetched
|
|
mock_cursor.fetchall.assert_called_once()
|
|
|
|
@patch("agentscope.service.sql_query.sqlite.sqlite3.connect")
|
|
def test_query_sqlite_exception_handling(
|
|
self,
|
|
mock_connect: MagicMock,
|
|
) -> None:
|
|
"""Test exception handling within the query_sqlite function"""
|
|
# Configure the mock to raise an exception during connection
|
|
mock_connect.side_effect = Exception("Connection Error")
|
|
|
|
# Execute the query_sqlite function
|
|
response = query_sqlite(
|
|
database="test_db.sqlite",
|
|
query="SELECT * FROM my_table",
|
|
)
|
|
|
|
# Assert that the function handled the exception
|
|
self.assertEqual(response.status, ServiceExecStatus.ERROR)
|
|
self.assertIn("Connection Error", str(response.content))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|