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