tests.py 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. import sys
  2. import unittest
  3. from django.apps import app_cache
  4. from django.core.management.validation import get_validation_errors
  5. from django.test import override_settings
  6. from django.utils.six import StringIO
  7. class InvalidModelTestCase(unittest.TestCase):
  8. """Import an appliation with invalid models and test the exceptions."""
  9. def setUp(self):
  10. # Make sure sys.stdout is not a tty so that we get errors without
  11. # coloring attached (makes matching the results easier). We restore
  12. # sys.stderr afterwards.
  13. self.old_stdout = sys.stdout
  14. self.stdout = StringIO()
  15. sys.stdout = self.stdout
  16. def tearDown(self):
  17. sys.stdout = self.old_stdout
  18. # Technically, this isn't an override -- TEST_SWAPPED_MODEL must be
  19. # set to *something* in order for the test to work. However, it's
  20. # easier to set this up as an override than to require every developer
  21. # to specify a value in their test settings.
  22. @override_settings(
  23. INSTALLED_APPS=['invalid_models_tests.invalid_models'],
  24. TEST_SWAPPED_MODEL='invalid_models.ReplacementModel',
  25. TEST_SWAPPED_MODEL_BAD_VALUE='not-a-model',
  26. TEST_SWAPPED_MODEL_BAD_MODEL='not_an_app.Target',
  27. )
  28. def test_invalid_models(self):
  29. module = app_cache.get_app_config("invalid_models").models_module
  30. get_validation_errors(self.stdout, module)
  31. self.stdout.seek(0)
  32. error_log = self.stdout.read()
  33. actual = error_log.split('\n')
  34. expected = module.model_errors.split('\n')
  35. unexpected = [err for err in actual if err not in expected]
  36. missing = [err for err in expected if err not in actual]
  37. self.assertFalse(unexpected, "Unexpected Errors: " + '\n'.join(unexpected))
  38. self.assertFalse(missing, "Missing Errors: " + '\n'.join(missing))