File: test_functional.py

package info (click to toggle)
freedombox 26.2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 82,976 kB
  • sloc: python: 48,504; javascript: 1,736; xml: 481; makefile: 290; sh: 167; php: 32
file content (151 lines) | stat: -rw-r--r-- 5,494 bytes parent folder | download | duplicates (4)
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=[])