"""Tests for db utilities.""" import pytest from product_review.api import db from product_review.util.db import db_transaction def test_db_transaction_decorator_commit(mocker): """Test db_transaction decorator commit. Ensure session is committed when no exception is raised within wrapped function. """ mocker.patch.object(db, "session") @db_transaction def wrapped_function(): pass wrapped_function() db.session.commit.assert_called_once() db.session.rollback.assert_not_called() def test_db_transaction_decorator_rollback(mocker): """Test db_transaction decorator rollback. Ensure session is rolled back when exception is raised within wrapped function. """ mocker.patch.object(db, "session") db.session.commit.side_effect = Exception("Test exception") @db_transaction def wrapped_function(): raise Exception("Test exception") with pytest.raises(Exception, match="Test exception"): wrapped_function() db.session.rollback.assert_called_once() db.session.commit.assert_not_called() def test_db_transaction_context_manager_commit(mocker): """Test db_transaction context manager commit. Ensure session is committed when no exception is raised within context. """ mocker.patch.object(db, "session") with db_transaction: pass db.session.commit.assert_called_once() db.session.rollback.assert_not_called() def test_db_transaction_context_manager_rollback(mocker): """Test db_transaction context manager rollback. Ensure session is rolled back when exception is raised within context. """ mocker.patch.object(db, "session") db.session.commit.side_effect = Exception("Test exception") with pytest.raises(Exception, match="Test exception"): with db_transaction: raise Exception("Test exception") db.session.rollback.assert_called_once() db.session.commit.assert_not_called()