File: test_functional.py

package info (click to toggle)
freedombox 26.2
  • links: PTS, VCS
  • area: main
  • in suites: forky
  • size: 82,976 kB
  • sloc: python: 48,504; javascript: 1,736; xml: 481; makefile: 290; sh: 167; php: 32
file content (135 lines) | stat: -rw-r--r-- 4,835 bytes parent folder | download | duplicates (5)
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
# SPDX-License-Identifier: AGPL-3.0-or-later
"""Functional, browser based tests for Nextcloud app."""

import time
import urllib

import pytest
from selenium.webdriver.common.keys import Keys

from plinth.tests import functional

pytestmark = [pytest.mark.apps, pytest.mark.nextcloud]

PASSWORD = 'kai8wahTei'


class TestNextcloudApp(functional.BaseAppTests):
    app_name = 'nextcloud'
    has_service = True

    def install_and_setup(self, session_browser):
        """Install app and set the domain."""
        super().install_and_setup(session_browser)
        functional.app_enable(session_browser, self.app_name)
        default_url = functional.config['DEFAULT']['url']
        parse_result = urllib.parse.urlparse(default_url)
        override_domain = parse_result.hostname
        override_domain += f':{parse_result.port}' if parse_result.port else ''
        session_browser.find_by_id('id_override_domain').fill(override_domain)
        session_browser.find_by_id('id_admin_password').fill(PASSWORD)
        functional.submit(session_browser, form_class='form-configuration')

    def test_create_folder(self, session_browser, background):
        """Test that creating a folder works."""
        folder_name = 'TestFolder'
        _visit_files_app(session_browser)

        _remove_folder(session_browser, folder_name)
        assert not _is_folder_present(session_browser, folder_name)

        _create_folder(session_browser, folder_name)
        assert _is_folder_present(session_browser, folder_name)

    def test_backup_restore(self, session_browser):
        """Test that backup and restore operations work on the app."""
        folder_name = 'TestBackupFolder'
        _visit_files_app(session_browser)
        if not _is_folder_present(session_browser, folder_name):
            _create_folder(session_browser, folder_name)

        super().test_backup_restore(session_browser)

        _visit_files_app(session_browser)
        assert _is_folder_present(session_browser, folder_name)


def _login(browser):
    """Login to Nextcloud interface."""
    functional.visit(browser, '/nextcloud/')
    if not browser.find_by_css('.login-form'):
        return

    browser.find_by_id('user').fill('nextcloud-admin')
    browser.find_by_id('password').fill(PASSWORD)
    functional.submit(browser, form_class='login-form')


def _visit_files_app(browser):
    """Login to Nextcloud and visit the files app."""
    _login(browser)
    functional.visit(browser, '/nextcloud/apps/files/files')
    # Close the welcome model dialog if it is present
    browser.find_by_tag('html').first.type(Keys.ESCAPE)
    time.sleep(1)  # Allow the model dialog to close.


def _remove_folder(browser, folder_name):
    """Remove a folder from Nextcloud files app."""
    # Select the folder
    xpath = f'//tr[{_class("files-list__row")} and ' \
        f'.//*[{_class("files-list__row-name-")} and ' \
        f'contains(text(),"{folder_name}")]]' \
        f'//span[{_class("checkbox-content-checkbox")}]'
    matches = browser.find_by_xpath(xpath)
    if not matches:
        return

    matches.first.check()

    # Click on '...' more actions button
    xpath = '//button[@aria-label="Actions"]'
    browser.find_by_xpath(xpath).first.click()

    # Click on 'Delete folder' pop down menu item
    xpath = '//button[.//span[contains(text(),"Delete folder")]]'
    browser.find_by_xpath(xpath).first.click()


def _is_folder_present(browser, folder_name):
    """Return whether a folder with given name exists."""
    xpath = f'//tr[{_class("files-list__row")}]' \
        f'//*[{_class("files-list__row-name-")} and ' \
        f'contains(text(),"{folder_name}")]'
    return bool(browser.find_by_xpath(xpath))


def _class(klass):
    """Return xpath snippet for matching class."""
    return f'contains(concat(" ",@class," "), " {klass} ")'


def _create_folder(browser, folder_name):
    """Create a folder in the Nextcloud files app."""
    # Click on the '+ New' button in the header
    xpath = f'//div[{_class("action-item")}]' \
        '//button[.//*[contains(text(),"New")]]'
    browser.find_by_xpath(xpath).first.click()

    # Click on the 'New folder' pop down menu item
    xpath = f'//button[{_class("action-button")} and ' \
        './span[text()="New folder"]]'
    browser.find_by_xpath(xpath).first.click()

    # Get the 'Create new folder' dialog box
    xpath = f'//div[{_class("dialog__modal")} and ' \
        './/h2[text()="Create new folder"]]'
    dialog = browser.find_by_xpath(xpath).first

    # Enter the folder name into text box 'Folder name'
    xpath = f'.//input[{_class("input-field__input")}]'
    dialog.find_by_xpath(xpath).first.fill(folder_name)

    # Press the 'Create' button
    xpath = './/button[.//*[contains(text(),"Create")]]'
    dialog.find_by_xpath(xpath).first.click()