Skip to content

Commit

Permalink
Add first set of docusaurus-build tests using Jest (facebook#259)
Browse files Browse the repository at this point in the history
* Add Prettier formatting to source files and example files, and check that Prettier formatting is maintained on PRs

* Remove trailing-comma as we are using Node 6 on Circle

* Use latest Node 6 LTS version in Circle

* Initial test suite

* Rename test to match original file

* restore test files

* Remove yarn.lock from pull request. Will run it again in a separate commit
  • Loading branch information
hramos authored and JoelMarcey committed Dec 18, 2017
1 parent 8ec4a6b commit 9dadb35
Show file tree
Hide file tree
Showing 4 changed files with 122 additions and 6 deletions.
11 changes: 7 additions & 4 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ defaults: &defaults

version: 2
jobs:
test-website:
tests:
<<: *defaults
steps:
- checkout
Expand All @@ -42,7 +42,10 @@ jobs:
name: Check Prettier
command: yarn ci-check
- run:
name: Test Build Static Website
name: Run Test Suites
command: yarn test
- run:
name: Test Static Website Builds
command: cd website && yarn run build

deploy-website:
Expand Down Expand Up @@ -99,11 +102,11 @@ workflows:

website:
jobs:
- test-website:
- tests:
filters: *filter-ignore-gh-pages
- deploy-website:
requires:
- test-website
- tests
filters: *filter-only-master

deploy:
Expand Down
Empty file added .watchmanconfig
Empty file.
107 changes: 107 additions & 0 deletions lib/__tests__/build-files.tests.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
const filepath = require('filepath');
const fm = require('front-matter');
const fs = require('fs-extra');
const glob = require('glob-promise');
const rimraf = require('rimraf');
const shell = require('shelljs');

const CWD = process.cwd();

const siteConfig = require(CWD + '/website/siteConfig.js');
const buildDir = CWD + '/website/build';
const docsDir = CWD + '/docs';
const staticCSSDir = CWD + '/website/static/css';

let inputMarkdownFiles = [];
let inputAssetsFiles = [];
let outputHTMLFiles = [];
let outputAssetsFiles = [];

function generateSite() {
shell.cd('website');
shell.exec('yarn build');
}

function clearBuildFolder() {
return rimraf(buildDir);
}

beforeEach(() => {
shell.cd(CWD);
});

beforeAll(() => {
generateSite();
return Promise.all([
glob(docsDir + '/**/*.md'),
glob(buildDir + '/' + siteConfig.projectName + '/docs/*.html'),
glob(docsDir + '/assets/*'),
glob(buildDir + '/' + siteConfig.projectName + '/img/*'),
]).then(function(results) {
inputMarkdownFiles = results[0];
outputHTMLFiles = results[1];
inputAssetsFiles = results[2];
outputAssetsFiles = results[3];
return;
});
});

function afterAll() {
clearBuildFolder();
}

test('Build folder exists', function() {
return fs.stat(buildDir).then(function(status) {
expect(status.isDirectory()).toBeTruthy();
});
});

test('Generated HTML for each Markdown resource', function() {
let metadata = [];
outputHTMLFiles.forEach(function(file) {
const path = filepath.create(file);
metadata.push(path.basename());
});
inputMarkdownFiles.forEach(function(file) {
const path = filepath.create(file);
const data = fs.readFileSync(file, 'utf8');
const frontmatter = fm(data);
expect(metadata).toContain(frontmatter.attributes.id + '.html');
});
});

test('Generated table of contents', function() {
outputHTMLFiles.forEach(function(file) {
const fileContents = fs.readFileSync(file, 'utf8');
expect(fileContents).not.toContain('<AUTOGENERATED_TABLE_OF_CONTENTS>');
});
});

test('Concatenated CSS files', function() {
return Promise.all([
glob(staticCSSDir + '/*.css'),
fs.readFile(
buildDir + '/' + siteConfig.projectName + '/css/main.css',
'utf8'
),
]).then(function(results) {
const inputFiles = results[0];
const outputFile = results[1];
inputFiles.forEach(function(file) {
const contents = fs.readFileSync(file, 'utf8');
expect(outputFile).toContain(contents);
});
});
});

test('Copied assets from /docs/assets', function() {
let metadata = [];
outputAssetsFiles.forEach(function(file) {
const path = filepath.create(file);
metadata.push(path.basename());
});
inputAssetsFiles.forEach(function(file) {
const path = filepath.create(file);
expect(metadata).toContain(path.basename());
});
});
10 changes: 8 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@
"nit:source": "prettier --config .prettierrc --list-different \"lib/**/*.js\"",
"nit:examples": "prettier --config .prettierrc --list-different \"examples/**/*.js\"",
"prettier": "yarn format:source && yarn format:examples",
"prettier:diff": "yarn nit:source && yarn nit:examples"
"prettier:diff": "yarn nit:source && yarn nit:examples",
"test": "jest"
},
"dependencies": {
"babel-preset-env": "^1.6.0",
Expand Down Expand Up @@ -59,6 +60,11 @@
"docusaurus-feed": "./lib/generate-feed.js"
},
"devDependencies": {
"prettier": "^1.9.1"
"prettier": "^1.9.1",
"filepath": "^1.1.0",
"front-matter": "^2.3.0",
"glob-promise": "^3.3.0",
"jest": "^21.2.1",
"rimraf": "^2.6.2"
}
}

0 comments on commit 9dadb35

Please sign in to comment.