From 12edbb53dbc28e22eab16649989ce99a0da724c1 Mon Sep 17 00:00:00 2001 From: Brad Warren Date: Fri, 23 Dec 2016 10:49:51 -0800 Subject: [PATCH] Fixes #3954 and adds a test to prevent regressions (#3957) * fixes #3954 and adds test to prevent regressions * assure pylint I know what I'm doing * Test FileDisplay methods take force_interactive --- certbot/display/util.py | 2 +- certbot/tests/display/util_test.py | 21 ++++++++++++++++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/certbot/display/util.py b/certbot/display/util.py index ebfce78e2..502426626 100644 --- a/certbot/display/util.py +++ b/certbot/display/util.py @@ -438,7 +438,7 @@ class NoninteractiveDisplay(object): line=os.linesep, frame=side_frame, msg=message)) def menu(self, message, choices, ok_label=None, cancel_label=None, - help_label=None, default=None, cli_flag=None, *unused_kwargs): + help_label=None, default=None, cli_flag=None, **unused_kwargs): # pylint: disable=unused-argument,too-many-arguments """Avoid displaying a menu. diff --git a/certbot/tests/display/util_test.py b/certbot/tests/display/util_test.py index 7b6bd842e..10ec463ba 100644 --- a/certbot/tests/display/util_test.py +++ b/certbot/tests/display/util_test.py @@ -1,10 +1,12 @@ """Test :mod:`certbot.display.util`.""" +import inspect import os import unittest import mock -import certbot.errors as errors +from certbot import errors +from certbot import interfaces from certbot.display import util as display_util @@ -259,6 +261,13 @@ class FileOutputDisplayTest(unittest.TestCase): self.displayer._get_valid_int_ans(3), (display_util.CANCEL, -1)) + def test_methods_take_force_interactive(self): + # Every IDisplay method implemented by FileDisplay must take + # force_interactive to prevent workflow regressions. + for name in interfaces.IDisplay.names(): # pylint: disable=no-member + arg_spec = inspect.getargspec(getattr(self.displayer, name)) + self.assertTrue("force_interactive" in arg_spec.args) + class NoninteractiveDisplayTest(unittest.TestCase): """Test non-interactive display. @@ -309,6 +318,16 @@ class NoninteractiveDisplayTest(unittest.TestCase): self.assertRaises( errors.MissingCommandlineFlag, self.displayer.directory_select, "msg") + def test_methods_take_kwargs(self): + # Every IDisplay method implemented by NoninteractiveDisplay + # should take **kwargs because every method of FileDisplay must + # take force_interactive which doesn't apply to + # NoninteractiveDisplay. + for name in interfaces.IDisplay.names(): # pylint: disable=no-member + method = getattr(self.displayer, name) + # asserts method accepts arbitrary keyword arguments + self.assertFalse(inspect.getargspec(method).keywords is None) + class SeparateListInputTest(unittest.TestCase): """Test Module functions."""