I think fixes the last of the testing

This commit is contained in:
Trenton H 2024-04-09 20:52:28 -07:00
parent f6989e99df
commit 59f850828f
7 changed files with 391 additions and 180 deletions

View File

@ -253,7 +253,13 @@ class ConsumerFilePhase(str, Enum):
FAILED = "FAILED" FAILED = "FAILED"
class ConsumerPlugin(AlwaysRunPluginMixin, ConsumeTaskPlugin, LoggingMixin): class ConsumerPlugin(
AlwaysRunPluginMixin,
NoSetupPluginMixin,
NoCleanupPluginMixin,
LoggingMixin,
ConsumeTaskPlugin,
):
logging_name = "paperless.consumer" logging_name = "paperless.consumer"
def __init__( def __init__(
@ -266,6 +272,8 @@ class ConsumerPlugin(AlwaysRunPluginMixin, ConsumeTaskPlugin, LoggingMixin):
) -> None: ) -> None:
super().__init__(input_doc, metadata, status_mgr, base_tmp_dir, task_id) super().__init__(input_doc, metadata, status_mgr, base_tmp_dir, task_id)
self.renew_logging_group()
self.original_path = self.input_doc.original_file self.original_path = self.input_doc.original_file
self.filename = self.metadata.filename or self.input_doc.original_file.name self.filename = self.metadata.filename or self.input_doc.original_file.name
self.override_title = self.metadata.title self.override_title = self.metadata.title
@ -282,12 +290,6 @@ class ConsumerPlugin(AlwaysRunPluginMixin, ConsumeTaskPlugin, LoggingMixin):
self.override_change_groups = self.metadata.change_groups self.override_change_groups = self.metadata.change_groups
self.override_custom_field_ids = self.metadata.custom_field_ids self.override_custom_field_ids = self.metadata.custom_field_ids
def setup(self) -> None:
pass
def cleanup(self) -> None:
pass
def _send_progress( def _send_progress(
self, self,
current_progress: int, current_progress: int,

View File

@ -3,9 +3,6 @@ import uuid
class LoggingMixin: class LoggingMixin:
def __init__(self) -> None:
self.renew_logging_group()
def renew_logging_group(self): def renew_logging_group(self):
""" """
Creates a new UUID to group subsequent log calls together with Creates a new UUID to group subsequent log calls together with

View File

@ -328,6 +328,7 @@ class DocumentParser(LoggingMixin):
def __init__(self, logging_group, progress_callback=None): def __init__(self, logging_group, progress_callback=None):
super().__init__() super().__init__()
self.renew_logging_group()
self.logging_group = logging_group self.logging_group = logging_group
self.settings = self.get_settings() self.settings = self.get_settings()
settings.SCRATCH_DIR.mkdir(parents=True, exist_ok=True) settings.SCRATCH_DIR.mkdir(parents=True, exist_ok=True)

View File

@ -14,6 +14,7 @@ from documents.barcodes import BarcodePlugin
from documents.data_models import ConsumableDocument from documents.data_models import ConsumableDocument
from documents.data_models import DocumentMetadataOverrides from documents.data_models import DocumentMetadataOverrides
from documents.data_models import DocumentSource from documents.data_models import DocumentSource
from documents.models import Document
from documents.models import Tag from documents.models import Tag
from documents.plugins.base import StopConsumeTaskError from documents.plugins.base import StopConsumeTaskError
from documents.tests.utils import DirectoriesMixin from documents.tests.utils import DirectoriesMixin
@ -674,9 +675,7 @@ class TestAsnBarcode(DirectoriesMixin, SampleDirMixin, GetReaderPluginMixin, Tes
dst = settings.SCRATCH_DIR / "barcode-39-asn-123.pdf" dst = settings.SCRATCH_DIR / "barcode-39-asn-123.pdf"
shutil.copy(test_file, dst) shutil.copy(test_file, dst)
with mock.patch( with mock.patch("documents.tasks.ProgressManager", DummyProgressManager):
"documents.consumer.Consumer.try_consume_file",
) as mocked_consumer:
tasks.consume_file( tasks.consume_file(
ConsumableDocument( ConsumableDocument(
source=DocumentSource.ConsumeFolder, source=DocumentSource.ConsumeFolder,
@ -684,10 +683,10 @@ class TestAsnBarcode(DirectoriesMixin, SampleDirMixin, GetReaderPluginMixin, Tes
), ),
None, None,
) )
mocked_consumer.assert_called_once()
args, kwargs = mocked_consumer.call_args
self.assertEqual(kwargs["override_asn"], 123) document = Document.objects.first()
self.assertEqual(document.archive_serial_number, 123)
@override_settings(CONSUMER_BARCODE_SCANNER="PYZBAR") @override_settings(CONSUMER_BARCODE_SCANNER="PYZBAR")
def test_scan_file_for_qrcode_without_upscale(self): def test_scan_file_for_qrcode_without_upscale(self):

View File

@ -721,7 +721,7 @@ class TestConsumer(
self.assertIsFile(filename) self.assertIsFile(filename)
# Database empty # Database empty
self.assertEqual(len(Document.objects.all()), 0) self.assertEqual(Document.objects.all().count(), 0)
@override_settings(FILENAME_FORMAT="{correspondent}/{title}") @override_settings(FILENAME_FORMAT="{correspondent}/{title}")
def testFilenameHandling(self): def testFilenameHandling(self):
@ -878,22 +878,24 @@ class TestConsumer(
with self.get_consumer(settings.CONSUMPTION_DIR / "simple.png") as consumer: with self.get_consumer(settings.CONSUMPTION_DIR / "simple.png") as consumer:
consumer.run() consumer.run()
doc1 = Document.objects.last() doc1 = Document.objects.filter(pk=1).first()
with self.get_consumer(settings.CONSUMPTION_DIR / "simple.pdf") as consumer: with self.get_consumer(settings.CONSUMPTION_DIR / "simple.pdf") as consumer:
consumer.run() consumer.run()
doc2 = Document.objects.last() doc2 = Document.objects.filter(pk=2).first()
with self.get_consumer(settings.CONSUMPTION_DIR / "simple.png.pdf") as consumer: with self.get_consumer(settings.CONSUMPTION_DIR / "simple.png.pdf") as consumer:
consumer.run() consumer.run()
doc3 = Document.objects.last() doc3 = Document.objects.filter(pk=3).first()
self.assertEqual(doc1.filename, "simple.png") self.assertEqual(doc1.filename, "simple.png")
self.assertEqual(doc1.archive_filename, "simple.pdf") self.assertEqual(doc1.archive_filename, "simple.pdf")
self.assertEqual(doc2.filename, "simple.pdf") self.assertEqual(doc2.filename, "simple.pdf")
self.assertEqual(doc2.archive_filename, "simple_01.pdf") self.assertEqual(doc2.archive_filename, "simple_01.pdf")
self.assertEqual(doc3.filename, "simple.png.pdf") self.assertEqual(doc3.filename, "simple.png.pdf")
self.assertEqual(doc3.archive_filename, "simple.png.pdf") self.assertEqual(doc3.archive_filename, "simple.png.pdf")

View File

@ -1,3 +1,4 @@
import shutil
from datetime import timedelta from datetime import timedelta
from pathlib import Path from pathlib import Path
from typing import TYPE_CHECKING from typing import TYPE_CHECKING
@ -88,8 +89,7 @@ class TestWorkflows(DirectoriesMixin, FileSystemAssertsMixin, APITestCase):
return super().setUp() return super().setUp()
@mock.patch("documents.consumer.ConsumerPlugin.run") def test_workflow_match(self):
def test_workflow_match(self, m):
""" """
GIVEN: GIVEN:
- Existing workflow - Existing workflow
@ -102,7 +102,7 @@ class TestWorkflows(DirectoriesMixin, FileSystemAssertsMixin, APITestCase):
type=WorkflowTrigger.WorkflowTriggerType.CONSUMPTION, type=WorkflowTrigger.WorkflowTriggerType.CONSUMPTION,
sources=f"{DocumentSource.ApiUpload},{DocumentSource.ConsumeFolder},{DocumentSource.MailFetch}", sources=f"{DocumentSource.ApiUpload},{DocumentSource.ConsumeFolder},{DocumentSource.MailFetch}",
filter_filename="*simple*", filter_filename="*simple*",
filter_path="*/samples/*", filter_path=f"*/{self.dirs.scratch_dir.parts[-1]}/*",
) )
action = WorkflowAction.objects.create( action = WorkflowAction.objects.create(
assign_title="Doc from {correspondent}", assign_title="Doc from {correspondent}",
@ -133,7 +133,10 @@ class TestWorkflows(DirectoriesMixin, FileSystemAssertsMixin, APITestCase):
self.assertEqual(trigger.__str__(), "WorkflowTrigger 1") self.assertEqual(trigger.__str__(), "WorkflowTrigger 1")
self.assertEqual(action.__str__(), "WorkflowAction 1") self.assertEqual(action.__str__(), "WorkflowAction 1")
test_file = self.SAMPLE_DIR / "simple.pdf" test_file = shutil.copy(
self.SAMPLE_DIR / "simple.pdf",
self.dirs.scratch_dir / "simple.pdf",
)
with mock.patch("documents.tasks.ProgressManager", DummyProgressManager): with mock.patch("documents.tasks.ProgressManager", DummyProgressManager):
with self.assertLogs("paperless.matching", level="INFO") as cm: with self.assertLogs("paperless.matching", level="INFO") as cm:
@ -144,26 +147,53 @@ class TestWorkflows(DirectoriesMixin, FileSystemAssertsMixin, APITestCase):
), ),
None, None,
) )
m.assert_called_once()
_, overrides = m.call_args document = Document.objects.first()
self.assertEqual(overrides["override_correspondent_id"], self.c.pk) self.assertEqual(document.correspondent, self.c)
self.assertEqual(overrides["override_document_type_id"], self.dt.pk) self.assertEqual(document.document_type, self.dt)
self.assertEqual(list(document.tags.all()), [self.t1, self.t2, self.t3])
self.assertEqual(document.storage_path, self.sp)
self.assertEqual(document.owner, self.user2)
self.assertEqual( self.assertEqual(
overrides["override_tag_ids"], list(
[self.t1.pk, self.t2.pk, self.t3.pk], get_users_with_perms(
) document,
self.assertEqual(overrides["override_storage_path_id"], self.sp.pk) only_with_perms_in=["view_document"],
self.assertEqual(overrides["override_owner_id"], self.user2.pk) ),
self.assertEqual(overrides["override_view_users"], [self.user3.pk]) ),
self.assertEqual(overrides["override_view_groups"], [self.group1.pk]) [self.user3],
self.assertEqual(overrides["override_change_users"], [self.user3.pk])
self.assertEqual(overrides["override_change_groups"], [self.group1.pk])
self.assertEqual(
overrides["override_title"],
"Doc from {correspondent}",
) )
self.assertEqual( self.assertEqual(
overrides["override_custom_field_ids"], list(
get_groups_with_perms(
document,
),
),
[self.group1],
)
self.assertEqual(
list(
get_users_with_perms(
document,
only_with_perms_in=["change_document"],
),
),
[self.user3],
)
self.assertEqual(
list(
get_groups_with_perms(
document,
),
),
[self.group1],
)
self.assertEqual(
document.title,
f"Doc from {self.c.name}",
)
self.assertEqual(
list(document.custom_fields.all().values_list("field", flat=True)),
[self.cf1.pk, self.cf2.pk], [self.cf1.pk, self.cf2.pk],
) )
@ -171,8 +201,7 @@ class TestWorkflows(DirectoriesMixin, FileSystemAssertsMixin, APITestCase):
expected_str = f"Document matched {trigger} from {w}" expected_str = f"Document matched {trigger} from {w}"
self.assertIn(expected_str, info) self.assertIn(expected_str, info)
@mock.patch("documents.consumer.Consumer.try_consume_file") def test_workflow_match_mailrule(self):
def test_workflow_match_mailrule(self, m):
""" """
GIVEN: GIVEN:
- Existing workflow - Existing workflow
@ -211,7 +240,11 @@ class TestWorkflows(DirectoriesMixin, FileSystemAssertsMixin, APITestCase):
w.actions.add(action) w.actions.add(action)
w.save() w.save()
test_file = self.SAMPLE_DIR / "simple.pdf" test_file = shutil.copy(
self.SAMPLE_DIR / "simple.pdf",
self.dirs.scratch_dir / "simple.pdf",
)
with mock.patch("documents.tasks.ProgressManager", DummyProgressManager): with mock.patch("documents.tasks.ProgressManager", DummyProgressManager):
with self.assertLogs("paperless.matching", level="INFO") as cm: with self.assertLogs("paperless.matching", level="INFO") as cm:
tasks.consume_file( tasks.consume_file(
@ -222,31 +255,55 @@ class TestWorkflows(DirectoriesMixin, FileSystemAssertsMixin, APITestCase):
), ),
None, None,
) )
m.assert_called_once() document = Document.objects.first()
_, overrides = m.call_args self.assertEqual(document.correspondent, self.c)
self.assertEqual(overrides["override_correspondent_id"], self.c.pk) self.assertEqual(document.document_type, self.dt)
self.assertEqual(overrides["override_document_type_id"], self.dt.pk) self.assertEqual(list(document.tags.all()), [self.t1, self.t2, self.t3])
self.assertEqual(document.storage_path, self.sp)
self.assertEqual(document.owner, self.user2)
self.assertEqual( self.assertEqual(
overrides["override_tag_ids"], list(
[self.t1.pk, self.t2.pk, self.t3.pk], get_users_with_perms(
document,
only_with_perms_in=["view_document"],
),
),
[self.user3],
) )
self.assertEqual(overrides["override_storage_path_id"], self.sp.pk)
self.assertEqual(overrides["override_owner_id"], self.user2.pk)
self.assertEqual(overrides["override_view_users"], [self.user3.pk])
self.assertEqual(overrides["override_view_groups"], [self.group1.pk])
self.assertEqual(overrides["override_change_users"], [self.user3.pk])
self.assertEqual(overrides["override_change_groups"], [self.group1.pk])
self.assertEqual( self.assertEqual(
overrides["override_title"], list(
"Doc from {correspondent}", get_groups_with_perms(
document,
),
),
[self.group1],
)
self.assertEqual(
list(
get_users_with_perms(
document,
only_with_perms_in=["change_document"],
),
),
[self.user3],
)
self.assertEqual(
list(
get_groups_with_perms(
document,
),
),
[self.group1],
)
self.assertEqual(
document.title,
f"Doc from {self.c.name}",
) )
info = cm.output[0] info = cm.output[0]
expected_str = f"Document matched {trigger} from {w}" expected_str = f"Document matched {trigger} from {w}"
self.assertIn(expected_str, info) self.assertIn(expected_str, info)
@mock.patch("documents.consumer.Consumer.try_consume_file") def test_workflow_match_multiple(self):
def test_workflow_match_multiple(self, m):
""" """
GIVEN: GIVEN:
- Multiple existing workflow - Multiple existing workflow
@ -259,7 +316,7 @@ class TestWorkflows(DirectoriesMixin, FileSystemAssertsMixin, APITestCase):
trigger1 = WorkflowTrigger.objects.create( trigger1 = WorkflowTrigger.objects.create(
type=WorkflowTrigger.WorkflowTriggerType.CONSUMPTION, type=WorkflowTrigger.WorkflowTriggerType.CONSUMPTION,
sources=f"{DocumentSource.ApiUpload},{DocumentSource.ConsumeFolder},{DocumentSource.MailFetch}", sources=f"{DocumentSource.ApiUpload},{DocumentSource.ConsumeFolder},{DocumentSource.MailFetch}",
filter_path="*/samples/*", filter_path=f"*/{self.dirs.scratch_dir.parts[-1]}/*",
) )
action1 = WorkflowAction.objects.create( action1 = WorkflowAction.objects.create(
assign_title="Doc from {correspondent}", assign_title="Doc from {correspondent}",
@ -301,7 +358,10 @@ class TestWorkflows(DirectoriesMixin, FileSystemAssertsMixin, APITestCase):
w2.actions.add(action2) w2.actions.add(action2)
w2.save() w2.save()
test_file = self.SAMPLE_DIR / "simple.pdf" test_file = shutil.copy(
self.SAMPLE_DIR / "simple.pdf",
self.dirs.scratch_dir / "simple.pdf",
)
with mock.patch("documents.tasks.ProgressManager", DummyProgressManager): with mock.patch("documents.tasks.ProgressManager", DummyProgressManager):
with self.assertLogs("paperless.matching", level="INFO") as cm: with self.assertLogs("paperless.matching", level="INFO") as cm:
@ -312,21 +372,25 @@ class TestWorkflows(DirectoriesMixin, FileSystemAssertsMixin, APITestCase):
), ),
None, None,
) )
m.assert_called_once() document = Document.objects.first()
_, overrides = m.call_args
# template 1 # template 1
self.assertEqual(overrides["override_document_type_id"], self.dt.pk) self.assertEqual(document.document_type, self.dt)
# template 2 # template 2
self.assertEqual(overrides["override_correspondent_id"], self.c2.pk) self.assertEqual(document.correspondent, self.c2)
self.assertEqual(overrides["override_storage_path_id"], self.sp.pk) self.assertEqual(document.storage_path, self.sp)
# template 1 & 2 # template 1 & 2
self.assertEqual( self.assertEqual(
overrides["override_tag_ids"], list(document.tags.all()),
[self.t1.pk, self.t2.pk, self.t3.pk], [self.t1, self.t2, self.t3],
) )
self.assertEqual( self.assertEqual(
overrides["override_view_users"], list(
[self.user2.pk, self.user3.pk], get_users_with_perms(
document,
only_with_perms_in=["view_document"],
),
),
[self.user2, self.user3],
) )
expected_str = f"Document matched {trigger1} from {w1}" expected_str = f"Document matched {trigger1} from {w1}"
@ -334,8 +398,7 @@ class TestWorkflows(DirectoriesMixin, FileSystemAssertsMixin, APITestCase):
expected_str = f"Document matched {trigger2} from {w2}" expected_str = f"Document matched {trigger2} from {w2}"
self.assertIn(expected_str, cm.output[1]) self.assertIn(expected_str, cm.output[1])
@mock.patch("documents.consumer.Consumer.try_consume_file") def test_workflow_fnmatch_path(self):
def test_workflow_fnmatch_path(self, m):
""" """
GIVEN: GIVEN:
- Existing workflow - Existing workflow
@ -348,7 +411,7 @@ class TestWorkflows(DirectoriesMixin, FileSystemAssertsMixin, APITestCase):
trigger = WorkflowTrigger.objects.create( trigger = WorkflowTrigger.objects.create(
type=WorkflowTrigger.WorkflowTriggerType.CONSUMPTION, type=WorkflowTrigger.WorkflowTriggerType.CONSUMPTION,
sources=f"{DocumentSource.ApiUpload},{DocumentSource.ConsumeFolder},{DocumentSource.MailFetch}", sources=f"{DocumentSource.ApiUpload},{DocumentSource.ConsumeFolder},{DocumentSource.MailFetch}",
filter_path="*sample*", filter_path=f"*{self.dirs.scratch_dir.parts[-1]}*",
) )
action = WorkflowAction.objects.create( action = WorkflowAction.objects.create(
assign_title="Doc fnmatch title", assign_title="Doc fnmatch title",
@ -363,7 +426,10 @@ class TestWorkflows(DirectoriesMixin, FileSystemAssertsMixin, APITestCase):
w.actions.add(action) w.actions.add(action)
w.save() w.save()
test_file = self.SAMPLE_DIR / "simple.pdf" test_file = shutil.copy(
self.SAMPLE_DIR / "simple.pdf",
self.dirs.scratch_dir / "simple.pdf",
)
with mock.patch("documents.tasks.ProgressManager", DummyProgressManager): with mock.patch("documents.tasks.ProgressManager", DummyProgressManager):
with self.assertLogs("paperless.matching", level="DEBUG") as cm: with self.assertLogs("paperless.matching", level="DEBUG") as cm:
@ -374,15 +440,13 @@ class TestWorkflows(DirectoriesMixin, FileSystemAssertsMixin, APITestCase):
), ),
None, None,
) )
m.assert_called_once() document = Document.objects.first()
_, overrides = m.call_args self.assertEqual(document.title, "Doc fnmatch title")
self.assertEqual(overrides["override_title"], "Doc fnmatch title")
expected_str = f"Document matched {trigger} from {w}" expected_str = f"Document matched {trigger} from {w}"
self.assertIn(expected_str, cm.output[0]) self.assertIn(expected_str, cm.output[0])
@mock.patch("documents.consumer.Consumer.try_consume_file") def test_workflow_no_match_filename(self):
def test_workflow_no_match_filename(self, m):
""" """
GIVEN: GIVEN:
- Existing workflow - Existing workflow
@ -414,7 +478,10 @@ class TestWorkflows(DirectoriesMixin, FileSystemAssertsMixin, APITestCase):
w.actions.add(action) w.actions.add(action)
w.save() w.save()
test_file = self.SAMPLE_DIR / "simple.pdf" test_file = shutil.copy(
self.SAMPLE_DIR / "simple.pdf",
self.dirs.scratch_dir / "simple.pdf",
)
with mock.patch("documents.tasks.ProgressManager", DummyProgressManager): with mock.patch("documents.tasks.ProgressManager", DummyProgressManager):
with self.assertLogs("paperless.matching", level="DEBUG") as cm: with self.assertLogs("paperless.matching", level="DEBUG") as cm:
@ -425,26 +492,36 @@ class TestWorkflows(DirectoriesMixin, FileSystemAssertsMixin, APITestCase):
), ),
None, None,
) )
m.assert_called_once() document = Document.objects.first()
_, overrides = m.call_args self.assertIsNone(document.correspondent)
self.assertIsNone(overrides["override_correspondent_id"]) self.assertIsNone(document.document_type)
self.assertIsNone(overrides["override_document_type_id"]) self.assertEqual(document.tags.all().count(), 0)
self.assertIsNone(overrides["override_tag_ids"]) self.assertIsNone(document.storage_path)
self.assertIsNone(overrides["override_storage_path_id"]) self.assertIsNone(document.owner)
self.assertIsNone(overrides["override_owner_id"]) self.assertEqual(
self.assertIsNone(overrides["override_view_users"]) get_users_with_perms(
self.assertIsNone(overrides["override_view_groups"]) document,
self.assertIsNone(overrides["override_change_users"]) only_with_perms_in=["view_document"],
self.assertIsNone(overrides["override_change_groups"]) ).count(),
self.assertIsNone(overrides["override_title"]) 0,
)
self.assertEqual(get_groups_with_perms(document).count(), 0)
self.assertEqual(
get_users_with_perms(
document,
only_with_perms_in=["change_document"],
).count(),
0,
)
self.assertEqual(get_groups_with_perms(document).count(), 0)
self.assertEqual(document.title, "simple")
expected_str = f"Document did not match {w}" expected_str = f"Document did not match {w}"
self.assertIn(expected_str, cm.output[0]) self.assertIn(expected_str, cm.output[0])
expected_str = f"Document filename {test_file.name} does not match" expected_str = f"Document filename {test_file.name} does not match"
self.assertIn(expected_str, cm.output[1]) self.assertIn(expected_str, cm.output[1])
@mock.patch("documents.consumer.Consumer.try_consume_file") def test_workflow_no_match_path(self):
def test_workflow_no_match_path(self, m):
""" """
GIVEN: GIVEN:
- Existing workflow - Existing workflow
@ -475,7 +552,10 @@ class TestWorkflows(DirectoriesMixin, FileSystemAssertsMixin, APITestCase):
w.actions.add(action) w.actions.add(action)
w.save() w.save()
test_file = self.SAMPLE_DIR / "simple.pdf" test_file = shutil.copy(
self.SAMPLE_DIR / "simple.pdf",
self.dirs.scratch_dir / "simple.pdf",
)
with mock.patch("documents.tasks.ProgressManager", DummyProgressManager): with mock.patch("documents.tasks.ProgressManager", DummyProgressManager):
with self.assertLogs("paperless.matching", level="DEBUG") as cm: with self.assertLogs("paperless.matching", level="DEBUG") as cm:
@ -486,26 +566,46 @@ class TestWorkflows(DirectoriesMixin, FileSystemAssertsMixin, APITestCase):
), ),
None, None,
) )
m.assert_called_once() document = Document.objects.first()
_, overrides = m.call_args self.assertIsNone(document.correspondent)
self.assertIsNone(overrides["override_correspondent_id"]) self.assertIsNone(document.document_type)
self.assertIsNone(overrides["override_document_type_id"]) self.assertEqual(document.tags.all().count(), 0)
self.assertIsNone(overrides["override_tag_ids"]) self.assertIsNone(document.storage_path)
self.assertIsNone(overrides["override_storage_path_id"]) self.assertIsNone(document.owner)
self.assertIsNone(overrides["override_owner_id"]) self.assertEqual(
self.assertIsNone(overrides["override_view_users"]) get_users_with_perms(
self.assertIsNone(overrides["override_view_groups"]) document,
self.assertIsNone(overrides["override_change_users"]) only_with_perms_in=["view_document"],
self.assertIsNone(overrides["override_change_groups"]) ).count(),
self.assertIsNone(overrides["override_title"]) 0,
)
self.assertEqual(
get_groups_with_perms(
document,
).count(),
0,
)
self.assertEqual(
get_users_with_perms(
document,
only_with_perms_in=["change_document"],
).count(),
0,
)
self.assertEqual(
get_groups_with_perms(
document,
).count(),
0,
)
self.assertEqual(document.title, "simple")
expected_str = f"Document did not match {w}" expected_str = f"Document did not match {w}"
self.assertIn(expected_str, cm.output[0]) self.assertIn(expected_str, cm.output[0])
expected_str = f"Document path {test_file} does not match" expected_str = f"Document path {test_file} does not match"
self.assertIn(expected_str, cm.output[1]) self.assertIn(expected_str, cm.output[1])
@mock.patch("documents.consumer.Consumer.try_consume_file") def test_workflow_no_match_mail_rule(self):
def test_workflow_no_match_mail_rule(self, m):
""" """
GIVEN: GIVEN:
- Existing workflow - Existing workflow
@ -536,7 +636,10 @@ class TestWorkflows(DirectoriesMixin, FileSystemAssertsMixin, APITestCase):
w.actions.add(action) w.actions.add(action)
w.save() w.save()
test_file = self.SAMPLE_DIR / "simple.pdf" test_file = shutil.copy(
self.SAMPLE_DIR / "simple.pdf",
self.dirs.scratch_dir / "simple.pdf",
)
with mock.patch("documents.tasks.ProgressManager", DummyProgressManager): with mock.patch("documents.tasks.ProgressManager", DummyProgressManager):
with self.assertLogs("paperless.matching", level="DEBUG") as cm: with self.assertLogs("paperless.matching", level="DEBUG") as cm:
@ -548,26 +651,46 @@ class TestWorkflows(DirectoriesMixin, FileSystemAssertsMixin, APITestCase):
), ),
None, None,
) )
m.assert_called_once() document = Document.objects.first()
_, overrides = m.call_args self.assertIsNone(document.correspondent)
self.assertIsNone(overrides["override_correspondent_id"]) self.assertIsNone(document.document_type)
self.assertIsNone(overrides["override_document_type_id"]) self.assertEqual(document.tags.all().count(), 0)
self.assertIsNone(overrides["override_tag_ids"]) self.assertIsNone(document.storage_path)
self.assertIsNone(overrides["override_storage_path_id"]) self.assertIsNone(document.owner)
self.assertIsNone(overrides["override_owner_id"]) self.assertEqual(
self.assertIsNone(overrides["override_view_users"]) get_users_with_perms(
self.assertIsNone(overrides["override_view_groups"]) document,
self.assertIsNone(overrides["override_change_users"]) only_with_perms_in=["view_document"],
self.assertIsNone(overrides["override_change_groups"]) ).count(),
self.assertIsNone(overrides["override_title"]) 0,
)
self.assertEqual(
get_groups_with_perms(
document,
).count(),
0,
)
self.assertEqual(
get_users_with_perms(
document,
only_with_perms_in=["change_document"],
).count(),
0,
)
self.assertEqual(
get_groups_with_perms(
document,
).count(),
0,
)
self.assertEqual(document.title, "simple")
expected_str = f"Document did not match {w}" expected_str = f"Document did not match {w}"
self.assertIn(expected_str, cm.output[0]) self.assertIn(expected_str, cm.output[0])
expected_str = "Document mail rule 99 !=" expected_str = "Document mail rule 99 !="
self.assertIn(expected_str, cm.output[1]) self.assertIn(expected_str, cm.output[1])
@mock.patch("documents.consumer.Consumer.try_consume_file") def test_workflow_no_match_source(self):
def test_workflow_no_match_source(self, m):
""" """
GIVEN: GIVEN:
- Existing workflow - Existing workflow
@ -598,7 +721,10 @@ class TestWorkflows(DirectoriesMixin, FileSystemAssertsMixin, APITestCase):
w.actions.add(action) w.actions.add(action)
w.save() w.save()
test_file = self.SAMPLE_DIR / "simple.pdf" test_file = shutil.copy(
self.SAMPLE_DIR / "simple.pdf",
self.dirs.scratch_dir / "simple.pdf",
)
with mock.patch("documents.tasks.ProgressManager", DummyProgressManager): with mock.patch("documents.tasks.ProgressManager", DummyProgressManager):
with self.assertLogs("paperless.matching", level="DEBUG") as cm: with self.assertLogs("paperless.matching", level="DEBUG") as cm:
@ -609,18 +735,39 @@ class TestWorkflows(DirectoriesMixin, FileSystemAssertsMixin, APITestCase):
), ),
None, None,
) )
m.assert_called_once() document = Document.objects.first()
_, overrides = m.call_args self.assertIsNone(document.correspondent)
self.assertIsNone(overrides["override_correspondent_id"]) self.assertIsNone(document.document_type)
self.assertIsNone(overrides["override_document_type_id"]) self.assertEqual(document.tags.all().count(), 0)
self.assertIsNone(overrides["override_tag_ids"]) self.assertIsNone(document.storage_path)
self.assertIsNone(overrides["override_storage_path_id"]) self.assertIsNone(document.owner)
self.assertIsNone(overrides["override_owner_id"]) self.assertEqual(
self.assertIsNone(overrides["override_view_users"]) get_users_with_perms(
self.assertIsNone(overrides["override_view_groups"]) document,
self.assertIsNone(overrides["override_change_users"]) only_with_perms_in=["view_document"],
self.assertIsNone(overrides["override_change_groups"]) ).count(),
self.assertIsNone(overrides["override_title"]) 0,
)
self.assertEqual(
get_groups_with_perms(
document,
).count(),
0,
)
self.assertEqual(
get_users_with_perms(
document,
only_with_perms_in=["change_document"],
).count(),
0,
)
self.assertEqual(
get_groups_with_perms(
document,
).count(),
0,
)
self.assertEqual(document.title, "simple")
expected_str = f"Document did not match {w}" expected_str = f"Document did not match {w}"
self.assertIn(expected_str, cm.output[0]) self.assertIn(expected_str, cm.output[0])
@ -662,8 +809,7 @@ class TestWorkflows(DirectoriesMixin, FileSystemAssertsMixin, APITestCase):
expected_str = f"No matching triggers with type {WorkflowTrigger.WorkflowTriggerType.DOCUMENT_ADDED} found" expected_str = f"No matching triggers with type {WorkflowTrigger.WorkflowTriggerType.DOCUMENT_ADDED} found"
self.assertIn(expected_str, cm.output[1]) self.assertIn(expected_str, cm.output[1])
@mock.patch("documents.consumer.Consumer.try_consume_file") def test_workflow_repeat_custom_fields(self):
def test_workflow_repeat_custom_fields(self, m):
""" """
GIVEN: GIVEN:
- Existing workflows which assign the same custom field - Existing workflows which assign the same custom field
@ -693,7 +839,10 @@ class TestWorkflows(DirectoriesMixin, FileSystemAssertsMixin, APITestCase):
w.actions.add(action1, action2) w.actions.add(action1, action2)
w.save() w.save()
test_file = self.SAMPLE_DIR / "simple.pdf" test_file = shutil.copy(
self.SAMPLE_DIR / "simple.pdf",
self.dirs.scratch_dir / "simple.pdf",
)
with mock.patch("documents.tasks.ProgressManager", DummyProgressManager): with mock.patch("documents.tasks.ProgressManager", DummyProgressManager):
with self.assertLogs("paperless.matching", level="INFO") as cm: with self.assertLogs("paperless.matching", level="INFO") as cm:
@ -704,10 +853,9 @@ class TestWorkflows(DirectoriesMixin, FileSystemAssertsMixin, APITestCase):
), ),
None, None,
) )
m.assert_called_once() document = Document.objects.first()
_, overrides = m.call_args
self.assertEqual( self.assertEqual(
overrides["override_custom_field_ids"], list(document.custom_fields.all().values_list("field", flat=True)),
[self.cf1.pk], [self.cf1.pk],
) )
@ -1369,8 +1517,7 @@ class TestWorkflows(DirectoriesMixin, FileSystemAssertsMixin, APITestCase):
group_perms: QuerySet = get_groups_with_perms(doc) group_perms: QuerySet = get_groups_with_perms(doc)
self.assertNotIn(self.group1, group_perms) self.assertNotIn(self.group1, group_perms)
@mock.patch("documents.consumer.Consumer.try_consume_file") def test_removal_action_document_consumed(self):
def test_removal_action_document_consumed(self, m):
""" """
GIVEN: GIVEN:
- Workflow with assignment and removal actions - Workflow with assignment and removal actions
@ -1429,7 +1576,10 @@ class TestWorkflows(DirectoriesMixin, FileSystemAssertsMixin, APITestCase):
w.actions.add(action2) w.actions.add(action2)
w.save() w.save()
test_file = self.SAMPLE_DIR / "simple.pdf" test_file = shutil.copy(
self.SAMPLE_DIR / "simple.pdf",
self.dirs.scratch_dir / "simple.pdf",
)
with mock.patch("documents.tasks.ProgressManager", DummyProgressManager): with mock.patch("documents.tasks.ProgressManager", DummyProgressManager):
with self.assertLogs("paperless.matching", level="INFO") as cm: with self.assertLogs("paperless.matching", level="INFO") as cm:
@ -1440,26 +1590,57 @@ class TestWorkflows(DirectoriesMixin, FileSystemAssertsMixin, APITestCase):
), ),
None, None,
) )
m.assert_called_once()
_, overrides = m.call_args document = Document.objects.first()
self.assertIsNone(overrides["override_correspondent_id"])
self.assertIsNone(overrides["override_document_type_id"]) self.assertIsNone(document.correspondent)
self.assertIsNone(document.document_type)
self.assertEqual( self.assertEqual(
overrides["override_tag_ids"], list(document.tags.all()),
[self.t2.pk, self.t3.pk], [self.t2, self.t3],
) )
self.assertIsNone(overrides["override_storage_path_id"]) self.assertIsNone(document.storage_path)
self.assertIsNone(overrides["override_owner_id"]) self.assertIsNone(document.owner)
self.assertEqual(overrides["override_view_users"], [self.user2.pk])
self.assertEqual(overrides["override_view_groups"], [self.group2.pk])
self.assertEqual(overrides["override_change_users"], [self.user2.pk])
self.assertEqual(overrides["override_change_groups"], [self.group2.pk])
self.assertEqual( self.assertEqual(
overrides["override_title"], list(
"Doc from {correspondent}", get_users_with_perms(
document,
only_with_perms_in=["view_document"],
),
),
[self.user2],
) )
self.assertEqual( self.assertEqual(
overrides["override_custom_field_ids"], list(
get_groups_with_perms(
document,
),
),
[self.group2],
)
self.assertEqual(
list(
get_users_with_perms(
document,
only_with_perms_in=["change_document"],
),
),
[self.user2],
)
self.assertEqual(
list(
get_groups_with_perms(
document,
),
),
[self.group2],
)
self.assertEqual(
document.title,
"Doc from None",
)
self.assertEqual(
list(document.custom_fields.all().values_list("field", flat=True)),
[self.cf2.pk], [self.cf2.pk],
) )
@ -1467,8 +1648,7 @@ class TestWorkflows(DirectoriesMixin, FileSystemAssertsMixin, APITestCase):
expected_str = f"Document matched {trigger} from {w}" expected_str = f"Document matched {trigger} from {w}"
self.assertIn(expected_str, info) self.assertIn(expected_str, info)
@mock.patch("documents.consumer.ConsumerPlugin.run") def test_removal_action_document_consumed_remove_all(self):
def test_removal_action_document_consumed_removeall(self, m):
""" """
GIVEN: GIVEN:
- Workflow with assignment and removal actions with remove all fields set - Workflow with assignment and removal actions with remove all fields set
@ -1519,7 +1699,10 @@ class TestWorkflows(DirectoriesMixin, FileSystemAssertsMixin, APITestCase):
w.actions.add(action2) w.actions.add(action2)
w.save() w.save()
test_file = self.SAMPLE_DIR / "simple.pdf" test_file = shutil.copy(
self.SAMPLE_DIR / "simple.pdf",
self.dirs.scratch_dir / "simple.pdf",
)
with mock.patch("documents.tasks.ProgressManager", DummyProgressManager): with mock.patch("documents.tasks.ProgressManager", DummyProgressManager):
with self.assertLogs("paperless.matching", level="INFO") as cm: with self.assertLogs("paperless.matching", level="INFO") as cm:
@ -1530,23 +1713,46 @@ class TestWorkflows(DirectoriesMixin, FileSystemAssertsMixin, APITestCase):
), ),
None, None,
) )
m.assert_called_once() document = Document.objects.first()
_, overrides = m.call_args self.assertIsNone(document.correspondent)
self.assertIsNone(overrides["override_correspondent_id"]) self.assertIsNone(document.document_type)
self.assertIsNone(overrides["override_document_type_id"]) self.assertEqual(document.tags.all().count(), 0)
self.assertIsNone(document.storage_path)
self.assertIsNone(document.owner)
self.assertEqual( self.assertEqual(
overrides["override_tag_ids"], get_users_with_perms(
[], document,
only_with_perms_in=["view_document"],
).count(),
0,
) )
self.assertIsNone(overrides["override_storage_path_id"])
self.assertIsNone(overrides["override_owner_id"])
self.assertEqual(overrides["override_view_users"], [])
self.assertEqual(overrides["override_view_groups"], [])
self.assertEqual(overrides["override_change_users"], [])
self.assertEqual(overrides["override_change_groups"], [])
self.assertEqual( self.assertEqual(
overrides["override_custom_field_ids"], get_groups_with_perms(
[], document,
).count(),
0,
)
self.assertEqual(
get_users_with_perms(
document,
only_with_perms_in=["change_document"],
).count(),
0,
)
self.assertEqual(
get_groups_with_perms(
document,
).count(),
0,
)
self.assertEqual(
document.custom_fields.all()
.values_list(
"field",
)
.count(),
0,
) )
info = cm.output[0] info = cm.output[0]

View File

@ -425,6 +425,10 @@ class MailAccountHandler(LoggingMixin):
logging_name = "paperless_mail" logging_name = "paperless_mail"
def __init__(self) -> None:
super().__init__()
self.renew_logging_group()
def _correspondent_from_name(self, name: str) -> Optional[Correspondent]: def _correspondent_from_name(self, name: str) -> Optional[Correspondent]:
try: try:
return Correspondent.objects.get_or_create(name=name)[0] return Correspondent.objects.get_or_create(name=name)[0]