"use strict"; const test = require("ava"); const path = require("path"); const request = require("supertest"); const cheerio = require("cheerio"); const mf = require("microformat-node"); process.chdir(path.resolve(__dirname, "./testsite/")); const config = require(path.resolve(__dirname, "../src/modules/config.js")); const app = require("../src/app.js"); const parseResponse = res => cheerio.load(res.text, { normalizeWhitespace: true, useHtmlParser2: true }); const toMicroformatsOptions = node => ({ node, textFormat: "normalised" }); test("homepage", t => { return request(app.listen()) .get("/") .expect(200) .expect("Content-Type", "text/html; charset=utf-8") .expect(/^/) .then(parseResponse) .then($ => { t.is($("head > title").text(), "John Doe", "head title is site author"); t.is($("h1").text(), "John Doe", "h1 is site author"); t.is($("main").length, 1, "only one
tag"); t.is($("main .posts").length, 1, "contains one posts listing"); t.is( $(".post:first-of-type a").attr("href"), "/post/testfile", "first post url" ); t.is( $(".post:first-of-type time").text(), "Sunday, January 1, 2017", "first post date" ); t.is( $(".post:first-of-type time").attr("datetime"), new Date("2017-01-01").toISOString() ); return $; }) .then(toMicroformatsOptions) .then(options => Promise.all([ mf.countAsync(options).then(count => t.deepEqual(count, { "h-card": 1 }) ), mf.getAsync(options).then(data => { t.deepEqual(data.items, [ { properties: { name: ["John Doe"], url: ["/"], photo: ["/static/johndoe.jpg"] }, type: ["h-card"] } ]); }) ]) ); }); test("post", t => { return request(app.listen()) .get("/post/testfile") .expect(200) .expect("Content-Type", "text/html; charset=utf-8") .expect(/^/) .then(parseResponse) .then($ => { t.is( $("head > title").text(), "This is a test · " + "John Doe", "head title contains post and site author" ); t.is( $("article h1").text(), "This is a test", "article header is post title" ); t.is( $("article time").text(), "Sunday, January 1, 2017", "first post date" ); t.is( $("article time").attr("datetime"), new Date("2017-01-01").toISOString() ); t.is( $("article p").text(), `Ut enim blandit volutpat maecenas? Volutpat blandit aliquam etiam erat \ velit, scelerisque in dictum non, consectetur a erat nam at lectus \ urna duis convallis convallis tellus, id interdum velit laoreet!`, "article has text" ); }); }); test("post not found", t => { return request(app.listen()) .get("/post/non-existant") .expect(404) .expect(/Post not found/) .then(() => t.pass()); }); test("tags", t => { return request(app.listen()) .get("/tag/a") .expect(200) .expect("Content-Type", "text/html; charset=utf-8") .expect(/^/) .then(parseResponse) .then($ => { t.is( $("head > title").text(), "A · John Doe", "head title contains title-cased tag and site name" ); t.is( $(".post a").text(), "This is a test", "post link text is post title" ); t.is( $(".post:first-of-type a").attr("href"), "/post/testfile", "post url" ); t.is( $(".post:first-of-type time").text(), "Sunday, January 1, 2017", "first post date" ); }); }); test("tags not found", t => request(app.listen()) .get("/tag/non-existant") .expect(404) .expect(/tag non-existant not found/) .then(() => t.pass()));