FreedomBox/plinth/modules/kiwix/tests/test_privileged.py
Joseph Nuthalapati 6dd6f12f5a
kiwix: Use new utility for handling uploads
Earlier, the uploaded ZIM file was being written to disk twice.

Manual Test
-----------
Without the changes in this commit, the English MediaWiki archive of
6.83 GB cannot be uploaded to the dev container of size 12 GB, since two
temporary files are created.

With the changes in this commit, the same file can be uploaded
successfully and accessed using Kiwix reader.

- Uploaded file has expected ownership and permissions.

Signed-off-by: Joseph Nuthalapati <njoseph@riseup.net>
[sunil: Handle error for uploading duplicate content.]
[sunil: Set root:root ownership on the uploaded file.]
[sunil: Use the action utility for checking that the upload file and moving it.]
Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: Veiko Aasa <veiko17@disroot.org>
2024-10-03 11:45:15 +03:00

87 lines
2.5 KiB
Python

# SPDX-License-Identifier: AGPL-3.0-or-later
"""
Test module for Kiwix actions.
"""
import pathlib
import shutil
from unittest.mock import patch
import pytest
import plinth.settings
from plinth.modules.kiwix import privileged
pytestmark = pytest.mark.usefixtures('mock_privileged')
privileged_modules_to_mock = ['plinth.modules.kiwix.privileged']
EMPTY_LIBRARY_CONTENTS = '''<?xml version="1.0" encoding="UTF-8"?>
<library version="20110515">
</library>'''
ZIM_ID = 'bc4f8cdf-5626-2b13-3860-0033deddfbea'
@pytest.fixture(autouse=True)
def fixture_kiwix_home(tmp_path):
"""Create a new Kiwix home in a new temporary directory.
Initialize with a sample, valid library file.
"""
privileged.KIWIX_HOME = tmp_path / 'kiwix'
privileged.KIWIX_HOME.mkdir()
privileged.CONTENT_DIR = privileged.KIWIX_HOME / 'content'
privileged.CONTENT_DIR.mkdir()
privileged.LIBRARY_FILE = privileged.KIWIX_HOME / 'library_zim.xml'
source_file = pathlib.Path(__file__).parent / 'data/sample_library_zim.xml'
shutil.copy(source_file, privileged.LIBRARY_FILE)
@pytest.fixture(name='upload_dir')
def fixture_upload_dir(tmp_path):
"""Overwrite the Django upload path."""
old_value = plinth.settings.FILE_UPLOAD_TEMP_DIR
plinth.settings.FILE_UPLOAD_TEMP_DIR = tmp_path
yield tmp_path
plinth.settings.FILE_UPLOAD_TEMP_DIR = old_value
@pytest.fixture(autouse=True)
def fixture_patch():
"""Patch some underlying methods."""
with patch('subprocess.check_call'), patch('subprocess.run'), patch(
'shutil.chown'):
yield
def test_add_package(upload_dir):
"""Test adding a content package to Kiwix."""
zim_file_name = 'wikipedia_en_all_maxi_2022-05.zim'
orig_file = upload_dir / zim_file_name
orig_file.touch()
privileged.add_package(zim_file_name, str(orig_file))
assert (privileged.KIWIX_HOME / 'content' / zim_file_name).exists()
assert not orig_file.exists()
def test_list_packages():
"""Test listing the content packages from a library file."""
content = privileged.list_packages()
assert content[ZIM_ID] == {
'title': 'FreedomBox',
'description': 'A sample content archive',
'path': 'freedombox'
}
def test_delete_package():
"""Test deleting one content package."""
zim_file = privileged.CONTENT_DIR / 'FreedomBox.zim'
zim_file.touch()
privileged.delete_package(ZIM_ID)
assert not zim_file.exists()
# Cannot check that the book is removed from library_zim.xml