diff --git a/django_mailbox/management/commands/processincomingmessage.py b/django_mailbox/management/commands/processincomingmessage.py index 384c585..ec34411 100644 --- a/django_mailbox/management/commands/processincomingmessage.py +++ b/django_mailbox/management/commands/processincomingmessage.py @@ -16,6 +16,7 @@ logging.basicConfig(level=logging.INFO) class Command(BaseCommand): + args = "<[Mailbox Name (optional)]>" help = "Receive incoming mail via stdin" def add_arguments(self, parser): diff --git a/django_mailbox/tests/test_processincomingmessage.py b/django_mailbox/tests/test_processincomingmessage.py index df5362d..8110913 100644 --- a/django_mailbox/tests/test_processincomingmessage.py +++ b/django_mailbox/tests/test_processincomingmessage.py @@ -1,11 +1,15 @@ +from distutils.version import LooseVersion +import mock + from django.core.management import call_command, CommandError from django.test import TestCase - -import mock +import django class CommandsTestCase(TestCase): def test_processincomingmessage_no_args(self): """Check that processincomingmessage works with no args""" + + mailbox_name = None # Mock handle so that the test doesn't hang waiting for input. Note that we are only testing # the argument parsing here -- functionality should be tested elsewhere with mock.patch('django_mailbox.management.commands.processincomingmessage.Command.handle') as handle: @@ -13,42 +17,42 @@ class CommandsTestCase(TestCase): handle.return_value = None call_command('processincomingmessage') - - # Define the arguments we expect handle to be called with - required_arguments = { - # This should be None, since it isn't given - 'mailbox_name': None, - # All otheres can be anything; we don't care about them at all - 'no_color': mock.ANY, - 'pythonpath': mock.ANY, - 'settings': mock.ANY, - 'skip_checks': mock.ANY, - 'traceback': mock.ANY, - 'verbosity': mock.ANY - } + args, kwargs = handle.call_args + # Make sure that we called with the right arguments - handle.assert_called_with(**required_arguments) + try: + self.assertEqual(kwargs['mailbox_name'], mailbox_name) + except KeyError: + # Handle Django 1.7 + # It uses optparse instead of argparse, so instead of being + # set to None, mailbox_name is simply left out altogether + # Thus we expect an empty tuple here + self.assertEqual(args, tuple()) + def test_processincomingmessage_with_arg(self): """Check that processincomingmessage works with mailbox_name given""" + mailbox_name = 'foo_mailbox' + with mock.patch('django_mailbox.management.commands.processincomingmessage.Command.handle') as handle: handle.return_value = None - call_command('processincomingmessage', 'foo_mailbox') - - required_arguments = { - 'mailbox_name': 'foo_mailbox', - 'no_color': mock.ANY, - 'pythonpath': mock.ANY, - 'settings': mock.ANY, - 'skip_checks': mock.ANY, - 'traceback': mock.ANY, - 'verbosity': mock.ANY - } - handle.assert_called_with(**required_arguments) + call_command('processincomingmessage', mailbox_name) + args, kwargs = handle.call_args + try: + self.assertEqual(kwargs['mailbox_name'], mailbox_name) + except KeyError: + # Handle Django 1.7 + # It uses optparse instead of argparse, so instead of being + # in kwargs, mailbox_name is in args + self.assertEqual(args[0], mailbox_name) def test_processincomingmessage_too_many_args(self): """Check that processincomingmessage raises an error if too many args""" - with self.assertRaises(CommandError): - call_command('processincomingmessage', 'foo_mailbox', 'invalid_arg') + # Only perform this test for Django versions greater than 1.7.*. This + # is because, with optparse, too many arguments doesn't result in an + # error, which means this test is worthless anyway + if LooseVersion(django.get_version()) >= LooseVersion('1.8'): + with self.assertRaises(CommandError): + call_command('processincomingmessage', 'foo_mailbox', 'invalid_arg')