Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
84 changes: 84 additions & 0 deletions tests/unit/test_db.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
import uuid
from unittest.mock import MagicMock

import pytest

from app.db.connector import DB # ajusta el import a tu ruta real


class FakeConn:
def __init__(self):
self.cursor_obj = MagicMock()

def cursor(self):
return self.cursor_obj

def commit(self):
pass

def close(self):
pass


class FakePool:
def __init__(self, minconn, maxconn, dsn):
# puedes comprobar aquí minconn, maxconn, dsn si quieres
self._conn = FakeConn()
self.getconn = MagicMock(return_value=self._conn)
self.putconn = MagicMock()
self.closeall = MagicMock()


@pytest.fixture(autouse=True)
def fake_pool(monkeypatch):
"""Antes de cada test, parchea pool.SimpleConnectionPool para que devuelva FakePool."""
monkeypatch.setenv("DATABASE_URL", "postgres://fake") # si tu settings saca de env
monkeypatch.setattr(
"app.db.connector.pool.SimpleConnectionPool",
lambda minconn, maxconn, dsn: FakePool(minconn, maxconn, dsn),
)
yield


def test_create_table_and_store_chat(tmp_path):
# Forzamos la _instance a None para aislar tests
DB._instance = None

# Instancia y crea tabla
db = DB(minconn=2, maxconn=5)
# Tras init, debería haber llamado create_table()
fake_pool = db.pool
conn = fake_pool.getconn()
# Comprobamos que ejecutamos el DDL correcto
expected_ddl = """
CREATE TABLE IF NOT EXISTS chats (
uid UUID PRIMARY KEY,
question TEXT NOT NULL,
answer TEXT NOT NULL,
votes INTEGER DEFAULT 0,
comment TEXT,
user_id UUID
);
"""
conn.cursor().execute.assert_any_call(expected_ddl)
fake_pool.putconn.assert_called_with(conn)

# Ahora probamos store_chat
fake_pool.getconn.reset_mock()
fake_pool.putconn.reset_mock()
conn.cursor().reset_mock()

test_uid = str(uuid.uuid4())
test_user = uuid.uuid4()
db.store_chat("¿Hola?", "¡Hola!", test_uid, test_user)

# Debe haberse conectado
# El INSERT
conn.cursor().execute.assert_called_once_with(
"""
INSERT into chats (uid, question, answer, votes, user_id) values (%s, %s, %s, %s, %s);
""",
(test_uid, "¿Hola?", "¡Hola!", 0, str(test_user)),
)
# Commit y cierre
fake_pool.putconn.assert_called_with(conn)