"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}`); } } }); }); }); };