Skip to content

Commit

Permalink
test: Increase build test suite coverage
Browse files Browse the repository at this point in the history
  • Loading branch information
rschristian committed Mar 22, 2022
1 parent 92db132 commit 9dbc936
Show file tree
Hide file tree
Showing 46 changed files with 486 additions and 189 deletions.
452 changes: 317 additions & 135 deletions packages/cli/tests/build.test.js

Large diffs are not rendered by default.

7 changes: 4 additions & 3 deletions packages/cli/tests/create.test.js
@@ -1,4 +1,4 @@
const { readFileSync } = require('fs');
const { readFile } = require('fs').promises;
const { relative, resolve } = require('path');
const { create } = require('./lib/cli');
const { expand } = require('./lib/utils');
Expand All @@ -19,7 +19,7 @@ describe('preact create', () => {
let dir = await create('netlify');

const templateFilePath = resolve(__dirname, dir, 'src', 'template.html');
const template = readFileSync(templateFilePath).toString('utf8');
const template = await readFile(templateFilePath, 'utf8');

expect(template.includes('twitter:card')).toEqual(true);
});
Expand All @@ -28,12 +28,13 @@ describe('preact create', () => {
let dir = await create('simple');

const templateFilePath = resolve(__dirname, dir, 'src', 'template.html');
const template = readFileSync(templateFilePath).toString('utf8');
const template = await readFile(templateFilePath, 'utf8');

expect(template.includes('apple-touch-icon')).toEqual(true);
});

