diff --git a/src/documents/tests/test_admin.py b/src/documents/tests/test_admin.py index e90808784..6e018eba8 100644 --- a/src/documents/tests/test_admin.py +++ b/src/documents/tests/test_admin.py @@ -16,8 +16,8 @@ from documents.models import Document from documents.models import Tag from documents.search import get_backend from documents.search import reset_backend -from documents.tests.utils import DirectoriesMixin from paperless.admin import PaperlessUserAdmin +from paperless_testing.dirs import DirectoriesMixin from paperless_testing.factories import DocumentFactory from paperless_testing.factories import TagFactory from paperless_testing.factories import UserFactory diff --git a/src/documents/tests/test_api_app_config.py b/src/documents/tests/test_api_app_config.py index 8620c3ec3..e6d3fc7af 100644 --- a/src/documents/tests/test_api_app_config.py +++ b/src/documents/tests/test_api_app_config.py @@ -11,10 +11,10 @@ from PIL.PngImagePlugin import PngInfo from rest_framework import status from rest_framework.test import APITestCase -from documents.tests.utils import DirectoriesMixin from documents.tests.utils import read_streaming_response from paperless.models import ApplicationConfiguration from paperless.models import ColorConvertChoices +from paperless_testing.dirs import DirectoriesMixin class TestApiAppConfig(DirectoriesMixin, APITestCase): diff --git a/src/documents/tests/test_api_bulk_download.py b/src/documents/tests/test_api_bulk_download.py index b4f243005..912eefdc6 100644 --- a/src/documents/tests/test_api_bulk_download.py +++ b/src/documents/tests/test_api_bulk_download.py @@ -14,9 +14,9 @@ from rest_framework.test import APITestCase from documents.models import Correspondent from documents.models import Document from documents.models import DocumentType -from documents.tests.utils import DirectoriesMixin from documents.tests.utils import SampleDirMixin from documents.tests.utils import read_streaming_response +from paperless_testing.dirs import DirectoriesMixin class TestBulkDownload(DirectoriesMixin, SampleDirMixin, APITestCase): diff --git a/src/documents/tests/test_api_bulk_edit.py b/src/documents/tests/test_api_bulk_edit.py index 0657a98cc..7e861e6e1 100644 --- a/src/documents/tests/test_api_bulk_edit.py +++ b/src/documents/tests/test_api_bulk_edit.py @@ -15,7 +15,7 @@ from documents.models import Document from documents.models import DocumentType from documents.models import StoragePath from documents.models import Tag -from documents.tests.utils import DirectoriesMixin +from paperless_testing.dirs import DirectoriesMixin class TestBulkEditAPI(DirectoriesMixin, APITestCase): diff --git a/src/documents/tests/test_api_custom_fields.py b/src/documents/tests/test_api_custom_fields.py index 8ad69dd0d..adcd41615 100644 --- a/src/documents/tests/test_api_custom_fields.py +++ b/src/documents/tests/test_api_custom_fields.py @@ -13,7 +13,7 @@ from rest_framework.test import APITestCase from documents.models import CustomField from documents.models import CustomFieldInstance from documents.models import Document -from documents.tests.utils import DirectoriesMixin +from paperless_testing.dirs import DirectoriesMixin class TestCustomFieldsAPI(DirectoriesMixin, APITestCase): diff --git a/src/documents/tests/test_api_document_versions.py b/src/documents/tests/test_api_document_versions.py index f8edd8815..d7241b54a 100644 --- a/src/documents/tests/test_api_document_versions.py +++ b/src/documents/tests/test_api_document_versions.py @@ -18,10 +18,10 @@ from documents.data_models import DocumentSource from documents.filters import EffectiveContentFilter from documents.filters import TitleContentFilter from documents.models import Document -from documents.tests.utils import DirectoriesMixin from documents.tests.utils import read_streaming_response from documents.versioning import annotate_effective_content from documents.views import DocumentSelectionMixin +from paperless_testing.dirs import DirectoriesMixin if TYPE_CHECKING: from pathlib import Path diff --git a/src/documents/tests/test_api_documents.py b/src/documents/tests/test_api_documents.py index 8c17926c5..1b5dc48eb 100644 --- a/src/documents/tests/test_api_documents.py +++ b/src/documents/tests/test_api_documents.py @@ -49,8 +49,8 @@ from documents.models import WorkflowAction from documents.models import WorkflowTrigger from documents.signals.handlers import run_workflows from documents.tests.utils import ConsumeTaskMixin -from documents.tests.utils import DirectoriesMixin from documents.tests.utils import read_streaming_response +from paperless_testing.dirs import DirectoriesMixin from paperless_testing.factories import DocumentFactory from paperless_testing.factories import TagFactory diff --git a/src/documents/tests/test_api_email.py b/src/documents/tests/test_api_email.py index 90a629e1a..e404e3037 100644 --- a/src/documents/tests/test_api_email.py +++ b/src/documents/tests/test_api_email.py @@ -10,8 +10,8 @@ from rest_framework import status from rest_framework.test import APITestCase from documents.models import Document -from documents.tests.utils import DirectoriesMixin from documents.tests.utils import SampleDirMixin +from paperless_testing.dirs import DirectoriesMixin class TestEmail(DirectoriesMixin, SampleDirMixin, APITestCase): diff --git a/src/documents/tests/test_api_filter_by_custom_fields.py b/src/documents/tests/test_api_filter_by_custom_fields.py index 0c4f9f37c..0c51169c1 100644 --- a/src/documents/tests/test_api_filter_by_custom_fields.py +++ b/src/documents/tests/test_api_filter_by_custom_fields.py @@ -13,7 +13,7 @@ from documents.models import Document from documents.models import SavedView from documents.models import SavedViewFilterRule from documents.serialisers import DocumentSerializer -from documents.tests.utils import DirectoriesMixin +from paperless_testing.dirs import DirectoriesMixin class DocumentWrapper: diff --git a/src/documents/tests/test_api_objects.py b/src/documents/tests/test_api_objects.py index 46d1da5c0..69264548e 100644 --- a/src/documents/tests/test_api_objects.py +++ b/src/documents/tests/test_api_objects.py @@ -21,7 +21,7 @@ from documents.models import Document from documents.models import DocumentType from documents.models import StoragePath from documents.models import Tag -from documents.tests.utils import DirectoriesMixin +from paperless_testing.dirs import DirectoriesMixin class TestApiObjects(DirectoriesMixin, APITestCase): diff --git a/src/documents/tests/test_api_permissions.py b/src/documents/tests/test_api_permissions.py index 0b2c491a4..867cdefaa 100644 --- a/src/documents/tests/test_api_permissions.py +++ b/src/documents/tests/test_api_permissions.py @@ -19,7 +19,7 @@ from documents.models import DocumentType from documents.models import MatchingModel from documents.models import StoragePath from documents.models import Tag -from documents.tests.utils import DirectoriesMixin +from paperless_testing.dirs import DirectoriesMixin class TestApiAuth(DirectoriesMixin, APITestCase): diff --git a/src/documents/tests/test_api_profile.py b/src/documents/tests/test_api_profile.py index d642f52d8..7422e5426 100644 --- a/src/documents/tests/test_api_profile.py +++ b/src/documents/tests/test_api_profile.py @@ -8,7 +8,7 @@ from rest_framework import status from rest_framework.authtoken.models import Token from rest_framework.test import APITestCase -from documents.tests.utils import DirectoriesMixin +from paperless_testing.dirs import DirectoriesMixin # see allauth.socialaccount.providers.openid.provider.OpenIDProvider diff --git a/src/documents/tests/test_api_search.py b/src/documents/tests/test_api_search.py index bb2dd6b91..18bcefc95 100644 --- a/src/documents/tests/test_api_search.py +++ b/src/documents/tests/test_api_search.py @@ -27,9 +27,9 @@ from documents.models import Tag from documents.models import Workflow from documents.search import get_backend from documents.search import reset_backend -from documents.tests.utils import DirectoriesMixin from paperless_mail.models import MailAccount from paperless_mail.models import MailRule +from paperless_testing.dirs import DirectoriesMixin from paperless_testing.factories import DocumentFactory pytestmark = pytest.mark.search diff --git a/src/documents/tests/test_api_trash.py b/src/documents/tests/test_api_trash.py index 58c4ad295..052a7f76d 100644 --- a/src/documents/tests/test_api_trash.py +++ b/src/documents/tests/test_api_trash.py @@ -7,7 +7,7 @@ from rest_framework import status from rest_framework.test import APITestCase from documents.models import Document -from documents.tests.utils import DirectoriesMixin +from paperless_testing.dirs import DirectoriesMixin class TestTrashAPI(DirectoriesMixin, APITestCase): diff --git a/src/documents/tests/test_api_uisettings.py b/src/documents/tests/test_api_uisettings.py index 82ee5d0fa..e365ea0e0 100644 --- a/src/documents/tests/test_api_uisettings.py +++ b/src/documents/tests/test_api_uisettings.py @@ -6,8 +6,8 @@ from django.test import override_settings from rest_framework import status from rest_framework.test import APITestCase -from documents.tests.utils import DirectoriesMixin from paperless.version import __full_version_str__ +from paperless_testing.dirs import DirectoriesMixin class TestApiUiSettings(DirectoriesMixin, APITestCase): diff --git a/src/documents/tests/test_api_workflows.py b/src/documents/tests/test_api_workflows.py index 7c1b9b6c5..3dc08c32f 100644 --- a/src/documents/tests/test_api_workflows.py +++ b/src/documents/tests/test_api_workflows.py @@ -14,7 +14,7 @@ from documents.models import Tag from documents.models import Workflow from documents.models import WorkflowAction from documents.models import WorkflowTrigger -from documents.tests.utils import DirectoriesMixin +from paperless_testing.dirs import DirectoriesMixin class TestApiWorkflows(DirectoriesMixin, APITestCase): diff --git a/src/documents/tests/test_barcodes.py b/src/documents/tests/test_barcodes.py index 84abcf2b1..2ad4868d8 100644 --- a/src/documents/tests/test_barcodes.py +++ b/src/documents/tests/test_barcodes.py @@ -18,11 +18,11 @@ from documents.models import Document from documents.models import Tag from documents.plugins.base import StopConsumeTaskError from documents.tests.utils import ConsumeTaskMixin -from documents.tests.utils import DirectoriesMixin from documents.tests.utils import DummyProgressManager from documents.tests.utils import FileSystemAssertsMixin from documents.tests.utils import SampleDirMixin from paperless.models import ApplicationConfiguration +from paperless_testing.dirs import DirectoriesMixin class GetReaderPluginMixin: diff --git a/src/documents/tests/test_bulk_edit.py b/src/documents/tests/test_bulk_edit.py index bfd134516..1970511cc 100644 --- a/src/documents/tests/test_bulk_edit.py +++ b/src/documents/tests/test_bulk_edit.py @@ -23,7 +23,7 @@ from documents.models import DocumentType from documents.models import StoragePath from documents.models import Tag from documents.permissions import set_permissions_for_objects -from documents.tests.utils import DirectoriesMixin +from paperless_testing.dirs import DirectoriesMixin class TestBulkEdit(DirectoriesMixin, TestCase): diff --git a/src/documents/tests/test_classifier.py b/src/documents/tests/test_classifier.py index 827247ac4..cb8049ce8 100644 --- a/src/documents/tests/test_classifier.py +++ b/src/documents/tests/test_classifier.py @@ -28,10 +28,10 @@ from documents.models import DocumentType from documents.models import MatchingModel from documents.models import StoragePath from documents.models import Tag -from documents.tests.utils import DirectoriesMixin from paperless.settings import CLASSIFIER_LANGUAGES from paperless.signed_pickle import HMAC_SIZE from paperless.signed_pickle import signed_pickle_dumps +from paperless_testing.dirs import DirectoriesMixin from paperless_testing.factories import DocumentFactory from paperless_testing.factories import TagFactory diff --git a/src/documents/tests/test_consumer.py b/src/documents/tests/test_consumer.py index 7c98f3552..91c7701f4 100644 --- a/src/documents/tests/test_consumer.py +++ b/src/documents/tests/test_consumer.py @@ -30,11 +30,11 @@ from documents.models import Tag from documents.parsers import ParseError from documents.plugins.helpers import ProgressStatusOptions from documents.tasks import sanity_check -from documents.tests.utils import DirectoriesMixin from documents.tests.utils import DummyProgressManager from documents.tests.utils import FileSystemAssertsMixin from documents.tests.utils import GetConsumerMixin from paperless_mail.models import MailRule +from paperless_testing.dirs import DirectoriesMixin class _BaseNewStyleParser: diff --git a/src/documents/tests/test_double_sided.py b/src/documents/tests/test_double_sided.py index 1189512df..3f6ecb2f1 100644 --- a/src/documents/tests/test_double_sided.py +++ b/src/documents/tests/test_double_sided.py @@ -15,9 +15,9 @@ from documents.data_models import ConsumableDocument from documents.data_models import DocumentSource from documents.double_sided import STAGING_FILE_NAME from documents.double_sided import TIMEOUT_MINUTES -from documents.tests.utils import DirectoriesMixin from documents.tests.utils import DummyProgressManager from documents.tests.utils import FileSystemAssertsMixin +from paperless_testing.dirs import DirectoriesMixin @override_settings( @@ -29,8 +29,8 @@ class TestDoubleSided(DirectoriesMixin, FileSystemAssertsMixin, TestCase): def setUp(self) -> None: super().setUp() - self.dirs.double_sided_dir = self.dirs.consumption_dir / "double-sided" - self.dirs.double_sided_dir.mkdir() + self.double_sided_dir = self.dirs.consumption_dir / "double-sided" + self.double_sided_dir.mkdir() self.staging_file = self.dirs.scratch_dir / STAGING_FILE_NAME def consume_file(self, srcname, dstname: str | Path = "foo.pdf"): @@ -39,7 +39,7 @@ class TestDoubleSided(DirectoriesMixin, FileSystemAssertsMixin, TestCase): destination file does not exist afterwards """ src = self.SAMPLE_DIR / srcname - dst = self.dirs.double_sided_dir / dstname + dst = self.double_sided_dir / dstname dst.parent.mkdir(parents=True, exist_ok=True) shutil.copy(src, dst) with mock.patch( @@ -214,31 +214,41 @@ class TestDoubleSided(DirectoriesMixin, FileSystemAssertsMixin, TestCase): self.assertIsNotFile(self.staging_file) self.assertIsInstance(msg.get("document_id"), int) - def test_subdirectory_upload(self) -> None: + def test_consume_double_sided_in_nested_dir(self) -> None: """ GIVEN: - A staging file exists WHEN: - - A file gets uploaded into foo/bar/double-sided - or double-sided/foo/bar + - A file is uploaded into foo/bar/double-sided THEN: - - The collated file gets put into foo/bar + - The collated file is placed into foo/bar """ - # TODO: parameterize this instead - for path in [ - Path("foo") / "bar" / "double-sided", - Path("double-sided") / "foo" / "bar", - ]: - with self.subTest(path=str(path)): - # Ensure we get fresh directories for each run - self.tearDown() - self.setUp() + self.create_staging_file() + self.consume_file( + "double-sided-odd.pdf", + Path("foo") / "bar" / "double-sided" / "foo.pdf", + ) + self.assertIsFile( + self.dirs.consumption_dir / "foo" / "bar" / "foo-collated.pdf", + ) - self.create_staging_file() - self.consume_file("double-sided-odd.pdf", Path(path) / "foo.pdf") - self.assertIsFile( - self.dirs.consumption_dir / "foo" / "bar" / "foo-collated.pdf", - ) + def test_consume_double_sided_with_nested_subdir(self) -> None: + """ + GIVEN: + - A staging file exists + WHEN: + - A file is uploaded into double-sided/foo/bar + THEN: + - The collated file is placed into foo/bar + """ + self.create_staging_file() + self.consume_file( + "double-sided-odd.pdf", + Path("double-sided") / "foo" / "bar" / "foo.pdf", + ) + self.assertIsFile( + self.dirs.consumption_dir / "foo" / "bar" / "foo-collated.pdf", + ) @override_settings(CONSUMER_ENABLE_COLLATE_DOUBLE_SIDED=False) def test_disabled_double_sided_dir_upload(self) -> None: diff --git a/src/documents/tests/test_file_handling.py b/src/documents/tests/test_file_handling.py index 66d6f3c85..0e8434645 100644 --- a/src/documents/tests/test_file_handling.py +++ b/src/documents/tests/test_file_handling.py @@ -30,8 +30,8 @@ from documents.models import DocumentType from documents.models import StoragePath from documents.serialisers import DocumentSerializer from documents.tasks import empty_trash -from documents.tests.utils import DirectoriesMixin from documents.tests.utils import FileSystemAssertsMixin +from paperless_testing.dirs import DirectoriesMixin from paperless_testing.factories import DocumentFactory diff --git a/src/documents/tests/test_management.py b/src/documents/tests/test_management.py index aa6befb9b..27375ecee 100644 --- a/src/documents/tests/test_management.py +++ b/src/documents/tests/test_management.py @@ -20,8 +20,8 @@ if TYPE_CHECKING: from documents.file_handling import generate_filename from documents.models import Document from documents.tasks import update_document_content_maybe_archive_file -from documents.tests.utils import DirectoriesMixin from documents.tests.utils import FileSystemAssertsMixin +from paperless_testing.dirs import DirectoriesMixin sample_file: Path = Path(__file__).parent / "samples" / "simple.pdf" diff --git a/src/documents/tests/test_management_exporter.py b/src/documents/tests/test_management_exporter.py index f85a8c4bf..95dbfc429 100644 --- a/src/documents/tests/test_management_exporter.py +++ b/src/documents/tests/test_management_exporter.py @@ -46,10 +46,10 @@ from documents.models import WorkflowTrigger from documents.sanity_checker import check_sanity from documents.settings import EXPORTER_FILE_NAME from documents.settings import EXPORTER_SHARE_LINK_BUNDLE_NAME -from documents.tests.utils import DirectoriesMixin from documents.tests.utils import FileSystemAssertsMixin from documents.tests.utils import SampleDirMixin from paperless_mail.models import MailAccount +from paperless_testing.dirs import DirectoriesMixin from paperless_testing.dirs import paperless_environment diff --git a/src/documents/tests/test_management_importer.py b/src/documents/tests/test_management_importer.py index bd74e7a16..a965a1037 100644 --- a/src/documents/tests/test_management_importer.py +++ b/src/documents/tests/test_management_importer.py @@ -15,9 +15,9 @@ from documents.management.commands.document_importer import _deserialize_record from documents.models import Document from documents.settings import EXPORTER_ARCHIVE_NAME from documents.settings import EXPORTER_FILE_NAME -from documents.tests.utils import DirectoriesMixin from documents.tests.utils import FileSystemAssertsMixin from documents.tests.utils import SampleDirMixin +from paperless_testing.dirs import DirectoriesMixin @pytest.mark.management diff --git a/src/documents/tests/test_management_retagger.py b/src/documents/tests/test_management_retagger.py index 23be6e2f2..d909946a8 100644 --- a/src/documents/tests/test_management_retagger.py +++ b/src/documents/tests/test_management_retagger.py @@ -14,7 +14,7 @@ from documents.models import DocumentType from documents.models import MatchingModel from documents.models import StoragePath from documents.models import Tag -from documents.tests.utils import DirectoriesMixin +from paperless_testing.dirs import DirectoriesMixin from paperless_testing.factories import CorrespondentFactory from paperless_testing.factories import DocumentFactory from paperless_testing.factories import DocumentTypeFactory diff --git a/src/documents/tests/test_management_superuser.py b/src/documents/tests/test_management_superuser.py index f2741ba53..620f46aef 100644 --- a/src/documents/tests/test_management_superuser.py +++ b/src/documents/tests/test_management_superuser.py @@ -7,7 +7,7 @@ from django.contrib.auth.models import User from django.core.management import call_command from django.test import TestCase -from documents.tests.utils import DirectoriesMixin +from paperless_testing.dirs import DirectoriesMixin @pytest.mark.management diff --git a/src/documents/tests/test_management_thumbnails.py b/src/documents/tests/test_management_thumbnails.py index 0b016f0cd..c72dd1b5e 100644 --- a/src/documents/tests/test_management_thumbnails.py +++ b/src/documents/tests/test_management_thumbnails.py @@ -9,8 +9,8 @@ from django.test import TestCase from documents.management.commands.document_thumbnails import _process_document from documents.models import Document from documents.parsers import get_default_thumbnail -from documents.tests.utils import DirectoriesMixin from documents.tests.utils import FileSystemAssertsMixin +from paperless_testing.dirs import DirectoriesMixin @pytest.mark.management diff --git a/src/documents/tests/test_share_link_bundles.py b/src/documents/tests/test_share_link_bundles.py index b86406924..ce57a0b32 100644 --- a/src/documents/tests/test_share_link_bundles.py +++ b/src/documents/tests/test_share_link_bundles.py @@ -20,7 +20,7 @@ from documents.models import ShareLinkBundle from documents.serialisers import ShareLinkBundleSerializer from documents.tasks import build_share_link_bundle from documents.tasks import cleanup_expired_share_link_bundles -from documents.tests.utils import DirectoriesMixin +from paperless_testing.dirs import DirectoriesMixin from paperless_testing.factories import DocumentFactory diff --git a/src/documents/tests/test_tag_hierarchy.py b/src/documents/tests/test_tag_hierarchy.py index ed0bff351..2b678010f 100644 --- a/src/documents/tests/test_tag_hierarchy.py +++ b/src/documents/tests/test_tag_hierarchy.py @@ -13,7 +13,7 @@ from documents.models import WorkflowAction from documents.models import WorkflowTrigger from documents.serialisers import TagSerializer from documents.signals.handlers import run_workflows -from documents.tests.utils import DirectoriesMixin +from paperless_testing.dirs import DirectoriesMixin class TestTagHierarchyPermissions(APITestCase): diff --git a/src/documents/tests/test_tasks.py b/src/documents/tests/test_tasks.py index 107c1dc6b..778ab1855 100644 --- a/src/documents/tests/test_tasks.py +++ b/src/documents/tests/test_tasks.py @@ -18,8 +18,8 @@ from documents.models import WorkflowAction from documents.sanity_checker import SanityCheckFailedException from documents.sanity_checker import SanityCheckMessages from documents.tests.test_classifier import dummy_preprocess -from documents.tests.utils import DirectoriesMixin from documents.tests.utils import FileSystemAssertsMixin +from paperless_testing.dirs import DirectoriesMixin @pytest.mark.django_db diff --git a/src/documents/tests/test_version_conditionals.py b/src/documents/tests/test_version_conditionals.py index a2531c7e6..af22c1124 100644 --- a/src/documents/tests/test_version_conditionals.py +++ b/src/documents/tests/test_version_conditionals.py @@ -14,8 +14,8 @@ from documents.conditionals import preview_etag from documents.conditionals import thumbnail_etag from documents.conditionals import thumbnail_last_modified from documents.models import Document -from documents.tests.utils import DirectoriesMixin from documents.versioning import resolve_effective_document_by_pk +from paperless_testing.dirs import DirectoriesMixin if TYPE_CHECKING: from rest_framework.request import Request diff --git a/src/documents/tests/test_views.py b/src/documents/tests/test_views.py index ce0024db9..97dc6f66d 100644 --- a/src/documents/tests/test_views.py +++ b/src/documents/tests/test_views.py @@ -29,11 +29,11 @@ from documents.models import StoragePath from documents.models import Tag from documents.models import UiSettings from documents.signals.handlers import update_llm_suggestions_cache -from documents.tests.utils import DirectoriesMixin from documents.tests.utils import read_streaming_response from paperless.models import ApplicationConfiguration from paperless_ai.exceptions import LLMProviderError from paperless_ai.exceptions import LLMTimeoutError +from paperless_testing.dirs import DirectoriesMixin class TestViews(DirectoriesMixin, TestCase): diff --git a/src/documents/tests/test_workflows.py b/src/documents/tests/test_workflows.py index 8f241e289..f79383323 100644 --- a/src/documents/tests/test_workflows.py +++ b/src/documents/tests/test_workflows.py @@ -64,13 +64,13 @@ from documents.models import WorkflowTrigger from documents.plugins.base import StopConsumeTaskError from documents.serialisers import WorkflowTriggerSerializer from documents.signals import document_consumption_finished -from documents.tests.utils import DirectoriesMixin from documents.tests.utils import DummyProgressManager from documents.tests.utils import FileSystemAssertsMixin from documents.tests.utils import SampleDirMixin from documents.workflows.actions import execute_password_removal_action from paperless_mail.models import MailAccount from paperless_mail.models import MailRule +from paperless_testing.dirs import DirectoriesMixin class TestWorkflows( diff --git a/src/documents/tests/utils.py b/src/documents/tests/utils.py index 16bc16f3d..27c139d03 100644 --- a/src/documents/tests/utils.py +++ b/src/documents/tests/utils.py @@ -1,8 +1,5 @@ -import shutil -import tempfile import time import warnings -from collections import namedtuple from collections.abc import Callable from collections.abc import Generator from collections.abc import Iterator @@ -19,7 +16,6 @@ from django.db import connection from django.db.migrations.executor import MigrationExecutor from django.http import StreamingHttpResponse from django.test import TransactionTestCase -from django.test import override_settings from documents.consumer import AsnCheckPlugin from documents.consumer import ConsumerPlugin @@ -31,54 +27,6 @@ from documents.parsers import ParseError from documents.plugins.helpers import ProgressStatusOptions -def setup_directories(): - dirs = namedtuple("Dirs", ()) - - dirs.data_dir = Path(tempfile.mkdtemp()).resolve() - dirs.scratch_dir = Path(tempfile.mkdtemp()).resolve() - dirs.media_dir = Path(tempfile.mkdtemp()).resolve() - dirs.consumption_dir = Path(tempfile.mkdtemp()).resolve() - dirs.static_dir = Path(tempfile.mkdtemp()).resolve() - dirs.index_dir = dirs.data_dir / "index" - dirs.originals_dir = dirs.media_dir / "documents" / "originals" - dirs.thumbnail_dir = dirs.media_dir / "documents" / "thumbnails" - dirs.archive_dir = dirs.media_dir / "documents" / "archive" - dirs.logging_dir = dirs.data_dir / "log" - - dirs.index_dir.mkdir(parents=True, exist_ok=True) - dirs.originals_dir.mkdir(parents=True, exist_ok=True) - dirs.thumbnail_dir.mkdir(parents=True, exist_ok=True) - dirs.archive_dir.mkdir(parents=True, exist_ok=True) - dirs.logging_dir.mkdir(parents=True, exist_ok=True) - - dirs.settings_override = override_settings( - DATA_DIR=dirs.data_dir, - SCRATCH_DIR=dirs.scratch_dir, - MEDIA_ROOT=dirs.media_dir, - ORIGINALS_DIR=dirs.originals_dir, - THUMBNAIL_DIR=dirs.thumbnail_dir, - ARCHIVE_DIR=dirs.archive_dir, - CONSUMPTION_DIR=dirs.consumption_dir, - LOGGING_DIR=dirs.logging_dir, - INDEX_DIR=dirs.index_dir, - STATIC_ROOT=dirs.static_dir, - MODEL_FILE=dirs.data_dir / "classification_model.pickle", - MEDIA_LOCK=dirs.media_dir / "media.lock", - ) - dirs.settings_override.enable() - - return dirs - - -def remove_dirs(dirs) -> None: - shutil.rmtree(dirs.media_dir, ignore_errors=True) - shutil.rmtree(dirs.data_dir, ignore_errors=True) - shutil.rmtree(dirs.scratch_dir, ignore_errors=True) - shutil.rmtree(dirs.consumption_dir, ignore_errors=True) - shutil.rmtree(dirs.static_dir, ignore_errors=True) - dirs.settings_override.disable() - - def util_call_with_backoff( method_or_callable: Callable, args: list | tuple, @@ -147,27 +95,6 @@ def read_streaming_response(response: StreamingHttpResponse) -> bytes: return content -class DirectoriesMixin: - """ - Creates and overrides settings for all folders and paths, then ensures - they are cleaned up on exit - """ - - def setUp(self) -> None: - from documents.search import reset_backend - - reset_backend() - self.dirs = setup_directories() - super().setUp() - - def tearDown(self) -> None: - from documents.search import reset_backend - - super().tearDown() - reset_backend() - remove_dirs(self.dirs) - - class FileSystemAssertsMixin: """ Utilities for checks various state information of the file system diff --git a/src/paperless/tests/parsers/test_tesseract_custom_settings.py b/src/paperless/tests/parsers/test_tesseract_custom_settings.py index d39c9dabf..ad0dc677f 100644 --- a/src/paperless/tests/parsers/test_tesseract_custom_settings.py +++ b/src/paperless/tests/parsers/test_tesseract_custom_settings.py @@ -3,7 +3,6 @@ import json from django.test import TestCase from django.test import override_settings -from documents.tests.utils import DirectoriesMixin from documents.tests.utils import FileSystemAssertsMixin from paperless.models import ApplicationConfiguration from paperless.models import CleanChoices @@ -11,6 +10,7 @@ from paperless.models import ColorConvertChoices from paperless.models import ModeChoices from paperless.models import OutputTypeChoices from paperless.parsers.tesseract import RasterisedDocumentParser +from paperless_testing.dirs import DirectoriesMixin class TestParserSettingsFromDb(DirectoriesMixin, FileSystemAssertsMixin, TestCase): diff --git a/src/paperless/tests/settings/test_remote_user.py b/src/paperless/tests/settings/test_remote_user.py index f98097d03..cc8b507c6 100644 --- a/src/paperless/tests/settings/test_remote_user.py +++ b/src/paperless/tests/settings/test_remote_user.py @@ -7,8 +7,8 @@ from django.test import override_settings from rest_framework import status from rest_framework.test import APITestCase -from documents.tests.utils import DirectoriesMixin from paperless.settings import _parse_remote_user_settings +from paperless_testing.dirs import DirectoriesMixin class TestRemoteUser(DirectoriesMixin, APITestCase): diff --git a/src/paperless_mail/tests/test_api.py b/src/paperless_mail/tests/test_api.py index f96b1cbc2..a6c3c81bb 100644 --- a/src/paperless_mail/tests/test_api.py +++ b/src/paperless_mail/tests/test_api.py @@ -7,7 +7,6 @@ from guardian.shortcuts import assign_perm from rest_framework import status from rest_framework.test import APITestCase -from documents.tests.utils import DirectoriesMixin from paperless_mail.models import MailAccount from paperless_mail.models import MailRule from paperless_mail.models import ProcessedMail @@ -15,6 +14,7 @@ from paperless_mail.tests.factories import MailAccountFactory from paperless_mail.tests.factories import MailRuleFactory from paperless_mail.tests.factories import ProcessedMailFactory from paperless_mail.tests.test_mail import BogusMailBox +from paperless_testing.dirs import DirectoriesMixin from paperless_testing.factories import CorrespondentFactory from paperless_testing.factories import DocumentTypeFactory from paperless_testing.factories import TagFactory diff --git a/src/paperless_mail/tests/test_mail.py b/src/paperless_mail/tests/test_mail.py index 609ac8947..3dca9fc7c 100644 --- a/src/paperless_mail/tests/test_mail.py +++ b/src/paperless_mail/tests/test_mail.py @@ -28,7 +28,6 @@ from rest_framework.test import APITestCase from documents.models import Correspondent from documents.models import MatchingModel -from documents.tests.utils import DirectoriesMixin from documents.tests.utils import FileSystemAssertsMixin from paperless_mail import tasks from paperless_mail.mail import MailAccountHandler @@ -42,6 +41,7 @@ from paperless_mail.models import MailRule from paperless_mail.models import ProcessedMail from paperless_mail.tests.factories import MailAccountFactory from paperless_mail.tests.factories import MailRuleFactory +from paperless_testing.dirs import DirectoriesMixin from paperless_testing.factories import CorrespondentFactory diff --git a/src/paperless_mail/tests/test_mail_nfc.py b/src/paperless_mail/tests/test_mail_nfc.py index bfef06da9..930c861bc 100644 --- a/src/paperless_mail/tests/test_mail_nfc.py +++ b/src/paperless_mail/tests/test_mail_nfc.py @@ -13,8 +13,6 @@ from unittest import mock import pytest -from documents.tests.utils import remove_dirs -from documents.tests.utils import setup_directories from paperless_mail.models import MailRule from paperless_mail.tests.factories import MailAccountFactory from paperless_mail.tests.test_mail import MessageBuilder @@ -22,13 +20,6 @@ from paperless_mail.tests.test_mail import _AttachmentDef from paperless_mail.tests.test_mail import fake_magic_from_buffer -@pytest.fixture() -def directories(settings): - dirs = setup_directories() - yield dirs - remove_dirs(dirs) - - @pytest.fixture() def queue_consumption_tasks_mock(): with mock.patch("paperless_mail.mail.queue_consumption_tasks") as m: @@ -78,7 +69,7 @@ class TestMailNFCNormalization: def test_attachment_nfd_filename_normalized_to_nfc( self, - directories, + paperless_dirs, queue_consumption_tasks_mock, attachment_rule, mail_account_handler, @@ -123,7 +114,7 @@ class TestMailNFCNormalization: def test_eml_subject_filename_nfc( self, - directories, + paperless_dirs, queue_consumption_tasks_mock, eml_rule, mail_account_handler, @@ -156,7 +147,7 @@ class TestMailNFCNormalization: def test_already_nfc_attachment_filename_unchanged( self, - directories, + paperless_dirs, queue_consumption_tasks_mock, attachment_rule, mail_account_handler, diff --git a/src/paperless_testing/dirs.py b/src/paperless_testing/dirs.py index 266bad307..794708ad6 100644 --- a/src/paperless_testing/dirs.py +++ b/src/paperless_testing/dirs.py @@ -14,6 +14,7 @@ from tempfile import TemporaryDirectory from typing import TYPE_CHECKING from typing import TypedDict +import pytest from django.test import override_settings if TYPE_CHECKING: @@ -129,3 +130,17 @@ def paperless_environment() -> Iterator[PaperlessDirs]: yield dirs finally: reset_backend() + + +class DirectoriesMixin: + """Bridges the directory fixture to unittest TestCase subclasses and to + plain pytest test classes that want `self.dirs`. + + Delete once no class depends on it. + """ + + dirs: PaperlessDirs + + @pytest.fixture(autouse=True) + def _paperless_dirs(self, paperless_dirs: PaperlessDirs) -> None: + self.dirs = paperless_dirs