from unittest.mock import MagicMock, patch, PropertyMock import pytest from payment.utils.decorators import method_decorator, no_autoflush def sample_decorator(func): def wrapper(*args, **kwargs): return f'decorated-{func(*args, **kwargs)}' return wrapper def test_method_decorator_single_method(): @method_decorator(sample_decorator, 'method1') class TestClass: """Test class for method_decorator.""" def method1(self): return 'method1' def method2(self): return 'method2' obj = TestClass() assert obj.method1() == 'decorated-method1' assert obj.method2() == 'method2' def test_method_decorator_multiple_methods(): @method_decorator(sample_decorator, ['method1', 'method2']) class TestClass: """Test class for method_decorator.""" def method1(self): return 'method1' def method2(self): return 'method2' obj = TestClass() assert obj.method1() == 'decorated-method1' assert obj.method2() == 'decorated-method2' def test_method_decorator_nonexistent_method(): with pytest.raises(AttributeError): @method_decorator(sample_decorator, 'bar') class TestClass: def foo(self): return 'foo' def test_no_autoflush_decorator_calls_func_within_context(): mock_func = MagicMock(return_value='result') mock_context = MagicMock() with patch('payment.utils.decorators.db.session') as mock_session: type(mock_session).no_autoflush = PropertyMock(return_value=mock_context) decorated = no_autoflush(mock_func) result = decorated(1, 2, key='value') mock_func.assert_called_once_with(1, 2, key='value') mock_context.__enter__.assert_called_once() mock_context.__exit__.assert_called_once() assert result == 'result'