it('should fail given an invalid name', async () => {
// @ts-ignore
const exit = jest.spyOn(process, 'exit').mockImplementation(() => {});
await create('simple', '*()@!#!$-Invalid-Name');

Expand Down
63 changes: 43 additions & 20 deletions packages/cli/tests/images/build.js
Expand Up @@ -54,23 +54,6 @@ exports.sass = `
</body>
`;

exports.sideEffectCss = `
<head>
<meta charset="utf-8">
<title>side-effect-css<\\/title>
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-capable" content="yes">
<link rel="apple-touch-icon" href=\\"\\/assets\\/icons\\/apple-touch-icon\\.png\\">
<link rel="manifest" href="\\/manifest\\.json">
<style>h1{background:#673ab8}<\\/style>
<link href=\\"/bundle.\\w{5}.css\\" rel=\\"stylesheet\\" media=\\"only x\\" onload=\\"this.media='all'\\">
<noscript>
<link rel=\\"stylesheet\\" href=\\"\\/bundle.\\w{5}.css\\">
</noscript>
<\\/head>
`;

exports.prerender = {};

exports.prerender.heads = {};
Expand Down Expand Up @@ -127,10 +110,10 @@ exports.prerender.heads.custom = `

exports.preload = {};

exports.preload.head = `
exports.preload.true = `
<head>
<meta charset=\\"utf-8\\">
<title>preact-prerender<\\/title>
<title>preact-preload-chunks<\\/title>
<meta name=\\"viewport\\" content=\\"width=device-width,initial-scale=1\\">
<meta name=\\"mobile-web-app-capable\\" content=\\"yes\\">
<meta name=\\"apple-mobile-web-app-capable\\" content=\\"yes\\">
Expand All @@ -147,6 +130,23 @@ exports.preload.head = `
</head>
`;

exports.preload.false = `
<head>
<meta charset=\\"utf-8\\">
<title>preact-preload-chunks<\\/title>
<meta name=\\"viewport\\" content=\\"width=device-width,initial-scale=1\\">
<meta name=\\"mobile-web-app-capable\\" content=\\"yes\\">
<meta name=\\"apple-mobile-web-app-capable\\" content=\\"yes\\">
<link rel=\\"apple-touch-icon\\" href=\\"\\/assets\\/icons\\/apple-touch-icon\\.png\\">
<link rel=\\"manifest\\" href=\\"\\/manifest\\.json\\">
<style>html{padding:0}<\\/style>
<link href=\\"\\/bundle\\.\\w{5}\\.css\\" rel=\\"stylesheet\\" media=\\"only x\\" onload=\\"this.media='all'\\">
<noscript>
<link rel=\\"stylesheet\\" href=\\"\\/bundle.\\w{5}.css\\">
</noscript>
</head>
`;

exports.prerender.home = `
<body>
<div id="app">
Expand Down Expand Up @@ -197,7 +197,7 @@ exports.template = `
<html lang="en">
<head>
<meta charset="utf-8">
<title>preact-webpack</title>
<title>preact-custom-template</title>
<meta name="example-meta" content="Hello World">
<link rel="manifest" href="/manifest.json">
</head>
Expand Down Expand Up @@ -253,3 +253,26 @@ exports.pushManifest = `
}
}
`;

exports.publicPath = `
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>preact-public-path</title>
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-capable" content="yes">
<link rel="apple-touch-icon" href="/example-path/assets/icons/apple-touch-icon.png">
<link rel="manifest" href="/example-path/manifest.json">
<link href="/example-path/bundle.\\w{5}.css" rel="stylesheet">
<style></style>
</head>
<body>
<h1>Public path test</h1>
<script type="__PREACT_CLI_DATA__">%7B%22preRenderData%22:%7B%22url%22:%22/%22%7D%7D</script>
<script defer="defer" src="/example-path/bundle.\\w{5}.js"></script>
<script nomodule="" src="/example-path/polyfills.\\w{5}.js"></script>
</body>
</html>
`;
14 changes: 8 additions & 6 deletions packages/cli/tests/lib/cli.js
Expand Up @@ -7,10 +7,12 @@ const shell = require('shelljs');
const root = join(__dirname, '../../../..');

async function linkPackage(name, from, to) {
await symlink(
join(from, 'node_modules', name),
join(to, 'node_modules', name)
);
try {
await symlink(
join(from, 'node_modules', name),
join(to, 'node_modules', name)
);
} catch {}
}

const argv = {
Expand All @@ -23,7 +25,7 @@ const argv = {
};

exports.create = async function (template, name) {
let dest = tmpDir();
let dest = await tmpDir();
name = name || `test-${template}`;

await cmd.create(template, dest, { name, cwd: '.' });
Expand All @@ -42,7 +44,7 @@ exports.build = async function (cwd, options, installNodeModules = false) {
}

let opts = Object.assign({}, { cwd }, argv, options);
return await cmd.build(argv.src, opts);
return await cmd.build(opts.src, opts);
};

exports.watch = function (cwd, port, host = '127.0.0.1') {
Expand Down
12 changes: 7 additions & 5 deletions packages/cli/tests/lib/output.js
@@ -1,25 +1,27 @@
const { existsSync, mkdirSync } = require('fs');
const { access, mkdir } = require('fs').promises;
const copy = require('ncp');
const { resolve } = require('path');
const { promisify } = require('util');

const output = resolve(__dirname, '../output');
const subjects = resolve(__dirname, '../subjects');

function tmpDir() {
async function tmpDir() {
let str = Math.random()
.toString(36)
.replace(/[^a-z]+/g, '')
.substr(0, 12);
if (!existsSync(output)) {
mkdirSync(output, { recursive: true });
try {
await access(output);
} catch {
await mkdir(output, { recursive: true });
}
return resolve(output, str);
}

async function subject(name) {
let src = resolve(subjects, name);
let dest = tmpDir();
let dest = await tmpDir();
await promisify(copy)(src, dest);
return dest;
}
Expand Down
@@ -0,0 +1,4 @@
import { h } from 'preact';
import styles from './style.css';

export default () => <h3 class={styles.text}>This is a fancy component!</h3>;
@@ -0,0 +1,3 @@
.text {
color: blue;
}
3 changes: 3 additions & 0 deletions packages/cli/tests/subjects/css-auto-modules/global.css
@@ -0,0 +1,3 @@
h1 {
color: red;
}
14 changes: 14 additions & 0 deletions packages/cli/tests/subjects/css-auto-modules/index.js
@@ -0,0 +1,14 @@
import { h } from 'preact';
import Component from './components';
import Route from './routes';
import './global.css';

export default () => {
return (
<div>
<h1>This is an app with some fancy styles!</h1>
<Route />
<Component />
</div>
);
};
4 changes: 4 additions & 0 deletions packages/cli/tests/subjects/css-auto-modules/package.json
@@ -0,0 +1,4 @@
{
"private": true,
"name": "preact-auto-css-modules"
}
4 changes: 4 additions & 0 deletions packages/cli/tests/subjects/css-auto-modules/routes/index.js
@@ -0,0 +1,4 @@
import { h } from 'preact';
import styles from './style.css';

export default () => <h2 class={styles.text}>This is a fancy route!</h2>;
3 changes: 3 additions & 0 deletions packages/cli/tests/subjects/css-auto-modules/routes/style.css
@@ -0,0 +1,3 @@
.text {
color: red;
}
2 changes: 2 additions & 0 deletions packages/cli/tests/subjects/css-imports/index.js
@@ -0,0 +1,2 @@
import './styles/a.css';
import './style.css';
4 changes: 4 additions & 0 deletions packages/cli/tests/subjects/css-imports/package.json
@@ -0,0 +1,4 @@
{
"private": true,
"name": "preact-css-imports"
}
5 changes: 5 additions & 0 deletions packages/cli/tests/subjects/css-imports/style.css
@@ -0,0 +1,5 @@
@import '~fake-module/style.css';

h1 {
background: peachpuff;
}
5 changes: 5 additions & 0 deletions packages/cli/tests/subjects/css-imports/styles/a.css
@@ -0,0 +1,5 @@
@import 'b.css';

body {
background: url('./img.jpg');
}
3 changes: 3 additions & 0 deletions packages/cli/tests/subjects/css-imports/styles/b.css
@@ -0,0 +1,3 @@
h1 {
color: #f00;
}
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
5 changes: 5 additions & 0 deletions packages/cli/tests/subjects/css-inline/index.js
@@ -0,0 +1,5 @@
import { h } from 'preact';

import './style.css';

export default () => <h1>Test CSS inlining</h1>;
4 changes: 4 additions & 0 deletions packages/cli/tests/subjects/css-inline/package.json
@@ -0,0 +1,4 @@
{
"private": true,
"name": "preact-css-inline"
}
7 changes: 7 additions & 0 deletions packages/cli/tests/subjects/css-inline/style.css
@@ -0,0 +1,7 @@
h1 {
color: red;
}

div {
background: blue;
}
File renamed without changes.
4 changes: 4 additions & 0 deletions packages/cli/tests/subjects/css-sass/package.json
@@ -0,0 +1,4 @@
{
"private": true,
"name": "preact-css-sass"
}
1 change: 1 addition & 0 deletions packages/cli/tests/subjects/css-side-effect/index.js
@@ -0,0 +1 @@
import './style.css';
@@ -1,5 +1,5 @@
{
"private": true,
"name": "side-effect-css",
"name": "preact-css-side-effect-import",
"sideEffects": false
}
2 changes: 1 addition & 1 deletion packages/cli/tests/subjects/custom-babelrc/package.json
@@ -1,4 +1,4 @@
{
"private": true,
"name": "preact-babelrc"
"name": "preact-custom-babelrc"
}
2 changes: 1 addition & 1 deletion packages/cli/tests/subjects/custom-template/package.json
@@ -1,4 +1,4 @@
{
"private": true,
"name": "preact-webpack"
"name": "preact-custom-template"
}
2 changes: 1 addition & 1 deletion packages/cli/tests/subjects/custom-webpack/package.json
@@ -1,4 +1,4 @@
{
"private": true,
"name": "preact-webpack"
"name": "preact-custom-webpack"
}
4 changes: 4 additions & 0 deletions packages/cli/tests/subjects/minimal/index.js
@@ -0,0 +1,4 @@
import { h } from 'preact';
import './style.css';

export default () => <h1>Minimal App</h1>;
4 changes: 4 additions & 0 deletions packages/cli/tests/subjects/minimal/package.json
@@ -0,0 +1,4 @@
{
"private": true,
"name": "preact-minimal"
}
3 changes: 3 additions & 0 deletions packages/cli/tests/subjects/minimal/style.css
@@ -0,0 +1,3 @@
h1 {
color: red;
}
@@ -1,4 +1,4 @@
{
"private": true,
"name": "preact-prerender"
"name": "preact-multiple-prerender-with-provider"
}
@@ -1,4 +1,4 @@
{
"private": true,
"name": "preact-prerender"
"name": "preact-multiple-prerender"
}
2 changes: 1 addition & 1 deletion packages/cli/tests/subjects/preload-chunks/package.json
@@ -1,4 +1,4 @@
{
"private": true,
"name": "preact-prerender"
"name": "preact-preload-chunks"
}
@@ -1,4 +1,4 @@
{
"private": true,
"name": "preact-babelrc"
"name": "preact-prerendering-hydration"
}
@@ -1,6 +1,6 @@
{
"private": true,
"name": "preact-prerender",
"name": "preact-prerendering-hydration-preact8",
"dependencies": {
"preact": "8.5.3",
"preact-render-to-string": "4.1.0"
Expand Down
4 changes: 4 additions & 0 deletions packages/cli/tests/subjects/public-path/index.js
@@ -0,0 +1,4 @@
import { h } from 'preact';
import './style.css';

export default () => <h1>Public path test</h1>;
4 changes: 4 additions & 0 deletions packages/cli/tests/subjects/public-path/package.json
@@ -0,0 +1,4 @@
{
"private": true,
"name": "preact-public-path"
}
3 changes: 3 additions & 0 deletions packages/cli/tests/subjects/public-path/preact.config.js
@@ -0,0 +1,3 @@
module.exports = function (config) {
config.output.publicPath = '/example-path/';
};
Empty file.
4 changes: 0 additions & 4 deletions packages/cli/tests/subjects/sass/package.json

This file was deleted.

6 changes: 0 additions & 6 deletions packages/cli/tests/subjects/side-effect-css/index.js

This file was deleted.

2 changes: 1 addition & 1 deletion packages/cli/tests/subjects/static-root/package.json
@@ -1,4 +1,4 @@
{
"private": true,
"name": "preact-prerender"
"name": "preact-static-root"
}

0 comments on commit 9dbc936

Please sign in to comment.