marko/test/express/index.test.js
Michael Rawlings 92c448f639 Autotest refactor (#1023)
* update autotest api and first few test suites

* refactor components-browser to use the new autotest api

* minor changes to update adjustIndent and components-pages to new autotest api

* refactor and combine async-render, deprecated-async-fragments, and render suites

* migrate compiler tests to new autotest runner

* migrate components-compilation tests to use new autotest api

* migrate most remaining test runners to new autotest api

* update adjustIndent

* migrate express tests to new autotest api

* switch from compare to snapshot

* move versions into directory

* remove snapshot sequences, prefix to name, suffix to ext

* refactor autotest

* keep node 4 happy: don't use destructured parameters

* use strict

* update contributing document to reflect new autotest api

* better snapshot errors with clickable path

* remove old vdomSkip property, fix some normalization in the render test runner, skip only tests that need to be skipped

* for generated vdom expectations use expected.html instead of rerendering the html template, update expected files that had editor added newlines at the end

* remove half-finished test that was intended to replace another test (render/fixtures/preserveWhitespace-load-option) - we'll keep the original
2018-03-23 11:27:52 -07:00

109 lines
3.3 KiB
JavaScript

"use strict";
require("../__util__/test-init");
const chai = require("chai");
chai.config.includeStack = true;
const expect = chai.expect;
const path = require("path");
const autotest = require("../autotest");
const request = require("request");
const fs = require("fs");
const marko = require("marko");
const markoExpressPath = require.resolve("marko/express");
const shell = require("shelljs");
const execSync = require("child_process").execSync;
const resolveFrom = require("resolve-from");
const fixturesDirectory = path.join(__dirname, "./fixtures");
setup();
autotest("versions/express-4/fixtures", run);
autotest("versions/express-5/fixtures", run);
function run(fixture) {
let test = fixture.test;
let dir = fixture.dir;
let resolve = fixture.resolve;
let snapshot = fixture.snapshot;
test(done => {
var express = require(resolveFrom(dir, "express"));
var mainPath = resolve("test.js");
var templatePath = resolve("template.marko");
var main = fs.existsSync(mainPath) ? require(mainPath) : {};
var loadOptions = main && main.loadOptions;
if (main.checkError) {
var e;
try {
main.createApp(express);
} catch (_e) {
e = _e;
}
if (!e) {
throw new Error("Error expected");
}
main.checkError(e);
return done();
} else if (main.createApp) {
var app = main.createApp(express, markoExpressPath);
var template = marko.load(templatePath, loadOptions);
app.get("/test", main.createController(template));
app.use(function errorHandler(err, req, res, next) {
if (res.headersSent) {
return next(err);
}
res.status(500);
res.end(err.toString());
});
var server = app.listen(0, function(err) {
if (err) {
return done(err);
}
var port = server.address().port;
var address = `http://localhost:${port}/test`;
request(address, function(error, response, body) {
try {
if (main.checkResponse) {
response.body = body;
response.error = error;
main.checkResponse(response, expect, snapshot);
} else {
if (error) {
return done(error);
}
chai.expect(response.statusCode).to.equal(200);
snapshot(body, ".html");
}
} catch (error) {
server.close();
throw error;
}
server.close();
done();
});
});
} else {
main.test(done);
}
});
}
function setup() {
["express-4", "express-5"].forEach(version => {
var versionDirectory = path.join(__dirname, "versions", version);
execSync("npm install", { cwd: versionDirectory });
shell.cp("-R", fixturesDirectory, versionDirectory);
});
}