tests.py 3.1 KB

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