Research-Stack/4-Infrastructure/NoDupeLabs/tests/database/test_wrapper_coverage.py

194 lines
6.9 KiB
Python

# SPDX-License-Identifier: Apache-2.0
# Copyright (c) 2025 Allaun
"""Tests for Database wrapper to achieve higher coverage."""
import sqlite3
from unittest.mock import MagicMock, PropertyMock, patch
import pytest
from nodupe.tools.databases.wrapper import Database, DatabaseError
class TestDatabaseWrapperCoverage:
"""Test cases to achieve higher coverage of Database wrapper."""
@patch('nodupe.tools.databases.wrapper.DatabaseConnection')
def test_database_init(self, mock_conn_class):
"""Test Database initialization."""
mock_conn = MagicMock()
mock_conn_class.return_value = mock_conn
db = Database("/test.db", timeout=30.0)
assert db.path == "/test.db"
assert db.timeout == 30.0
assert hasattr(db, 'connection')
assert hasattr(db, 'schema')
assert hasattr(db, 'query')
assert hasattr(db, 'transaction_manager')
assert hasattr(db, 'cache')
assert hasattr(db, 'locking')
assert hasattr(db, 'logging')
assert hasattr(db, 'session')
assert hasattr(db, 'compression')
assert hasattr(db, 'serialization')
assert hasattr(db, 'cleanup')
@patch('nodupe.tools.databases.wrapper.DatabaseConnection')
def test_database_aliases(self, mock_conn_class):
"""Test backward compatibility aliases."""
mock_conn = MagicMock()
mock_conn_class.return_value = mock_conn
db = Database("/test.db")
# Test that aliases work
assert db.monitoring is db.performance
assert db.validation is db.integrity
assert db.schema_migration is db.migration
assert db.optimization is db.performance
@patch('nodupe.tools.databases.wrapper.DatabaseConnection')
def test_close(self, mock_conn_class):
"""Test close method."""
mock_conn = MagicMock()
mock_conn_class.return_value = mock_conn
db = Database("/test.db")
db.close()
mock_conn.close.assert_called_once()
@patch('nodupe.tools.databases.wrapper.DatabaseConnection')
def test_create_table_success(self, mock_conn_class):
"""Test create_table successful execution."""
mock_conn = MagicMock()
mock_conn_class.return_value = mock_conn
mock_connection = MagicMock()
mock_conn.get_connection.return_value = mock_connection
db = Database("/test.db")
db.create_table("test_table", "id INTEGER PRIMARY KEY, name TEXT")
mock_connection.execute.assert_called()
@patch('nodupe.tools.databases.wrapper.DatabaseConnection')
def test_create_table_sql_error(self, mock_conn_class):
"""Test create_table raises DatabaseError on SQL error."""
mock_conn = MagicMock()
mock_conn_class.return_value = mock_conn
import sqlite3
mock_connection = MagicMock()
mock_connection.execute.side_effect = sqlite3.Error("SQL error")
mock_conn.get_connection.return_value = mock_connection
db = Database("/test.db")
with pytest.raises(DatabaseError):
db.create_table("test_table", "invalid schema")
@patch('nodupe.tools.databases.wrapper.DatabaseConnection')
def test_create(self, mock_conn_class):
"""Test create method."""
mock_conn = MagicMock()
mock_conn_class.return_value = mock_conn
mock_connection = MagicMock()
mock_connection.cursor.return_value.lastrowid = 1
mock_conn.get_connection.return_value = mock_connection
db = Database("/test.db")
result = db.create("files", {"path": "/test.txt", "size": 100})
assert result == 1
mock_connection.commit.assert_called()
@patch('nodupe.tools.databases.wrapper.DatabaseConnection')
def test_update(self, mock_conn_class):
"""Test update method."""
mock_conn = MagicMock()
mock_conn_class.return_value = mock_conn
mock_connection = MagicMock()
mock_connection.cursor.return_value.rowcount = 1
mock_conn.get_connection.return_value = mock_connection
db = Database("/test.db")
result = db.update("UPDATE files SET size = ? WHERE id = ?", (200, 1))
assert result == 1
mock_connection.commit.assert_called()
@patch('nodupe.tools.databases.wrapper.DatabaseConnection')
def test_delete(self, mock_conn_class):
"""Test delete method."""
mock_conn = MagicMock()
mock_conn_class.return_value = mock_conn
mock_connection = MagicMock()
mock_connection.cursor.return_value.rowcount = 1
mock_conn.get_connection.return_value = mock_connection
db = Database("/test.db")
result = db.delete("DELETE FROM files WHERE id = ?", (1,))
assert result == 1
mock_connection.commit.assert_called()
@patch('nodupe.tools.databases.wrapper.DatabaseConnection')
def test_execute_batch(self, mock_conn_class):
"""Test execute_batch method."""
mock_conn = MagicMock()
mock_conn_class.return_value = mock_conn
db = Database("/test.db")
with patch.object(db.batch, 'execute_batch') as mock_batch:
db.execute_batch([("INSERT INTO files VALUES (?, ?)", ("/a", 100))])
mock_batch.assert_called_once()
@patch('nodupe.tools.databases.wrapper.DatabaseConnection')
def test_execute_transaction_batch(self, mock_conn_class):
"""Test execute_transaction_batch method."""
mock_conn = MagicMock()
mock_conn_class.return_value = mock_conn
db = Database("/test.db")
with patch.object(db.batch, 'execute_transaction_batch') as mock_batch:
db.execute_transaction_batch([("INSERT INTO files VALUES (?, ?)", ("/a", 100))])
mock_batch.assert_called_once()
@patch('nodupe.tools.databases.wrapper.DatabaseConnection')
def test_transaction_context_manager(self, mock_conn_class):
"""Test transaction context manager."""
mock_conn = MagicMock()
mock_conn_class.return_value = mock_conn
db = Database("/test.db")
with patch.object(db.transaction_manager, 'transaction') as mock_tx:
mock_tx.return_value.__enter__ = MagicMock(return_value=None)
mock_tx.return_value.__exit__ = MagicMock(return_value=None)
with db.transaction():
pass
mock_tx.assert_called_once()
@patch('nodupe.tools.databases.wrapper.DatabaseConnection')
def test_context_manager_protocol(self, mock_conn_class):
"""Test context manager protocol."""
mock_conn = MagicMock()
mock_conn_class.return_value = mock_conn
db = Database("/test.db")
with db as database:
assert database is db
mock_conn.close.assert_called()