Consolidated all tests for createsuperuser in the same TestCase.

This commit is contained in:
Baptiste Mispelon 2014-02-17 23:49:57 +01:00
parent 45edb9d235
commit b78f9a12c8
2 changed files with 108 additions and 158 deletions

View File

@ -1,11 +1,7 @@
# -*- encoding: utf-8 -*-
from __future__ import unicode_literals from __future__ import unicode_literals
import locale
from django.apps import apps from django.apps import apps
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from django.contrib.auth.management.commands import createsuperuser
from django.contrib.auth.models import User, AnonymousUser from django.contrib.auth.models import User, AnonymousUser
from django.contrib.auth.tests.custom_user import CustomUser from django.contrib.auth.tests.custom_user import CustomUser
from django.contrib.auth.tests.utils import skipIfCustomUser from django.contrib.auth.tests.utils import skipIfCustomUser
@ -15,8 +11,6 @@ from django.dispatch import receiver
from django.test import TestCase, override_settings from django.test import TestCase, override_settings
from django.test.signals import setting_changed from django.test.signals import setting_changed
from django.utils import translation from django.utils import translation
from django.utils.encoding import force_str
from django.utils.six import binary_type, PY2, StringIO
@receiver(setting_changed) @receiver(setting_changed)
@ -29,46 +23,6 @@ def user_model_swapped(**kwargs):
apps.clear_cache() apps.clear_cache()
def mock_inputs(inputs):
"""
Decorator to temporarily replace input/getpass to allow interactive
createsuperuser.
"""
def inner(test_func):
def wrapped(*args):
class mock_getpass:
@staticmethod
def getpass(prompt=b'Password: ', stream=None):
if PY2:
# getpass on Windows only supports prompt as bytestring (#19807)
assert isinstance(prompt, binary_type)
return inputs['password']
def mock_input(prompt):
# prompt should be encoded in Python 2. This line will raise an
# Exception if prompt contains unencoded non-ascii on Python 2.
prompt = str(prompt)
assert str('__proxy__') not in prompt
response = ''
for key, val in inputs.items():
if force_str(key) in prompt.lower():
response = val
break
return response
old_getpass = createsuperuser.getpass
old_input = createsuperuser.input
createsuperuser.getpass = mock_getpass
createsuperuser.input = mock_input
try:
test_func(*args)
finally:
createsuperuser.getpass = old_getpass
createsuperuser.input = old_input
return wrapped
return inner
@skipIfCustomUser @skipIfCustomUser
class BasicTestCase(TestCase): class BasicTestCase(TestCase):
def test_user(self): def test_user(self):
@ -127,107 +81,6 @@ class BasicTestCase(TestCase):
self.assertTrue(super.is_active) self.assertTrue(super.is_active)
self.assertTrue(super.is_staff) self.assertTrue(super.is_staff)
def test_createsuperuser_management_command(self):
"Check the operation of the createsuperuser management command"
# We can use the management command to create a superuser
new_io = StringIO()
call_command(
"createsuperuser",
interactive=False,
username="joe",
email="joe@somewhere.org",
stdout=new_io
)
command_output = new_io.getvalue().strip()
self.assertEqual(command_output, 'Superuser created successfully.')
u = User.objects.get(username="joe")
self.assertEqual(u.email, 'joe@somewhere.org')
# created password should be unusable
self.assertFalse(u.has_usable_password())
# We can supress output on the management command
new_io = StringIO()
call_command(
"createsuperuser",
interactive=False,
username="joe2",
email="joe2@somewhere.org",
verbosity=0,
stdout=new_io
)
command_output = new_io.getvalue().strip()
self.assertEqual(command_output, '')
u = User.objects.get(username="joe2")
self.assertEqual(u.email, 'joe2@somewhere.org')
self.assertFalse(u.has_usable_password())
call_command(
"createsuperuser",
interactive=False,
username="joe+admin@somewhere.org",
email="joe@somewhere.org",
verbosity=0
)
u = User.objects.get(username="joe+admin@somewhere.org")
self.assertEqual(u.email, 'joe@somewhere.org')
self.assertFalse(u.has_usable_password())
@mock_inputs({'password': "nopasswd"})
def test_createsuperuser_nolocale(self):
"""
Check that createsuperuser does not break when no locale is set. See
ticket #16017.
"""
old_getdefaultlocale = locale.getdefaultlocale
try:
# Temporarily remove locale information
locale.getdefaultlocale = lambda: (None, None)
# Call the command in this new environment
call_command(
"createsuperuser",
interactive=True,
username="nolocale@somewhere.org",
email="nolocale@somewhere.org",
verbosity=0
)
except TypeError:
self.fail("createsuperuser fails if the OS provides no information about the current locale")
finally:
# Re-apply locale information
locale.getdefaultlocale = old_getdefaultlocale
# If we were successful, a user should have been created
u = User.objects.get(username="nolocale@somewhere.org")
self.assertEqual(u.email, 'nolocale@somewhere.org')
@mock_inputs({
'password': "nopasswd",
'uživatel': 'foo', # username (cz)
'email': 'nolocale@somewhere.org'})
def test_createsuperuser_non_ascii_verbose_name(self):
# Aliased so the string doesn't get extracted
from django.utils.translation import ugettext_lazy as ulazy
username_field = User._meta.get_field('username')
old_verbose_name = username_field.verbose_name
username_field.verbose_name = ulazy('uživatel')
new_io = StringIO()
try:
call_command(
"createsuperuser",
interactive=True,
stdout=new_io
)
finally:
username_field.verbose_name = old_verbose_name
command_output = new_io.getvalue().strip()
self.assertEqual(command_output, 'Superuser created successfully.')
def test_get_user_model(self): def test_get_user_model(self):
"The current user model can be retrieved" "The current user model can be retrieved"
self.assertEqual(get_user_model(), User) self.assertEqual(get_user_model(), User)

