﻿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
36043	TransactionTestCase erasing migration data when using --keepdb option	Guillaume LEBRETON		"I've made a project for this issue to be easily reproduced here: https://github.com/Guilouf/django_bug
Using django5.1.4 and postgresql-17

When object are created in a data migration, and when there is a `TransactionTestCase` among the test case, all data is erased at the end of the tests run.
Then, if you try to re-run the tests using the `--keepdb` option, the data created during migrations is gone.

Here is how to reproduce it:

models.py
{{{
from django.db import models

class Car(models.Model):
    name = models.CharField(max_length=100)
}}}

data migration

{{{
from django.db import migrations, models


def create_car(apps, schema_editor):
    Car = apps.get_model(""cars"", ""Car"")
    Car.objects.create(name=""206"")

class Migration(migrations.Migration):
    dependencies = [
        ('cars', '0001_initial'),
    ]

    operations = [migrations.RunPython(create_car, migrations.RunPython.noop) ]

}}}

keepdb test
{{{
from django.test import TestCase, TransactionTestCase

from cars.models import Car


class A_CarTestCase(TestCase):

    def test_car_migrated(self):
        self.assertTrue(Car.objects.first())


class B_BugTestCase(TransactionTestCase):

    def test_bug_migrated(self):
        pass
}}}

Using ` python manage.py test cars.tests.tests_keepdb --keepdb`, the first time tests are executed correctly, the second time `test_car_migrated` fails because there is no more existing cars.

I tried using `serialized_rollback = True` but it doesn't change anything about keeping data after the test session ends. I may have found some issues with that option but it should be on a separate ticket.

I understand that is not necessarily a bug, but this implications should appear in the docs that you can't mix `--keepdb` and having just even one `TransactionTestCase` if you want to access data from migrations.
https://docs.djangoproject.com/en/5.1/topics/testing/overview/#preserving-the-test-database I think the section of the doc should be updated with a warning about `TransactionTestCase`.

Here, https://docs.djangoproject.com/en/5.1/topics/testing/tools/#transactiontestcase, 
we can read ""''A TransactionTestCase may call commit and rollback and observe the effects of these calls on the database.''"", i think this is misleading and should be reformulated, when i read this i think that the database would be restored to the state it was before the test, which is not the case.

Here https://github.com/wagtail/wagtail/issues/4520 an example of implications of this behavior. Wagtail have some models (`Page` for example) created during migrations. If you use even just one `TransactionTestCase`, then after a test re-run with `--keepdb` all the mandatory data from wagtails migrations are gone.

I can propose a PR to update the docs if  you agree.

"	Bug	closed	Testing framework	5.1	Normal	duplicate		Guillaume LEBRETON	Unreviewed	0	0	0	0	0	0
