mirror of
https://github.com/freedombox/FreedomBox.git
synced 2026-02-18 08:33:41 +00:00
189 lines
5.7 KiB
Python
189 lines
5.7 KiB
Python
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
"""
|
|
Tests for config module.
|
|
"""
|
|
|
|
import pytest
|
|
import os
|
|
|
|
from unittest.mock import (patch, MagicMock)
|
|
|
|
from plinth import __main__ as plinth_main
|
|
from plinth.modules.apache import uws_directory_of_user
|
|
from plinth.modules.config import (home_page_url2scid, get_home_page,
|
|
_home_page_scid2url, change_home_page)
|
|
from plinth.modules.config.forms import ConfigurationForm
|
|
|
|
|
|
def test_hostname_field():
|
|
"""Test that hostname field accepts only valid hostnames."""
|
|
valid_hostnames = [
|
|
'a', '0a', 'a0', 'AAA', '00', '0-0', 'example-hostname', 'example',
|
|
'012345678901234567890123456789012345678901234567890123456789012'
|
|
]
|
|
invalid_hostnames = [
|
|
'', '-', '-a', 'a-', '.a', 'a.', 'a.a', '?', 'a?a',
|
|
'0123456789012345678901234567890123456789012345678901234567890123'
|
|
]
|
|
|
|
for hostname in valid_hostnames:
|
|
form = ConfigurationForm({
|
|
'hostname': hostname,
|
|
'domainname': 'example.com'
|
|
})
|
|
assert form.is_valid()
|
|
|
|
for hostname in invalid_hostnames:
|
|
form = ConfigurationForm({
|
|
'hostname': hostname,
|
|
'domainname': 'example.com'
|
|
})
|
|
assert not form.is_valid()
|
|
|
|
|
|
def test_domainname_field():
|
|
"""Test that domainname field accepts only valid domainnames."""
|
|
valid_domainnames = [
|
|
'', 'a', '0a', 'a0', 'AAA', '00', '0-0', 'example-hostname', 'example',
|
|
'example.org', 'a.b.c.d', 'a-0.b-0.c-0',
|
|
'012345678901234567890123456789012345678901234567890123456789012',
|
|
((('x' * 63) + '.') * 3) + 'x' * 61
|
|
]
|
|
invalid_domainnames = [
|
|
'-', '-a', 'a-', '.a', 'a.', '?', 'a?a', 'a..a', 'a.-a', '.',
|
|
((('x' * 63) + '.') * 3) + 'x' * 62, 'x' * 64
|
|
]
|
|
|
|
for domainname in valid_domainnames:
|
|
form = ConfigurationForm({
|
|
'hostname': 'example',
|
|
'domainname': domainname
|
|
})
|
|
assert form.is_valid()
|
|
|
|
for domainname in invalid_domainnames:
|
|
form = ConfigurationForm({
|
|
'hostname': 'example',
|
|
'domainname': domainname
|
|
})
|
|
assert not form.is_valid()
|
|
|
|
|
|
def test_homepage_mapping():
|
|
"""Basic tests for homepage functions."""
|
|
f = home_page_url2scid
|
|
assert f(None) is None
|
|
assert f('/unknown/url') is None
|
|
assert 'plinth' == f('/plinth/')
|
|
assert 'plinth' == f('/plinth')
|
|
assert 'plinth' == f('plinth')
|
|
assert 'apache-default' == f('/index.html')
|
|
assert 'uws-user' == f('/~user')
|
|
assert 'uws-user' == f('/~user/whatever/else')
|
|
# assert 'config' == f('/plinth/apps/sharing/')
|
|
|
|
f = _home_page_scid2url
|
|
assert f(None) is None
|
|
assert '/plinth/' == f('plinth')
|
|
assert '/index.html' == f('apache-default')
|
|
|
|
|
|
def test_homepage_mapping_skip_ci():
|
|
"""Special tests for homepage functions."""
|
|
|
|
try:
|
|
UWS_DIRECTORY = uws_directory_of_user(os.getlogin())
|
|
except OSError:
|
|
reason = "Needs access to ~/ directory. " \
|
|
+ "CI sandboxed workspace doesn't provide it."
|
|
pytest.skip(reason)
|
|
|
|
if os.path.exists(UWS_DIRECTORY):
|
|
reason = "UWS dir {} exists already.".format(UWS_DIRECTORY)
|
|
pytest.skip(reason)
|
|
|
|
f = _home_page_scid2url
|
|
os.mkdir(UWS_DIRECTORY)
|
|
assert '/~fbx/' == f('uws-fbx')
|
|
os.rmdir(UWS_DIRECTORY)
|
|
assert f('uws-fbx') is None
|
|
|
|
|
|
class Dict2Obj(object):
|
|
"""Mock object made out of any dict."""
|
|
|
|
def __init__(self, a_dict):
|
|
self.__dict__ = a_dict
|
|
|
|
|
|
@patch('plinth.frontpage.Shortcut.list',
|
|
MagicMock(return_value=[
|
|
Dict2Obj({
|
|
'url': 'url/for/' + id,
|
|
'component_id': id
|
|
}) for id in ('a', 'b')
|
|
]))
|
|
@pytest.mark.usefixtures('needs_root')
|
|
def test_homepage_field():
|
|
"""Test homepage changes.
|
|
|
|
Test Cases:
|
|
1) FreedomBox Homepage (default),
|
|
2) Apache default,
|
|
3) A user's website of an...
|
|
3.1) unexisting user
|
|
3.2) existing user without a page
|
|
3.3) existing user page.
|
|
4) A FreedomBox App.
|
|
4.1) unknown app
|
|
4.2) uninstalled app
|
|
4.3) disabled app
|
|
4.4) enabled app
|
|
|
|
Note: If run on a pristine unconfigured FreedomBox, this test will leave
|
|
the homepage default-configured. (Imperfect cleanup in such case).
|
|
|
|
Pending: Specific test cases to distiguish 4.1,2,3.
|
|
Currently they share the same test case.
|
|
"""
|
|
try:
|
|
UWS_DIRECTORY = uws_directory_of_user(os.getlogin())
|
|
except OSError:
|
|
reason = "Needs access to ~/ directory, etc. " \
|
|
+ "CI sandboxed workspace doesn't provide it."
|
|
pytest.skip(reason)
|
|
|
|
DEFAULT_HOME_PAGE = 'plinth'
|
|
ORIGINAL_HOME_PAGE = get_home_page() or DEFAULT_HOME_PAGE
|
|
|
|
if ORIGINAL_HOME_PAGE not in (DEFAULT_HOME_PAGE, None):
|
|
reason = "Unexpected home page {}.".format(ORIGINAL_HOME_PAGE)
|
|
pytest.skip(reason)
|
|
|
|
# invalid changes fall back to default:
|
|
for scid in ('uws-unexisting', 'uws-fbx', 'missing_app'):
|
|
change_home_page(scid)
|
|
assert get_home_page() == DEFAULT_HOME_PAGE
|
|
|
|
os.mkdir(UWS_DIRECTORY)
|
|
|
|
# valid changes actually happen:
|
|
for scid in ('b', 'a', 'uws-fbx', 'apache-default', 'plinth'):
|
|
change_home_page(scid)
|
|
assert get_home_page() == scid
|
|
|
|
# cleanup:
|
|
change_home_page(ORIGINAL_HOME_PAGE)
|
|
os.rmdir(UWS_DIRECTORY)
|
|
assert get_home_page() == ORIGINAL_HOME_PAGE
|
|
|
|
|
|
def test_locale_path():
|
|
"""
|
|
Test that the 'locale' directory is in the same folder as __main__.py.
|
|
This is required for detecting translated languages.
|
|
"""
|
|
plinth_dir = os.path.dirname(plinth_main.__file__)
|
|
locale_dir = os.path.join(plinth_dir, 'locale')
|
|
assert os.path.isdir(locale_dir)
|