1. import datetime
    
  2. from io import StringIO
    
  3. from unittest import mock
    
  4. 
    
  5. from django.core.management.base import OutputWrapper
    
  6. from django.db.migrations.questioner import (
    
  7.     InteractiveMigrationQuestioner,
    
  8.     MigrationQuestioner,
    
  9. )
    
  10. from django.db.models import NOT_PROVIDED
    
  11. from django.test import SimpleTestCase
    
  12. from django.test.utils import override_settings
    
  13. 
    
  14. 
    
  15. class QuestionerTests(SimpleTestCase):
    
  16.     @override_settings(
    
  17.         INSTALLED_APPS=["migrations"],
    
  18.         MIGRATION_MODULES={"migrations": None},
    
  19.     )
    
  20.     def test_ask_initial_with_disabled_migrations(self):
    
  21.         questioner = MigrationQuestioner()
    
  22.         self.assertIs(False, questioner.ask_initial("migrations"))
    
  23. 
    
  24.     def test_ask_not_null_alteration(self):
    
  25.         questioner = MigrationQuestioner()
    
  26.         self.assertIsNone(
    
  27.             questioner.ask_not_null_alteration("field_name", "model_name")
    
  28.         )
    
  29. 
    
  30.     @mock.patch("builtins.input", return_value="2")
    
  31.     def test_ask_not_null_alteration_not_provided(self, mock):
    
  32.         questioner = InteractiveMigrationQuestioner(
    
  33.             prompt_output=OutputWrapper(StringIO())
    
  34.         )
    
  35.         question = questioner.ask_not_null_alteration("field_name", "model_name")
    
  36.         self.assertEqual(question, NOT_PROVIDED)
    
  37. 
    
  38. 
    
  39. class QuestionerHelperMethodsTests(SimpleTestCase):
    
  40.     def setUp(self):
    
  41.         self.prompt = OutputWrapper(StringIO())
    
  42.         self.questioner = InteractiveMigrationQuestioner(prompt_output=self.prompt)
    
  43. 
    
  44.     @mock.patch("builtins.input", return_value="datetime.timedelta(days=1)")
    
  45.     def test_questioner_default_timedelta(self, mock_input):
    
  46.         value = self.questioner._ask_default()
    
  47.         self.assertEqual(value, datetime.timedelta(days=1))
    
  48. 
    
  49.     @mock.patch("builtins.input", return_value="")
    
  50.     def test_questioner_default_no_user_entry(self, mock_input):
    
  51.         value = self.questioner._ask_default(default="datetime.timedelta(days=1)")
    
  52.         self.assertEqual(value, datetime.timedelta(days=1))
    
  53. 
    
  54.     @mock.patch("builtins.input", side_effect=["", "exit"])
    
  55.     def test_questioner_no_default_no_user_entry(self, mock_input):
    
  56.         with self.assertRaises(SystemExit):
    
  57.             self.questioner._ask_default()
    
  58.         self.assertIn(
    
  59.             "Please enter some code, or 'exit' (without quotes) to exit.",
    
  60.             self.prompt.getvalue(),
    
  61.         )
    
  62. 
    
  63.     @mock.patch("builtins.input", side_effect=["bad code", "exit"])
    
  64.     def test_questioner_no_default_bad_user_entry_code(self, mock_input):
    
  65.         with self.assertRaises(SystemExit):
    
  66.             self.questioner._ask_default()
    
  67.         self.assertIn("Invalid input: ", self.prompt.getvalue())
    
  68. 
    
  69.     @mock.patch("builtins.input", side_effect=["", "n"])
    
  70.     def test_questioner_no_default_no_user_entry_boolean(self, mock_input):
    
  71.         value = self.questioner._boolean_input("Proceed?")
    
  72.         self.assertIs(value, False)
    
  73. 
    
  74.     @mock.patch("builtins.input", return_value="")
    
  75.     def test_questioner_default_no_user_entry_boolean(self, mock_input):
    
  76.         value = self.questioner._boolean_input("Proceed?", default=True)
    
  77.         self.assertIs(value, True)
    
  78. 
    
  79.     @mock.patch("builtins.input", side_effect=[10, "garbage", 1])
    
  80.     def test_questioner_bad_user_choice(self, mock_input):
    
  81.         question = "Make a choice:"
    
  82.         value = self.questioner._choice_input(question, choices="abc")
    
  83.         expected_msg = f"{question}\n" f" 1) a\n" f" 2) b\n" f" 3) c\n"
    
  84.         self.assertIn(expected_msg, self.prompt.getvalue())
    
  85.         self.assertEqual(value, 1)