0
0
mirror of https://github.com/sveltejs/svelte.git synced 2024-11-30 00:46:29 +01:00
svelte/test/server-side-rendering/index.js

118 lines
2.8 KiB
JavaScript
Raw Normal View History

2017-06-03 04:04:36 +02:00
import assert from "assert";
import * as fs from "fs";
import * as path from "path";
2017-06-25 20:15:06 +02:00
import glob from 'glob';
2017-06-03 04:04:36 +02:00
import {
showOutput,
2017-06-03 04:04:36 +02:00
loadConfig,
setupHtmlEqual,
tryToLoadJson
} from "../helpers.js";
function tryToReadFile(file) {
try {
2017-06-03 04:04:36 +02:00
return fs.readFileSync(file, "utf-8");
} catch (err) {
if (err.code !== "ENOENT") throw err;
return null;
}
}
2017-06-03 04:04:36 +02:00
describe("ssr", () => {
before(() => {
require(process.env.COVERAGE
? "../../src/server-side-rendering/register.js"
: "../../ssr/register");
2016-12-16 22:17:31 +01:00
return setupHtmlEqual();
});
2017-06-03 04:04:36 +02:00
fs.readdirSync("test/server-side-rendering/samples").forEach(dir => {
if (dir[0] === ".") return;
// add .solo to a sample directory name to only run that test, or
// .show to always show the output. or both
2017-06-03 04:04:36 +02:00
const solo = /\.solo/.test(dir);
let show = /\.show/.test(dir);
2017-06-03 04:04:36 +02:00
if (solo && process.env.CI) {
throw new Error("Forgot to remove `solo: true` from test");
2017-01-04 20:07:05 +01:00
}
2017-06-03 04:04:36 +02:00
(solo ? it.only : it)(dir, () => {
dir = path.resolve("test/server-side-rendering/samples", dir);
const component = require(`${dir}/main.html`);
2017-06-03 04:04:36 +02:00
const expectedHtml = tryToReadFile(`${dir}/_expected.html`);
const expectedCss = tryToReadFile(`${dir}/_expected.css`) || "";
2017-06-03 04:04:36 +02:00
const data = tryToLoadJson(`${dir}/data.json`);
let html;
let css;
let error;
try {
2017-06-03 04:04:36 +02:00
html = component.render(data);
css = component.renderCss().css;
2017-06-03 04:04:36 +02:00
} catch (e) {
show = true;
error = e;
}
if (show) showOutput(dir, { generate: "ssr" });
2017-06-03 04:04:36 +02:00
if (error) throw error;
2017-06-03 04:04:36 +02:00
fs.writeFileSync(`${dir}/_actual.html`, html);
if (css) fs.writeFileSync(`${dir}/_actual.css`, css);
2017-06-25 17:24:24 +02:00
try {
assert.htmlEqual(html, expectedHtml);
assert.equal(
css.replace(/^\s+/gm, ""),
expectedCss.replace(/^\s+/gm, "")
);
} catch (err) {
showOutput(dir, { generate: 'ssr' });
throw err;
}
});
});
// duplicate client-side tests, as far as possible
2017-06-03 04:04:36 +02:00
fs.readdirSync("test/runtime/samples").forEach(dir => {
if (dir[0] === ".") return;
2017-06-03 04:04:36 +02:00
const config = loadConfig(`./runtime/samples/${dir}/_config.js`);
2017-06-03 04:04:36 +02:00
if (config.solo && process.env.CI) {
throw new Error("Forgot to remove `solo: true` from test");
}
2017-01-31 23:35:03 +01:00
2017-06-03 04:04:36 +02:00
if (config["skip-ssr"]) return;
2017-06-03 04:04:36 +02:00
(config.skip ? it.skip : config.solo ? it.only : it)(dir, () => {
const cwd = path.resolve("test/runtime/samples", dir);
2017-06-25 20:15:06 +02:00
glob.sync('**/*.html', { cwd: `test/runtime/samples/${dir}` }).forEach(file => {
2017-06-03 04:04:36 +02:00
const resolved = require.resolve(`../runtime/samples/${dir}/${file}`);
delete require.cache[resolved];
2017-05-28 17:27:51 +02:00
});
2017-06-03 04:04:36 +02:00
const component = require(`../runtime/samples/${dir}/main.html`);
2017-01-31 23:35:03 +01:00
let html;
2017-01-31 23:35:03 +01:00
try {
2017-06-03 04:04:36 +02:00
html = component.render(config.data);
2017-06-03 04:04:36 +02:00
if (config.html) {
assert.htmlEqual(html, config.html);
2017-01-31 23:35:03 +01:00
}
2017-06-03 04:04:36 +02:00
} catch (err) {
showOutput(cwd, { generate: "ssr" });
2017-01-31 23:35:03 +01:00
throw err;
}
});
});
});