View File

@ -1,11 +1,13 @@
from __future__ import unicode_literals from __future__ import unicode_literals
from datetime import date from datetime import date
import locale
from django.apps import apps from django.apps import apps
from django.contrib.auth import models, management from django.contrib.auth import models, management
from django.contrib.auth.checks import check_user_model from django.contrib.auth.checks import check_user_model
from django.contrib.auth.management import create_permissions from django.contrib.auth.management import create_permissions
from django.contrib.auth.management.commands import changepassword from django.contrib.auth.management.commands import changepassword, createsuperuser
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.contrib.auth.tests.custom_user import CustomUser from django.contrib.auth.tests.custom_user import CustomUser
from django.contrib.auth.tests.utils import skipIfCustomUser from django.contrib.auth.tests.utils import skipIfCustomUser
@ -16,7 +18,47 @@ from django.core.management import call_command
from django.core.management.base import CommandError from django.core.management.base import CommandError
from django.test import TestCase, override_settings, override_system_checks from django.test import TestCase, override_settings, override_system_checks
from django.utils import six from django.utils import six
from django.utils.six import StringIO from django.utils.encoding import force_str
def mock_inputs(inputs):
"""
Decorator to temporarily replace input/getpass to allow interactive
createsuperuser.
"""
def inner(test_func):
def wrapped(*args):
class mock_getpass:
@staticmethod
def getpass(prompt=b'Password: ', stream=None):
if six.PY2:
# getpass on Windows only supports prompt as bytestring (#19807)
assert isinstance(prompt, six.binary_type)
return inputs['password']
def mock_input(prompt):
# prompt should be encoded in Python 2. This line will raise an
# Exception if prompt contains unencoded non-ascii on Python 2.
prompt = str(prompt)
assert str('__proxy__') not in prompt
response = ''
for key, val in inputs.items():
if force_str(key) in prompt.lower():
response = val
break
return response
old_getpass = createsuperuser.getpass
old_input = createsuperuser.input
createsuperuser.getpass = mock_getpass
createsuperuser.input = mock_input
try:
test_func(*args)
finally:
createsuperuser.getpass = old_getpass
createsuperuser.input = old_input
return wrapped
return inner
@skipIfCustomUser @skipIfCustomUser
@ -53,8 +95,8 @@ class ChangepasswordManagementCommandTestCase(TestCase):
def setUp(self): def setUp(self):
self.user = models.User.objects.create_user(username='joe', password='qwerty') self.user = models.User.objects.create_user(username='joe', password='qwerty')
self.stdout = StringIO() self.stdout = six.StringIO()
self.stderr = StringIO() self.stderr = six.StringIO()
def tearDown(self): def tearDown(self):
self.stdout.close() self.stdout.close()
@ -100,10 +142,10 @@ class ChangepasswordManagementCommandTestCase(TestCase):
@skipIfCustomUser @skipIfCustomUser
class CreatesuperuserManagementCommandTestCase(TestCase): class CreatesuperuserManagementCommandTestCase(TestCase):
def test_createsuperuser(self): def test_basic_usage(self):
"Check the operation of the createsuperuser management command" "Check the operation of the createsuperuser management command"
# We can use the management command to create a superuser # We can use the management command to create a superuser
new_io = StringIO() new_io = six.StringIO()
call_command( call_command(
"createsuperuser", "createsuperuser",
interactive=False, interactive=False,
@ -119,9 +161,64 @@ class CreatesuperuserManagementCommandTestCase(TestCase):
# created password should be unusable # created password should be unusable
self.assertFalse(u.has_usable_password()) self.assertFalse(u.has_usable_password())
@mock_inputs({'password': "nopasswd"})
def test_nolocale(self):
"""
Check that createsuperuser does not break when no locale is set. See
ticket #16017.
"""
old_getdefaultlocale = locale.getdefaultlocale
try:
# Temporarily remove locale information
locale.getdefaultlocale = lambda: (None, None)
# Call the command in this new environment
call_command(
"createsuperuser",
interactive=True,
username="nolocale@somewhere.org",
email="nolocale@somewhere.org",
verbosity=0
)
except TypeError:
self.fail("createsuperuser fails if the OS provides no information about the current locale")
finally:
# Re-apply locale information
locale.getdefaultlocale = old_getdefaultlocale
# If we were successful, a user should have been created
u = User.objects.get(username="nolocale@somewhere.org")
self.assertEqual(u.email, 'nolocale@somewhere.org')
@mock_inputs({
'password': "nopasswd",
'u\u017eivatel': 'foo', # username (cz)
'email': 'nolocale@somewhere.org'})
def test_non_ascii_verbose_name(self):
# Aliased so the string doesn't get extracted
from django.utils.translation import ugettext_lazy as ulazy
username_field = User._meta.get_field('username')
old_verbose_name = username_field.verbose_name
username_field.verbose_name = ulazy('u\u017eivatel')
new_io = six.StringIO()
try:
call_command(
"createsuperuser",
interactive=True,
stdout=new_io
)
finally:
username_field.verbose_name = old_verbose_name
command_output = new_io.getvalue().strip()
self.assertEqual(command_output, 'Superuser created successfully.')
def test_verbosity_zero(self): def test_verbosity_zero(self):
# We can supress output on the management command # We can supress output on the management command
new_io = StringIO() new_io = six.StringIO()
call_command( call_command(
"createsuperuser", "createsuperuser",
interactive=False, interactive=False,
@ -137,7 +234,7 @@ class CreatesuperuserManagementCommandTestCase(TestCase):
self.assertFalse(u.has_usable_password()) self.assertFalse(u.has_usable_password())
def test_email_in_username(self): def test_email_in_username(self):
new_io = StringIO() new_io = six.StringIO()
call_command( call_command(
"createsuperuser", "createsuperuser",
interactive=False, interactive=False,
@ -155,7 +252,7 @@ class CreatesuperuserManagementCommandTestCase(TestCase):
# We can use the management command to create a superuser # We can use the management command to create a superuser
# We skip validation because the temporary substitution of the # We skip validation because the temporary substitution of the
# swappable User model messes with validation. # swappable User model messes with validation.
new_io = StringIO() new_io = six.StringIO()
call_command( call_command(
"createsuperuser", "createsuperuser",
interactive=False, interactive=False,
@ -178,7 +275,7 @@ class CreatesuperuserManagementCommandTestCase(TestCase):
# We can use the management command to create a superuser # We can use the management command to create a superuser
# We skip validation because the temporary substitution of the # We skip validation because the temporary substitution of the
# swappable User model messes with validation. # swappable User model messes with validation.
new_io = StringIO() new_io = six.StringIO()
with self.assertRaises(CommandError): with self.assertRaises(CommandError):
call_command( call_command(
"createsuperuser", "createsuperuser",
@ -201,7 +298,7 @@ class CreatesuperuserManagementCommandTestCase(TestCase):
def isatty(self): def isatty(self):
return False return False
out = StringIO() out = six.StringIO()
call_command( call_command(
"createsuperuser", "createsuperuser",
stdin=FakeStdin(), stdin=FakeStdin(),