Refactor tests (WIP)
parent
7344b45be0
commit
3e532e3ff6
@ -1,4 +1,4 @@
|
|||||||
{
|
{
|
||||||
"extends": "@joepie91/eslint-config",
|
"extends": "@joepie91/eslint-config",
|
||||||
"ignorePatterns": "test/**"
|
"ignorePatterns": "test-old/**"
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,45 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
const Promise = require("bluebird");
|
||||||
|
const pEvent = require("p-event");
|
||||||
|
const pStream = require("p-stream");
|
||||||
|
|
||||||
|
module.exports = function fetch(client, args, options = {}) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
let attributeResults = [];
|
||||||
|
let bodyInfoResults = [];
|
||||||
|
let bodyPromises = [];
|
||||||
|
|
||||||
|
let fetchOp = client.seq.fetch(... args);
|
||||||
|
|
||||||
|
fetchOp.on("end", () => {
|
||||||
|
resolve(Promise.try(() => {
|
||||||
|
if (options.onEnd != null) {
|
||||||
|
return options.onEnd();
|
||||||
|
}
|
||||||
|
}).then(() => {
|
||||||
|
return Promise.all(bodyPromises);
|
||||||
|
}).then((bodies) => {
|
||||||
|
return {
|
||||||
|
attributeResults,
|
||||||
|
bodyInfoResults,
|
||||||
|
bodies
|
||||||
|
};
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
|
||||||
|
fetchOp.on("message", (message) => {
|
||||||
|
message.on("attributes", (attributes) => {
|
||||||
|
attributeResults.push(attributes);
|
||||||
|
});
|
||||||
|
|
||||||
|
message.on("body", (bodyStream, info) => {
|
||||||
|
bodyInfoResults.push(info);
|
||||||
|
|
||||||
|
bodyPromises.push(pStream(bodyStream));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
pEvent(fetchOp, "error").then(reject);
|
||||||
|
});
|
||||||
|
};
|
@ -0,0 +1,9 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
module.exports = function concatenateLines(lines, includeTrailingNewline = true) {
|
||||||
|
let allLines = (includeTrailingNewline)
|
||||||
|
? lines.concat([ "" ])
|
||||||
|
: lines;
|
||||||
|
|
||||||
|
return allLines.filter((line) => line != null).join("\r\n");
|
||||||
|
};
|
@ -0,0 +1,66 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
const net = require("net");
|
||||||
|
const Promise = require("bluebird");
|
||||||
|
const chalk = require("chalk");
|
||||||
|
|
||||||
|
const CRLF = "\r\n";
|
||||||
|
|
||||||
|
module.exports = function createMockServer({ steps, test, handle = ()=>{} }) {
|
||||||
|
let counter = 0;
|
||||||
|
|
||||||
|
const server = net.createServer((socket) => {
|
||||||
|
let buffer = "";
|
||||||
|
|
||||||
|
socket.write("* OK asdf\r\n");
|
||||||
|
|
||||||
|
socket.on("data", (data) => {
|
||||||
|
buffer += data.toString("utf8");
|
||||||
|
|
||||||
|
if (buffer.includes(CRLF)) {
|
||||||
|
let lines = buffer.split(CRLF);
|
||||||
|
buffer = lines.pop();
|
||||||
|
|
||||||
|
Promise.map(lines, (line) => {
|
||||||
|
return Promise.try(() => {
|
||||||
|
console.log(chalk.gray(line));
|
||||||
|
|
||||||
|
return handle(line);
|
||||||
|
}).then((result) => {
|
||||||
|
if (result == null) {
|
||||||
|
let step = steps[counter];
|
||||||
|
counter += 1;
|
||||||
|
|
||||||
|
if (step.expected != null) {
|
||||||
|
test.same(line, step.expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (typeof step.response === "function")
|
||||||
|
? step.response()
|
||||||
|
: step.response;
|
||||||
|
} else {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}).then((response) => {
|
||||||
|
socket.write(response);
|
||||||
|
});
|
||||||
|
}, { concurrency: 1 });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
server.listen(0, "127.0.0.1", () => {
|
||||||
|
// FIXME: Error condition?
|
||||||
|
resolve({
|
||||||
|
server: server,
|
||||||
|
port: server.address().port,
|
||||||
|
finalize: function () {
|
||||||
|
if (counter < steps.length) {
|
||||||
|
test.ok(false, `Mock server expected ${steps.length} steps but only saw ${counter}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
@ -0,0 +1,150 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
const Promise = require("bluebird");
|
||||||
|
const tap = require("tap");
|
||||||
|
const pEvent = require("p-event");
|
||||||
|
const IMAP = require("../..");
|
||||||
|
|
||||||
|
const lines = require("../lines");
|
||||||
|
const createMockServer = require("../mock-server");
|
||||||
|
const fetch = require("../fetch");
|
||||||
|
|
||||||
|
tap.test("fetch-with-uid", (test) => {
|
||||||
|
return testFetch(test, true, false);
|
||||||
|
});
|
||||||
|
|
||||||
|
tap.test("fetch-without-uid", (test) => {
|
||||||
|
return testFetch(test, false, false);
|
||||||
|
});
|
||||||
|
|
||||||
|
tap.test("fetch-with-body", (test) => {
|
||||||
|
return testFetch(test, true, true);
|
||||||
|
});
|
||||||
|
|
||||||
|
function testFetch(test, withUID, withBody) {
|
||||||
|
let steps = [{
|
||||||
|
expected: 'A0 CAPABILITY',
|
||||||
|
response: lines([
|
||||||
|
'* CAPABILITY IMAP4rev1 UNSELECT IDLE NAMESPACE QUOTA CHILDREN',
|
||||||
|
'A0 OK Thats all she wrote!',
|
||||||
|
]),
|
||||||
|
}, {
|
||||||
|
expected: 'A1 LOGIN "foo" "bar"',
|
||||||
|
response: lines([
|
||||||
|
'* CAPABILITY IMAP4rev1 UNSELECT IDLE NAMESPACE QUOTA CHILDREN UIDPLUS MOVE',
|
||||||
|
'A1 OK authenticated (Success)',
|
||||||
|
]),
|
||||||
|
}, {
|
||||||
|
expected: 'A2 NAMESPACE',
|
||||||
|
response: lines([
|
||||||
|
'* NAMESPACE (("" "/")) NIL NIL',
|
||||||
|
'A2 OK Success',
|
||||||
|
]),
|
||||||
|
}, {
|
||||||
|
expected: 'A3 LIST "" ""',
|
||||||
|
response: lines([
|
||||||
|
'* LIST (\\Noselect) "/" "/"',
|
||||||
|
'A3 OK Success',
|
||||||
|
]),
|
||||||
|
}, {
|
||||||
|
expected: 'A4 EXAMINE "INBOX"',
|
||||||
|
response: lines([
|
||||||
|
'* FLAGS (\\Answered \\Flagged \\Draft \\Deleted \\Seen)',
|
||||||
|
'* OK [PERMANENTFLAGS ()] Flags permitted.',
|
||||||
|
'* OK [UIDVALIDITY 2] UIDs valid.',
|
||||||
|
'* 685 EXISTS',
|
||||||
|
'* 0 RECENT',
|
||||||
|
'* OK [UIDNEXT 4422] Predicted next UID.',
|
||||||
|
'A4 OK [READ-ONLY] INBOX selected. (Success)',
|
||||||
|
]),
|
||||||
|
}, {
|
||||||
|
expected: (withBody)
|
||||||
|
? 'A5 FETCH 1 (UID FLAGS INTERNALDATE BODY.PEEK[TEXT])'
|
||||||
|
: 'A5 FETCH 1 (UID FLAGS INTERNALDATE)',
|
||||||
|
response: lines([
|
||||||
|
'* 1 FETCH (UID 1)',
|
||||||
|
`* 1 FETCH (INTERNALDATE "05-Sep-2004 00:38:03 +0000"${(withUID) ? " UID 1000" : ""})`,
|
||||||
|
(withBody)
|
||||||
|
? '* 1 FETCH (BODY[TEXT] "IMAP is terrible")'
|
||||||
|
: null,
|
||||||
|
'* 1 FETCH (FLAGS (\\Seen))',
|
||||||
|
'A5 OK Success',
|
||||||
|
]),
|
||||||
|
}, {
|
||||||
|
expected: "A6 LOGOUT",
|
||||||
|
response: lines([
|
||||||
|
'* BYE LOGOUT Requested',
|
||||||
|
'A6 OK good day (Success)',
|
||||||
|
]),
|
||||||
|
}];
|
||||||
|
|
||||||
|
return Promise.try(() => {
|
||||||
|
let continuationWasSent;
|
||||||
|
|
||||||
|
return createMockServer({
|
||||||
|
steps: steps,
|
||||||
|
test: test,
|
||||||
|
// NOTE: Anything handled here is not matched against steps, nor is the counter incremented
|
||||||
|
handle: function (line) {
|
||||||
|
if (line === "IDLE IDLE") {
|
||||||
|
continuationWasSent = true;
|
||||||
|
|
||||||
|
return Promise.delay(100).then(() => {
|
||||||
|
return lines([ "+ idling" ]);
|
||||||
|
});
|
||||||
|
} else if (line === "DONE") {
|
||||||
|
test.ok(continuationWasSent, "DONE seen before continuation sent");
|
||||||
|
continuationWasSent = false;
|
||||||
|
return lines([ "IDLE ok" ]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}).then(({ server, port, finalize }) => {
|
||||||
|
const client = new IMAP({
|
||||||
|
user: "foo",
|
||||||
|
password: "bar",
|
||||||
|
host: "127.0.0.1",
|
||||||
|
port: port,
|
||||||
|
keepalive: false
|
||||||
|
});
|
||||||
|
|
||||||
|
Promise.promisifyAll(client, { multiArgs: true });
|
||||||
|
client.connect();
|
||||||
|
|
||||||
|
return Promise.try(() => {
|
||||||
|
return pEvent(client, "ready");
|
||||||
|
}).then(() => {
|
||||||
|
server.close(); // Stop listening for new clients
|
||||||
|
|
||||||
|
return client.openBoxAsync("INBOX", true);
|
||||||
|
}).then(() => {
|
||||||
|
return fetch( client,
|
||||||
|
(withBody)
|
||||||
|
? [ 1, { bodies: [ "TEXT" ] } ]
|
||||||
|
: [ 1 ]
|
||||||
|
);
|
||||||
|
}).tap(() => {
|
||||||
|
client.end();
|
||||||
|
|
||||||
|
return pEvent(client, "end");
|
||||||
|
}).then(({ attributeResults, bodyInfoResults, bodies }) => {
|
||||||
|
finalize();
|
||||||
|
|
||||||
|
test.same(attributeResults, [{
|
||||||
|
uid: 1,
|
||||||
|
date: new Date('05-Sep-2004 00:38:03 +0000'),
|
||||||
|
flags: [ '\\Seen' ]
|
||||||
|
}]);
|
||||||
|
|
||||||
|
if (withBody) {
|
||||||
|
test.same(bodies, [ Buffer.from('IMAP is terrible') ]);
|
||||||
|
|
||||||
|
test.same(bodyInfoResults, [{
|
||||||
|
seqno: 1,
|
||||||
|
which: 'TEXT',
|
||||||
|
size: 16
|
||||||
|
}]);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
@ -0,0 +1,154 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
const Promise = require("bluebird");
|
||||||
|
const tap = require("tap");
|
||||||
|
const pEvent = require("p-event");
|
||||||
|
const IMAP = require("../..");
|
||||||
|
|
||||||
|
const lines = require("../lines");
|
||||||
|
const createMockServer = require("../mock-server");
|
||||||
|
const fetch = require("../fetch");
|
||||||
|
|
||||||
|
tap.test("idle-with-delay", (test) => {
|
||||||
|
return testIdle(test, true);
|
||||||
|
});
|
||||||
|
|
||||||
|
tap.test("idle-without-delay", (test) => {
|
||||||
|
return testIdle(test, false);
|
||||||
|
});
|
||||||
|
|
||||||
|
function testIdle(test, withDelay) {
|
||||||
|
let steps = [{
|
||||||
|
expected: 'A0 CAPABILITY',
|
||||||
|
response: lines([
|
||||||
|
'* CAPABILITY IMAP4rev1 UNSELECT IDLE NAMESPACE QUOTA CHILDREN',
|
||||||
|
'A0 OK Thats all she wrote!',
|
||||||
|
]),
|
||||||
|
}, {
|
||||||
|
expected: 'A1 LOGIN "foo" "bar"',
|
||||||
|
response: lines([
|
||||||
|
'* CAPABILITY IMAP4rev1 UNSELECT IDLE NAMESPACE QUOTA CHILDREN UIDPLUS MOVE',
|
||||||
|
'A1 OK authenticated (Success)',
|
||||||
|
]),
|
||||||
|
}, {
|
||||||
|
expected: 'A2 NAMESPACE',
|
||||||
|
response: lines([
|
||||||
|
'* NAMESPACE (("" "/")) NIL NIL',
|
||||||
|
'A2 OK Success',
|
||||||
|
]),
|
||||||
|
}, {
|
||||||
|
expected: 'A3 LIST "" ""',
|
||||||
|
response: lines([
|
||||||
|
'* LIST (\\Noselect) "/" "/"',
|
||||||
|
'A3 OK Success',
|
||||||
|
]),
|
||||||
|
}, {
|
||||||
|
expected: 'A4 EXAMINE "INBOX"',
|
||||||
|
response: lines([
|
||||||
|
'* FLAGS (\\Answered \\Flagged \\Draft \\Deleted \\Seen)',
|
||||||
|
'* OK [PERMANENTFLAGS ()] Flags permitted.',
|
||||||
|
'* OK [UIDVALIDITY 2] UIDs valid.',
|
||||||
|
'* 685 EXISTS',
|
||||||
|
'* 0 RECENT',
|
||||||
|
'* OK [UIDNEXT 4422] Predicted next UID.',
|
||||||
|
'A4 OK [READ-ONLY] INBOX selected. (Success)'
|
||||||
|
]),
|
||||||
|
}, {
|
||||||
|
expected: 'A5 FETCH 1 (UID FLAGS INTERNALDATE BODY.PEEK[TEXT])',
|
||||||
|
response: lines([
|
||||||
|
'* 1 FETCH (UID 1)',
|
||||||
|
'* 1 FETCH (INTERNALDATE "05-Sep-2004 00:38:03 +0000" UID 1000)',
|
||||||
|
'* 1 FETCH (BODY[TEXT] "IMAP is terrible")',
|
||||||
|
'* 1 FETCH (FLAGS (\\Seen))',
|
||||||
|
'A5 OK Success',
|
||||||
|
]),
|
||||||
|
}, {
|
||||||
|
expected: 'A6 STATUS "test" (MESSAGES RECENT UNSEEN UIDVALIDITY UIDNEXT)',
|
||||||
|
response: lines([
|
||||||
|
'* STATUS test (MESSAGES 231 RECENT 0 UNSEEN 0 UIDVALIDITY 123 UIDNEXT 442)',
|
||||||
|
'A6 OK STATUS completed',
|
||||||
|
]),
|
||||||
|
}, {
|
||||||
|
expected: 'A7 LOGOUT',
|
||||||
|
response: lines([
|
||||||
|
'* BYE LOGOUT Requested',
|
||||||
|
'A7 OK good day (Success)',
|
||||||
|
]),
|
||||||
|
}];
|
||||||
|
|
||||||
|
return Promise.try(() => {
|
||||||
|
let continuationWasSent;
|
||||||
|
|
||||||
|
return createMockServer({
|
||||||
|
steps: steps,
|
||||||
|
test: test,
|
||||||
|
// NOTE: Anything handled here is not matched against steps, nor is the counter incremented
|
||||||
|
handle: function (line) {
|
||||||
|
if (line === "IDLE IDLE") {
|
||||||
|
continuationWasSent = true;
|
||||||
|
|
||||||
|
return Promise.delay(100).then(() => {
|
||||||
|
return lines([ "+ idling" ]);
|
||||||
|
});
|
||||||
|
} else if (line === "DONE") {
|
||||||
|
test.ok(continuationWasSent, "DONE seen before continuation sent");
|
||||||
|
continuationWasSent = false;
|
||||||
|
return lines([ "IDLE ok" ]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}).then(({ server, port, finalize }) => {
|
||||||
|
const client = new IMAP({
|
||||||
|
user: "foo",
|
||||||
|
password: "bar",
|
||||||
|
host: "127.0.0.1",
|
||||||
|
port: port,
|
||||||
|
keepalive: true // NOTE: Different in other tests!
|
||||||
|
});
|
||||||
|
|
||||||
|
Promise.promisifyAll(client, { multiArgs: true });
|
||||||
|
client.connect();
|
||||||
|
|
||||||
|
return Promise.try(() => {
|
||||||
|
return pEvent(client, "ready");
|
||||||
|
}).then(() => {
|
||||||
|
server.close(); // Stop listening for new clients
|
||||||
|
|
||||||
|
return client.openBoxAsync("INBOX", true);
|
||||||
|
}).then(() => {
|
||||||
|
return fetch( client,
|
||||||
|
[ 1, { bodies: [ "TEXT" ] } ]
|
||||||
|
);
|
||||||
|
}).tap(() => {
|
||||||
|
return Promise.try(() => {
|
||||||
|
if (withDelay) {
|
||||||
|
return Promise.delay(500);
|
||||||
|
}
|
||||||
|
}).then(() => {
|
||||||
|
return Promise.try(() => {
|
||||||
|
return client.statusAsync("test");
|
||||||
|
}).then((_status) => {
|
||||||
|
client.end();
|
||||||
|
|
||||||
|
return pEvent(client, "end");
|
||||||
|
}).timeout(500, "Timed out waiting for STATUS");
|
||||||
|
});
|
||||||
|
}).then(({ attributeResults, bodyInfoResults, bodies }) => {
|
||||||
|
finalize();
|
||||||
|
|
||||||
|
test.same(attributeResults, [{
|
||||||
|
uid: 1,
|
||||||
|
date: new Date('05-Sep-2004 00:38:03 +0000'),
|
||||||
|
flags: [ '\\Seen' ]
|
||||||
|
}]);
|
||||||
|
|
||||||
|
test.same(bodies, [ Buffer.from('IMAP is terrible') ]);
|
||||||
|
|
||||||
|
test.same(bodyInfoResults, [{
|
||||||
|
seqno: 1,
|
||||||
|
which: 'TEXT',
|
||||||
|
size: 16
|
||||||
|
}]);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
@ -0,0 +1,245 @@
|
|||||||
|
"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);
|
||||||
|
});
|
||||||
|
});
|
Loading…
Reference in New Issue