Skip to content

Commit

Permalink
Allow nested atomic blocks, fix tests
Browse files Browse the repository at this point in the history
  • Loading branch information
epandurski committed Feb 9, 2019
1 parent 630b24e commit 8b6242e
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 12 deletions.
4 changes: 2 additions & 2 deletions flask_signalbus/atomic.py
Original file line number Diff line number Diff line change
Expand Up @@ -113,8 +113,8 @@ def f():
def wrapper(*args, **kwargs):
session = self.session
session_info = session.info
assert not session_info.get(_ATOMIC_FLAG_SESSION_INFO_KEY), \
'"atomic" blocks can not be nested'
if session_info.get(_ATOMIC_FLAG_SESSION_INFO_KEY):
return func(*args, **kwargs)
f = retry_on_deadlock(session)(func)
session_info[_ATOMIC_FLAG_SESSION_INFO_KEY] = True
try:
Expand Down
33 changes: 23 additions & 10 deletions tests/test_atomic.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,33 +26,46 @@ def f(x):
def test_execute_atomic(atomic_db):
db = atomic_db
commit = Mock()
rollback = Mock()
db.session.commit = commit
db.session.rollback = rollback
var = 1

with pytest.raises(RuntimeError):
@db.execute_atomic
def f1():
raise RuntimeError
commit.assert_not_called()

with pytest.raises(AssertionError):
@db.execute_atomic
def f2():
@db.execute_atomic
def recursive():
pass
commit.assert_not_called()
rollback.assert_called_once()

@db.execute_atomic
def f3():
def f2():
assert var == 1
return 666
commit.assert_called_once()
assert f3 == 666
rollback.assert_called_once()
assert f2 == 666

assert db.execute_atomic(lambda x: x, 777) == 777


def test_nested_execute_atomic(atomic_db):
db = atomic_db
commit = Mock()
rollback = Mock()
db.session.commit = commit
db.session.rollback = rollback

@db.execute_atomic
def f1():
@db.execute_atomic
def f2():
pass

commit.assert_called_once()
rollback.assert_not_called()


def test_retry_on_integrity_error(atomic_db, AtomicModel):
db = atomic_db
o = AtomicModel(
Expand Down

0 comments on commit 8b6242e

Please sign in to comment.