monkeysphere: Add functional tests for import/publish keys

Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
This commit is contained in:
Joseph Nuthalapati 2018-10-25 14:23:22 -07:00 committed by James Valleroy
parent a75b415624
commit f52e13d316
No known key found for this signature in database
GPG Key ID: 77C0C75E7B650808
4 changed files with 137 additions and 14 deletions

View File

@ -0,0 +1,41 @@
#
# This file is part of FreedomBox.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
@apps @monkeysphere
Feature: Monkeysphere
Import and publish OpenPGP keys for SSH and HTTPS keys
Background:
Given I'm a logged in user
And the monkeysphere application is installed
And the domain name is set to mydomain.example
Scenario: Import SSH keys
When I import SSH key for mydomain.example in monkeysphere
Then the SSH key should imported for mydomain.example in monkeysphere
Scenario: Import HTTPS keys
When I import HTTPS key for mydomain.example in monkeysphere
Then the HTTPS key should imported for mydomain.example in monkeysphere
Scenario: Publish SSH keys
Given the SSH key for mydomain.example is imported in monkeysphere
Then I should be able to publish SSH key for mydomain.example in monkeysphere
Scenario: Publish HTTPS keys
Given the HTTPS key for mydomain.example is imported in monkeysphere
Then I should be able to publish HTTPS key for mydomain.example in monkeysphere

View File

@ -295,3 +295,30 @@ def upgrades_enable_automatic(browser, enable):
def upgrades_assert_automatic(browser, enabled):
should_be_enabled = (enabled == 'enabled')
assert system.upgrades_get_automatic(browser) == should_be_enabled
@given(
parsers.parse(
'the {key_type:w} key for {domain:S} is imported in monkeysphere'))
def monkeysphere_given_import_key(browser, key_type, domain):
system.monkeysphere_import_key(browser, key_type.lower(), domain)
@when(
parsers.parse('I import {key_type:w} key for {domain:S} in monkeysphere'))
def monkeysphere_import_key(browser, key_type, domain):
system.monkeysphere_import_key(browser, key_type.lower(), domain)
@then(
parsers.parse(
'the {key_type:w} key should imported for {domain:S} in monkeysphere'))
def monkeysphere_assert_imported_key(browser, key_type, domain):
system.monkeysphere_assert_imported_key(browser, key_type.lower(), domain)
@then(
parsers.parse('I should be able to publish {key_type:w} key for '
'{domain:S} in monkeysphere'))
def monkeysphere_publish_key(browser, key_type, domain):
system.monkeysphere_publish_key(browser, key_type.lower(), domain)

View File

@ -17,7 +17,9 @@
from support import application, config
from . import application
from .interface import default_url, nav_to_module, submit
from .service import wait_for_page_update
config_page_title_language_map = {
'da': 'Generel Konfiguration',
@ -329,3 +331,47 @@ def upgrades_get_automatic(browser):
"""Return whether automatic software upgrades is enabled."""
nav_to_module(browser, 'upgrades')
return browser.find_by_name('auto_upgrades_enabled').first.checked
def _monkeysphere_find_domain(browser, key_type, domain_type, domain):
"""Iterate every domain of a given type which given key type."""
keys_of_type = browser.find_by_css(
'.monkeysphere-service-{}'.format(key_type))
for key_of_type in keys_of_type:
search_domains = key_of_type.find_by_css(
'.monkeysphere-{}-domain'.format(domain_type))
for search_domain in search_domains:
if search_domain.text == domain:
return key_of_type, search_domain
raise IndexError('Domain not found')
def monkeysphere_import_key(browser, key_type, domain):
"""Import a key of specified type for given domain into monkeysphere."""
try:
monkeysphere_assert_imported_key(browser, key_type, domain)
except IndexError:
pass
else:
return
key, _ = _monkeysphere_find_domain(browser, key_type, 'importable', domain)
with wait_for_page_update(browser):
key.find_by_css('.button-import').click()
def monkeysphere_assert_imported_key(browser, key_type, domain):
"""Assert that a key of specified type for given domain was imported.."""
nav_to_module(browser, 'monkeysphere')
return _monkeysphere_find_domain(browser, key_type, 'imported', domain)
def monkeysphere_publish_key(browser, key_type, domain):
"""Publish a key of specified type for given domain from monkeysphere."""
nav_to_module(browser, 'monkeysphere')
key, _ = _monkeysphere_find_domain(browser, key_type, 'imported', domain)
with wait_for_page_update(browser):
key.find_by_css('.button-publish').click()
application.wait_for_config_update(browser, 'monkeysphere')

View File

@ -80,7 +80,7 @@
</thead>
<tbody>
{% for key in status.keys.values|dictsort:"ssh_fingerprint" %}
<tr>
<tr class="monkeysphere-service-{{ key.service }}">
<td>
{% if key.service == 'ssh' %}
{% trans "Secure Shell" %}
@ -93,22 +93,31 @@
<td>
<ul>
{% for domain in key.all_domains %}
<li>
{% if domain not in key.imported_domains %}
{% if domain not in key.imported_domains %}
<li>
<span class="label label-default"
><span class="glyphicon glyphicon-remove"
aria-hidden="true"></span></span>
{% elif domain not in key.available_domains %}
<span class="monkeysphere-importable-domain"
>{{ domain }}</span>
</li>
{% elif domain not in key.available_domains %}
<li>
<span class="label label-warning"
><span class="glyphicon glyphicon-warning-sign"
aria-hidden="true"></span></span>
{% else %}
<span class="monkeysphere-unavailable-domain"
>{{ domain }}</span>
</li>
{% else %}
<li>
<span class="label label-success"
><span class="glyphicon glyphicon-ok"
aria-hidden="true"></span></span>
{% endif %}
{{ domain }}
</li>
<span class="monkeysphere-imported-domain"
>{{ domain }}</span>
</li>
{% endif %}
{% endfor %}
</ul>
</td>
@ -126,29 +135,29 @@
</td>
<td>
{% if not key.openpgp_fingerprint %}
<form class="form pull-right" method="post"
<form class="form pull-right form-import" method="post"
action="{% url 'monkeysphere:import' key.ssh_fingerprint %}">
{% csrf_token %}
<button type="submit" class="btn btn-primary btn-sm pull-right">
<button type="submit" class="btn btn-primary btn-sm pull-right button-import">
{% trans "Import Key" %}</button>
</form>
{% else %}
{% if not running %}
<form class="form pull-right" method="post"
<form class="form pull-right form-publish" method="post"
action="{% url 'monkeysphere:publish' key.openpgp_fingerprint %}">
{% csrf_token %}
<button type="submit" class="btn btn-warning btn-sm pull-right">
<button type="submit" class="btn btn-warning btn-sm pull-right button-publish">
{% trans "Publish Key" %}</button>
</form>
{% endif %}
{% if key.importable_domains %}
<form class="form pull-right" method="post"
<form class="form pull-right form-add-domain" method="post"
action="{% url 'monkeysphere:import' key.ssh_fingerprint %}">
{% csrf_token %}
<button type="submit" class="btn btn-primary btn-sm pull-right">
<button type="submit" class="btn btn-primary btn-sm pull-right button-add-domains">
{% trans "Add Domains" %}</button>
</form>
{% endif %}