letsencrypt: Update and fix tests involving domain changes

- Remove checking of the sender is 'test' and use mocking.

- Remove need for tests being run as root.

- Simplify log messages, avoid pylint warnings.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
This commit is contained in:
Sunil Mohan Adapa 2019-09-09 17:34:13 -07:00 committed by James Valleroy
parent 7cbaec3e26
commit 54b0e7c63b
No known key found for this signature in database
GPG Key ID: 77C0C75E7B650808
2 changed files with 62 additions and 14 deletions

View File

@ -163,9 +163,8 @@ def on_domain_added(sender, domain_type='', name='', description='',
return False
try:
# Obtaining certs during tests or empty names isn't expected to succeed
if sender != 'test' and name:
logger.info('Obtaining a Let\'s Encrypt certificate for %s', name)
if name:
logger.info('Obtaining certificate for %s', name)
certificate_obtain(name)
return True
except ActionError:
@ -178,15 +177,13 @@ def on_domain_removed(sender, domain_type, name='', **kwargs):
return False
try:
# Revoking certs during tests or empty names isn't expected to succeed
if sender != 'test' and name:
logger.info("Revoking the Let\'s Encrypt certificate for " + name)
if name:
logger.info('Revoking certificate for %s', name)
certificate_revoke(name)
return True
except ActionError as exception:
logger.warning(
('Failed to revoke certificate for domain {domain}: {error}'
).format(domain=name, error=exception.args[2]))
logger.warning('Failed to revoke certificate for %s: %s', name,
exception.args[2])
return False

View File

@ -18,21 +18,72 @@
Tests for letsencrypt module.
"""
from unittest.mock import call, patch
import pytest
from plinth.modules.names.components import DomainType
from .. import on_domain_added, on_domain_removed
pytestmark = pytest.mark.usefixtures('needs_root', 'needs_sudo')
@pytest.fixture(name='domain_types')
def fixture_domain_types():
"""Create a domain types required for tests."""
DomainType('domain-type-tor', 'Tor Hidden Service', 'tor:index',
can_have_certificate=False)
DomainType('domain-type-test', 'Test Domain Type', 'test:index')
@pytest.mark.usefixtures('domain_types')
def test_add_onion_domain():
"""Test that .onion domains are ignored when added/removed."""
assert not on_domain_added('test', 'domain-type-tor', 'ddddd.onion')
assert not on_domain_removed('test', 'domain-type-tor', 'ddddd.onion')
@patch('plinth.modules.letsencrypt.get_status')
@patch('plinth.modules.letsencrypt.certificate_obtain')
@pytest.mark.usefixtures('load_cfg')
def test_add_valid_domain():
assert on_domain_added('test', 'domainname', 'subdomain.domain.tld')
@pytest.mark.parametrize('domain,status_input,obtain,result', [
('domain1.tld', {
'certificate_available': True,
'validity': 'not-valid'
}, True, True),
('domain2.tld', {
'certificate_available': False,
'validity': 'valid'
}, True, True),
('domain3.tld', {
'certificate_available': True,
'validity': 'valid'
}, False, False),
('', {
'certificate_available': False,
'validity': 'valid'
}, False, True),
])
def test_add_valid_domain(certificate_obtain, get_status, domain, status_input,
obtain, result):
"""Test adding a domain that can have certificates."""
get_status.return_value = {'domains': {domain: status_input}}
assert result == on_domain_added('test', 'domain-type-test', domain)
if obtain:
certificate_obtain.assert_has_calls([call(domain)])
else:
certificate_obtain.assert_not_called()
def test_remove_domain():
assert on_domain_removed('test', '', 'somedomain.tld')
@patch('plinth.modules.letsencrypt.certificate_revoke')
@pytest.mark.usefixtures('load_cfg')
@pytest.mark.parametrize('domain,revoke,result', [
('domain1.tld', True, True),
('', False, True),
])
def test_remove_domain(certificate_revoke, domain, revoke, result):
"""Test removing a domain that can certificates."""
assert result == on_domain_removed('test', 'domain-type-test', domain)
if revoke:
certificate_revoke.assert_has_calls([call(domain)])
else:
certificate_revoke.assert_not_called()