diff --git a/modoboa/webmail/mocks.py b/modoboa/webmail/mocks.py index 6d09b9dd2..6a9efa92f 100644 --- a/modoboa/webmail/mocks.py +++ b/modoboa/webmail/mocks.py @@ -1,5 +1,6 @@ """Mock objects.""" +from modoboa.webmail import constants from modoboa.webmail.tests import data as tests_data @@ -43,7 +44,10 @@ class IMAP4Mock: return "OK", [b"19"] elif command == "FETCH": uid = int(args[0]) - data = tests_data.BODYSTRUCTURE_SAMPLE_WITH_FLAGS + if constants.CUSTOM_HEADER_SCHEDULED_ID.upper() in args[1]: + data = tests_data.BODYSTRUCTURE_SAMPLE_SCHEDULED + else: + data = tests_data.BODYSTRUCTURE_SAMPLE_WITH_FLAGS if uid == 46931: if args[1] == "(BODYSTRUCTURE)": data = tests_data.BODYSTRUCTURE_ONLY_4 @@ -62,7 +66,12 @@ class IMAP4Mock: if args[1] == "(BODYSTRUCTURE)": data = tests_data.BODYSTRUCTURE_EMPTY_MAIL elif "HEADER.FIELDS" in args[1]: - data = tests_data.BODYSTRUCTURE_EMPTY_MAIL_WITH_HEADERS + if constants.CUSTOM_HEADER_SCHEDULED_DATETIME.upper() in args[1]: + data = ( + tests_data.BODYSTRUCTURE_EMPTY_MAIL_WITH_HEADERS_SCHEDULED + ) + else: + data = tests_data.BODYSTRUCTURE_EMPTY_MAIL_WITH_HEADERS else: data = tests_data.EMPTY_BODY elif uid == 3444: diff --git a/modoboa/webmail/tests/data.py b/modoboa/webmail/tests/data.py index 09a84d5a0..1925a837f 100644 --- a/modoboa/webmail/tests/data.py +++ b/modoboa/webmail/tests/data.py @@ -110,6 +110,18 @@ BODYSTRUCTURE_SAMPLE_WITH_FLAGS = [ b")", ] +BODYSTRUCTURE_SAMPLE_SCHEDULED = [ + ( + b'19 (UID 19 FLAGS (\\Seen) RFC822.SIZE 100000 BODYSTRUCTURE (("text" "plain" ("charset" "ISO-8859-1" "format" "flowed") NIL NIL "7bit" 2 1 NIL NIL NIL NIL)("message" "rfc822" ("name*" "ISO-8859-1\'\'%5B%49%4E%53%43%52%49%50%54%49%4F%4E%5D%20%52%E9%63%E9%70%74%69%6F%6E%20%64%65%20%76%6F%74%72%65%20%64%6F%73%73%69%65%72%20%64%27%69%6E%73%63%72%69%70%74%69%6F%6E%20%46%72%65%65%20%48%61%75%74%20%44%E9%62%69%74") NIL NIL "8bit" 3632 ("Wed, 13 Dec 2006 20:30:02 +0100" {70}', # noqa + b"[INSCRIPTION] R\xe9c\xe9ption de votre dossier d'inscription Free Haut D\xe9bit", + ), # noqa + ( + b' (("Free Haut Debit" NIL "inscription" "freetelecom.fr")) (("Free Haut Debit" NIL "inscription" "freetelecom.fr")) ((NIL NIL "hautdebit" "freetelecom.fr")) ((NIL NIL "nguyen.antoine" "wanadoo.fr")) NIL NIL NIL "<20061213193125.9DA0919AC@dgroup2-2.proxad.net>") ("text" "plain" ("charset" "iso-8859-1") NIL NIL "8bit" 1428 38 NIL ("inline" NIL) NIL NIL) 76 NIL ("inline" ("filename*" "ISO-8859-1\'\'%5B%49%4E%53%43%52%49%50%54%49%4F%4E%5D%20%52%E9%63%E9%70%74%69%6F%6E%20%64%65%20%76%6F%74%72%65%20%64%6F%73%73%69%65%72%20%64%27%69%6E%73%63%72%69%70%74%69%6F%6E%20%46%72%65%65%20%48%61%75%74%20%44%E9%62%69%74")) NIL NIL) "mixed" ("boundary" "------------040706080908000209030901") NIL NIL NIL) BODY[HEADER.FIELDS (DATE FROM TO CC SUBJECT X-SCHEDULED-ID X-SCHEDULED-DATETIME)] {348}', # noqa + b"Date: Tue, 19 Dec 2006 19:50:13 +0100\r\nFrom: Antoine Nguyen \r\nTo: Antoine Nguyen \r\nSubject: [Fwd: [INSCRIPTION] =?ISO-8859-1?Q?R=E9c=E9ption_de_votre_?=\r\n =?ISO-8859-1?Q?dossier_d=27inscription_Free_Haut_D=E9bit=5D?=\r\nX-Scheduled-ID: 1123\r\nX-Scheduled-Datetime: 2026-02-02T15:37:59.022298+00:00\r\n\r\n", + ), + b")", +] + EMPTY_BODYSTRUCTURE = 'BODYSTRUCTURE (("text" "plain" ("charset" "us-ascii") NIL NIL "quoted-printable" 0 0 NIL NIL NIL NIL)("application" "zip" ("name" "hotmail.com!ngyn.org!1435428000!1435514400.zip") NIL NIL "base64" 978 NIL ("attachment" ("filename" "hotmail.com!ngyn.org!1435428000!1435514400.zip")) NIL NIL) "mixed" ("boundary" "--boundary_32281_b52cf564-2a50-4f96-aeb0-ef5f83b05463") NIL NIL NIL)' BODYSTRUCTURE_EMPTY_MAIL = [bytes(f"33 (UID 33 {EMPTY_BODYSTRUCTURE})", "utf-8")] @@ -123,6 +135,15 @@ BODYSTRUCTURE_EMPTY_MAIL_WITH_HEADERS = [ b")", ] +BODYSTRUCTURE_EMPTY_MAIL_WITH_HEADERS_SCHEDULED = [ + ( + bytes(f"33 (UID 33 {EMPTY_BODYSTRUCTURE}", "utf-8") + + b" BODY[HEADER.FIELDS (FROM TO CC DATE SUBJECT X-SCHEDULED-DATETIME)] {293}", + b"From: \r\nTo: \r\nCc: \r\nSubject: Notre contact du 28/12/2011 - 192175092\r\nDate: Wed, 28 Dec 2011 13:29:17 +0100\r\nMessage-ID: \r\nX-Scheduled-Datetime: 2026-02-02T15:37:59.022298+00:00\r\n\r\n", + ), + b")", +] + EMPTY_BODY = [(b"33 (UID 33 BODY[1] {0}", b""), b")"] BODYSTRUCTURE_WITH_PDF = [ diff --git a/modoboa/webmail/tests/test_viewsets.py b/modoboa/webmail/tests/test_viewsets.py index 96e78ec50..6801256cf 100644 --- a/modoboa/webmail/tests/test_viewsets.py +++ b/modoboa/webmail/tests/test_viewsets.py @@ -255,6 +255,11 @@ class UserEmailViewSetTestCase(WebmailTestCase): self.assertEqual(response.status_code, 200) self.assertTrue(response.json()["subject"].startswith("Fwd:")) + # Scheduled message + response = self.client.get(f"{url}?mailbox=Scheduled&mailid=33") + self.assertEqual(response.status_code, 200) + self.assertIn("scheduled_datetime", response.json()) + def test_attachment(self): self.authenticate() url = reverse("v2:webmail-email-attachment") @@ -445,6 +450,16 @@ class ScheduledMessageViewSetTestCase(WebmailTestCase): account=self.user, scheduled_datetime=timezone.now() ) + def test_listmailbox(self): + self.authenticate() + url = reverse("v2:webmail-email-list") + response = self.client.get(f"{url}?mailbox=Scheduled") + self.assertEqual(response.status_code, 200) + content = response.json() + self.assertEqual(content["count"], 1) + self.assertEqual(content["results"][0]["scheduled_id"], 1123) + self.assertIn("scheduled_datetime_raw", content["results"][0]) + def test_delete(self): self.authenticate() url = reverse("v2:webmail-scheduled-message-detail", args=[self.message.id])