mirror of
				https://github.com/paperless-ngx/paperless-ngx.git
				synced 2025-10-30 03:56:23 -05:00 
			
		
		
		
	API mail rule & account tests
and fix use of assign_tags
This commit is contained in:
		| @@ -76,7 +76,7 @@ export class MailRuleEditDialogComponent extends EditDialogComponent<PaperlessMa | ||||
|       action: new FormControl(MailAction.MarkRead), | ||||
|       action_parameter: new FormControl(null), | ||||
|       assign_title_from: new FormControl(MailMetadataTitleOption.FromSubject), | ||||
|       assign_tags: new FormControl(null), | ||||
|       assign_tags: new FormControl([]), | ||||
|       assign_document_type: new FormControl(null), | ||||
|       assign_correspondent_from: new FormControl( | ||||
|         MailMetadataCorrespondentOption.FromNothing | ||||
|   | ||||
| @@ -739,10 +739,15 @@ class AccountField(serializers.PrimaryKeyRelatedField): | ||||
|  | ||||
|  | ||||
| class MailRuleSerializer(serializers.ModelSerializer): | ||||
|     account = AccountField(allow_null=True) | ||||
|     assign_correspondent = CorrespondentField(allow_null=True) | ||||
|     assign_tags = TagsField(many=True) | ||||
|     assign_document_type = DocumentTypeField(allow_null=True) | ||||
|     account = AccountField(required=True) | ||||
|     action_parameter = serializers.CharField( | ||||
|         allow_null=True, | ||||
|         required=False, | ||||
|         default="", | ||||
|     ) | ||||
|     assign_correspondent = CorrespondentField(allow_null=True, required=False) | ||||
|     assign_tags = TagsField(many=True, allow_null=True, required=False) | ||||
|     assign_document_type = DocumentTypeField(allow_null=True, required=False) | ||||
|  | ||||
|     class Meta: | ||||
|         model = MailRule | ||||
| @@ -773,5 +778,9 @@ class MailRuleSerializer(serializers.ModelSerializer): | ||||
|         return instance | ||||
|  | ||||
|     def create(self, validated_data): | ||||
|         if "assign_tags" in validated_data: | ||||
|             assign_tags = validated_data.pop("assign_tags") | ||||
|         mail_rule = MailRule.objects.create(**validated_data) | ||||
|         if assign_tags: | ||||
|             mail_rule.assign_tags.set(assign_tags) | ||||
|         return mail_rule | ||||
|   | ||||
| @@ -2,6 +2,7 @@ import datetime | ||||
| import io | ||||
| import json | ||||
| import os | ||||
| import re | ||||
| import shutil | ||||
| import tempfile | ||||
| import urllib.request | ||||
| @@ -36,6 +37,7 @@ from documents.models import Comment | ||||
| from documents.models import StoragePath | ||||
| from documents.tests.utils import DirectoriesMixin | ||||
| from paperless import version | ||||
| from paperless_mail.models import MailAccount, MailRule | ||||
| from rest_framework.test import APITestCase | ||||
| from whoosh.writing import AsyncWriter | ||||
|  | ||||
| @@ -2929,3 +2931,441 @@ class TestTasks(APITestCase): | ||||
|         returned_data = response.data[0] | ||||
|  | ||||
|         self.assertEqual(returned_data["task_file_name"], "anothertest.pdf") | ||||
|  | ||||
|  | ||||
| class TestAPIMailAccounts(APITestCase): | ||||
|     ENDPOINT = "/api/mail_accounts/" | ||||
|  | ||||
|     def setUp(self): | ||||
|         super().setUp() | ||||
|  | ||||
|         self.user = User.objects.create_superuser(username="temp_admin") | ||||
|         self.client.force_authenticate(user=self.user) | ||||
|  | ||||
|     def test_get_mail_accounts(self): | ||||
|         """ | ||||
|         GIVEN: | ||||
|             - Configured mail accounts | ||||
|         WHEN: | ||||
|             - API call is made to get mail accounts | ||||
|         THEN: | ||||
|             - Configured mail accounts are provided | ||||
|         """ | ||||
|  | ||||
|         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", | ||||
|         ) | ||||
|  | ||||
|         response = self.client.get(self.ENDPOINT) | ||||
|  | ||||
|         self.assertEqual(response.status_code, 200) | ||||
|         self.assertEqual(response.data["count"], 1) | ||||
|         returned_account1 = response.data["results"][0] | ||||
|  | ||||
|         from pprint import pprint | ||||
|  | ||||
|         pprint(returned_account1) | ||||
|  | ||||
|         self.assertEqual(returned_account1["name"], account1.name) | ||||
|         self.assertEqual(returned_account1["username"], account1.username) | ||||
|         self.assertEqual( | ||||
|             returned_account1["password"], | ||||
|             re.sub(".", "*", account1.password), | ||||
|         ) | ||||
|         self.assertEqual(returned_account1["imap_server"], account1.imap_server) | ||||
|         self.assertEqual(returned_account1["imap_port"], account1.imap_port) | ||||
|         self.assertEqual(returned_account1["imap_security"], account1.imap_security) | ||||
|         self.assertEqual(returned_account1["character_set"], account1.character_set) | ||||
|  | ||||
|     def test_create_mail_account(self): | ||||
|         """ | ||||
|         WHEN: | ||||
|             - API request is made to add a mail account | ||||
|         THEN: | ||||
|             - A new mail account is created | ||||
|         """ | ||||
|  | ||||
|         account1 = { | ||||
|             "name": "Email1", | ||||
|             "username": "username1", | ||||
|             "password": "password1", | ||||
|             "imap_server": "server.example.com", | ||||
|             "imap_port": 443, | ||||
|             "imap_security": MailAccount.ImapSecurity.SSL, | ||||
|             "character_set": "UTF-8", | ||||
|         } | ||||
|  | ||||
|         response = self.client.post( | ||||
|             self.ENDPOINT, | ||||
|             data=account1, | ||||
|         ) | ||||
|  | ||||
|         self.assertEqual(response.status_code, 201) | ||||
|  | ||||
|         returned_account1 = MailAccount.objects.get(name="Email1") | ||||
|  | ||||
|         from pprint import pprint | ||||
|  | ||||
|         pprint(returned_account1) | ||||
|  | ||||
|         self.assertEqual(returned_account1.name, account1["name"]) | ||||
|         self.assertEqual(returned_account1.username, account1["username"]) | ||||
|         self.assertEqual(returned_account1.password, account1["password"]) | ||||
|         self.assertEqual(returned_account1.imap_server, account1["imap_server"]) | ||||
|         self.assertEqual(returned_account1.imap_port, account1["imap_port"]) | ||||
|         self.assertEqual(returned_account1.imap_security, account1["imap_security"]) | ||||
|         self.assertEqual(returned_account1.character_set, account1["character_set"]) | ||||
|  | ||||
|     def test_delete_mail_account(self): | ||||
|         """ | ||||
|         GIVEN: | ||||
|             - Existing mail account | ||||
|         WHEN: | ||||
|             - API request is made to delete a mail account | ||||
|         THEN: | ||||
|             - Account is deleted | ||||
|         """ | ||||
|  | ||||
|         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", | ||||
|         ) | ||||
|  | ||||
|         response = self.client.delete( | ||||
|             f"{self.ENDPOINT}{account1.pk}/", | ||||
|         ) | ||||
|  | ||||
|         self.assertEqual(response.status_code, 204) | ||||
|  | ||||
|         self.assertEqual(len(MailAccount.objects.all()), 0) | ||||
|  | ||||
|     def test_update_mail_account(self): | ||||
|         """ | ||||
|         GIVEN: | ||||
|             - Existing mail accounts | ||||
|         WHEN: | ||||
|             - API request is made to update mail account | ||||
|         THEN: | ||||
|             - The mail account is updated, password only updated if not '****' | ||||
|         """ | ||||
|  | ||||
|         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", | ||||
|         ) | ||||
|  | ||||
|         response = self.client.patch( | ||||
|             f"{self.ENDPOINT}{account1.pk}/", | ||||
|             data={ | ||||
|                 "name": "Updated Name 1", | ||||
|                 "password": "******", | ||||
|             }, | ||||
|         ) | ||||
|  | ||||
|         self.assertEqual(response.status_code, 200) | ||||
|  | ||||
|         returned_account1 = MailAccount.objects.get(pk=account1.pk) | ||||
|         self.assertEqual(returned_account1.name, "Updated Name 1") | ||||
|         self.assertEqual(returned_account1.password, account1.password) | ||||
|  | ||||
|         response = self.client.patch( | ||||
|             f"{self.ENDPOINT}{account1.pk}/", | ||||
|             data={ | ||||
|                 "name": "Updated Name 2", | ||||
|                 "password": "123xyz", | ||||
|             }, | ||||
|         ) | ||||
|  | ||||
|         self.assertEqual(response.status_code, 200) | ||||
|  | ||||
|         returned_account2 = MailAccount.objects.get(pk=account1.pk) | ||||
|         self.assertEqual(returned_account2.name, "Updated Name 2") | ||||
|         self.assertEqual(returned_account2.password, "123xyz") | ||||
|  | ||||
|  | ||||
| class TestAPIMailRules(APITestCase): | ||||
|     ENDPOINT = "/api/mail_rules/" | ||||
|  | ||||
|     def setUp(self): | ||||
|         super().setUp() | ||||
|  | ||||
|         self.user = User.objects.create_superuser(username="temp_admin") | ||||
|         self.client.force_authenticate(user=self.user) | ||||
|  | ||||
|     def test_get_mail_rules(self): | ||||
|         """ | ||||
|         GIVEN: | ||||
|             - Configured mail accounts and rules | ||||
|         WHEN: | ||||
|             - API call is made to get mail rules | ||||
|         THEN: | ||||
|             - Configured mail rules are provided | ||||
|         """ | ||||
|  | ||||
|         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_subject="subject", | ||||
|             filter_body="body", | ||||
|             filter_attachment_filename="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.get(self.ENDPOINT) | ||||
|  | ||||
|         self.assertEqual(response.status_code, 200) | ||||
|         self.assertEqual(response.data["count"], 1) | ||||
|         returned_rule1 = response.data["results"][0] | ||||
|  | ||||
|         from pprint import pprint | ||||
|  | ||||
|         pprint(returned_rule1) | ||||
|  | ||||
|         self.assertEqual(returned_rule1["name"], rule1.name) | ||||
|         self.assertEqual(returned_rule1["account"], account1.pk) | ||||
|         self.assertEqual(returned_rule1["folder"], rule1.folder) | ||||
|         self.assertEqual(returned_rule1["filter_from"], rule1.filter_from) | ||||
|         self.assertEqual(returned_rule1["filter_subject"], rule1.filter_subject) | ||||
|         self.assertEqual(returned_rule1["filter_body"], rule1.filter_body) | ||||
|         self.assertEqual( | ||||
|             returned_rule1["filter_attachment_filename"], | ||||
|             rule1.filter_attachment_filename, | ||||
|         ) | ||||
|         self.assertEqual(returned_rule1["maximum_age"], rule1.maximum_age) | ||||
|         self.assertEqual(returned_rule1["action"], rule1.action) | ||||
|         self.assertEqual(returned_rule1["assign_title_from"], rule1.assign_title_from) | ||||
|         self.assertEqual( | ||||
|             returned_rule1["assign_correspondent_from"], | ||||
|             rule1.assign_correspondent_from, | ||||
|         ) | ||||
|         self.assertEqual(returned_rule1["order"], rule1.order) | ||||
|         self.assertEqual(returned_rule1["attachment_type"], rule1.attachment_type) | ||||
|  | ||||
|     def test_create_mail_rule(self): | ||||
|         """ | ||||
|         GIVEN: | ||||
|             - Configured mail account exists | ||||
|         WHEN: | ||||
|             - API request is made to add a mail rule | ||||
|         THEN: | ||||
|             - A new mail rule is created | ||||
|         """ | ||||
|  | ||||
|         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", | ||||
|         ) | ||||
|  | ||||
|         tag = Tag.objects.create( | ||||
|             name="t", | ||||
|         ) | ||||
|  | ||||
|         correspondent = Correspondent.objects.create( | ||||
|             name="c", | ||||
|         ) | ||||
|  | ||||
|         document_type = DocumentType.objects.create( | ||||
|             name="dt", | ||||
|         ) | ||||
|  | ||||
|         rule1 = { | ||||
|             "name": "Rule1", | ||||
|             "account": account1.pk, | ||||
|             "folder": "INBOX", | ||||
|             "filter_from": "from@example.com", | ||||
|             "filter_subject": "subject", | ||||
|             "filter_body": "body", | ||||
|             "filter_attachment_filename": "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, | ||||
|             "action_parameter": "parameter", | ||||
|             "assign_tags": [tag.pk], | ||||
|             "assign_correspondent": correspondent.pk, | ||||
|             "assign_document_type": document_type.pk, | ||||
|         } | ||||
|  | ||||
|         response = self.client.post( | ||||
|             self.ENDPOINT, | ||||
|             data=rule1, | ||||
|         ) | ||||
|  | ||||
|         self.assertEqual(response.status_code, 201) | ||||
|  | ||||
|         response = self.client.get(self.ENDPOINT) | ||||
|  | ||||
|         self.assertEqual(response.status_code, 200) | ||||
|         self.assertEqual(response.data["count"], 1) | ||||
|         returned_rule1 = response.data["results"][0] | ||||
|  | ||||
|         from pprint import pprint | ||||
|  | ||||
|         pprint(returned_rule1) | ||||
|  | ||||
|         self.assertEqual(returned_rule1["name"], rule1["name"]) | ||||
|         self.assertEqual(returned_rule1["account"], account1.pk) | ||||
|         self.assertEqual(returned_rule1["folder"], rule1["folder"]) | ||||
|         self.assertEqual(returned_rule1["filter_from"], rule1["filter_from"]) | ||||
|         self.assertEqual(returned_rule1["filter_subject"], rule1["filter_subject"]) | ||||
|         self.assertEqual(returned_rule1["filter_body"], rule1["filter_body"]) | ||||
|         self.assertEqual( | ||||
|             returned_rule1["filter_attachment_filename"], | ||||
|             rule1["filter_attachment_filename"], | ||||
|         ) | ||||
|         self.assertEqual(returned_rule1["maximum_age"], rule1["maximum_age"]) | ||||
|         self.assertEqual(returned_rule1["action"], rule1["action"]) | ||||
|         self.assertEqual( | ||||
|             returned_rule1["assign_title_from"], | ||||
|             rule1["assign_title_from"], | ||||
|         ) | ||||
|         self.assertEqual( | ||||
|             returned_rule1["assign_correspondent_from"], | ||||
|             rule1["assign_correspondent_from"], | ||||
|         ) | ||||
|         self.assertEqual(returned_rule1["order"], rule1["order"]) | ||||
|         self.assertEqual(returned_rule1["attachment_type"], rule1["attachment_type"]) | ||||
|         self.assertEqual(returned_rule1["action_parameter"], rule1["action_parameter"]) | ||||
|         self.assertEqual( | ||||
|             returned_rule1["assign_correspondent"], | ||||
|             rule1["assign_correspondent"], | ||||
|         ) | ||||
|         self.assertEqual( | ||||
|             returned_rule1["assign_document_type"], | ||||
|             rule1["assign_document_type"], | ||||
|         ) | ||||
|         self.assertEqual(returned_rule1["assign_tags"], rule1["assign_tags"]) | ||||
|  | ||||
|     def test_delete_mail_rule(self): | ||||
|         """ | ||||
|         GIVEN: | ||||
|             - Existing mail rule | ||||
|         WHEN: | ||||
|             - API request is made to delete a mail rule | ||||
|         THEN: | ||||
|             - Rule is deleted | ||||
|         """ | ||||
|  | ||||
|         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_subject="subject", | ||||
|             filter_body="body", | ||||
|             filter_attachment_filename="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.delete( | ||||
|             f"{self.ENDPOINT}{rule1.pk}/", | ||||
|         ) | ||||
|  | ||||
|         self.assertEqual(response.status_code, 204) | ||||
|  | ||||
|         self.assertEqual(len(MailRule.objects.all()), 0) | ||||
|  | ||||
|     def test_update_mail_rule(self): | ||||
|         """ | ||||
|         GIVEN: | ||||
|             - Existing mail rule | ||||
|         WHEN: | ||||
|             - API request is made to update mail rule | ||||
|         THEN: | ||||
|             - The mail rule is updated | ||||
|         """ | ||||
|  | ||||
|         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_subject="subject", | ||||
|             filter_body="body", | ||||
|             filter_attachment_filename="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.patch( | ||||
|             f"{self.ENDPOINT}{rule1.pk}/", | ||||
|             data={ | ||||
|                 "name": "Updated Name 1", | ||||
|                 "action": MailRule.MailAction.DELETE, | ||||
|             }, | ||||
|         ) | ||||
|  | ||||
|         self.assertEqual(response.status_code, 200) | ||||
|  | ||||
|         returned_rule1 = MailRule.objects.get(pk=rule1.pk) | ||||
|         self.assertEqual(returned_rule1.name, "Updated Name 1") | ||||
|         self.assertEqual(returned_rule1.action, MailRule.MailAction.DELETE) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Michael Shamoon
					Michael Shamoon