diff --git a/poetry.lock b/poetry.lock index 0ab03aa..0beec8d 100644 --- a/poetry.lock +++ b/poetry.lock @@ -386,6 +386,20 @@ python-versions = ">=3.6" py = "*" pytest = ">=3.10" +[[package]] +name = "pytest-mock" +version = "3.10.0" +description = "Thin-wrapper around the mock package for easier use with pytest" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +pytest = ">=5.0" + +[package.extras] +dev = ["pre-commit", "pytest-asyncio", "tox"] + [[package]] name = "pytest-xdist" version = "2.5.0" @@ -488,7 +502,7 @@ testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools" [metadata] lock-version = "1.1" python-versions = ">=3.7,<3.11" -content-hash = "5ed0423136bff7b3208bab5cc90ef6e1aa03918b9cb3e81b10d60d9a84c47de9" +content-hash = "098fe8820fcf719b946a0b92b29a64e93e68107e9fe0340b1d8503e53b2802fd" [metadata.files] altgraph = [ @@ -783,6 +797,10 @@ pytest-forked = [ {file = "pytest-forked-1.4.0.tar.gz", hash = "sha256:8b67587c8f98cbbadfdd804539ed5455b6ed03802203485dd2f53c1422d7440e"}, {file = "pytest_forked-1.4.0-py3-none-any.whl", hash = "sha256:bbbb6717efc886b9d64537b41fb1497cfaf3c9601276be8da2cccfea5a3c8ad8"}, ] +pytest-mock = [ + {file = "pytest-mock-3.10.0.tar.gz", hash = "sha256:fbbdb085ef7c252a326fd8cdcac0aa3b1333d8811f131bdcc701002e1be7ed4f"}, + {file = "pytest_mock-3.10.0-py3-none-any.whl", hash = "sha256:f4c973eeae0282963eb293eb173ce91b091a79c1334455acfac9ddee8a1c784b"}, +] pytest-xdist = [ {file = "pytest-xdist-2.5.0.tar.gz", hash = "sha256:4580deca3ff04ddb2ac53eba39d76cb5dd5edeac050cb6fbc768b0dd712b4edf"}, {file = "pytest_xdist-2.5.0-py3-none-any.whl", hash = "sha256:6fe5c74fec98906deb8f2d2b616b5c782022744978e7bd4695d39c8f42d0ce65"}, diff --git a/pyproject.toml b/pyproject.toml index 40d66f3..d554bfc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -33,6 +33,9 @@ dangerzone = 'dangerzone:main' dangerzone-container = 'dangerzone:main' dangerzone-cli = 'dangerzone:main' +[tool.poetry.group.dev.dependencies] +pytest-mock = "^3.10.0" + [build-system] requires = ["poetry>=1.1.4"] build-backend = "poetry.masonry.api" diff --git a/tests/test_document.py b/tests/test_document.py index 1cff181..df3550a 100644 --- a/tests/test_document.py +++ b/tests/test_document.py @@ -3,11 +3,12 @@ import platform import stat import tempfile from pathlib import Path +from unittest.mock import MagicMock import pytest from dangerzone import errors -from dangerzone.document import SAFE_EXTENSION, Document +from dangerzone.document import ARCHIVE_SUBDIR, SAFE_EXTENSION, Document from . import sample_doc, unreadable_pdf @@ -16,6 +17,10 @@ def test_input_sample_init(sample_doc: str) -> None: Document(sample_doc) +def test_input_sample_init_archive(sample_doc: str) -> None: + Document(sample_doc, archive=True) + + def test_input_sample_after(sample_doc: str) -> None: d = Document() d.input_filename = sample_doc @@ -78,6 +83,40 @@ def test_output_file_not_pdf(tmp_path: Path) -> None: assert not os.path.exists(docx_file) +@pytest.mark.skipif(platform.system() == "Windows", reason="Unix-specific") +def test_archive_unwriteable_dir(sample_doc: str, tmp_path: Path) -> None: + doc = tmp_path / "doc.pdf" + Path.touch(doc) + d = Document(str(doc)) + + # make archive directory unreadable + os.chmod(tmp_path, 0o400) + + with pytest.raises(errors.UnwriteableArchiveDirException) as e: + d.validate_default_archive_dir() + + +def test_archive(mocker: MagicMock, tmp_path: Path) -> None: + test_string = "original file" + original_doc_path = str(tmp_path / "doc.pdf") + archived_doc_path = str(tmp_path / ARCHIVE_SUBDIR / "doc.pdf") + + # write some content for later verifying content integrity + with open(original_doc_path, "w") as f: + f.write(test_string) + + d = Document(original_doc_path, archive=True) + d.archive() + + # original document has been moved to unsafe/doc.pdf + assert not os.path.exists(original_doc_path) + assert os.path.exists(archived_doc_path) + + # make sure it is the original file by comparing its content + with open(archived_doc_path) as f: + assert f.read() == test_string + + def test_set_output_dir(sample_doc: str, tmp_path: Path) -> None: d = Document(sample_doc) d.set_output_dir(str(tmp_path))