Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[WIP] run tests with SSR compiler, where possible #253

Merged
merged 10 commits into from
Feb 1, 2017
2 changes: 1 addition & 1 deletion src/generators/server-side-rendering/visitors/YieldTag.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
export default {
enter ( generator ) {
generator.append( `\${options.yield()}` );
generator.append( `\${options && options.yield ? options.yield() : ''}` );
}
};
27 changes: 2 additions & 25 deletions test/generate.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import * as path from 'path';
import * as fs from 'fs';
import * as acorn from 'acorn';

import { svelte, env, setupHtmlEqual } from './helpers.js';
import { addLineNumbers, loadConfig, svelte, env, setupHtmlEqual } from './helpers.js';

let showCompiledCode = false;
let compileOptions = null;
Expand All @@ -18,36 +18,13 @@ require.extensions[ '.html' ] = function ( module, filename ) {
return module._compile( code, filename );
};

function addLineNumbers ( code ) {
return code.split( '\n' ).map( ( line, i ) => {
i = String( i + 1 );
while ( i.length < 3 ) i = ` ${i}`;

return `${i}: ${line.replace( /^\t+/, match => match.split( '\t' ).join( ' ' ) )}`;
}).join( '\n' );
}

function loadConfig ( dir ) {
try {
const resolved = require.resolve( `./generator/${dir}/_config.js` );
delete require.cache[ resolved ];
return require( resolved ).default;
} catch ( err ) {
if ( err.code === 'E_NOT_FOUND' ) {
return {};
}

throw err;
}
}

describe( 'generate', () => {
before( setupHtmlEqual );

function runTest ( dir, shared ) {
if ( dir[0] === '.' ) return;

const config = loadConfig( dir );
const config = loadConfig( `./generator/${dir}/_config.js` );

if ( config.solo && process.env.CI ) {
throw new Error( 'Forgot to remove `solo: true` from test' );
Expand Down
2 changes: 2 additions & 0 deletions test/generator/component-binding-nested/_config.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
export default {
'skip-ssr': true, // TODO delete this line, once binding works

data: {
x: 'initial'
},
Expand Down
2 changes: 2 additions & 0 deletions test/generator/component-binding/_config.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
export default {
'skip-ssr': true, // TODO delete this line, once binding works

html: `
<button>+1</button>
<p>count: 0</p>
Expand Down
4 changes: 2 additions & 2 deletions test/generator/component-yield/_config.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
export default {
html: '<p>Hello</p>'
}
html: '<p>Hello</p>'
};
23 changes: 12 additions & 11 deletions test/generator/component-yield/main.html
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
<p>
Hello
{{#if test}}
{{yield}}
{{/if}}
Hello
{{#if test}}
{{yield}}
{{/if}}
</p>

<script>
export default {
data(){
return {
test: true
}
}
}
export default {
data () {
return {
test: true
};
}
};
</script>
2 changes: 2 additions & 0 deletions test/generator/onrender-chain/_config.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
export default {
'skip-ssr': true,

html: `
<span>3</span><span>2</span><span>1</span>
`,
Expand Down
2 changes: 2 additions & 0 deletions test/generator/onrender-fires-when-ready-nested/_config.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
export default {
'skip-ssr': true, // uses onrender

html: `<div><p>true</p>\n<p>true</p></div>`
};
2 changes: 2 additions & 0 deletions test/generator/onrender-fires-when-ready/_config.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
export default {
'skip-ssr': true, // uses onrender

html: `<div><p>true</p></div>`,

test ( assert, component, target ) {
Expand Down
4 changes: 4 additions & 0 deletions test/generator/raw-mustaches/_config.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
const ns = '<noscript></noscript>';

export default {
'skip-ssr': true,

data: {
raw: '<span><em>raw html!!!\\o/</span></em>'
},

html: `before${ns}<span><em>raw html!!!\\o/</span></em>${ns}after`,

test ( assert, component, target ) {
Expand Down
2 changes: 2 additions & 0 deletions test/generator/set-in-observe/_config.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
export default {
'skip-ssr': true, // uses onrender

html: `
<p>1</p>
<p>2</p>
Expand Down
2 changes: 2 additions & 0 deletions test/generator/set-in-onrender/_config.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
export default {
'skip-ssr': true, // uses onrender

html: '<p>2</p>'
};
2 changes: 2 additions & 0 deletions test/generator/svg-xmlns/_config.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
export default {
'skip-ssr': true,

data: {
x: 0,
y: 0,
Expand Down
23 changes: 23 additions & 0 deletions test/helpers.js
Original file line number Diff line number Diff line change
Expand Up @@ -114,3 +114,26 @@ export function setupHtmlEqual () {
};
});
}

export function loadConfig ( file ) {
try {
const resolved = require.resolve( file );
delete require.cache[ resolved ];
return require( resolved ).default;
} catch ( err ) {
if ( err.code === 'E_NOT_FOUND' ) {
return {};
}

throw err;
}
}

export function addLineNumbers ( code ) {
return code.split( '\n' ).map( ( line, i ) => {
i = String( i + 1 );
while ( i.length < 3 ) i = ` ${i}`;

return `${i}: ${line.replace( /^\t+/, match => match.split( '\t' ).join( ' ' ) )}`;
}).join( '\n' );
}
1 change: 1 addition & 0 deletions test/server-side-rendering/raw-mustaches/_actual.html
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
before<span><em>raw html!!!\o/</span></em>after
1 change: 1 addition & 0 deletions test/server-side-rendering/raw-mustaches/_expected.html
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
before<span><em>raw html!!!\o/</span></em>after
3 changes: 3 additions & 0 deletions test/server-side-rendering/raw-mustaches/data.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"raw": "<span><em>raw html!!!\\o/</span></em>"
}
1 change: 1 addition & 0 deletions test/server-side-rendering/raw-mustaches/main.html
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
before{{{raw}}}after
45 changes: 44 additions & 1 deletion test/ssr.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import assert from 'assert';
import * as fs from 'fs';

import { exists, setupHtmlEqual, tryToLoadJson } from './helpers.js';
import { addLineNumbers, exists, loadConfig, setupHtmlEqual, svelte, tryToLoadJson } from './helpers.js';

function tryToReadFile ( file ) {
try {
Expand Down Expand Up @@ -47,4 +47,47 @@ describe( 'ssr', () => {
assert.equal( css.replace( /^\s+/gm, '' ), expectedCss.replace( /^\s+/gm, '' ) );
});
});

// duplicate client-side tests, as far as possible
fs.readdirSync( 'test/generator' ).forEach( dir => {
if ( dir[0] === '.' ) return;

const config = loadConfig( `./generator/${dir}/_config.js` );

if ( config.solo && process.env.CI ) {
throw new Error( 'Forgot to remove `solo: true` from test' );
}

if ( config['skip-ssr'] ) return;

( config.skip ? it.skip : config.solo ? it.only : it )( dir, () => {
let compiled;

try {
const source = fs.readFileSync( `test/generator/${dir}/main.html`, 'utf-8' );
compiled = svelte.compile( source, { generate: 'ssr' });
} catch ( err ) {
if ( config.compileError ) {
config.compileError( err );
return;
} else {
throw err;
}
}

const component = require( `./generator/${dir}/main.html` );
let html;

try {
html = component.render( config.data );

if ( config.html ) {
assert.htmlEqual( html, config.html );
}
} catch ( err ) {
console.log( addLineNumbers( compiled.code ) ); // eslint-disable-line no-console
throw err;
}
});
});
});