You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

67 lines
1.4 KiB
JavaScript

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