diff --git a/src/conftest.py b/src/conftest.py index 8cedbcc56..91f5635a2 100644 --- a/src/conftest.py +++ b/src/conftest.py @@ -181,3 +181,9 @@ def with_form_pdf_file() -> Path: def multi_page_images_pdf_file() -> Path: """Multi-page PDF of scanned images, no text layer.""" return samples.MULTI_PAGE_IMAGES_PDF + + +@pytest.fixture(scope="session") +def thumbnail_webp_file() -> Path: + """Small WebP thumbnail.""" + return samples.THUMBNAIL_WEBP diff --git a/src/documents/tests/conftest.py b/src/documents/tests/conftest.py index 567342dcc..c41f200a2 100644 --- a/src/documents/tests/conftest.py +++ b/src/documents/tests/conftest.py @@ -12,29 +12,25 @@ if TYPE_CHECKING: from paperless_testing.dirs import PaperlessDirs -@pytest.fixture(scope="session") -def document_samples_dir() -> Path: - """Path to the shared test sample documents.""" - return Path(__file__).parent / "samples" / "documents" - - @pytest.fixture() def sample_doc( paperless_dirs: "PaperlessDirs", - document_samples_dir: Path, + simple_digital_pdf_file: Path, + multi_page_images_pdf_file: Path, + thumbnail_webp_file: Path, ) -> "Document": """Create a document with valid files and matching checksums.""" with filelock.FileLock(paperless_dirs.media_lock): shutil.copy( - document_samples_dir / "originals" / "0000001.pdf", + simple_digital_pdf_file, paperless_dirs.originals_dir / "0000001.pdf", ) shutil.copy( - document_samples_dir / "archive" / "0000001.pdf", + multi_page_images_pdf_file, paperless_dirs.archive_dir / "0000001.pdf", ) shutil.copy( - document_samples_dir / "thumbnails" / "0000001.webp", + thumbnail_webp_file, paperless_dirs.thumbnail_dir / "0000001.webp", ) diff --git a/src/documents/tests/samples/documents/archive/0000001.pdf b/src/documents/tests/samples/documents/archive/0000001.pdf deleted file mode 100644 index ea08363bf..000000000 Binary files a/src/documents/tests/samples/documents/archive/0000001.pdf and /dev/null differ diff --git a/src/documents/tests/samples/documents/originals/0000001.pdf b/src/documents/tests/samples/documents/originals/0000001.pdf deleted file mode 100644 index e450de482..000000000 Binary files a/src/documents/tests/samples/documents/originals/0000001.pdf and /dev/null differ diff --git a/src/documents/tests/samples/documents/originals/0000002.pdf b/src/documents/tests/samples/documents/originals/0000002.pdf deleted file mode 100644 index 5e75266ca..000000000 Binary files a/src/documents/tests/samples/documents/originals/0000002.pdf and /dev/null differ diff --git a/src/documents/tests/samples/documents/originals/0000003.pdf b/src/documents/tests/samples/documents/originals/0000003.pdf deleted file mode 100644 index afbeef5c8..000000000 Binary files a/src/documents/tests/samples/documents/originals/0000003.pdf and /dev/null differ diff --git a/src/documents/tests/samples/documents/thumbnails/0000002.webp b/src/documents/tests/samples/documents/thumbnails/0000002.webp deleted file mode 100644 index a7ff623b2..000000000 Binary files a/src/documents/tests/samples/documents/thumbnails/0000002.webp and /dev/null differ diff --git a/src/documents/tests/samples/documents/thumbnails/0000003.webp b/src/documents/tests/samples/documents/thumbnails/0000003.webp deleted file mode 100644 index a7ff623b2..000000000 Binary files a/src/documents/tests/samples/documents/thumbnails/0000003.webp and /dev/null differ diff --git a/src/documents/tests/samples/documents/thumbnails/0000004.webp b/src/documents/tests/samples/documents/thumbnails/0000004.webp deleted file mode 100644 index a7ff623b2..000000000 Binary files a/src/documents/tests/samples/documents/thumbnails/0000004.webp and /dev/null differ diff --git a/src/documents/tests/test_api_documents.py b/src/documents/tests/test_api_documents.py index 1ecf0a8b9..3df2a2b8a 100644 --- a/src/documents/tests/test_api_documents.py +++ b/src/documents/tests/test_api_documents.py @@ -57,6 +57,7 @@ from paperless_testing.permissions import grant_all_global from paperless_testing.permissions import grant_global from paperless_testing.permissions import grant_object from paperless_testing.samples import SIMPLE_DIGITAL_PDF +from paperless_testing.samples import THUMBNAIL_WEBP class TestDocumentApi(DirectoriesMixin, ConsumeTaskMixin, APITestCase): @@ -2531,13 +2532,7 @@ class TestDocumentApi(DirectoriesMixin, ConsumeTaskMixin, APITestCase): archive_filename="archive.pdf", ) - source_file: Path = ( - Path(__file__).parent - / "samples" - / "documents" - / "thumbnails" - / "0000001.webp" - ) + source_file: Path = THUMBNAIL_WEBP archive_file: Path = SIMPLE_DIGITAL_PDF shutil.copy(source_file, doc.source_path) diff --git a/src/documents/tests/test_api_email.py b/src/documents/tests/test_api_email.py index 0d2dbbbde..c0a3fc9ac 100644 --- a/src/documents/tests/test_api_email.py +++ b/src/documents/tests/test_api_email.py @@ -12,6 +12,9 @@ from documents.tests.utils import SampleDirMixin from paperless_testing.dirs import DirectoriesMixin from paperless_testing.factories import UserFactory from paperless_testing.permissions import grant_global +from paperless_testing.samples import MULTI_PAGE_DIGITAL_PDF +from paperless_testing.samples import SIMPLE_DIGITAL_PDF +from paperless_testing.samples import WITH_FORM_PDF class TestEmail(DirectoriesMixin, SampleDirMixin, APITestCase): @@ -42,15 +45,15 @@ class TestEmail(DirectoriesMixin, SampleDirMixin, APITestCase): # Copy sample files to document paths (using different files to distinguish versions) shutil.copy( - self.SAMPLE_DIR / "documents" / "originals" / "0000001.pdf", + SIMPLE_DIGITAL_PDF, self.doc1.archive_path, ) shutil.copy( - self.SAMPLE_DIR / "documents" / "originals" / "0000002.pdf", + MULTI_PAGE_DIGITAL_PDF, self.doc1.source_path, ) shutil.copy( - self.SAMPLE_DIR / "documents" / "originals" / "0000003.pdf", + WITH_FORM_PDF, self.doc2.source_path, ) diff --git a/src/documents/tests/test_bulk_edit.py b/src/documents/tests/test_bulk_edit.py index 1b67a320f..73176466b 100644 --- a/src/documents/tests/test_bulk_edit.py +++ b/src/documents/tests/test_bulk_edit.py @@ -24,6 +24,9 @@ from documents.models import Tag from documents.permissions import set_permissions_for_objects from paperless_testing.dirs import DirectoriesMixin from paperless_testing.permissions import grant_object +from paperless_testing.samples import MULTI_PAGE_DIGITAL_PDF +from paperless_testing.samples import SIMPLE_DIGITAL_PDF +from paperless_testing.samples import WITH_FORM_PDF class TestBulkEdit(DirectoriesMixin, TestCase): @@ -701,47 +704,27 @@ class TestPDFActions(DirectoriesMixin, TestCase): super().setUp() sample1 = self.dirs.scratch_dir / "sample.pdf" shutil.copy( - Path(__file__).parent - / "samples" - / "documents" - / "originals" - / "0000001.pdf", + SIMPLE_DIGITAL_PDF, sample1, ) sample1_archive = self.dirs.archive_dir / "sample_archive.pdf" shutil.copy( - Path(__file__).parent - / "samples" - / "documents" - / "originals" - / "0000001.pdf", + SIMPLE_DIGITAL_PDF, sample1_archive, ) sample2 = self.dirs.scratch_dir / "sample2.pdf" shutil.copy( - Path(__file__).parent - / "samples" - / "documents" - / "originals" - / "0000002.pdf", + MULTI_PAGE_DIGITAL_PDF, sample2, ) sample2_archive = self.dirs.archive_dir / "sample2_archive.pdf" shutil.copy( - Path(__file__).parent - / "samples" - / "documents" - / "originals" - / "0000002.pdf", + MULTI_PAGE_DIGITAL_PDF, sample2_archive, ) sample3 = self.dirs.scratch_dir / "sample3.pdf" shutil.copy( - Path(__file__).parent - / "samples" - / "documents" - / "originals" - / "0000003.pdf", + WITH_FORM_PDF, sample3, ) self.doc1 = Document.objects.create( @@ -775,11 +758,7 @@ class TestPDFActions(DirectoriesMixin, TestCase): ) img_doc_archive = self.dirs.archive_dir / "sample_image.pdf" shutil.copy( - Path(__file__).parent - / "samples" - / "documents" - / "originals" - / "0000001.pdf", + SIMPLE_DIGITAL_PDF, img_doc_archive, ) self.img_doc = Document.objects.create( diff --git a/src/documents/tests/test_consumer.py b/src/documents/tests/test_consumer.py index 4b8150b93..28cc4da11 100644 --- a/src/documents/tests/test_consumer.py +++ b/src/documents/tests/test_consumer.py @@ -36,6 +36,8 @@ from paperless_testing.assertions import FileSystemAssertsMixin from paperless_testing.dirs import DirectoriesMixin from paperless_testing.factories import UserFactory from paperless_testing.fakes.progress import FakeProgressManager +from paperless_testing.samples import MULTI_PAGE_DIGITAL_PDF +from paperless_testing.samples import MULTI_PAGE_IMAGES_PDF from paperless_testing.samples import SIMPLE_DIGITAL_PDF @@ -113,9 +115,7 @@ class _BaseNewStyleParser: class DummyParser(_BaseNewStyleParser): - _ARCHIVE_SRC = ( - Path(__file__).parent / "samples" / "documents" / "archive" / "0000001.pdf" - ) + _ARCHIVE_SRC = MULTI_PAGE_IMAGES_PDF def parse(self, document_path, mime_type, *, produce_archive: bool = True) -> None: self._text = "The Text" @@ -201,33 +201,19 @@ class TestConsumer( self.addCleanup(patcher.stop) def get_test_file(self): - src = ( - Path(__file__).parent - / "samples" - / "documents" - / "originals" - / "0000001.pdf" - ) + src = SIMPLE_DIGITAL_PDF dst = self.dirs.scratch_dir / "sample.pdf" shutil.copy(src, dst) return dst def get_test_file2(self): - src = ( - Path(__file__).parent - / "samples" - / "documents" - / "originals" - / "0000002.pdf" - ) + src = MULTI_PAGE_DIGITAL_PDF dst = self.dirs.scratch_dir / "sample2.pdf" shutil.copy(src, dst) return dst def get_test_archive_file(self): - src = ( - Path(__file__).parent / "samples" / "documents" / "archive" / "0000001.pdf" - ) + src = MULTI_PAGE_IMAGES_PDF dst = self.dirs.scratch_dir / "sample_archive.pdf" shutil.copy(src, dst) return dst @@ -1604,13 +1590,7 @@ class TestConsumerRemoteOCR( self.addCleanup(patcher.stop) def _consume(self, *, overrides: DocumentMetadataOverrides | None = None) -> bool: - src = ( - Path(__file__).parent - / "samples" - / "documents" - / "originals" - / "0000001.pdf" - ) + src = SIMPLE_DIGITAL_PDF dst = self.dirs.scratch_dir / "sample.pdf" shutil.copy(src, dst) diff --git a/src/documents/tests/test_management_exporter.py b/src/documents/tests/test_management_exporter.py index 137744569..f83a7ba31 100644 --- a/src/documents/tests/test_management_exporter.py +++ b/src/documents/tests/test_management_exporter.py @@ -51,6 +51,7 @@ from paperless_testing.assertions import FileSystemAssertsMixin from paperless_testing.dirs import DirectoriesMixin from paperless_testing.dirs import paperless_environment from paperless_testing.permissions import grant_object +from paperless_testing.samples import install_document_samples @pytest.mark.management @@ -196,10 +197,7 @@ class TestExportImport( def test_exporter(self, *, use_filename_format=False) -> None: shutil.rmtree(Path(self.dirs.media_dir) / "documents") - shutil.copytree( - Path(__file__).parent / "samples" / "documents", - Path(self.dirs.media_dir) / "documents", - ) + install_document_samples(Path(self.dirs.media_dir) / "documents") num_permission_objects = Permission.objects.count() @@ -303,10 +301,7 @@ class TestExportImport( def test_exporter_with_filename_format(self) -> None: shutil.rmtree(Path(self.dirs.media_dir) / "documents") - shutil.copytree( - Path(__file__).parent / "samples" / "documents", - Path(self.dirs.media_dir) / "documents", - ) + install_document_samples(Path(self.dirs.media_dir) / "documents") with override_settings( FILENAME_FORMAT="{created_year}/{correspondent}/{title}", @@ -315,10 +310,7 @@ class TestExportImport( def test_exporter_includes_share_links_and_bundles(self) -> None: shutil.rmtree(Path(self.dirs.media_dir) / "documents") - shutil.copytree( - Path(__file__).parent / "samples" / "documents", - Path(self.dirs.media_dir) / "documents", - ) + install_document_samples(Path(self.dirs.media_dir) / "documents") share_link = ShareLink.objects.create( slug="share-link-slug", @@ -417,10 +409,7 @@ class TestExportImport( def test_update_export_changed_time(self) -> None: shutil.rmtree(Path(self.dirs.media_dir) / "documents") - shutil.copytree( - Path(__file__).parent / "samples" / "documents", - Path(self.dirs.media_dir) / "documents", - ) + install_document_samples(Path(self.dirs.media_dir) / "documents") self._do_export() self.assertIsFile(self.target / "manifest.json") @@ -456,10 +445,7 @@ class TestExportImport( def test_update_export_changed_checksum(self) -> None: shutil.rmtree(Path(self.dirs.media_dir) / "documents") - shutil.copytree( - Path(__file__).parent / "samples" / "documents", - Path(self.dirs.media_dir) / "documents", - ) + install_document_samples(Path(self.dirs.media_dir) / "documents") self._do_export() @@ -486,10 +472,7 @@ class TestExportImport( def test_update_export_deleted_document(self) -> None: shutil.rmtree(Path(self.dirs.media_dir) / "documents") - shutil.copytree( - Path(__file__).parent / "samples" / "documents", - Path(self.dirs.media_dir) / "documents", - ) + install_document_samples(Path(self.dirs.media_dir) / "documents") manifest = self._do_export() @@ -521,10 +504,7 @@ class TestExportImport( @override_settings(FILENAME_FORMAT="{title}/{correspondent}") def test_update_export_changed_location(self) -> None: shutil.rmtree(Path(self.dirs.media_dir) / "documents") - shutil.copytree( - Path(__file__).parent / "samples" / "documents", - Path(self.dirs.media_dir) / "documents", - ) + install_document_samples(Path(self.dirs.media_dir) / "documents") self._do_export(use_filename_format=True) self.assertIsFile(self.target / "wow1" / "c.pdf") @@ -566,10 +546,7 @@ class TestExportImport( - Zipfile contains exported files """ shutil.rmtree(Path(self.dirs.media_dir) / "documents") - shutil.copytree( - Path(__file__).parent / "samples" / "documents", - Path(self.dirs.media_dir) / "documents", - ) + install_document_samples(Path(self.dirs.media_dir) / "documents") args = ["document_exporter", self.target, "--zip"] @@ -598,10 +575,7 @@ class TestExportImport( - Zipfile contains exported files """ shutil.rmtree(Path(self.dirs.media_dir) / "documents") - shutil.copytree( - Path(__file__).parent / "samples" / "documents", - Path(self.dirs.media_dir) / "documents", - ) + install_document_samples(Path(self.dirs.media_dir) / "documents") args = ["document_exporter", self.target, "--zip", "--use-filename-format"] @@ -637,10 +611,7 @@ class TestExportImport( - The existing file and directory in target are removed """ shutil.rmtree(Path(self.dirs.media_dir) / "documents") - shutil.copytree( - Path(__file__).parent / "samples" / "documents", - Path(self.dirs.media_dir) / "documents", - ) + install_document_samples(Path(self.dirs.media_dir) / "documents") # Create stuff in target directory existing_file = self.target / "test.txt" @@ -736,10 +707,7 @@ class TestExportImport( - Documents can be imported again """ shutil.rmtree(Path(self.dirs.media_dir) / "documents") - shutil.copytree( - Path(__file__).parent / "samples" / "documents", - Path(self.dirs.media_dir) / "documents", - ) + install_document_samples(Path(self.dirs.media_dir) / "documents") manifest = self._do_export() has_archive = False @@ -782,10 +750,7 @@ class TestExportImport( - Documents can be imported again """ shutil.rmtree(Path(self.dirs.media_dir) / "documents") - shutil.copytree( - Path(__file__).parent / "samples" / "documents", - Path(self.dirs.media_dir) / "documents", - ) + install_document_samples(Path(self.dirs.media_dir) / "documents") manifest = self._do_export() has_thumbnail = False @@ -830,10 +795,7 @@ class TestExportImport( - Documents can be imported again """ shutil.rmtree(Path(self.dirs.media_dir) / "documents") - shutil.copytree( - Path(__file__).parent / "samples" / "documents", - Path(self.dirs.media_dir) / "documents", - ) + install_document_samples(Path(self.dirs.media_dir) / "documents") manifest = self._do_export(split_manifest=True) has_document = False @@ -866,10 +828,7 @@ class TestExportImport( - Documents can be imported again """ shutil.rmtree(Path(self.dirs.media_dir) / "documents") - shutil.copytree( - Path(__file__).parent / "samples" / "documents", - Path(self.dirs.media_dir) / "documents", - ) + install_document_samples(Path(self.dirs.media_dir) / "documents") self._do_export(use_folder_prefix=True) @@ -896,10 +855,7 @@ class TestExportImport( - Documents can be imported again """ shutil.rmtree(Path(self.dirs.media_dir) / "documents") - shutil.copytree( - Path(__file__).parent / "samples" / "documents", - Path(self.dirs.media_dir) / "documents", - ) + install_document_samples(Path(self.dirs.media_dir) / "documents") self._do_export(use_folder_prefix=True, split_manifest=True) @@ -926,10 +882,7 @@ class TestExportImport( """ shutil.rmtree(Path(self.dirs.media_dir) / "documents") - shutil.copytree( - Path(__file__).parent / "samples" / "documents", - Path(self.dirs.media_dir) / "documents", - ) + install_document_samples(Path(self.dirs.media_dir) / "documents") num_content_type_objects = ContentType.objects.count() num_permission_objects = Permission.objects.count() @@ -966,10 +919,7 @@ class TestExportImport( def test_exporter_with_auditlog_disabled(self) -> None: shutil.rmtree(Path(self.dirs.media_dir) / "documents") - shutil.copytree( - Path(__file__).parent / "samples" / "documents", - Path(self.dirs.media_dir) / "documents", - ) + install_document_samples(Path(self.dirs.media_dir) / "documents") with override_settings( AUDIT_LOG_ENABLED=False, @@ -989,10 +939,7 @@ class TestExportImport( survive the round-trip with deleted_at preserved """ shutil.rmtree(Path(self.dirs.media_dir) / "documents") - shutil.copytree( - Path(__file__).parent / "samples" / "documents", - Path(self.dirs.media_dir) / "documents", - ) + install_document_samples(Path(self.dirs.media_dir) / "documents") # d1 has self.note and self.cfi1 attached via setUp self.d1.delete() @@ -1036,10 +983,7 @@ class TestExportImport( """ shutil.rmtree(self.dirs.media_dir / "documents") - shutil.copytree( - self.SAMPLE_DIR / "documents", - self.dirs.media_dir / "documents", - ) + install_document_samples(self.dirs.media_dir / "documents") _ = self._do_export(data_only=True) diff --git a/src/documents/tests/test_sample_files.py b/src/documents/tests/test_sample_files.py new file mode 100644 index 000000000..44919da30 --- /dev/null +++ b/src/documents/tests/test_sample_files.py @@ -0,0 +1,34 @@ +import hashlib +from pathlib import Path + +from paperless_testing.samples import SIMPLE_DIGITAL_PDF +from paperless_testing.samples import install_document_samples + +EXPECTED_MEDIA_FILES = [ + "originals/0000001.pdf", + "originals/0000002.pdf", + "originals/0000003.pdf", + "originals/0000004.pdf", + "originals/0000005.pdf", + "originals/0000006.pdf", + "archive/0000001.pdf", + "thumbnails/0000001.webp", + "thumbnails/0000002.webp", + "thumbnails/0000003.webp", + "thumbnails/0000004.webp", +] + + +def _sha(path: Path) -> str: + return hashlib.sha256(path.read_bytes()).hexdigest() + + +def test_install_recreates_every_historical_opaque_name(tmp_path: Path) -> None: + install_document_samples(tmp_path) + for relpath in EXPECTED_MEDIA_FILES: + assert (tmp_path / relpath).is_file(), relpath + + +def test_install_uses_the_shared_bytes(tmp_path: Path) -> None: + install_document_samples(tmp_path) + assert _sha(tmp_path / "originals" / "0000001.pdf") == _sha(SIMPLE_DIGITAL_PDF) diff --git a/src/documents/tests/test_tasks.py b/src/documents/tests/test_tasks.py index 247b6a529..9548adade 100644 --- a/src/documents/tests/test_tasks.py +++ b/src/documents/tests/test_tasks.py @@ -20,6 +20,7 @@ from documents.sanity_checker import SanityCheckMessages from documents.tests.helpers import dummy_preprocess from paperless_testing.assertions import FileSystemAssertsMixin from paperless_testing.dirs import DirectoriesMixin +from paperless_testing.samples import SIMPLE_DIGITAL_PDF @pytest.mark.django_db @@ -228,20 +229,12 @@ class TestUpdateContent(DirectoriesMixin, TestCase): """ sample1 = self.dirs.scratch_dir / "sample.pdf" shutil.copy( - Path(__file__).parent - / "samples" - / "documents" - / "originals" - / "0000001.pdf", + SIMPLE_DIGITAL_PDF, sample1, ) sample1_archive = self.dirs.archive_dir / "sample_archive.pdf" shutil.copy( - Path(__file__).parent - / "samples" - / "documents" - / "originals" - / "0000001.pdf", + SIMPLE_DIGITAL_PDF, sample1_archive, ) doc = Document.objects.create( @@ -269,11 +262,7 @@ class TestUpdateContent(DirectoriesMixin, TestCase): """ sample1 = self.dirs.scratch_dir / "sample.pdf" shutil.copy( - Path(__file__).parent - / "samples" - / "documents" - / "originals" - / "0000001.pdf", + SIMPLE_DIGITAL_PDF, sample1, ) doc = Document.objects.create( diff --git a/src/documents/tests/samples/documents/thumbnails/0000001.webp b/src/paperless_testing/sample_files/thumbnail.webp similarity index 100% rename from src/documents/tests/samples/documents/thumbnails/0000001.webp rename to src/paperless_testing/sample_files/thumbnail.webp diff --git a/src/paperless_testing/samples.py b/src/paperless_testing/samples.py index a34602b53..e73eebb3b 100644 --- a/src/paperless_testing/samples.py +++ b/src/paperless_testing/samples.py @@ -4,6 +4,7 @@ A sample used by a single app stays in that app's ``tests/samples`` tree. Only a file that two or more apps need lives here, exactly once. """ +import shutil from pathlib import Path SHARED_SAMPLES_DIR = (Path(__file__).parent / "sample_files").resolve() @@ -12,3 +13,35 @@ SIMPLE_DIGITAL_PDF = SHARED_SAMPLES_DIR / "simple-digital.pdf" MULTI_PAGE_DIGITAL_PDF = SHARED_SAMPLES_DIR / "multi-page-digital.pdf" WITH_FORM_PDF = SHARED_SAMPLES_DIR / "with-form.pdf" MULTI_PAGE_IMAGES_PDF = SHARED_SAMPLES_DIR / "multi-page-images.pdf" +THUMBNAIL_WEBP = SHARED_SAMPLES_DIR / "thumbnail.webp" + +# The fake media tree under documents/tests/samples/documents keeps only the +# files unique to it. The files that duplicate a shared sample are laid back +# down under their historical opaque names (DB rows and exporter manifests +# refer to them) by install_document_samples(). +_DOCUMENT_SAMPLES_DIR = ( + Path(__file__).parent.parent / "documents" / "tests" / "samples" / "documents" +).resolve() + +_SHARED_AS_MEDIA = ( + ("originals/0000001.pdf", SIMPLE_DIGITAL_PDF), + ("originals/0000002.pdf", MULTI_PAGE_DIGITAL_PDF), + ("originals/0000003.pdf", WITH_FORM_PDF), + ("archive/0000001.pdf", MULTI_PAGE_IMAGES_PDF), + ("thumbnails/0000001.webp", THUMBNAIL_WEBP), + ("thumbnails/0000002.webp", THUMBNAIL_WEBP), + ("thumbnails/0000003.webp", THUMBNAIL_WEBP), + ("thumbnails/0000004.webp", THUMBNAIL_WEBP), +) + + +def install_document_samples(dest: Path) -> None: + """Populate ``dest`` with the full fake media tree. + + Replaces ``shutil.copytree(/documents, dest)`` in tests. + """ + shutil.copytree(_DOCUMENT_SAMPLES_DIR, dest, dirs_exist_ok=True) + for relpath, source in _SHARED_AS_MEDIA: + target = dest / relpath + target.parent.mkdir(parents=True, exist_ok=True) + shutil.copy2(source, target)