FreedomBox/plinth/modules/miniflux/tests/test_functional.py
Veiko Aasa eca6a65080
miniflux: tests: functional: Use helper functions from functional libary
Also, ignore pexpect module in mypy checks.

Tests:
  - All miniflux tests pass.

Signed-off-by: Veiko Aasa <veiko17@disroot.org>
[sunil: Update to reflect the new utility function name]
Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: Sunil Mohan Adapa <sunil@medhas.org>
2024-12-27 16:43:39 -08:00

127 lines
4.4 KiB
Python

# SPDX-License-Identifier: AGPL-3.0-or-later
"""
Functional, browser based tests for Miniflux app.
"""
import pytest
from plinth.tests import functional
pytestmark = [pytest.mark.apps, pytest.mark.miniflux]
ADMIN_USERNAME = 'admin'
ADMIN_PASSWORD = 'str0ngp@$$word'
ADMIN_PASSWORD_NEW = 'str0ngERp@$$word'
CREDENTIALS = {'username': 'admin', 'password': ADMIN_PASSWORD}
class TestMinifluxApp(functional.BaseAppTests):
"""Class to customize basic app tests for Miniflux."""
app_name = 'miniflux'
has_service = True
has_web = True
@pytest.fixture(name='create_admin_user')
def fixture_create_admin_user(self, session_browser):
"""Create an admin user for Miniflux."""
functional.app_enable(session_browser, self.app_name)
_create_admin_user(session_browser)
def test_create_miniflux_admin_user(self, session_browser,
create_admin_user):
"""Test creating an admin user."""
_miniflux_login(session_browser)
# Verify that this user can see admin settings
functional.click_link_by_href(session_browser, '/miniflux/settings')
assert not session_browser.links.find_by_href(
'/miniflux/users').is_empty()
def test_reset_miniflux_user_password(self, session_browser,
create_admin_user):
"""Test Miniflux user password reset."""
CREDENTIALS['password'] = ADMIN_PASSWORD_NEW
_reset_user_password(session_browser)
_miniflux_login(session_browser)
assert not session_browser.links.find_by_href(
'/miniflux/unread').is_empty()
@pytest.mark.backups
def test_backup_restore(self, session_browser, create_admin_user):
"""Test backup and restore of app data."""
_subscribe(session_browser, 'https://planet.debian.org/atom.xml')
super().test_backup_restore(session_browser)
assert _is_subscribed(session_browser, 'Planet Debian')
def _fill_credentials_form(browser, href):
"""Fill the user credentials form in Miniflux app."""
functional.nav_to_module(browser, 'miniflux')
functional.click_link_by_href(browser, f'/plinth/apps/miniflux/{href}/')
browser.fill('miniflux-username', CREDENTIALS['username'])
browser.fill('miniflux-password', CREDENTIALS['password'])
browser.fill('miniflux-password_confirmation', CREDENTIALS['password'])
functional.submit(browser, form_class='form-miniflux')
def _create_admin_user(browser):
"""Create Miniflux admin user."""
_fill_credentials_form(browser, 'create-admin-user')
_fill_credentials_form(browser, 'reset-user-password')
def _open_miniflux_app(browser):
"""Load the web interface of Miniflux."""
functional.visit(browser, '/miniflux/')
main = browser.find_by_id('main')
functional.eventually(lambda: main.visible)
def _miniflux_logout(browser):
"""Attempt to log out of Miniflux app. Doesn't fail if not logged in."""
_open_miniflux_app(browser)
maybe_logout_button = browser.links.find_by_href('/miniflux/logout')
if not maybe_logout_button.is_empty():
functional.click_and_wait(browser, maybe_logout_button)
def _miniflux_submit(browser):
"""Perform the Submit action in Miniflux forms."""
functional.submit(browser,
element=browser.find_by_css('button[type="submit"]'))
def _miniflux_login(browser):
"""Login to miniflux with the given credentials."""
_open_miniflux_app(browser)
_miniflux_logout(browser)
browser.find_by_id('form-username').fill(CREDENTIALS['username'])
browser.find_by_id('form-password').fill(CREDENTIALS['password'])
_miniflux_submit(browser)
def _reset_user_password(browser):
"""Reset a Miniflux user's password from FreedomBox web interface."""
_fill_credentials_form(browser, 'reset-user-password')
def _subscribe(browser, feed_url):
"""Subscribe to a feed in Miniflux."""
_open_miniflux_app(browser)
_miniflux_login(browser)
functional.click_link_by_href(browser, '/miniflux/subscribe')
browser.find_by_id('form-url').fill(feed_url)
_miniflux_submit(browser)
def _is_subscribed(browser, feed_name):
"""Check if the user is subscribed to a feed."""
_open_miniflux_app(browser)
_miniflux_login(browser)
functional.click_link_by_href(browser, '/miniflux/feeds')
return browser.is_text_present(feed_name)