"use strict"; const Promise = require("bluebird"); const pEvent = require("p-event"); const tap = require("tap"); const BL = require("bl"); const { Parser } = require("../../lib/Parser"); tap.test("parse-session", (test) => { let session = ` Server: * PREAUTH [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND URL-PARTIAL CATENATE UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS SPECIAL-USE BINARY MOVE ACL RIGHTS=texk] Logged in as m.markov at domain.com Client: 1 LIST "" "*" Server: * LIST (\\HasNoChildren) "/" confirmed-spam Server: * LIST (\\HasNoChildren \\Trash) "/" Trash Server: * LIST (\\HasNoChildren) "/" SpamLikely Server: * LIST (\\HasNoChildren) "/" Spam Server: * LIST (\\HasNoChildren) "/" "Sent Items" Server: * LIST (\\HasNoChildren) "/" Archive Server: * LIST (\\HasNoChildren \\Drafts) "/" Drafts Server: * LIST (\\HasNoChildren) "/" Notes Server: * LIST (\\HasNoChildren) "/" TeamViewer Server: * LIST (\\HasNoChildren \\Sent) "/" "Sent Messages" Server: * LIST (\\HasNoChildren) "/" confirmed-ham Server: * LIST (\\Noselect \\HasChildren) "/" Public Server: * LIST (\\HasNoChildren) "/" Public/office3 Server: * LIST (\\HasNoChildren) "/" Public/office4 Server: * LIST (\\HasNoChildren) "/" Public/support Server: * LIST (\\HasNoChildren) "/" Public/root Server: * LIST (\\HasNoChildren) "/" Public/updates Server: * LIST (\\HasNoChildren) "/" Public/postmaster Server: * LIST (\\Noselect \\HasChildren) "/" Shared Server: * LIST (\\Noselect \\HasChildren) "/" Shared/d.marteva Server: * LIST (\\HasNoChildren) "/" Shared/d.marteva/INBOX Server: * LIST (\\HasNoChildren) "/" INBOX Server: 1 OK List completed. Client: 2 LOGOUT `.replace(/\n/g, "\r\n").replace(/^\t+/gm, ""); let serverSession = session .split("\n") .filter((line) => line.startsWith("Server:")) .map((line) => line.replace(/^Server: /, "")) .join("\n"); let serverBuffer = new BL([ Buffer.from(serverSession) ]); let expectedResults = [{ "type": "preauth", "textCode": { "key": "CAPABILITY", "val": ["IMAP4rev1", "LITERAL+", "SASL-IR", "LOGIN-REFERRALS", "ID", "ENABLE", "IDLE", "SORT", "SORT=DISPLAY", "THREAD=REFERENCES", "THREAD=REFS", "THREAD=ORDEREDSUBJECT", "MULTIAPPEND", "URL-PARTIAL", "CATENATE", "UNSELECT", "CHILDREN", "NAMESPACE", "UIDPLUS", "LIST-EXTENDED", "I18NLEVEL=1", "CONDSTORE", "QRESYNC", "ESEARCH", "ESORT", "SEARCHRES", "WITHIN", "CONTEXT=SEARCH", "LIST-STATUS", "SPECIAL-USE", "BINARY", "MOVE", "ACL", "RIGHTS=texk"] }, "text": "Logged in as m.markov at domain.com" }, { "type": "list", "text": { "flags": ["\\HasNoChildren"], "delimiter": "/", "name": "confirmed-spam" } }, { "type": "list", "text": { "flags": ["\\HasNoChildren", "\\Trash"], "delimiter": "/", "name": "Trash" } }, { "type": "list", "text": { "flags": ["\\HasNoChildren"], "delimiter": "/", "name": "SpamLikely" } }, { "type": "list", "text": { "flags": ["\\HasNoChildren"], "delimiter": "/", "name": "Spam" } }, { "type": "list", "text": { "flags": ["\\HasNoChildren"], "delimiter": "/", "name": "Sent Items" } }, { "type": "list", "text": { "flags": ["\\HasNoChildren"], "delimiter": "/", "name": "Archive" } }, { "type": "list", "text": { "flags": ["\\HasNoChildren", "\\Drafts"], "delimiter": "/", "name": "Drafts" } }, { "type": "list", "text": { "flags": ["\\HasNoChildren"], "delimiter": "/", "name": "Notes" } }, { "type": "list", "text": { "flags": ["\\HasNoChildren"], "delimiter": "/", "name": "TeamViewer" } }, { "type": "list", "text": { "flags": ["\\HasNoChildren", "\\Sent"], "delimiter": "/", "name": "Sent Messages" } }, { "type": "list", "text": { "flags": ["\\HasNoChildren"], "delimiter": "/", "name": "confirmed-ham" } }, { "type": "list", "text": { "flags": ["\\Noselect", "\\HasChildren"], "delimiter": "/", "name": "Public" } }, { "type": "list", "text": { "flags": ["\\HasNoChildren"], "delimiter": "/", "name": "Public/office3" } }, { "type": "list", "text": { "flags": ["\\HasNoChildren"], "delimiter": "/", "name": "Public/office4" } }, { "type": "list", "text": { "flags": ["\\HasNoChildren"], "delimiter": "/", "name": "Public/support" } }, { "type": "list", "text": { "flags": ["\\HasNoChildren"], "delimiter": "/", "name": "Public/root" } }, { "type": "list", "text": { "flags": ["\\HasNoChildren"], "delimiter": "/", "name": "Public/updates" } }, { "type": "list", "text": { "flags": ["\\HasNoChildren"], "delimiter": "/", "name": "Public/postmaster" } }, { "type": "list", "text": { "flags": ["\\Noselect", "\\HasChildren"], "delimiter": "/", "name": "Shared" } }, { "type": "list", "text": { "flags": ["\\Noselect", "\\HasChildren"], "delimiter": "/", "name": "Shared/d.marteva" } }, { "type": "list", "text": { "flags": ["\\HasNoChildren"], "delimiter": "/", "name": "Shared/d.marteva/INBOX" } }, { "type": "list", "text": { "flags": ["\\HasNoChildren"], "delimiter": "/", "name": "INBOX" } }]; let stream = new BL.BufferListStream(serverBuffer); let parser = new Parser(stream); let results = []; parser.on("tagged", (item) => { // console.log("tagged", item); results.push(item); }); parser.on("untagged", (item) => { // console.log("untagged", item); results.push(item); }); parser.on("continue", (... args) => { // console.log("continue", args); }); parser.on("other", (... args) => { // console.log("other", args); }); parser.on("body", (... args) => { // console.log("body", args); }); return Promise.try(() => { // NOTE: Parser does not expose an 'end' event return pEvent(stream, "end"); }).then(() => { // Hack for clearing out `undefined` properties let normalizedResults = JSON.parse(JSON.stringify(results)); test.same(normalizedResults, expectedResults); }); });