mirror of
https://github.com/django/django.git
synced 2025-02-23 16:24:46 +00:00
Change patch from https://code.djangoproject.com/ticket/5568 to work on modern Django. Add special case for MySQL which has different syntax for DROP INDEX. Add unit tests for the new functionality.
89 lines
3.1 KiB
Python
89 lines
3.1 KiB
Python
"""
|
|
A series of tests to establish that the command-line bash completion works.
|
|
"""
|
|
import os
|
|
import sys
|
|
|
|
from django.conf import settings
|
|
from django.core.management import ManagementUtility
|
|
from django.utils import unittest
|
|
from django.utils.six import StringIO
|
|
|
|
|
|
class BashCompletionTests(unittest.TestCase):
|
|
"""
|
|
Testing the Python level bash completion code.
|
|
This requires setting up the environment as if we got passed data
|
|
from bash.
|
|
"""
|
|
|
|
def setUp(self):
|
|
self.old_DJANGO_AUTO_COMPLETE = os.environ.get('DJANGO_AUTO_COMPLETE')
|
|
os.environ['DJANGO_AUTO_COMPLETE'] = '1'
|
|
self.output = StringIO()
|
|
self.old_stdout = sys.stdout
|
|
sys.stdout = self.output
|
|
|
|
def tearDown(self):
|
|
sys.stdout = self.old_stdout
|
|
if self.old_DJANGO_AUTO_COMPLETE:
|
|
os.environ['DJANGO_AUTO_COMPLETE'] = self.old_DJANGO_AUTO_COMPLETE
|
|
else:
|
|
del os.environ['DJANGO_AUTO_COMPLETE']
|
|
|
|
def _user_input(self, input_str):
|
|
os.environ['COMP_WORDS'] = input_str
|
|
os.environ['COMP_CWORD'] = str(len(input_str.split()) - 1)
|
|
sys.argv = input_str.split(' ')
|
|
|
|
def _run_autocomplete(self):
|
|
util = ManagementUtility(argv=sys.argv)
|
|
try:
|
|
util.autocomplete()
|
|
except SystemExit:
|
|
pass
|
|
return self.output.getvalue().strip().split('\n')
|
|
|
|
def test_django_admin_py(self):
|
|
"django_admin.py will autocomplete option flags"
|
|
self._user_input('django-admin.py sqlall --v')
|
|
output = self._run_autocomplete()
|
|
self.assertEqual(output, ['--verbosity='])
|
|
|
|
def test_manage_py(self):
|
|
"manage.py will autocomplete option flags"
|
|
self._user_input('manage.py sqlall --v')
|
|
output = self._run_autocomplete()
|
|
self.assertEqual(output, ['--verbosity='])
|
|
|
|
def test_custom_command(self):
|
|
"A custom command can autocomplete option flags"
|
|
self._user_input('django-admin.py test_command --l')
|
|
output = self._run_autocomplete()
|
|
self.assertEqual(output, ['--list'])
|
|
|
|
def test_subcommands(self):
|
|
"Subcommands can be autocompleted"
|
|
self._user_input('django-admin.py sql')
|
|
output = self._run_autocomplete()
|
|
self.assertEqual(output, ['sql sqlall sqlclear sqlcustom sqldropindexes sqlflush sqlindexes sqlinitialdata sqlsequencereset'])
|
|
|
|
def test_help(self):
|
|
"No errors, just an empty list if there are no autocomplete options"
|
|
self._user_input('django-admin.py help --')
|
|
output = self._run_autocomplete()
|
|
self.assertEqual(output, [''])
|
|
|
|
def test_runfcgi(self):
|
|
"Command arguments will be autocompleted"
|
|
self._user_input('django-admin.py runfcgi h')
|
|
output = self._run_autocomplete()
|
|
self.assertEqual(output, ['host='])
|
|
|
|
def test_app_completion(self):
|
|
"Application names will be autocompleted for an AppCommand"
|
|
self._user_input('django-admin.py sqlall a')
|
|
output = self._run_autocomplete()
|
|
app_labels = [name.split('.')[-1] for name in settings.INSTALLED_APPS]
|
|
self.assertEqual(output, sorted(label for label in app_labels if label.startswith('a')))
|