1
0
mirror of https://github.com/certbot/certbot.git synced 2026-01-21 19:01:07 +03:00

Finish user agent changes:

- revert changes to acme/, instead living with its current baroque API
 - add an extremely mockable test case
This commit is contained in:
Peter Eckersley
2015-11-10 16:04:56 -08:00
parent baaeab5fa1
commit a4885e491a
4 changed files with 32 additions and 20 deletions

View File

@@ -37,7 +37,6 @@ class Client(object): # pylint: disable=too-many-instance-attributes
:ivar key: `.JWK` (private)
:ivar alg: `.JWASignature`
:ivar bool verify_ssl: Verify SSL certificates?
:ivar str ua: User agent string to send to the server.
:ivar .ClientNetwork net: Client network. Useful for testing. If not
supplied, it will be initialized using `key`, `alg` and
`verify_ssl`.
@@ -46,7 +45,7 @@ class Client(object): # pylint: disable=too-many-instance-attributes
DER_CONTENT_TYPE = 'application/pkix-cert'
def __init__(self, directory, key, alg=jose.RS256, verify_ssl=True,
net=None, ua="acme-python"):
net=None):
"""Initialize.
:param directory: Directory Resource (`.messages.Directory`) or
@@ -54,7 +53,7 @@ class Client(object): # pylint: disable=too-many-instance-attributes
"""
self.key = key
self.net = ClientNetwork(key, alg, verify_ssl, user_agent) if net is None else net
self.net = ClientNetwork(key, alg, verify_ssl) if net is None else net
if isinstance(directory, six.string_types):
self.directory = messages.Directory.from_json(

View File

@@ -31,9 +31,9 @@ logger = logging.getLogger(__name__)
def _acme_from_config_key(config, key):
# TODO: Allow for other alg types besides RS256
return acme_client.Client(directory=config.server, key=key,
verify_ssl=(not config.no_verify_ssl),
ua=config.user_agent)
net = acme_client.ClientNetwork(key, verify_ssl=(not config.no_verify_ssl),
user_agent=config.user_agent)
return acme_client.Client(directory=config.server, key=key, net=net)
def register(config, account_storage, tos_cb=None):
@@ -99,6 +99,7 @@ def register(config, account_storage, tos_cb=None):
acc = account.Account(regr, key)
account.report_new_account(acc, config)
account_storage.save(acc)
return acc, acme

View File

@@ -10,6 +10,7 @@ import unittest
import mock
from letsencrypt import account
from letsencrypt import cli
from letsencrypt import configuration
from letsencrypt import errors
@@ -30,15 +31,15 @@ class CLITest(unittest.TestCase):
self.config_dir = os.path.join(self.tmp_dir, 'config')
self.work_dir = os.path.join(self.tmp_dir, 'work')
self.logs_dir = os.path.join(self.tmp_dir, 'logs')
self.standard_args = ['--text', '--config-dir', self.config_dir,
'--work-dir', self.work_dir, '--logs-dir', self.logs_dir,
'--agree-dev-preview']
def tearDown(self):
shutil.rmtree(self.tmp_dir)
def _call(self, args):
from letsencrypt import cli
args = ['--text', '--config-dir', self.config_dir,
'--work-dir', self.work_dir, '--logs-dir', self.logs_dir,
'--agree-dev-preview'] + args
args = self.standard_args + args
with mock.patch('letsencrypt.cli.sys.stdout') as stdout:
with mock.patch('letsencrypt.cli.sys.stderr') as stderr:
with mock.patch('letsencrypt.cli.client') as client:
@@ -50,10 +51,7 @@ class CLITest(unittest.TestCase):
Variant of _call that preserves stdout so that it can be mocked by the
caller.
"""
from letsencrypt import cli
args = ['--text', '--config-dir', self.config_dir,
'--work-dir', self.work_dir, '--logs-dir', self.logs_dir,
'--agree-dev-preview'] + args
args = self.standard_args + args
with mock.patch('letsencrypt.cli.sys.stderr') as stderr:
with mock.patch('letsencrypt.cli.client') as client:
ret = cli.main(args)
@@ -112,9 +110,27 @@ class CLITest(unittest.TestCase):
self.assertTrue("--key-path" not in out)
out = self._help_output(['-h'])
from letsencrypt import cli
self.assertTrue(cli.usage_strings(plugins)[0] in out)
@mock.patch('letsencrypt.cli.sys.stdout')
@mock.patch('letsencrypt.cli.sys.stderr')
@mock.patch('letsencrypt.cli.client.acme_client.ClientNetwork')
@mock.patch('letsencrypt.cli.client.acme_client.Client')
@mock.patch('letsencrypt.cli._determine_account')
@mock.patch('letsencrypt.cli.client.Client.obtain_and_enroll_certificate')
@mock.patch('letsencrypt.cli._auth_from_domains')
def test_user_agent(self, _afd, _obt, det, _client, acme_net, _out, _err):
ua = "bandersnatch"
# Normally the client is totally mocked out, but here we need more
# arguments to automate it...
args = ["--user-agent", ua, "--standalone", "certonly",
"-m", "none@none.com", "-d", "example.com", '--agree-tos']
args += self.standard_args
det.return_value = mock.MagicMock(), None
cli.main(args)
acme_net.assert_called_once_with(mock.ANY, verify_ssl=True, user_agent=ua)
@mock.patch('letsencrypt.cli.display_ops')
def test_installer_selection(self, mock_display_ops):
self._call(['install', '--domain', 'foo.bar', '--cert-path', 'cert',
@@ -281,8 +297,6 @@ class CLITest(unittest.TestCase):
@mock.patch('letsencrypt.cli.sys')
def test_handle_exception(self, mock_sys):
# pylint: disable=protected-access
from letsencrypt import cli
mock_open = mock.mock_open()
with mock.patch('letsencrypt.cli.open', mock_open, create=True):
exception = Exception('detail')
@@ -433,8 +447,6 @@ class MockedVerb(object):
"""
def __init__(self, verb_name):
from letsencrypt import cli
self.verb_dict = cli.HelpfulArgumentParser.VERBS
self.verb_func = None
self.verb_name = verb_name

View File

@@ -71,7 +71,7 @@ class ClientTest(unittest.TestCase):
def test_init_acme_verify_ssl(self):
self.acme_client.assert_called_once_with(
directory=mock.ANY, key=mock.ANY, ua=mock.ANY, verify_ssl=True)
directory=mock.ANY, key=mock.ANY, verify_ssl=True)
def _mock_obtain_certificate(self):
self.client.auth_handler = mock.MagicMock()