[Django] #28400: TransactionTestCase will truncate data created from data migration

4 views
Skip to first unread message

Django

unread,
Jul 14, 2017, 11:41:13 PM7/14/17
to django-...@googlegroups.com
#28400: TransactionTestCase will truncate data created from data migration
-------------------------------------+-------------------------------------
Reporter: Jared | Owner: nobody
Mackey |
Type: Bug | Status: new
Component: Testing | Version: 1.11
framework | Keywords: tests,data-
Severity: Normal | migrations
Triage Stage: | Has patch: 0
Unreviewed |
Needs documentation: 0 | Needs tests: 0
Patch needs improvement: 0 | Easy pickings: 0
UI/UX: 0 |
-------------------------------------+-------------------------------------
Data migrations that create data in the database do not persist after
running tests that inherit from `TransactionTestCase`. The first test that
runs on the database works as expected but subsequent tests do not.

Here is an example migration:

{{{
def add_group_permissions(apps, schema_editor):
for app_config in apps.get_app_configs():
app_config.models_module = True
create_permissions(app_config, verbosity=0)
app_config.models_module = None

Group = apps.get_model('auth', 'Group')
Permission = apps.get_model('auth', 'Permission')

group, _ = Group.objects.get_or_create(name='demo_group')
group.permissions.clear()
permission = Permission.objects.get(codename='existing_permission')
group.permissions.add(permission)


class Migration(migrations.Migration):

dependencies = [ ]

operations = [
migrations.RunPython(add_group_permissions,
reverse_code=migrations.RunPython.noop),
migrations.RunPython(lambda apps, schema_editor:
ContentType.objects.clear_cache()), # hack to get the ContentType cache
to clear
]
}}}

Here is a test case that will prove that the second test to run will fail
with `django.contrib.auth.models.DoesNotExist: Group matching query does
not exist.`

{{{
class TestGroupsExist(TransactionTestCase):
""" One of these tests will fail. Which one depends on which one the
test runner runs first. The second one to run will fail. """
def test_group_exists_1(self):
self.assertIsNotNone(Group.objects.get_by_natural_key('demo_group'))

def test_group_exists_2(self):
self.assertIsNotNone(Group.objects.get_by_natural_key('demo_group'))
}}}

The following log is found after the first test is ran.

`TRUNCATE ... "auth_group_permissions", "auth_group", ...;; args=None`

A possible solution to this is to re-run data only migrations after
truncating the tables.

--
Ticket URL: <https://code.djangoproject.com/ticket/28400>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

Django

unread,
Jul 14, 2017, 11:51:31 PM7/14/17
to django-...@googlegroups.com
#28400: TransactionTestCase will truncate data created from data migration
-------------------------------------+-------------------------------------
Reporter: Jared Mackey | Owner: nobody
Type: Bug | Status: new
Component: Testing framework | Version: 1.11
Severity: Normal | Resolution:
Keywords: tests,data- | Triage Stage:
migrations | Unreviewed
Has patch: 0 | Needs documentation: 0

Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Description changed by Jared Mackey:

Old description:

New description:

Data migrations that create data in the database do not persist after
running tests that inherit from `TransactionTestCase`. The first test that

runs on the database works as expected but subsequent tests do not. I am
filling as a bug as I would expect that data created before tests are ran
would persist a transaction rollback during the test cases. A possible


class Migration(migrations.Migration):

dependencies = [ ]

--

--
Ticket URL: <https://code.djangoproject.com/ticket/28400#comment:1>

Django

unread,
Jul 15, 2017, 9:03:31 AM7/15/17
to django-...@googlegroups.com
#28400: TransactionTestCase will truncate data created from data migration
-------------------------------------+-------------------------------------
Reporter: Jared Mackey | Owner: nobody
Type: Bug | Status: closed

Component: Testing framework | Version: 1.11
Severity: Normal | Resolution: invalid

Keywords: tests,data- | Triage Stage:
migrations | Unreviewed
Has patch: 0 | Needs documentation: 0

Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Changes (by Tim Graham):

* status: new => closed
* resolution: => invalid


Comment:

This is [https://docs.djangoproject.com/en/stable/topics/testing/overview
/#rollback-emulation as documented]:

Any initial data loaded in migrations will only be available in
`TestCase` tests and not in `TransactionTestCase` tests ... Django can
reload that data for you on a per-testcase basis by setting the
`serialized_rollback` option to `True` in the body of the `TestCase` or
`TransactionTestCase`, but note that this will slow down that test suite
by approximately 3x.

--
Ticket URL: <https://code.djangoproject.com/ticket/28400#comment:2>

Reply all
Reply to author
Forward
0 new messages