mirror of
https://github.com/paperless-ngx/paperless-ngx.git
synced 2026-10-02 14:20:31 +00:00
The temp directory layout used by the tests was written out four separate times: once in the documents conftest, once in the paperless checks tests, once in a fixture local to the NFC upload tests, and once in the helper behind the old paperless_environment context manager. Each copy covered a different subset of the settings, so which directories a test actually got depended on which copy it happened to reach. The layout now lives in paperless_testing.dirs. build_paperless_dirs owns where things go and creates them, dirs_settings maps them onto Django setting names and is pure, and a paperless_dirs fixture in the root conftest applies that mapping through pytest-django's settings fixture so every app can reach it. Tests that need a second environment part way through a test body use the paperless_environment context manager from the same module, which expresses the identical layout through override_settings. The three redundant implementations and the old media settings fixture are gone, and their consumers now take paperless_dirs.
93 lines
3.0 KiB
Python
93 lines
3.0 KiB
Python
from __future__ import annotations
|
|
|
|
import unicodedata
|
|
from typing import TYPE_CHECKING
|
|
from unittest import mock
|
|
|
|
import celery.result
|
|
import pytest
|
|
from django.core.files.uploadedfile import SimpleUploadedFile
|
|
|
|
if TYPE_CHECKING:
|
|
from rest_framework.test import APIClient
|
|
|
|
from documents.data_models import ConsumableDocument
|
|
from documents.data_models import DocumentMetadataOverrides
|
|
from paperless_testing.dirs import PaperlessDirs
|
|
|
|
|
|
@pytest.fixture()
|
|
def consume_file_mock():
|
|
with mock.patch("documents.tasks.consume_file.apply_async") as m:
|
|
m.return_value = celery.result.AsyncResult(id="test-task-id")
|
|
yield m
|
|
|
|
|
|
@pytest.mark.django_db
|
|
class TestPostDocumentNFCNormalization:
|
|
def test_nfd_filename_normalized_to_nfc(
|
|
self,
|
|
admin_client: APIClient,
|
|
consume_file_mock: mock.MagicMock,
|
|
paperless_dirs: PaperlessDirs,
|
|
) -> None:
|
|
"""Uploaded file with NFD filename must have its name stored as NFC."""
|
|
nfd = unicodedata.normalize("NFD", "Rechnung März.pdf")
|
|
nfc = unicodedata.normalize("NFC", "Rechnung März.pdf")
|
|
|
|
# Verify our test strings actually differ at the byte level
|
|
assert nfd != nfc
|
|
|
|
uploaded = SimpleUploadedFile(
|
|
nfd,
|
|
b"%PDF-1.4 test",
|
|
content_type="application/pdf",
|
|
)
|
|
response = admin_client.post(
|
|
"/api/documents/post_document/",
|
|
{"document": uploaded},
|
|
)
|
|
|
|
assert response.status_code == 200
|
|
|
|
task_kwargs = consume_file_mock.call_args.kwargs["kwargs"]
|
|
input_doc: ConsumableDocument = task_kwargs["input_doc"]
|
|
overrides: DocumentMetadataOverrides = task_kwargs["overrides"]
|
|
|
|
# The temp file on disk must have an NFC name
|
|
assert input_doc.original_file.name == nfc, (
|
|
f"Expected NFC filename {nfc!r}, got {input_doc.original_file.name!r}"
|
|
)
|
|
# The override filename stored for later use must also be NFC
|
|
assert overrides.filename == nfc, (
|
|
f"Expected NFC override filename {nfc!r}, got {overrides.filename!r}"
|
|
)
|
|
assert unicodedata.is_normalized("NFC", overrides.filename)
|
|
|
|
def test_already_nfc_filename_unchanged(
|
|
self,
|
|
admin_client: APIClient,
|
|
consume_file_mock: mock.MagicMock,
|
|
paperless_dirs: PaperlessDirs,
|
|
) -> None:
|
|
"""Uploaded file with already-NFC filename must pass through unchanged."""
|
|
nfc = unicodedata.normalize("NFC", "Invoice_2024.pdf")
|
|
|
|
uploaded = SimpleUploadedFile(
|
|
nfc,
|
|
b"%PDF-1.4 test",
|
|
content_type="application/pdf",
|
|
)
|
|
response = admin_client.post(
|
|
"/api/documents/post_document/",
|
|
{"document": uploaded},
|
|
)
|
|
|
|
assert response.status_code == 200
|
|
|
|
task_kwargs = consume_file_mock.call_args.kwargs["kwargs"]
|
|
overrides: DocumentMetadataOverrides = task_kwargs["overrides"]
|
|
|
|
assert overrides.filename == nfc
|
|
assert unicodedata.is_normalized("NFC", overrides.filename)
|