/**
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.
*/

var rewire = require('rewire');
var PlatformJson = rewire('../src/PlatformJson');
var ModuleMetadata = PlatformJson.__get__('ModuleMetadata');

var FAKE_MODULE = {
    name: 'fakeModule',
    src: 'www/fakeModule.js',
    clobbers: [{ target: 'window.fakeClobber' }],
    merges: [{ target: 'window.fakeMerge' }],
    runs: true
};

describe('PlatformJson class', function () {
    it('Test 001 : should be constructable', function () {
        expect(new PlatformJson()).toEqual(jasmine.any(PlatformJson));
    });

    describe('instance', function () {
        var platformJson;
        var fakePlugin;

        beforeEach(function () {
            platformJson = new PlatformJson('/fake/path', 'android');
            fakePlugin = jasmine.createSpyObj('fakePlugin', ['getJsModules']);
            fakePlugin.id = 'fakeId';
            fakePlugin.version = '1.0.0';
            fakePlugin.getJsModules.and.returnValue([FAKE_MODULE]);
        });

        describe('addPluginMetadata method', function () {
            it('Test 002 : should not throw if root "modules" property is missing', function () {
                expect(function () {
                    platformJson.addPluginMetadata(fakePlugin);
                }).not.toThrow();
            });

            it('Test 003 : should add each module to "root.modules" array', function () {
                platformJson.addPluginMetadata(fakePlugin);
                expect(platformJson.root.modules.length).toBe(1);
                expect(platformJson.root.modules[0]).toEqual(jasmine.any(ModuleMetadata));
            });

            it('Test 004 : shouldn\'t add module if there is already module with the same file added', function () {
                platformJson.root.modules = [{
                    name: 'fakePlugin2',
                    file: 'plugins/fakeId/www/fakeModule.js'
                }];

                platformJson.addPluginMetadata(fakePlugin);
                expect(platformJson.root.modules.length).toBe(1);
                expect(platformJson.root.modules[0].name).toBe('fakePlugin2');
            });

            it('Test 005 : should add entry to plugin_metadata with corresponding version', function () {
                platformJson.addPluginMetadata(fakePlugin);
                expect(platformJson.root.plugin_metadata[fakePlugin.id]).toBe(fakePlugin.version);
            });
        });

        describe('removePluginMetadata method', function () {
            it('Test 006 : should not throw if root "modules" property is missing', function () {
                expect(function () {
                    platformJson.removePluginMetadata(fakePlugin);
                }).not.toThrow();
            });

            it('Test 007 : should remove plugin modules from "root.modules" array based on file path', function () {
                var pluginPaths = [
                    'plugins/fakeId/www/fakeModule.js',
                    'plugins/otherPlugin/www/module1.js',
                    'plugins/otherPlugin/www/module1.js'
                ];

                platformJson.root.modules = pluginPaths.map(function (p) { return { file: p }; });
                platformJson.removePluginMetadata(fakePlugin);
                var resultantPaths = platformJson.root.modules
                    .map(function (p) { return p.file; })
                    .filter(function (f) { return /fakeModule\.js$/.test(f); });

                expect(resultantPaths.length).toBe(0);
            });

            it('Test 008 : should remove entry from plugin_metadata with corresponding version', function () {
                platformJson.root.plugin_metadata = {};
                platformJson.root.plugin_metadata[fakePlugin.id] = fakePlugin.version;
                platformJson.removePluginMetadata(fakePlugin);
                expect(platformJson.root.plugin_metadata[fakePlugin.id]).not.toBeDefined();
            });
        });

        function evaluateCordovaDefineStatement (str) {
            expect(typeof str).toBe('string');
            const fnString = str.replace(/^\s*cordova\.define\('cordova\/plugin_list',\s*([\s\S]+)\);\s*$/, '($1)');
            const mod = { exports: {} };
            global.eval(fnString)(null, mod.exports, mod); // eslint-disable-line no-eval
            return mod;
        }

        function expectedMetadata () {
            // Create plain objects from ModuleMetadata instances
            const modules = platformJson.root.modules.map(o => Object.assign({}, o));
            modules.metadata = platformJson.root.plugin_metadata;
            return modules;
        }

        describe('generateMetadata method', function () {
            it('Test 009 : should generate text metadata containing list of installed modules', function () {
                const meta = platformJson.addPluginMetadata(fakePlugin).generateMetadata();
                const mod = evaluateCordovaDefineStatement(meta);

                expect(mod.exports).toEqual(expectedMetadata());
            });
        });

        describe('generateAndSaveMetadata method', function () {
            it('should save generated metadata', function () {
                // Needs to use graceful-fs, since that is used by fs-extra
                const spy = spyOn(require('graceful-fs'), 'writeFileSync');

                const dest = require('path').join(__dirname, 'test-destination');
                platformJson.addPluginMetadata(fakePlugin).generateAndSaveMetadata(dest);

                expect(spy).toHaveBeenCalledTimes(1);
                const [file, data] = spy.calls.argsFor(0);
                expect(file).toBe(dest);
                const mod = evaluateCordovaDefineStatement(data);
                expect(mod.exports).toEqual(expectedMetadata());
            });
        });
    });
});

describe('ModuleMetadata class', function () {
    it('Test 010 : should be constructable', function () {
        var meta;
        expect(function () {
            meta = new ModuleMetadata('fakePlugin', { src: 'www/fakeModule.js' });
        }).not.toThrow();
        expect(meta instanceof ModuleMetadata).toBeTruthy();
    });

    it('Test 011 : should throw if either pluginId or jsModule argument isn\'t specified', function () {
        expect(ModuleMetadata).toThrow();
        expect(() => new ModuleMetadata('fakePlugin', {})).toThrow();
    });

    it('Test 012 : should guess module id either from name property of from module src', function () {
        expect(new ModuleMetadata('fakePlugin', { name: 'fakeModule' }).id).toMatch(/fakeModule$/);
        expect(new ModuleMetadata('fakePlugin', { src: 'www/fakeModule.js' }).id).toMatch(/fakeModule$/);
    });

    it('Test 013 : should read "clobbers" property from module', function () {
        expect(new ModuleMetadata('fakePlugin', { name: 'fakeModule' }).clobbers).not.toBeDefined();
        var metadata = new ModuleMetadata('fakePlugin', FAKE_MODULE);
        expect(metadata.clobbers).toEqual(jasmine.any(Array));
        expect(metadata.clobbers[0]).toBe(FAKE_MODULE.clobbers[0].target);
    });

    it('Test 014 : should read "merges" property from module', function () {
        expect(new ModuleMetadata('fakePlugin', { name: 'fakeModule' }).merges).not.toBeDefined();
        var metadata = new ModuleMetadata('fakePlugin', FAKE_MODULE);
        expect(metadata.merges).toEqual(jasmine.any(Array));
        expect(metadata.merges[0]).toBe(FAKE_MODULE.merges[0].target);
    });

    it('Test 015 : should read "runs" property from module', function () {
        expect(new ModuleMetadata('fakePlugin', { name: 'fakeModule' }).runs).not.toBeDefined();
        expect(new ModuleMetadata('fakePlugin', FAKE_MODULE).runs).toBe(true);
    });
});
