diff options
Diffstat (limited to 'comm/mailnews/imap/test/unit/test_ImapResponse.js')
-rw-r--r-- | comm/mailnews/imap/test/unit/test_ImapResponse.js | 288 |
1 files changed, 288 insertions, 0 deletions
diff --git a/comm/mailnews/imap/test/unit/test_ImapResponse.js b/comm/mailnews/imap/test/unit/test_ImapResponse.js new file mode 100644 index 0000000000..4dd60e6d32 --- /dev/null +++ b/comm/mailnews/imap/test/unit/test_ImapResponse.js @@ -0,0 +1,288 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +var { ImapResponse } = ChromeUtils.import( + "resource:///modules/ImapResponse.jsm" +); +var { ImapUtils } = ChromeUtils.import("resource:///modules/ImapUtils.jsm"); + +/** + * Test CAPABILITY response can be correctly parsed. + */ +add_task(function test_CapabilityResponse() { + let response = new ImapResponse(); + response.parse( + "32 OK [CAPABILITY IMAP4rev1 IDLE STARTTLS AUTH=LOGIN AUTH=PLAIN] server ready\r\n" + ); + + deepEqual(response.authMethods, ["LOGIN", "PLAIN"]); + deepEqual(response.capabilities, ["IMAP4REV1", "IDLE", "STARTTLS"]); + + response = new ImapResponse(); + response.parse("* CAPABILITY IMAP4rev1 ID IDLE STARTTLS AUTH=PLAIN\r\n"); + + deepEqual(response.authMethods, ["PLAIN"]); + deepEqual(response.capabilities, ["IMAP4REV1", "ID", "IDLE", "STARTTLS"]); +}); + +/** + * Test flags from a FETCH response can be correctly parsed. + */ +add_task(function test_FetchResponse_flags() { + let response = new ImapResponse(); + response.parse( + [ + "* 1 FETCH (UID 500 FLAGS (\\Answered \\Seen $Forwarded))", + "* 2 FETCH (UID 600 FLAGS (\\Seen))", + "", + ].join("\r\n") + ); + ok(!response.done); + + response.parse( + ["* 3 FETCH (UID 601 FLAGS ())", "40 OK Fetch completed", ""].join("\r\n") + ); + + ok(response.done); + deepEqual(response.messages[0], { + sequence: 1, + uid: 500, + flags: + ImapUtils.FLAG_ANSWERED | ImapUtils.FLAG_SEEN | ImapUtils.FLAG_FORWARDED, + keywords: "$Forwarded", + customAttributes: {}, + }); + deepEqual(response.messages[1], { + sequence: 2, + uid: 600, + flags: ImapUtils.FLAG_SEEN, + keywords: "", + customAttributes: {}, + }); + deepEqual(response.messages[2], { + sequence: 3, + uid: 601, + flags: 0, + keywords: "", + customAttributes: {}, + }); +}); + +/** + * Test body from a FETCH response can be correctly parsed. + */ +add_task(function test_messageBody() { + let response = new ImapResponse(); + response.parse( + [ + "* 1 FETCH (UID 500 FLAGS (\\Answered \\Seen $Forwarded) BODY[HEADER.FIELDS (FROM TO)] {12}", + "abcd", + "efgh", + ")", + "* 2 FETCH (UID 600 FLAGS (\\Seen) BODY[] {15}", + "Hello ", + "world", + ")", + "40 OK Fetch completed", + "", + ].join("\r\n") + ); + + equal(response.messages[0].body, "abcd\r\nefgh\r\n"); + equal(response.messages[1].body, "Hello \r\nworld\r\n"); +}); + +/** + * Test msg body spanning multiple chuncks can be correctly parsed. + */ +add_task(function test_messageBodyIncremental() { + let response = new ImapResponse(); + // Chunk 1. + response.parse( + [ + "* 1 FETCH (UID 500 FLAGS (\\Answered \\Seen $Forwarded) BODY[HEADER.FIELDS (FROM TO)] {12}", + "abcd", + "efgh", + ")", + "* 2 FETCH (UID 600 FLAGS (\\Seen) BODY[] {15}", + "Hel", + ].join("\r\n") + ); + equal(response.messages[0].body, "abcd\r\nefgh\r\n"); + ok(!response.done); + + // Chunk 2. + response.parse("lo \r\nworld\r\n"); + ok(!response.done); + + // Chunk 3. + response.parse(")\r\n40 OK Fetch completed\r\n"); + ok(response.done); + equal(response.messages[1].body, "Hello \r\nworld\r\n"); +}); + +/** + * Test FLAGS response can be correctly parsed. + */ +add_task(function test_FlagsResponse() { + let response = new ImapResponse(); + response.parse( + [ + "* FLAGS (\\Seen \\Draft $Forwarded)", + "* OK [PERMANENTFLAGS (\\Seen \\Draft $Forwarded \\*)] Flags permitted.", + "* 6 EXISTS", + "* OK [UNSEEN 2] First unseen.", + "* OK [UIDVALIDITY 1594877893] UIDs valid", + "* OK [UIDNEXT 625] Predicted next UID", + "* OK [HIGHESTMODSEQ 1148] Highest", + "42 OK [READ-WRITE] Select completed", + "", + ].join("\r\n") + ); + + equal( + response.flags, + ImapUtils.FLAG_SEEN | ImapUtils.FLAG_DRAFT | ImapUtils.FLAG_FORWARDED + ); + equal( + response.permanentflags, + ImapUtils.FLAG_SEEN | + ImapUtils.FLAG_DRAFT | + ImapUtils.FLAG_FORWARDED | + ImapUtils.FLAG_LABEL | + ImapUtils.FLAG_MDN_SENT | + ImapUtils.FLAG_FORWARDED | + ImapUtils.FLAG_SUPPORT_USER_FLAG + ); + equal(response.highestmodseq, 1148); + equal(response.exists, 6); +}); + +/** + * Test mailbox updates can be correctly parsed. + */ +add_task(function test_MailboxResponse() { + let response = new ImapResponse(); + response.parse("* 7 EXISTS\r\n"); + response.parse("* 1 EXPUNGE\r\n* 3 EXPUNGE\r\n"); + equal(response.exists, 7); + deepEqual(response.expunged, [1, 3]); +}); + +/** + * Test LIST response can be correctly parsed. + */ +add_task(function test_ListResponse() { + let response = new ImapResponse(); + response.parse( + [ + '* LIST (\\Subscribed \\NoInferiors \\Marked \\Trash) "/" "Trash"', + '* LIST () "/" "a \\"b\\" c"', + '* LIST (\\Subscribed) "/" INBOX', + "84 OK List completed (0.002 + 0.000 + 0.001 secs).", + "", + ].join("\r\n") + ); + equal(response.mailboxes.length, 3); + deepEqual(response.mailboxes[0], { + name: "Trash", + delimiter: "/", + flags: + ImapUtils.FLAG_SUBSCRIBED | + ImapUtils.FLAG_NO_INFERIORS | + ImapUtils.FLAG_HAS_NO_CHILDREN | + ImapUtils.FLAG_MARKED | + ImapUtils.FLAG_IMAP_TRASH | + ImapUtils.FLAG_IMAP_XLIST_TRASH, + }); + deepEqual(response.mailboxes[1], { + name: 'a "b" c', + delimiter: "/", + flags: 0, + }); + deepEqual(response.mailboxes[2], { + name: "INBOX", + delimiter: "/", + flags: ImapUtils.FLAG_SUBSCRIBED, + }); +}); + +/** + * Test folder names containg [] or () or "" can be correctly parsed. + */ +add_task(function test_parseFolderNames() { + let response = new ImapResponse(); + response.parse( + [ + '* LSUB () "/" "[Gmail]"', + '* LSUB () "/" "[Gmail]/All Mail"', + '* LSUB () "/" "[Gmail]/Sent"', + '* LSUB () "/" "[a(b)])"', + '* LSUB () "/" "a \\"b \\"c\\""', + "84 OK LSUB completed", + "", + ].join("\r\n") + ); + equal(response.mailboxes.length, 5); + deepEqual( + response.mailboxes.map(x => x.name), + ["[Gmail]", "[Gmail]/All Mail", "[Gmail]/Sent", "[a(b)])", 'a "b "c"'] + ); +}); + +/** + * Test STATUS response can be correctly parsed. + */ +add_task(function test_StatusResponse() { + let response = new ImapResponse(); + response.parse( + '* STATUS "sub folder 2" (UIDNEXT 2 MESSAGES 1 UNSEEN 1 RECENT 0)\r\n' + ); + deepEqual(response.attributes, { + mailbox: "sub folder 2", + uidnext: 2, + messages: 1, + unseen: 1, + recent: 0, + }); +}); + +/** + * Test GETQUOTAROOT response can be correctly parsed. + */ +add_task(function test_QuotaResponse() { + let response = new ImapResponse(); + response.parse( + ["* QUOTAROOT Sent INBOX", "* QUOTA INBOX (STORAGE 123 456)", ""].join( + "\r\n" + ) + ); + deepEqual(response.quotaRoots, ["INBOX"]); + deepEqual(response.quotas, [["INBOX", "STORAGE", 123, 456]]); +}); + +/** + * Test IDLE and DONE response can be correctly parsed. + */ +add_task(function test_IdleDoneResponse() { + let response = new ImapResponse(); + response.parse("+ idling\r\n"); + deepEqual( + [response.tag, response.status, response.done], + ["+", "idling", true] + ); + + response = new ImapResponse(); + response.parse(["+ idling", "75 OK Completed", ""].join("\r\n")); + deepEqual([response.tag, response.status, response.done], [75, "OK", true]); +}); + +/** + * Test SEARCH response can be correctly parsed. + */ +add_task(function test_SearchResponse() { + let response = new ImapResponse(); + response.parse("* SEARCH 1 4 9\r\n90 OK SEARCH COMPLETED\r\n"); + deepEqual(response.search, [1, 4, 9]); +}); |