Commit 2a9ee49f authored by Baptiste Mispelon's avatar Baptiste Mispelon
Browse files

Removed BaseCommand.stdin introduced in 116d3984.

This option is not actually very useful in the general case
because it doesn't override sys.stdin.

It's still marginally useful for testing some features of
the createsuperuser command so it was moved there.
This commit also makes the detection of a TTY in createsuperuser
a bit more robust, after a suggestion of appolo13.
parent b78f9a12
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -50,6 +50,10 @@ class Command(BaseCommand):
    option_list = BaseCommand.option_list
    help = 'Used to create a superuser.'

    def execute(self, *args, **options):
        self.stdin = options.get('stdin', sys.stdin)  # Used for testing
        return super(Command, self).execute(*args, **options)

    def handle(self, *args, **options):
        username = options.get(self.UserModel.USERNAME_FIELD, None)
        interactive = options.get('interactive')
@@ -84,7 +88,7 @@ class Command(BaseCommand):
            default_username = get_default_username()
            try:

                if not self.stdin.isatty():
                if hasattr(self.stdin, 'isatty') and not self.stdin.isatty():
                    raise NotRunningInTTYException("Not running in a TTY")

                # Get a username
+29 −0
Original line number Diff line number Diff line
@@ -2,6 +2,7 @@ from __future__ import unicode_literals

from datetime import date
import locale
import sys

from django.apps import apps
from django.contrib.auth import models, management
@@ -309,6 +310,34 @@ class CreatesuperuserManagementCommandTestCase(TestCase):
        self.assertEqual(User._default_manager.count(), 0)
        self.assertIn("Superuser creation skipped", out.getvalue())

    def test_passing_stdin(self):
        """
        You can pass a stdin object as an option and it should be
        available on self.stdin.
        If no such option is passed, it defaults to sys.stdin.
        """

        user_data = {'username': 'foo', 'email': 'foo@example.com'}
        sentinel = object()
        command = createsuperuser.Command()
        command.execute(
            stdin=sentinel,
            stdout=six.StringIO(),
            interactive=False,
            username='janet',
            email='janet@example.com',
        )
        self.assertIs(command.stdin, sentinel)

        command = createsuperuser.Command()
        command.execute(
            stdout=six.StringIO(),
            interactive=False,
            username='joe',
            email='joe@example.com',
        )
        self.assertIs(command.stdin, sys.stdin)


class CustomUserModelValidationTestCase(TestCase):
    @override_settings(AUTH_USER_MODEL='auth.CustomUserNonListRequiredFields')
+0 −1
Original line number Diff line number Diff line
@@ -306,7 +306,6 @@ class BaseCommand(object):
            self.stderr = OutputWrapper(options.get('stderr', sys.stderr))
        else:
            self.stderr = OutputWrapper(options.get('stderr', sys.stderr), self.style.ERROR)
        self.stdin = options.get('stdin', sys.stdin)  # Useful for testing

        if self.can_import_settings:
            from django.conf import settings  # NOQA
+0 −26
Original line number Diff line number Diff line
@@ -61,32 +61,6 @@ class CommandTests(SimpleTestCase):
            management.call_command('leave_locale_alone_true', stdout=out)
            self.assertEqual(out.getvalue(), "pl\n")

    def test_passing_stdin(self):
        """
        You can pass a stdin object to a command's options and it should be
        available on self.stdin.
        """
        class CustomCommand(BaseCommand):
            def handle(self, *args, **kwargs):
                pass

        sentinel = object()
        command = CustomCommand()
        command.execute(stdin=sentinel, stdout=StringIO())
        self.assertIs(command.stdin, sentinel)

    def test_passing_stdin_default(self):
        """
        If stdin is not passed as an option, the default should be sys.stdin.
        """
        class CustomCommand(BaseCommand):
            def handle(self, *args, **kwargs):
                return 'OK'

        command = CustomCommand()
        command.execute(stdout=StringIO())
        self.assertIs(command.stdin, sys.stdin)


class UtilsTests(SimpleTestCase):