Home Reference Source Test

test/index.js

import Component from '../source/Component';

import { stringifyDOM } from 'dom-renderer';

import { readFile } from 'fs-extra';

import { join } from 'path';

import { toDataURI } from '@tech_query/node-toolkit';


/**
 * @test {Component}
 */
describe('Core class',  () => {

    var style, template, fragment;

    /**
     * @test {Component.parseCSS}
     */
    it('Parse CSS files',  async () => {

        const file = 'test/example-js/index.css';

        style = await Component.parseCSS( file );

        style.tagName.should.be.equal('STYLE');

        style.textContent.should.be.equal((await readFile( file )) + '');
    });

    /**
     * @test {Component.parseHTML}
     */
    it('Parse pure HTML',  async () => {

        const file = 'test/example-js/index.html';

        template = await Component.parseHTML( file );

        template.nodeType.should.be.equal( 11 );

        stringifyDOM( template ).should.be.equal(
            (await readFile( file )) + ''
        );
    });

    describe('Parse mixed HTML',  () => {

        before(async () =>
            fragment = await Component.parseHTML('test/example-html/index.html')
        );

        /**
         * @test {Component.findStyle}
         * @test {Component.parseCSS}
         */
        it('Find & Parse styles',  async () => {

            const styles = Component.findStyle( fragment );

            styles.map(element => element.tagName).should.be.eql([
                'LINK', 'STYLE'
            ]);

            const element = await Component.parseCSS(
                styles[1].textContent,
                styles[1].type,
                'test/example-html/index.css'
            );

            element.textContent.trim().should.be.equal(`
textarea {
  outline: none;
}
textarea {
  display: block;
}`.trim()
            );
        });

        /**
         * @test {Component.packJS}
         */
        it('Parse script',  () => {

            const code = Component.packJS(join(
                'test/example-html/', fragment.lastElementChild.getAttribute('src')
            ));

            (() => eval( code )).should.not.throw( SyntaxError );

            code.should.containEql('\'example-html\'');
        });
    });

    /**
     * @test {Component#toHTML}
     */
    it('Bundle to HTML',  async () => {

        const fragment = await (new Component('test/example-html')).toHTML(),
            tagName = element => element.tagName;

        Array.from(fragment.children, tagName).should.be.eql(
            ['TEMPLATE', 'SCRIPT']
        );

        Array.from(fragment.firstElementChild.content.children, tagName)
            .should.be.eql(['STYLE', 'STYLE', 'TEXTAREA']);
    });

    /**
     * @test {Component#toJS}
     */
    it('Bundle to JS',  async () => {

        var component = await (new Component('test/example-js')).toJS();

        component.includes(
            JSON.stringify( style.textContent ).slice(1, -1)
        ).should.be.true();

        component.includes(
            JSON.stringify( stringifyDOM( template ) )
                .slice(1, -1).replace(/\\"/g, '"')
        ).should.be.true();

        component.includes('name: \'Web components\'').should.be.true();

        component.includes(
            toDataURI('test/example-js/icon.svg')
        ).should.be.true();

        (() => eval( component )).should.not.throw( SyntaxError );
    });
});