FreedomBox/plinth/modules/kiwix/tests/test_functional.py
Joseph Nuthalapati 28143c091a
kiwix: Do not require login to access the app
Kiwix content packages should be publicly accessible by default. Allow
the frontpage shortcut to be accessed without logging in.

Added a functional test to check that Kiwix library can be accessed
without logging in.

Signed-off-by: Joseph Nuthalapati <njoseph@riseup.net>
Reviewed-by: Sunil Mohan Adapa <sunil@medhas.org>
2023-10-22 14:04:18 -07:00

120 lines
4.2 KiB
Python

# SPDX-License-Identifier: AGPL-3.0-or-later
"""
Functional, browser based tests for Kiwix app.
"""
import pathlib
from time import sleep
import pytest
from plinth.tests import functional
from .test_privileged import ZIM_ID
pytestmark = [pytest.mark.apps, pytest.mark.sso, pytest.mark.kiwix]
_default_url = functional.config['DEFAULT']['url']
_data_dir = pathlib.Path(__file__).parent / 'data'
class TestKiwixApp(functional.BaseAppTests):
"""Basic functional tests for Kiwix app."""
app_name = 'kiwix'
has_service = True
has_web = True
def test_add_delete_package(self, session_browser):
"""Test adding/deleting content package to the library."""
functional.app_enable(session_browser, 'kiwix')
zim_file = _data_dir / 'FreedomBox.zim'
_add_package(session_browser, str(zim_file))
assert _is_package_listed(session_browser, 'freedombox')
assert _is_package_available(session_browser, 'FreedomBox')
_delete_package(session_browser, ZIM_ID)
assert not _is_package_listed(session_browser, 'freedombox')
assert not _is_package_available(session_browser, 'FreedomBox')
@pytest.mark.backups
def test_backup_restore(self, session_browser):
"""Test backing up and restoring."""
functional.app_enable(session_browser, 'kiwix')
zim_file = _data_dir / 'FreedomBox.zim'
_add_package(session_browser, str(zim_file))
functional.backup_create(session_browser, 'kiwix', 'test_kiwix')
_delete_package(session_browser, ZIM_ID)
functional.backup_restore(session_browser, 'kiwix', 'test_kiwix')
assert _is_package_listed(session_browser, 'freedombox')
assert _is_package_available(session_browser, 'FreedomBox')
def test_add_invalid_zim_file(self, session_browser):
"""Test handling of invalid zim files."""
functional.app_enable(session_browser, 'kiwix')
zim_file = _data_dir / 'invalid.zim'
_add_package(session_browser, str(zim_file))
assert not _is_package_listed(session_browser, 'invalid')
def test_anonymous_access(self, session_browser):
"""Test anonymous access to Kiwix library."""
functional.app_enable(session_browser, 'kiwix')
functional.logout(session_browser)
assert functional.eventually(_shortcut_exists, args=[session_browser])
assert functional.eventually(_is_anonymous_read_allowed,
args=[session_browser])
def _add_package(browser, file_name):
"""Add a package by uploading the ZIM file in kiwix app page."""
browser.links.find_by_href('/plinth/apps/kiwix/package/add/').first.click()
browser.attach_file('kiwix-file', file_name)
functional.submit(browser, form_class='form-kiwix')
def _is_package_available(browser, title) -> bool:
"""Check whether a ZIM file is available in Kiwix web interface."""
browser.visit(f'{_default_url}/kiwix')
sleep(1) # Allow time for the books to appear
titles = browser.find_by_id('book__title')
return any(element.value == title for element in titles)
def _is_package_listed(browser, name) -> bool:
"""Return whether a content package is list in kiwix app page."""
functional.nav_to_module(browser, 'kiwix')
links_found = browser.links.find_by_partial_href(f'/kiwix/viewer#{name}')
return len(links_found) == 1
def _delete_package(browser, zim_id):
"""Delete a content package from the kiwix app page."""
functional.nav_to_module(browser, 'kiwix')
link = browser.links.find_by_href(
f'/plinth/apps/kiwix/package/{zim_id}/delete/')
if not link:
raise ValueError('ZIM file missing!')
link.first.click()
functional.submit(browser, form_class='form-delete')
def _is_anonymous_read_allowed(browser) -> bool:
"""Check if Kiwix library page can be accessed without logging in."""
functional.visit(browser, '/kiwix')
return browser.is_element_present_by_id('kiwixfooter')
def _shortcut_exists(browser) -> bool:
"""Check that the Kiwix shortcut exists on the front page."""
browser.visit(_default_url)
links_found = browser.links.find_by_href('/kiwix')
return len(links_found) == 1