#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.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/053.92f4e7c8eed10f4567ec60879867af1d%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to