Skip to content

Refine the django.conf module check to see if the settings really are configured #668

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Oct 30, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 12 additions & 10 deletions pytest_django/lazy_django.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,18 @@ def skip_if_no_django():


def django_settings_is_configured():
# Avoid importing Django if it has not yet been imported
if (
not os.environ.get("DJANGO_SETTINGS_MODULE")
and "django.conf" not in sys.modules
):
return False

# If DJANGO_SETTINGS_MODULE is defined at this point, Django is assumed to
# always be loaded.
return True
"""Return whether the Django settings module has been configured.

This uses either the DJANGO_SETTINGS_MODULE environment variable, or the
configured flag in the Django settings object if django.conf has already
been imported.
"""
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In case this needs to be fixed anyway, please remove the newline at the end.

ret = bool(os.environ.get("DJANGO_SETTINGS_MODULE"))

if not ret and "django.conf" in sys.modules:
return sys.modules["django.conf"].settings.configured

return ret


def get_django_version():
Expand Down
35 changes: 35 additions & 0 deletions tests/test_django_settings_module.py
Original file line number Diff line number Diff line change
Expand Up @@ -406,6 +406,41 @@ def test_cfg(pytestconfig):
assert r.ret == 0


def test_no_ds_but_django_conf_imported(testdir, monkeypatch):
"""pytest-django should not bail out, if "django.conf" has been imported
somewhere, e.g. via hypothesis (#599)."""

monkeypatch.delenv('DJANGO_SETTINGS_MODULE')

testdir.makepyfile("""
import os
import sys

# line copied from hypothesis/extras/django.py
from django.conf import settings as django_settings

# Don't let pytest poke into this object, generating a
# django.core.exceptions.ImproperlyConfigured
del django_settings
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wow.. inspect.isclass / isinstance triggers the ImproperlyConfigured already..


from pytest_django.lazy_django import django_settings_is_configured

def test_django_settings_is_configured():
assert django_settings_is_configured() is False

def test_django_conf_is_imported():
assert 'django.conf' in sys.modules

def test_env():
assert 'DJANGO_SETTINGS_MODULE' not in os.environ

def test_cfg(pytestconfig):
assert pytestconfig.option.ds is None
""")
r = testdir.runpytest_subprocess('-s')
assert r.ret == 0


def test_no_django_settings_but_django_imported(testdir, monkeypatch):
"""Make sure we do not crash when Django happens to be imported, but
settings is not properly configured"""
Expand Down