﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
28400	TransactionTestCase will truncate data created from data migration	Jared Mackey	nobody	"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 solution to this is to re-run data only migrations after truncating the tables.

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`
"	Bug	closed	Testing framework	1.11	Normal	invalid	tests,data-migrations		Unreviewed	0	0	0	0	0	0
