From 9dadb3578c5806417649fe0fab26a98613beef0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ramos?= <165856+hramos@users.noreply.github.com> Date: Mon, 18 Dec 2017 14:40:52 -0800 Subject: [PATCH] Add first set of docusaurus-build tests using Jest (#259) * 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 --- .circleci/config.yml | 11 +-- .watchmanconfig | 0 lib/__tests__/build-files.tests.js | 107 +++++++++++++++++++++++++++++ package.json | 10 ++- 4 files changed, 122 insertions(+), 6 deletions(-) create mode 100644 .watchmanconfig create mode 100644 lib/__tests__/build-files.tests.js diff --git a/.circleci/config.yml b/.circleci/config.yml index 71473010a2c7..275b125dcee1 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -31,7 +31,7 @@ defaults: &defaults version: 2 jobs: - test-website: + tests: <<: *defaults steps: - checkout @@ -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: @@ -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: diff --git a/.watchmanconfig b/.watchmanconfig new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/lib/__tests__/build-files.tests.js b/lib/__tests__/build-files.tests.js new file mode 100644 index 000000000000..3215abaf3d38 --- /dev/null +++ b/lib/__tests__/build-files.tests.js @@ -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(''); + }); +}); + +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()); + }); +}); diff --git a/package.json b/package.json index bd87bdc2ad98..e206c047f6b6 100644 --- a/package.json +++ b/package.json @@ -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", @@ -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" } }