import { join } from 'path';
import { winEOL } from 'umi-utils';
import HTMLGenerator from './HTMLGenerator';
describe('HG', () => {
it('getFlatRoutes', () => {
const hg = new HTMLGenerator();
const result = hg.getFlatRoutes([
{
path: '/a',
routes: [{ path: '/a/b', component: './a/b' }],
},
{ path: '/b', component: './b' },
{ component: './c' },
]);
expect(result).toEqual([
{ path: '/a' },
{ path: '/a/b', component: './a/b' },
{ path: '/b', component: './b' },
]);
});
it('getHtmlPath', () => {
const hg = new HTMLGenerator({
config: {
mountElementId: 'root',
},
});
expect(hg.getHtmlPath('/')).toEqual('index.html');
expect(hg.getHtmlPath('/a')).toEqual('a/index.html');
expect(hg.getHtmlPath('/a/')).toEqual('a/index.html');
});
it('getHtmlPath with exportStatic.htmlSuffix = true', () => {
const hg = new HTMLGenerator({
config: {
exportStatic: { htmlSuffix: true },
mountElementId: 'root',
},
});
expect(hg.getHtmlPath('/')).toEqual('index.html');
expect(hg.getHtmlPath('/a.html')).toEqual('a.html');
});
it('getLinksContent', () => {
const hg = new HTMLGenerator();
const result = hg.getLinksContent([
{ rel: 'stylesheet', href: './a.css' },
{ a: 1, c: 'd', e: true },
]);
expect(result).toEqual(
`
`.trim(),
);
});
it('getMetasContent', () => {
const hg = new HTMLGenerator();
const result = hg.getMetasContent([{ a: 1, c: 'd', e: true }]);
expect(result).toEqual(
`
`.trim(),
);
});
it('getScriptsContent', () => {
const hg = new HTMLGenerator();
const result = hg.getScriptsContent([
{ src: './a.js' },
{ src: './a.js', crossorigin: 'anonymous' },
{ content: "alert('hello');\nalert('umi');", a: 'b' },
]);
expect(result).toEqual(
`
`.trim(),
);
});
it('getStylesContent', () => {
const hg = new HTMLGenerator();
const result = hg.getStylesContent([{ content: 'body { color: red; }', a: 'b' }]);
expect(result).toEqual(
`
`.trim(),
);
});
it('getContent', () => {
const hg = new HTMLGenerator({
env: 'production',
chunksMap: {
umi: ['umi.js', 'umi.css'],
},
minify: false,
config: {
mountElementId: 'documenttestid',
},
paths: {
cwd: '/a',
absPageDocumentPath: '/tmp/files-not-exists',
defaultDocumentPath: join(__dirname, 'fixtures/document.ejs'),
},
modifyLinks: links => {
links.push({
rel: 'stylesheet',
href: 'http://ant.design/test.css',
});
return links;
},
});
const content = hg.getContent({
path: '/',
});
expect(winEOL(content.trim())).toEqual(
`
`.trim(),
);
});
it('getContent with chunks', () => {
const hg = new HTMLGenerator({
env: 'production',
chunksMap: {
umi: ['umi.js', 'umi.css'],
a: ['a.js'],
b: ['b.js', 'b.css'],
c: ['c.js', 'c.css'],
},
minify: false,
config: {
mountElementId: 'documenttestid',
},
paths: {
cwd: '/a',
absPageDocumentPath: '/tmp/files-not-exists',
defaultDocumentPath: join(__dirname, 'fixtures/document.ejs'),
},
modifyChunks() {
return ['a', { name: 'b', headScript: true }, 'umi', 'c'];
},
});
const content = hg.getContent({
path: '/',
});
expect(winEOL(content.trim())).toEqual(
`
`.trim(),
);
});
it('getContent with publicPath', () => {
const hg = new HTMLGenerator({
env: 'production',
chunksMap: {
umi: ['umi.js', 'umi.css'],
},
minify: false,
publicPath: '/foo/',
config: {
mountElementId: 'documenttestid',
},
paths: {
cwd: '/a',
absPageDocumentPath: '/tmp/files-not-exists',
defaultDocumentPath: join(__dirname, 'fixtures/document-with-publicPath.ejs'),
},
});
const content = hg.getContent({
path: '/',
});
expect(winEOL(content.trim())).toEqual(
`
`.trim(),
);
});
it('getContent with runtimePublicPath', () => {
const hg = new HTMLGenerator({
env: 'production',
chunksMap: {
umi: ['umi.js', 'umi.css'],
},
minify: false,
config: {
runtimePublicPath: true,
mountElementId: 'documenttestid',
},
paths: {
cwd: '/a',
absPageDocumentPath: '/tmp/files-not-exists',
defaultDocumentPath: join(__dirname, 'fixtures/document.ejs'),
},
});
const content = hg.getContent({
path: '/',
});
expect(winEOL(content.trim())).toEqual(
`
`.trim(),
);
});
it('getContent with runtimePublicPath string', () => {
const hg = new HTMLGenerator({
env: 'production',
chunksMap: {
umi: ['umi.js', 'umi.css'],
},
minify: false,
config: {
runtimePublicPath: 'window.__injected_runtime_public_path__ || "/"',
mountElementId: 'documenttestid',
},
paths: {
cwd: '/a',
absPageDocumentPath: '/tmp/files-not-exists',
defaultDocumentPath: join(__dirname, 'fixtures/document.ejs'),
},
});
const content = hg.getContent({
path: '/',
});
expect(winEOL(content.trim())).toEqual(
`
`.trim(),
);
});
it('getContent in development', () => {
const hg = new HTMLGenerator({
env: 'development',
chunksMap: {
umi: ['umi.js', 'umi.css'],
},
config: {
mountElementId: 'documenttestid',
},
paths: {
cwd: '/a',
absPageDocumentPath: '/tmp/files-not-exists',
defaultDocumentPath: join(__dirname, 'fixtures/document.ejs'),
},
});
const content = hg.getContent({
path: '/',
});
expect(winEOL(content.trim())).toEqual(
`
`.trim(),
);
});
it('getRoute and minify', () => {
const hg = new HTMLGenerator({
env: 'production',
minify: true,
chunksMap: {
umi: ['umi.js', 'umi.css'],
},
config: {
mountElementId: 'documenttestid',
},
paths: {
cwd: '/a',
absPageDocumentPath: '/tmp/files-not-exists',
defaultDocumentPath: join(__dirname, 'fixtures/document.ejs'),
},
});
const content = hg.getContent({
path: '/',
});
expect(winEOL(content.trim())).toEqual(
`
`.trim(),
);
});
it('getRoute dynamicRoot', () => {
const hg = new HTMLGenerator({
env: 'production',
minify: false,
chunksMap: {
umi: ['umi.js', 'umi.css'],
},
config: {
exportStatic: {
dynamicRoot: true,
},
mountElementId: 'documenttestid',
},
paths: {
cwd: '/a',
absPageDocumentPath: '/tmp/files-not-exists',
defaultDocumentPath: join(__dirname, 'fixtures/document.ejs'),
},
});
const c1 = hg.getContent({
path: '/',
});
expect(winEOL(c1.trim())).toEqual(
`
`.trim(),
);
const c2 = hg.getContent({
path: '/a',
});
expect(c2.includes('"../umi.js"') && c2.includes('"../umi.css"')).toEqual(true);
const c3 = hg.getContent({
path: '/a/b',
});
expect(c3.includes('"../../umi.js"') && c3.includes('"../../umi.css"')).toEqual(true);
});
it('getRoute dynamicRoot with exportStatic.htmlSuffix = true', () => {
const hg = new HTMLGenerator({
env: 'production',
minify: false,
chunksMap: {
umi: ['umi.js', 'umi.css'],
},
config: {
exportStatic: {
htmlSuffix: true,
dynamicRoot: true,
},
mountElementId: 'documenttestid',
},
paths: {
cwd: '/a',
absPageDocumentPath: '/tmp/files-not-exists',
defaultDocumentPath: join(__dirname, 'fixtures/document.ejs'),
},
});
const c1 = hg.getContent({
path: '/',
});
expect(winEOL(c1.trim())).toEqual(
`
`.trim(),
);
const c2 = hg.getContent({
path: '/a',
});
expect(c2.includes('"./umi.js"') && c2.includes('"./umi.css"')).toEqual(true);
const c3 = hg.getContent({
path: '/a/b',
});
expect(c3.includes('"../umi.js"') && c3.includes('"../umi.css"')).toEqual(true);
});
it('getMatchedContent', () => {
const hg = new HTMLGenerator({
env: 'production',
minify: false,
chunksMap: {
umi: ['umi.js', 'umi.css'],
},
config: {
mountElementId: 'documenttestid',
},
paths: {
cwd: '/a',
absPageDocumentPath: '/tmp/files-not-exists',
defaultDocumentPath: join(__dirname, 'fixtures/document.ejs'),
},
routes: [
{ path: '/a' },
{
path: '/b',
routes: [{ path: '/b/c' }],
},
{ path: '/c/d' },
{ path: '/e/:id' },
],
});
const c1 = hg.getMatchedContent('/a');
expect(c1.includes('"/umi.js"') && c1.includes('"/umi.css"')).toEqual(true);
const c2 = hg.getMatchedContent('/a/b');
expect(c2.includes('"/umi.js"') && c2.includes('"/umi.css"')).toEqual(true);
});
it('getMatchedContent with exportStatic', () => {
const hg = new HTMLGenerator({
env: 'production',
minify: false,
chunksMap: {
umi: ['umi.js', 'umi.css'],
},
config: {
exportStatic: {
htmlSuffix: true,
dynamicRoot: true,
},
mountElementId: 'documenttestid',
},
paths: {
cwd: '/a',
absPageDocumentPath: '/tmp/files-not-exists',
defaultDocumentPath: join(__dirname, 'fixtures/document.ejs'),
},
routes: [
{ path: '/a' },
{
path: '/b',
routes: [
{
path: '/b/c',
},
],
},
{ path: '/c/d' },
{ path: '/e/:id' },
],
});
const c1 = hg.getMatchedContent('/a');
expect(c1.includes('"./umi.js"') && c1.includes('"./umi.css"')).toEqual(true);
const c2 = hg.getMatchedContent('/b/c');
expect(c2.includes('"../umi.js"') && c2.includes('"../umi.css"')).toEqual(true);
const c3 = hg.getMatchedContent('/c');
expect(c3.includes('"./umi.js"') && c3.includes('"./umi.css"')).toEqual(true);
const c4 = hg.getMatchedContent('/e/123');
expect(c4.includes('"../umi.js"') && c4.includes('"../umi.css"')).toEqual(true);
});
it('getMatchedContent with exportStatic and context', () => {
const hg = new HTMLGenerator({
env: 'production',
minify: false,
chunksMap: {
umi: ['umi.js', 'umi.css'],
},
config: {
exportStatic: true,
mountElementId: 'root',
},
paths: {
cwd: '/a',
absPageDocumentPath: '/tmp/files-not-exists',
defaultDocumentPath: join(__dirname, 'fixtures/custom-doc-with-context.ejs'),
},
routes: [
{ path: '/a' },
{
path: '/b',
routes: [
{
path: '/b/c',
title: 'bctitle',
},
],
},
],
modifyContext: (context, { route }) => {
return {
...context,
path: route.path,
title: route.title || 'defaultTitle',
};
},
});
const c1 = hg.getMatchedContent('/a');
expect(c1.includes('"/umi.js"') && c1.includes('"/umi.css"')).toEqual(true);
expect(c1.includes('defaultTitle-/a')).toEqual(true);
const c2 = hg.getMatchedContent('/b/c');
expect(c2.includes('"/umi.js"') && c2.includes('"/umi.css"')).toEqual(true);
expect(c2.includes('bctitle-/b/c')).toEqual(true);
});
it('get content with default document when title is undefined', () => {
const hg = new HTMLGenerator({
env: 'production',
minify: false,
config: {
mountElementId: 'root',
},
chunksMap: {
umi: ['umi.js', 'umi.css'],
},
paths: {
cwd: '/a',
absPageDocumentPath: '/tmp/files-not-exists',
defaultDocumentPath: join(__dirname, '../../template/document.ejs'),
},
routes: [{ path: '/a' }],
modifyContext: context => {
return context;
},
});
const c1 = hg.getMatchedContent('/a');
expect(c1.includes('"/umi.js"') && c1.includes('"/umi.css"')).toEqual(true);
expect(c1.includes('')).toEqual(false);
});
it('getMatchedContent with ssr and context', () => {
const hg = new HTMLGenerator({
env: 'production',
minify: false,
chunksMap: {
umi: ['umi.js', 'umi.css'],
},
config: {
ssr: true,
mountElementId: 'root',
},
paths: {
cwd: '/a',
absPageDocumentPath: '/tmp/files-not-exists',
defaultDocumentPath: join(__dirname, 'fixtures/custom-doc-with-context.ejs'),
},
routes: [
{ path: '/a' },
{
path: '/b',
routes: [
{
path: '/b/c',
title: 'bctitle',
},
],
},
],
modifyContext: (context, { route }) => {
return {
...context,
path: route.path,
title: route.title || 'defaultTitle',
};
},
});
const c1 = hg.getMatchedContent('/a');
expect(c1.includes('"/umi.js"') && c1.includes('"/umi.css"')).toEqual(true);
expect(c1.includes('defaultTitle-/a')).toEqual(true);
const c2 = hg.getMatchedContent('/b/c');
expect(c2.includes('"/umi.js"') && c2.includes('"/umi.css"')).toEqual(true);
expect(c2.includes('bctitle-/b/c')).toEqual(true);
});
it('getContent with include', () => {
const hg = new HTMLGenerator({
env: 'production',
minify: false,
chunksMap: {
umi: ['umi.js', 'umi.css'],
},
config: {
mountElementId: 'root',
},
paths: {
cwd: '/a',
absPageDocumentPath: '/tmp/files-not-exists',
defaultDocumentPath: join(__dirname, 'fixtures/document-with-include.ejs'),
},
});
const content = hg.getContent({
path: '/',
});
expect(winEOL(content.trim())).toEqual(
`
custom
`.trim(),
);
});
});