var BrotliPlugin = require('../index.js');
var webpack = require('webpack');
var iltorb = require('iltorb');
var rmRf = require('rimraf');

var OUTPUT_DIR = __dirname + '/tmp/';

function createCompiler(options) {
    var defaultOptions = {
        bail: true,
        cache: false,
        entry: __dirname + '/fixtures/entry.js',
        output: {
            path: OUTPUT_DIR,
            filename: '[name].js',
            chunkFilename: '[id].[name].js'
        },
        plugins: [
            new BrotliPlugin()
        ]
    };

    if (!Array.isArray(options)) {
        options = Object.assign({}, defaultOptions, options);
    }

    return webpack(options);
}

function compile(compiler) {
    return new Promise(function (resolve, reject) {
        compiler.run(function (err, stats) {
            if (err) return reject(err);
            resolve(stats);
        });
    });
}

describe('when applied with default settings', function () {
    beforeEach(function (done) {
        rmRf(OUTPUT_DIR, done)
    });

    afterEach(function (done) {
        rmRf(OUTPUT_DIR, done)
    });

    it('compresses and decopresses', function () {
        var compiler = createCompiler();

        new BrotliPlugin().apply(compiler);

        return compile(compiler).then(function (stats) {
            expect(stats.compilation.assets).toHaveProperty(['main.js']);
            expect(stats.compilation.assets).toHaveProperty(['main.js.br']);

            var source = stats.compilation.assets['main.js'].source();
            expect(source).toContain('console.log');

            var decopressed = iltorb.decompressSync(stats.compilation.assets['main.js.br'].source()).toString();
            expect(decopressed).toMatch(source);
        });
    });
});