Skip to content

Commit b67b9ce

Browse files
committed
Replace shared_db_wrapper tests with a pytester test
1 parent 38cc40c commit b67b9ce

File tree

2 files changed

+52
-51
lines changed

2 files changed

+52
-51
lines changed

Diff for: pytest_django/fixtures.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,8 @@ def finalize():
234234
# Otherwise we've run it already.
235235
if exc_type == DummyException:
236236
# dummy exception makes `atomic` rollback the savepoint
237-
atomic.__exit__(exc_type, exc_value, traceback)
237+
with _django_cursor_wrapper:
238+
atomic.__exit__(exc_type, exc_value, traceback)
238239

239240
try:
240241
_django_cursor_wrapper.enable()

Diff for: tests/test_database.py

+50-50
Original file line numberDiff line numberDiff line change
@@ -52,57 +52,57 @@ def test_noaccess_fixture(noaccess):
5252
pass
5353

5454

55-
@pytest.mark.skipif(get_django_version() < (1, 6),
56-
reason="shared_db_wrapper needs at least Django 1.6")
57-
class TestSharedDbWrapper(object):
58-
"""Tests for sharing data created with share_db_wrapper, order matters."""
59-
@pytest.fixture(scope='class')
60-
def shared_item(self, request, shared_db_wrapper):
61-
with shared_db_wrapper(request):
62-
return Item.objects.create(name='shared item')
63-
64-
def test_preparing_data(self, shared_item):
65-
type(self)._shared_item_pk = shared_item.pk
66-
67-
def test_accessing_the_same_data(self, db, shared_item):
68-
retrieved_item = Item.objects.get(name='shared item')
69-
assert type(self)._shared_item_pk == retrieved_item.pk
70-
71-
72-
@pytest.mark.skipif(get_django_version() < (1, 6),
73-
reason="shared_db_wrapper needs at least Django 1.6")
74-
def test_shared_db_wrapper_not_leaking(db):
75-
assert not Item.objects.filter(name='shared item').exists()
76-
77-
78-
def test_nesting_shared_db_wrapper(db, shared_db_wrapper):
79-
finalizers = []
80-
request = type('FakeRequest', (object, ), {
81-
'funcargnames': (),
82-
'addfinalizer': lambda self, f: finalizers.append(f)
83-
})()
84-
85-
with shared_db_wrapper(request):
86-
item1 = Item.objects.create()
87-
88-
with shared_db_wrapper(request):
89-
item2 = Item.objects.create()
90-
91-
# Each call to shared_db_wrapper should have added 1 finalizer
92-
item1_fin, item2_fin = finalizers
93-
94-
# Make sure the data lives outside `with shared_db_wrapper`
95-
assert Item.objects.filter(pk=item1.pk).exists()
96-
assert Item.objects.filter(pk=item2.pk).exists()
97-
98-
# Check that finalizers remove the right data
99-
item2_fin()
100-
assert Item.objects.filter(pk=item1.pk).exists()
101-
assert not Item.objects.filter(pk=item2.pk).exists()
55+
@pytest.mark.skipif(
56+
get_django_version() < (1, 6),
57+
reason="shared_db_wrapper needs at least Django 1.6")
58+
def test_shared_db_wrapper(django_testdir):
59+
django_testdir.create_test_module('''
60+
from .app.models import Item
61+
import pytest
10262
103-
item1_fin()
104-
assert not Item.objects.filter(pk=item1.pk).exists()
105-
assert not Item.objects.filter(pk=item2.pk).exists()
63+
@pytest.fixture(scope='session')
64+
def session_item(request, shared_db_wrapper):
65+
with shared_db_wrapper(request):
66+
return Item.objects.create(name='session')
67+
68+
@pytest.fixture(scope='module')
69+
def module_item(request, shared_db_wrapper):
70+
with shared_db_wrapper(request):
71+
return Item.objects.create(name='module')
72+
73+
@pytest.fixture(scope='class')
74+
def class_item(request, shared_db_wrapper):
75+
with shared_db_wrapper(request):
76+
return Item.objects.create(name='class')
77+
78+
class TestItems:
79+
def test_save_the_items(
80+
self, db, session_item, module_item, class_item):
81+
global _session_item
82+
global _module_item
83+
global _class_item
84+
assert session_item.pk
85+
assert module_item.pk
86+
assert class_item.pk
87+
_session_item = session_item
88+
_module_item = module_item
89+
_class_item = class_item
90+
91+
def test_accessing_the_same_items(
92+
self, db, session_item, module_item, class_item):
93+
assert _session_item == session_item
94+
assert _module_item == module_item
95+
assert _class_item == class_item
96+
97+
class TestSharing:
98+
def test_sharing_some_items(
99+
self, db, session_item, module_item, class_item):
100+
assert _session_item == session_item
101+
assert _module_item == module_item
102+
assert _class_item != class_item
103+
''')
104+
result = django_testdir.runpytest_subprocess('-v', '-s', '--reuse-db')
105+
assert result.ret == 0
106106

107107

108108
class TestDatabaseFixtures:

0 commit comments

Comments
 (0)