From b144ee785ae29436a8cd25959a1ab4f434321a51 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Mon, 11 Dec 2023 10:58:51 -0800 Subject: [PATCH] Move consumption-template-related API tests --- .../tests/test_api_consumption_templates.py | 236 ++++++++++++++++++ src/documents/tests/test_api_permissions.py | 224 ----------------- 2 files changed, 236 insertions(+), 224 deletions(-) create mode 100644 src/documents/tests/test_api_consumption_templates.py diff --git a/src/documents/tests/test_api_consumption_templates.py b/src/documents/tests/test_api_consumption_templates.py new file mode 100644 index 000000000..e32294050 --- /dev/null +++ b/src/documents/tests/test_api_consumption_templates.py @@ -0,0 +1,236 @@ +import json + +from django.contrib.auth.models import Group +from django.contrib.auth.models import User +from rest_framework import status +from rest_framework.test import APITestCase + +from documents.data_models import DocumentSource +from documents.models import ConsumptionTemplate +from documents.models import Correspondent +from documents.models import CustomField +from documents.models import DocumentType +from documents.models import StoragePath +from documents.models import Tag +from documents.tests.utils import DirectoriesMixin +from paperless_mail.models import MailAccount +from paperless_mail.models import MailRule + + +class TestApiConsumptionTemplates(DirectoriesMixin, APITestCase): + ENDPOINT = "/api/consumption_templates/" + + def setUp(self) -> None: + super().setUp() + + user = User.objects.create_superuser(username="temp_admin") + self.client.force_authenticate(user=user) + self.user2 = User.objects.create(username="user2") + self.user3 = User.objects.create(username="user3") + self.group1 = Group.objects.create(name="group1") + + self.c = Correspondent.objects.create(name="Correspondent Name") + self.c2 = Correspondent.objects.create(name="Correspondent Name 2") + self.dt = DocumentType.objects.create(name="DocType Name") + self.t1 = Tag.objects.create(name="t1") + self.t2 = Tag.objects.create(name="t2") + self.t3 = Tag.objects.create(name="t3") + self.sp = StoragePath.objects.create(path="/test/") + self.cf1 = CustomField.objects.create(name="Custom Field 1", data_type="string") + self.cf2 = CustomField.objects.create( + name="Custom Field 2", + data_type="integer", + ) + + self.ct = ConsumptionTemplate.objects.create( + name="Template 1", + order=0, + sources=f"{int(DocumentSource.ApiUpload)},{int(DocumentSource.ConsumeFolder)},{int(DocumentSource.MailFetch)}", + filter_filename="*simple*", + filter_path="*/samples/*", + assign_title="Doc from {correspondent}", + assign_correspondent=self.c, + assign_document_type=self.dt, + assign_storage_path=self.sp, + assign_owner=self.user2, + ) + self.ct.assign_tags.add(self.t1) + self.ct.assign_tags.add(self.t2) + self.ct.assign_tags.add(self.t3) + self.ct.assign_view_users.add(self.user3.pk) + self.ct.assign_view_groups.add(self.group1.pk) + self.ct.assign_change_users.add(self.user3.pk) + self.ct.assign_change_groups.add(self.group1.pk) + self.ct.assign_custom_fields.add(self.cf1.pk) + self.ct.assign_custom_fields.add(self.cf2.pk) + self.ct.save() + + def test_api_get_consumption_template(self): + """ + GIVEN: + - API request to get all consumption template + WHEN: + - API is called + THEN: + - Existing consumption templates are returned + """ + response = self.client.get(self.ENDPOINT, format="json") + + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data["count"], 1) + + resp_consumption_template = response.data["results"][0] + self.assertEqual(resp_consumption_template["id"], self.ct.id) + self.assertEqual( + resp_consumption_template["assign_correspondent"], + self.ct.assign_correspondent.pk, + ) + + def test_api_create_consumption_template(self): + """ + GIVEN: + - API request to create a consumption template + WHEN: + - API is called + THEN: + - Correct HTTP response + - New template is created + """ + response = self.client.post( + self.ENDPOINT, + json.dumps( + { + "name": "Template 2", + "order": 1, + "sources": [DocumentSource.ApiUpload], + "filter_filename": "*test*", + }, + ), + content_type="application/json", + ) + self.assertEqual(response.status_code, status.HTTP_201_CREATED) + self.assertEqual(ConsumptionTemplate.objects.count(), 2) + + def test_api_create_invalid_consumption_template(self): + """ + GIVEN: + - API request to create a consumption template + - Neither file name nor path filter are specified + WHEN: + - API is called + THEN: + - Correct HTTP 400 response + - No template is created + """ + response = self.client.post( + self.ENDPOINT, + json.dumps( + { + "name": "Template 2", + "order": 1, + "sources": [DocumentSource.ApiUpload], + }, + ), + content_type="application/json", + ) + self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) + self.assertEqual(ConsumptionTemplate.objects.count(), 1) + + def test_api_create_consumption_template_empty_fields(self): + """ + GIVEN: + - API request to create a consumption template + - Path or filename filter or assign title are empty string + WHEN: + - API is called + THEN: + - Template is created but filter or title assignment is not set if "" + """ + response = self.client.post( + self.ENDPOINT, + json.dumps( + { + "name": "Template 2", + "order": 1, + "sources": [DocumentSource.ApiUpload], + "filter_filename": "*test*", + "filter_path": "", + "assign_title": "", + }, + ), + content_type="application/json", + ) + self.assertEqual(response.status_code, status.HTTP_201_CREATED) + ct = ConsumptionTemplate.objects.get(name="Template 2") + self.assertEqual(ct.filter_filename, "*test*") + self.assertIsNone(ct.filter_path) + self.assertIsNone(ct.assign_title) + + response = self.client.post( + self.ENDPOINT, + json.dumps( + { + "name": "Template 3", + "order": 1, + "sources": [DocumentSource.ApiUpload], + "filter_filename": "", + "filter_path": "*/test/*", + }, + ), + content_type="application/json", + ) + self.assertEqual(response.status_code, status.HTTP_201_CREATED) + ct2 = ConsumptionTemplate.objects.get(name="Template 3") + self.assertEqual(ct2.filter_path, "*/test/*") + self.assertIsNone(ct2.filter_filename) + + def test_api_create_consumption_template_with_mailrule(self): + """ + GIVEN: + - API request to create a consumption template with a mail rule but no MailFetch source + WHEN: + - API is called + THEN: + - New template is created with MailFetch as source + """ + account1 = MailAccount.objects.create( + name="Email1", + username="username1", + password="password1", + imap_server="server.example.com", + imap_port=443, + imap_security=MailAccount.ImapSecurity.SSL, + character_set="UTF-8", + ) + rule1 = MailRule.objects.create( + name="Rule1", + account=account1, + folder="INBOX", + filter_from="from@example.com", + filter_to="someone@somewhere.com", + filter_subject="subject", + filter_body="body", + filter_attachment_filename_include="file.pdf", + maximum_age=30, + action=MailRule.MailAction.MARK_READ, + assign_title_from=MailRule.TitleSource.FROM_SUBJECT, + assign_correspondent_from=MailRule.CorrespondentSource.FROM_NOTHING, + order=0, + attachment_type=MailRule.AttachmentProcessing.ATTACHMENTS_ONLY, + ) + response = self.client.post( + self.ENDPOINT, + json.dumps( + { + "name": "Template 2", + "order": 1, + "sources": [DocumentSource.ApiUpload], + "filter_mailrule": rule1.pk, + }, + ), + content_type="application/json", + ) + self.assertEqual(response.status_code, status.HTTP_201_CREATED) + self.assertEqual(ConsumptionTemplate.objects.count(), 2) + ct = ConsumptionTemplate.objects.get(name="Template 2") + self.assertEqual(ct.sources, [int(DocumentSource.MailFetch).__str__()]) diff --git a/src/documents/tests/test_api_permissions.py b/src/documents/tests/test_api_permissions.py index 2450f6248..1b6bd19df 100644 --- a/src/documents/tests/test_api_permissions.py +++ b/src/documents/tests/test_api_permissions.py @@ -9,18 +9,13 @@ from guardian.shortcuts import get_users_with_perms from rest_framework import status from rest_framework.test import APITestCase -from documents.data_models import DocumentSource -from documents.models import ConsumptionTemplate from documents.models import Correspondent -from documents.models import CustomField from documents.models import Document 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_mail.models import MailAccount -from paperless_mail.models import MailRule class TestApiAuth(DirectoriesMixin, APITestCase): @@ -913,222 +908,3 @@ class TestBulkEditObjectPermissions(APITestCase): ) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) - - -class TestApiConsumptionTemplates(DirectoriesMixin, APITestCase): - ENDPOINT = "/api/consumption_templates/" - - def setUp(self) -> None: - super().setUp() - - user = User.objects.create_superuser(username="temp_admin") - self.client.force_authenticate(user=user) - self.user2 = User.objects.create(username="user2") - self.user3 = User.objects.create(username="user3") - self.group1 = Group.objects.create(name="group1") - - self.c = Correspondent.objects.create(name="Correspondent Name") - self.c2 = Correspondent.objects.create(name="Correspondent Name 2") - self.dt = DocumentType.objects.create(name="DocType Name") - self.t1 = Tag.objects.create(name="t1") - self.t2 = Tag.objects.create(name="t2") - self.t3 = Tag.objects.create(name="t3") - self.sp = StoragePath.objects.create(path="/test/") - self.cf1 = CustomField.objects.create(name="Custom Field 1", data_type="string") - self.cf2 = CustomField.objects.create( - name="Custom Field 2", - data_type="integer", - ) - - self.ct = ConsumptionTemplate.objects.create( - name="Template 1", - order=0, - sources=f"{int(DocumentSource.ApiUpload)},{int(DocumentSource.ConsumeFolder)},{int(DocumentSource.MailFetch)}", - filter_filename="*simple*", - filter_path="*/samples/*", - assign_title="Doc from {correspondent}", - assign_correspondent=self.c, - assign_document_type=self.dt, - assign_storage_path=self.sp, - assign_owner=self.user2, - ) - self.ct.assign_tags.add(self.t1) - self.ct.assign_tags.add(self.t2) - self.ct.assign_tags.add(self.t3) - self.ct.assign_view_users.add(self.user3.pk) - self.ct.assign_view_groups.add(self.group1.pk) - self.ct.assign_change_users.add(self.user3.pk) - self.ct.assign_change_groups.add(self.group1.pk) - self.ct.assign_custom_fields.add(self.cf1.pk) - self.ct.assign_custom_fields.add(self.cf2.pk) - self.ct.save() - - def test_api_get_consumption_template(self): - """ - GIVEN: - - API request to get all consumption template - WHEN: - - API is called - THEN: - - Existing consumption templates are returned - """ - response = self.client.get(self.ENDPOINT, format="json") - - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual(response.data["count"], 1) - - resp_consumption_template = response.data["results"][0] - self.assertEqual(resp_consumption_template["id"], self.ct.id) - self.assertEqual( - resp_consumption_template["assign_correspondent"], - self.ct.assign_correspondent.pk, - ) - - def test_api_create_consumption_template(self): - """ - GIVEN: - - API request to create a consumption template - WHEN: - - API is called - THEN: - - Correct HTTP response - - New template is created - """ - response = self.client.post( - self.ENDPOINT, - json.dumps( - { - "name": "Template 2", - "order": 1, - "sources": [DocumentSource.ApiUpload], - "filter_filename": "*test*", - }, - ), - content_type="application/json", - ) - self.assertEqual(response.status_code, status.HTTP_201_CREATED) - self.assertEqual(ConsumptionTemplate.objects.count(), 2) - - def test_api_create_invalid_consumption_template(self): - """ - GIVEN: - - API request to create a consumption template - - Neither file name nor path filter are specified - WHEN: - - API is called - THEN: - - Correct HTTP 400 response - - No template is created - """ - response = self.client.post( - self.ENDPOINT, - json.dumps( - { - "name": "Template 2", - "order": 1, - "sources": [DocumentSource.ApiUpload], - }, - ), - content_type="application/json", - ) - self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) - self.assertEqual(ConsumptionTemplate.objects.count(), 1) - - def test_api_create_consumption_template_empty_fields(self): - """ - GIVEN: - - API request to create a consumption template - - Path or filename filter or assign title are empty string - WHEN: - - API is called - THEN: - - Template is created but filter or title assignment is not set if "" - """ - response = self.client.post( - self.ENDPOINT, - json.dumps( - { - "name": "Template 2", - "order": 1, - "sources": [DocumentSource.ApiUpload], - "filter_filename": "*test*", - "filter_path": "", - "assign_title": "", - }, - ), - content_type="application/json", - ) - self.assertEqual(response.status_code, status.HTTP_201_CREATED) - ct = ConsumptionTemplate.objects.get(name="Template 2") - self.assertEqual(ct.filter_filename, "*test*") - self.assertIsNone(ct.filter_path) - self.assertIsNone(ct.assign_title) - - response = self.client.post( - self.ENDPOINT, - json.dumps( - { - "name": "Template 3", - "order": 1, - "sources": [DocumentSource.ApiUpload], - "filter_filename": "", - "filter_path": "*/test/*", - }, - ), - content_type="application/json", - ) - self.assertEqual(response.status_code, status.HTTP_201_CREATED) - ct2 = ConsumptionTemplate.objects.get(name="Template 3") - self.assertEqual(ct2.filter_path, "*/test/*") - self.assertIsNone(ct2.filter_filename) - - def test_api_create_consumption_template_with_mailrule(self): - """ - GIVEN: - - API request to create a consumption template with a mail rule but no MailFetch source - WHEN: - - API is called - THEN: - - New template is created with MailFetch as source - """ - account1 = MailAccount.objects.create( - name="Email1", - username="username1", - password="password1", - imap_server="server.example.com", - imap_port=443, - imap_security=MailAccount.ImapSecurity.SSL, - character_set="UTF-8", - ) - rule1 = MailRule.objects.create( - name="Rule1", - account=account1, - folder="INBOX", - filter_from="from@example.com", - filter_to="someone@somewhere.com", - filter_subject="subject", - filter_body="body", - filter_attachment_filename_include="file.pdf", - maximum_age=30, - action=MailRule.MailAction.MARK_READ, - assign_title_from=MailRule.TitleSource.FROM_SUBJECT, - assign_correspondent_from=MailRule.CorrespondentSource.FROM_NOTHING, - order=0, - attachment_type=MailRule.AttachmentProcessing.ATTACHMENTS_ONLY, - ) - response = self.client.post( - self.ENDPOINT, - json.dumps( - { - "name": "Template 2", - "order": 1, - "sources": [DocumentSource.ApiUpload], - "filter_mailrule": rule1.pk, - }, - ), - content_type="application/json", - ) - self.assertEqual(response.status_code, status.HTTP_201_CREATED) - self.assertEqual(ConsumptionTemplate.objects.count(), 2) - ct = ConsumptionTemplate.objects.get(name="Template 2") - self.assertEqual(ct.sources, [int(DocumentSource.MailFetch).__str__()])