From 116d39842dab2569013856e9f3701a7cb6554f09 Mon Sep 17 00:00:00 2001 From: Baptiste Mispelon Date: Mon, 17 Feb 2014 04:24:34 +0100 Subject: [PATCH] Added the possibility to pass a stdin object to a management command. This makes testing certain features easier. Thanks to AeroNotix for the original patch. --- django/core/management/base.py | 1 + tests/user_commands/tests.py | 27 +++++++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/django/core/management/base.py b/django/core/management/base.py index 77c0bc6034..9eeca23c47 100644 --- a/django/core/management/base.py +++ b/django/core/management/base.py @@ -306,6 +306,7 @@ 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 diff --git a/tests/user_commands/tests.py b/tests/user_commands/tests.py index bf555e66b9..e184d0e6df 100644 --- a/tests/user_commands/tests.py +++ b/tests/user_commands/tests.py @@ -2,6 +2,7 @@ import sys from django.core import management from django.core.management import CommandError +from django.core.management.base import BaseCommand from django.core.management.utils import popen_wrapper from django.test import SimpleTestCase from django.utils import translation @@ -60,6 +61,32 @@ 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):