1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
|
# SPDX-License-Identifier: AGPL-3.0-or-later
"""
Functional, browser based tests for sharing app.
"""
import pytest
import splinter
from plinth.tests import functional
pytestmark = [pytest.mark.apps, pytest.mark.sharing]
class TestSharingApp(functional.BaseAppTests):
app_name = 'sharing'
has_service = False
has_web = False
check_diagnostics = False
def test_add_remove_share(self, session_browser):
"""Test adding and removing a share."""
_remove_share(session_browser, 'tmp')
_add_share(session_browser, 'tmp', '/tmp', 'admin')
_verify_share(session_browser, 'tmp', '/tmp', 'admin')
_access_share(session_browser, 'tmp')
_remove_share(session_browser, 'tmp')
_verify_invalid_share(session_browser, 'tmp')
_verify_nonexistant_share(session_browser, 'tmp')
def test_edit_share(self, session_browser):
"""Test editing a share."""
_remove_share(session_browser, 'tmp')
_remove_share(session_browser, 'boot')
_add_share(session_browser, 'tmp', '/tmp', 'admin')
_edit_share(session_browser, 'tmp', 'boot', '/boot', 'admin')
_verify_invalid_share(session_browser, 'tmp')
_verify_nonexistant_share(session_browser, 'tmp')
_verify_share(session_browser, 'boot', '/boot', 'admin')
_access_share(session_browser, 'boot')
def test_share_permissions(self, session_browser):
"""Test share permissions."""
_remove_share(session_browser, 'tmp')
_add_share(session_browser, 'tmp', '/tmp', 'syncthing-access')
_verify_share(session_browser, 'tmp', '/tmp', 'syncthing-access')
_verify_inaccessible_share(session_browser, 'tmp')
_make_share_public(session_browser, 'tmp')
functional.logout(session_browser)
assert functional.is_available(session_browser, 'share_tmp')
functional.login(session_browser)
@pytest.mark.backups
def test_backup_restore(self, session_browser):
"""Test backup and restore."""
_remove_share(session_browser, 'tmp')
_add_share(session_browser, 'tmp', '/tmp', 'admin')
functional.backup_create(session_browser, 'sharing', 'test_sharing')
_remove_share(session_browser, 'tmp')
functional.backup_restore(session_browser, 'sharing', 'test_sharing')
_verify_share(session_browser, 'tmp', '/tmp', 'admin')
_access_share(session_browser, 'tmp')
def _remove_share(browser, name):
"""Remove a share in sharing app."""
try:
share_row = _get_share(browser, name)
except splinter.exceptions.ElementDoesNotExist:
pass
else:
share_row.find_by_css('.share-remove')[0].click()
def _add_share(browser, name, path, group):
"""Add a share in sharing app."""
functional.visit(browser, '/plinth/apps/sharing/add/')
browser.fill('sharing-name', name)
browser.fill('sharing-path', path)
browser.find_by_css(
'#id_sharing-groups input[value="{}"]'.format(group)).check()
functional.submit(browser, form_class='form-add-edit')
def _edit_share(browser, old_name, new_name, path, group):
"""Edit a share in sharing app."""
row = _get_share(browser, old_name)
functional.click_and_wait(browser, row.find_by_css('.share-edit').first)
browser.fill('sharing-name', new_name)
browser.fill('sharing-path', path)
browser.find_by_css('#id_sharing-groups input').uncheck()
browser.find_by_css(
'#id_sharing-groups input[value="{}"]'.format(group)).check()
functional.submit(browser, form_class='form-add-edit')
def _get_share(browser, name):
"""Return the row for a given share."""
functional.visit(browser, '/plinth/apps/sharing/')
return browser.find_by_id('share-{}'.format(name))[0]
def _verify_share(browser, name, path, group):
"""Verfiy that a share exists in list of shares."""
href = f'{functional.base_url}/share/{name}'
url = f'/share/{name}'
row = _get_share(browser, name)
assert row.find_by_css('.share-name')[0].text == name
assert row.find_by_css('.share-path')[0].text == path
assert row.find_by_css('.share-url a')[0]['href'] == href
assert row.find_by_css('.share-url a')[0].text == url
assert row.find_by_css('.share-groups')[0].text == group
def _access_share(browser, name):
"""Visit a share and see if it is accessible."""
row = _get_share(browser, name)
url = row.find_by_css('.share-url a')[0]['href']
browser.visit(url)
assert '/share/{}'.format(name) in browser.title
def _make_share_public(browser, name):
"""Make share publicly accessible."""
row = _get_share(browser, name)
functional.click_and_wait(browser, row.find_by_css('.share-edit').first)
browser.find_by_id('id_sharing-is_public').check()
functional.submit(browser, form_class='form-add-edit')
def _verify_invalid_share(browser, name):
with pytest.raises(splinter.exceptions.ElementDoesNotExist):
_get_share(browser, name)
def _verify_nonexistant_share(browser, name):
"""Verify that given URL for a given share name is a 404."""
functional.visit(browser, f'/share/{name}')
functional.eventually(lambda: '404' in browser.title)
def _verify_inaccessible_share(browser, name):
"""Verify that given URL for a given share name denies permission."""
functional.visit(browser, f'/share/{name}')
functional.eventually(lambda: '/plinth' in browser.url, args=[])
|