From f92254769bbf60c3777a2abe337c470a9edb7d5f Mon Sep 17 00:00:00 2001 From: Brad Warren Date: Tue, 20 Dec 2016 14:34:12 -0800 Subject: [PATCH] I promise checklists are OK (fixes #3934) (#3940) * TIL checklist calls input * full coverage on certbot/display/util.py * improve no double warning test --- certbot/display/util.py | 3 +- certbot/tests/display/util_test.py | 53 +++++++++++++++++++----------- 2 files changed, 35 insertions(+), 21 deletions(-) diff --git a/certbot/display/util.py b/certbot/display/util.py index 0796a0e94..ebfce78e2 100644 --- a/certbot/display/util.py +++ b/certbot/display/util.py @@ -223,7 +223,8 @@ class FileDisplay(object): code, ans = self.input("Select the appropriate numbers separated " "by commas and/or spaces, or leave input " - "blank to select all options shown") + "blank to select all options shown", + force_interactive=True) if code == OK: if len(ans.strip()) == 0: diff --git a/certbot/tests/display/util_test.py b/certbot/tests/display/util_test.py index 51fbc2828..7b6bd842e 100644 --- a/certbot/tests/display/util_test.py +++ b/certbot/tests/display/util_test.py @@ -43,6 +43,19 @@ class FileOutputDisplayTest(unittest.TestCase): string = self.mock_stdout.write.call_args[0][0] self.assertTrue("message" in string) + def test_notification_noninteractive2(self): + # The main purpose of this test is to make sure we only call + # logger.warning once which _force_noninteractive checks internally + self._force_noninteractive(self.displayer.notification, "message") + string = self.mock_stdout.write.call_args[0][0] + self.assertTrue("message" in string) + + self.assertTrue(self.displayer.skipped_interaction) + + self._force_noninteractive(self.displayer.notification, "message2") + string = self.mock_stdout.write.call_args[0][0] + self.assertTrue("message2" in string) + @mock.patch("certbot.display.util." "FileDisplay._get_valid_int_ans") def test_menu(self, mock_ans): @@ -50,6 +63,12 @@ class FileOutputDisplayTest(unittest.TestCase): ret = self.displayer.menu("message", CHOICES, force_interactive=True) self.assertEqual(ret, (display_util.OK, 0)) + def test_menu_noninteractive(self): + default = 0 + result = self._force_noninteractive( + self.displayer.menu, "msg", CHOICES, default=default) + self.assertEqual(result, (display_util.OK, default)) + def test_input_cancel(self): with mock.patch("six.moves.input", return_value="c"): code, _ = self.displayer.input("message", force_interactive=True) @@ -100,38 +119,32 @@ class FileOutputDisplayTest(unittest.TestCase): self.assertTrue(self._force_noninteractive( self.displayer.yesno, "message", default=True)) - @mock.patch("certbot.display.util.FileDisplay.input") + @mock.patch("certbot.display.util.six.moves.input") def test_checklist_valid(self, mock_input): - mock_input.return_value = (display_util.OK, "2 1") + mock_input.return_value = "2 1" code, tag_list = self.displayer.checklist( "msg", TAGS, force_interactive=True) self.assertEqual( (code, set(tag_list)), (display_util.OK, set(["tag1", "tag2"]))) - @mock.patch("certbot.display.util.FileDisplay.input") + @mock.patch("certbot.display.util.six.moves.input") def test_checklist_empty(self, mock_input): - mock_input.return_value = (display_util.OK, "") + mock_input.return_value = "" code, tag_list = self.displayer.checklist("msg", TAGS, force_interactive=True) self.assertEqual( (code, set(tag_list)), (display_util.OK, set(["tag1", "tag2", "tag3"]))) - @mock.patch("certbot.display.util.FileDisplay.input") + @mock.patch("certbot.display.util.six.moves.input") def test_checklist_miss_valid(self, mock_input): - mock_input.side_effect = [ - (display_util.OK, "10"), - (display_util.OK, "tag1 please"), - (display_util.OK, "1") - ] + mock_input.side_effect = ["10", "tag1 please", "1"] ret = self.displayer.checklist("msg", TAGS, force_interactive=True) self.assertEqual(ret, (display_util.OK, ["tag1"])) - @mock.patch("certbot.display.util.FileDisplay.input") + @mock.patch("certbot.display.util.six.moves.input") def test_checklist_miss_quit(self, mock_input): - mock_input.side_effect = [ - (display_util.OK, "10"), - (display_util.CANCEL, "1") - ] + mock_input.side_effect = ["10", "c"] + ret = self.displayer.checklist("msg", TAGS, force_interactive=True) self.assertEqual(ret, (display_util.CANCEL, [])) @@ -160,15 +173,15 @@ class FileOutputDisplayTest(unittest.TestCase): self.displayer._scrub_checklist_input(list_, TAGS)) self.assertEqual(set_tags, exp[i]) - @mock.patch("certbot.display.util.FileDisplay.input") + @mock.patch("certbot.display.util.six.moves.input") def test_directory_select(self, mock_input): # pylint: disable=star-args args = ["msg", "/var/www/html", "--flag", True] - result = (display_util.OK, "/var/www/html") - mock_input.return_value = result + user_input = "/var/www/html" + mock_input.return_value = user_input - self.assertEqual(self.displayer.directory_select(*args), result) - mock_input.assert_called_once_with(*args) + returned = self.displayer.directory_select(*args) + self.assertEqual(returned, (display_util.OK, user_input)) def test_directory_select_noninteractive(self): default = "/var/www/html"