From d904127b3342102a0491c15ae24888f9966e043c Mon Sep 17 00:00:00 2001 From: Alexandre Matos Date: Fri, 10 Jan 2025 11:00:31 -0300 Subject: [PATCH 1/2] Set the serialized_aliases argument of setup_databases. --- pytest_django/fixtures.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/pytest_django/fixtures.py b/pytest_django/fixtures.py index 8c4cad94..4be5e9cd 100644 --- a/pytest_django/fixtures.py +++ b/pytest_django/fixtures.py @@ -144,6 +144,7 @@ def django_db_setup( db_cfg = setup_databases( verbosity=request.config.option.verbose, interactive=False, + serialized_aliases=_get_serialized_aliases(request.session.items), **setup_databases_args, ) @@ -301,6 +302,34 @@ def handle(self, *args, **kwargs): migrate.Command = MigrateSilentCommand +def _get_serialized_aliases(tests: list) -> set: + """ + Get a set of `serialized_aliases` to be used with `setup_databases`. + + The `serialized_aliases` argument of the `setup_databases` function determines what subset of aliases test + databases should have their state serialized to allow usage of the `serialized_rollback` feature. If it's not + provided, it defaults to aliases. + + Django 5 removed the `SERIALIZE` test setting, as it can be inferred from the databases with the + `serialized_rollback` option enabled. Django's default test runner, `DiscoverRunner`, uses logic similar to this to + build the `serialized_aliases` set and pass it to `setup_databases`, as implemented in + `django.test.runner.DiscoverRunner.run_tests`. + """ + from django.db import connections + + databases = {} + for test in tests: + if not (marker := test.get_closest_marker("django_db")): + continue + (_, _, test_databases, serialized_rollback, _) = validate_django_db(marker) + if test_databases == "__all__": + test_databases = connections + if test_databases: + databases.update((alias, serialized_rollback or databases.get(alias, False)) for alias in test_databases) + serialized_aliases = {alias for alias, serialize in databases.items() if serialize} + return serialized_aliases + + def _set_suffix_to_test_databases(suffix: str) -> None: from django.conf import settings From 53605592bcb282d124c56dad6f1c775a2ea13349 Mon Sep 17 00:00:00 2001 From: Alexandre Matos Date: Fri, 10 Jan 2025 15:07:18 -0300 Subject: [PATCH 2/2] Reformat code. --- pytest_django/fixtures.py | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/pytest_django/fixtures.py b/pytest_django/fixtures.py index 4be5e9cd..9db38af9 100644 --- a/pytest_django/fixtures.py +++ b/pytest_django/fixtures.py @@ -302,18 +302,20 @@ def handle(self, *args, **kwargs): migrate.Command = MigrateSilentCommand -def _get_serialized_aliases(tests: list) -> set: +def _get_serialized_aliases(tests: list[pytest.Item]) -> set[str]: """ Get a set of `serialized_aliases` to be used with `setup_databases`. - The `serialized_aliases` argument of the `setup_databases` function determines what subset of aliases test - databases should have their state serialized to allow usage of the `serialized_rollback` feature. If it's not - provided, it defaults to aliases. + The `serialized_aliases` argument of the `setup_databases` function + determines what subset of aliases test databases should have their state + serialized to allow usage of the `serialized_rollback` feature. If it's + not provided, it defaults to aliases. - Django 5 removed the `SERIALIZE` test setting, as it can be inferred from the databases with the - `serialized_rollback` option enabled. Django's default test runner, `DiscoverRunner`, uses logic similar to this to - build the `serialized_aliases` set and pass it to `setup_databases`, as implemented in - `django.test.runner.DiscoverRunner.run_tests`. + Django 5 removed the `SERIALIZE` test setting, as it can be inferred from + the databases with the `serialized_rollback` option enabled. Django's + default test runner, `DiscoverRunner`, uses logic similar to this to build + the `serialized_aliases` set and pass it to `setup_databases`, as + implemented in `django.test.runner.DiscoverRunner.run_tests`. """ from django.db import connections @@ -321,12 +323,19 @@ def _get_serialized_aliases(tests: list) -> set: for test in tests: if not (marker := test.get_closest_marker("django_db")): continue - (_, _, test_databases, serialized_rollback, _) = validate_django_db(marker) + validated_marker = validate_django_db(marker) + (_, _, test_databases, serialized_rollback, _) = validated_marker + if test_databases == "__all__": test_databases = connections if test_databases: - databases.update((alias, serialized_rollback or databases.get(alias, False)) for alias in test_databases) - serialized_aliases = {alias for alias, serialize in databases.items() if serialize} + databases.update( + (alias, serialized_rollback or databases.get(alias, False)) + for alias in test_databases + ) + serialized_aliases = { + alias for alias, serialize in databases.items() if serialize + } return serialized_aliases