parts/django/tests/regressiontests/bash_completion/tests.py
changeset 307 c6bca38c1cbf
equal deleted inserted replaced
306:5ff1fc726848 307:c6bca38c1cbf
       
     1 """
       
     2 A series of tests to establish that the command-line bash completion works.
       
     3 """
       
     4 import os
       
     5 import unittest
       
     6 import sys
       
     7 import StringIO
       
     8 
       
     9 from django.conf import settings
       
    10 from django.core.management import ManagementUtility
       
    11 
       
    12 class BashCompletionTests(unittest.TestCase):
       
    13     """
       
    14     Testing the Python level bash completion code.
       
    15     This requires setting up the environment as if we got passed data
       
    16     from bash.
       
    17     """
       
    18 
       
    19     def setUp(self):
       
    20         self.old_DJANGO_AUTO_COMPLETE = os.environ.get('DJANGO_AUTO_COMPLETE')
       
    21         os.environ['DJANGO_AUTO_COMPLETE'] = '1'
       
    22         self.output = StringIO.StringIO()
       
    23         self.old_stdout = sys.stdout
       
    24         sys.stdout = self.output
       
    25 
       
    26     def tearDown(self):
       
    27         sys.stdout = self.old_stdout
       
    28         if self.old_DJANGO_AUTO_COMPLETE:
       
    29             os.environ['DJANGO_AUTO_COMPLETE'] = self.old_DJANGO_AUTO_COMPLETE
       
    30         else:
       
    31             del os.environ['DJANGO_AUTO_COMPLETE']
       
    32 
       
    33     def _user_input(self, input_str):
       
    34         os.environ['COMP_WORDS'] = input_str
       
    35         os.environ['COMP_CWORD'] = str(len(input_str.split()) - 1)
       
    36         sys.argv = input_str.split(' ')
       
    37 
       
    38     def _run_autocomplete(self):
       
    39         util = ManagementUtility(argv=sys.argv)
       
    40         try:
       
    41             util.autocomplete()
       
    42         except SystemExit:
       
    43             pass
       
    44         return self.output.getvalue().strip().split('\n')
       
    45 
       
    46     def test_django_admin_py(self):
       
    47         "django_admin.py will autocomplete option flags"
       
    48         self._user_input('django-admin.py sqlall --v')
       
    49         output = self._run_autocomplete()
       
    50         self.assertEqual(output, ['--verbosity='])
       
    51 
       
    52     def test_manage_py(self):
       
    53         "manage.py will autocomplete option flags"
       
    54         self._user_input('manage.py sqlall --v')
       
    55         output = self._run_autocomplete()
       
    56         self.assertEqual(output, ['--verbosity='])
       
    57 
       
    58     def test_custom_command(self):
       
    59         "A custom command can autocomplete option flags"
       
    60         self._user_input('django-admin.py test_command --l')
       
    61         output = self._run_autocomplete()
       
    62         self.assertEqual(output, ['--list'])
       
    63 
       
    64     def test_subcommands(self):
       
    65         "Subcommands can be autocompleted"
       
    66         self._user_input('django-admin.py sql')
       
    67         output = self._run_autocomplete()
       
    68         self.assertEqual(output, ['sql sqlall sqlclear sqlcustom sqlflush sqlindexes sqlinitialdata sqlreset sqlsequencereset'])
       
    69 
       
    70     def test_help(self):
       
    71         "No errors, just an empty list if there are no autocomplete options"
       
    72         self._user_input('django-admin.py help --')
       
    73         output = self._run_autocomplete()
       
    74         self.assertEqual(output, [''])
       
    75 
       
    76     def test_runfcgi(self):
       
    77         "Command arguments will be autocompleted"
       
    78         self._user_input('django-admin.py runfcgi h')
       
    79         output = self._run_autocomplete()
       
    80         self.assertEqual(output, ['host='])
       
    81 
       
    82     def test_app_completion(self):
       
    83         "Application names will be autocompleted for an AppCommand"
       
    84         self._user_input('django-admin.py sqlall a')
       
    85         output = self._run_autocomplete()
       
    86         app_labels = [name.split('.')[-1] for name in settings.INSTALLED_APPS]
       
    87         self.assertEqual(output, sorted(label for label in app_labels if label.startswith('a')))