Ctrl K
ComunidadGuías…

tests/test_docs_store_resource_cleanup.py

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
import pytest

from dm.docs import store


class Cursor:
    def __init__(self, *, rows=None, fail_on_execute=False):
        self.rows = list(rows or [])
        self.fail_on_execute = fail_on_execute
        self.closed = False
        self.executed = []

    def execute(self, sql):
        self.executed.append(sql)
        if self.fail_on_execute:
            raise RuntimeError("driver failure")

    def fetchone(self):
        return self.rows.pop(0) if self.rows else None

    def close(self):
        self.closed = True


class Connection:
    def __init__(self, cursor):
        self._cursor = cursor
        self.closed = False
        self._autocommit = None
        self.fail_autocommit = False

    @property
    def autocommit(self):
        return self._autocommit

    @autocommit.setter
    def autocommit(self, value):
        if self.fail_autocommit:
            raise RuntimeError("cannot configure autocommit")
        self._autocommit = value

    def cursor(self):
        return self._cursor

    def close(self):
        self.closed = True


def test_connect_rejects_non_boolean_autocommit(monkeypatch):
    monkeypatch.setattr(store.psycopg2, "connect", lambda **kwargs: pytest.fail("driver should not be called"))
    for value in (1, "true", None):
        with pytest.raises(ValueError):
            store.connect(value)


def test_connect_closes_connection_when_autocommit_configuration_fails(monkeypatch):
    connection = Connection(Cursor())
    connection.fail_autocommit = True
    monkeypatch.setattr(store.psycopg2, "connect", lambda **kwargs: connection)
    with pytest.raises(RuntimeError, match="autocommit"):
        store.connect()
    assert connection.closed


def test_connect_vec_closes_connection_when_registration_fails(monkeypatch):
    cursor = Cursor()
    connection = Connection(cursor)
    monkeypatch.setattr(store, "connect", lambda **kwargs: connection)
    import pgvector.psycopg2
    monkeypatch.setattr(pgvector.psycopg2, "register_vector", lambda conn: (_ for _ in ()).throw(RuntimeError("bad vector")))
    with pytest.raises(RuntimeError):
        store.connect_vec()
    assert connection.closed


def test_init_schema_closes_cursor_and_connection_on_failure(monkeypatch):
    cursor = Cursor(fail_on_execute=True)
    connection = Connection(cursor)
    monkeypatch.setattr(store, "connect", lambda: connection)
    with pytest.raises(RuntimeError):
        store.init_schema()
    assert cursor.closed
    assert connection.closed


def test_counts_closes_resources_and_validates_rows(monkeypatch):
    cursor = Cursor(rows=[(2,), (5,)])
    connection = Connection(cursor)
    monkeypatch.setattr(store, "connect", lambda: connection)
    assert store.counts() == (2, 5)
    assert cursor.closed and connection.closed


@pytest.mark.parametrize("rows", [[], [(1,)], [(True,), (2,)], [(-1,), (2,)], [(1.5,), (2,)]])
def test_counts_rejects_missing_or_invalid_count_rows(monkeypatch, rows):
    cursor = Cursor(rows=rows)
    connection = Connection(cursor)
    monkeypatch.setattr(store, "connect", lambda: connection)
    with pytest.raises(RuntimeError):
        store.counts()
    assert cursor.closed and connection.closed