/*
 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.
 */

const path = require('path');
const EventEmitter = require('events');

const Api = require('../bin/template/cordova/Api');
const create = require('../bin/lib/create');

describe('can get the Api', function () {

    it('should be defined', function () {
        expect(Api).toBeDefined();
    });

    it('should export static createPlatform function', function () {
        expect(Api.createPlatform).toBeDefined();
        expect(typeof Api.createPlatform).toBe('function');
    });

    it('should export static updatePlatform function', function () {
        expect(Api.updatePlatform).toBeDefined();
        expect(typeof Api.updatePlatform).toBe('function');
    });

    describe('static createPlatform method', () => {
        it('should create a platform app and return the Api', () => {
            // Trick function under test to load our Api after calling createProject
            const testDir = path.join(__dirname, '../bin/template');
            const testOpts = {};
            spyOn(create, 'createProject').and.returnValue(Promise.resolve());

            return Api.createPlatform(testDir, null, testOpts, new EventEmitter()).then(api => {
                expect(api).toBeInstanceOf(Api);
                expect(create.createProject).toHaveBeenCalledWith(
                    testDir, jasmine.any(String), jasmine.any(String), testOpts
                );
            });
        });
    });
});

describe('project level Api', function () {

    var testApi = new Api();

    it('can be created', function () {
        expect(testApi).toBeDefined();
    });

    it('has a requirements method', function () {
        expect(testApi.requirements).toBeDefined();
        expect(typeof testApi.requirements).toBe('function');
    });

    it('has a clean method', function () {
        expect(testApi.clean).toBeDefined();
        expect(typeof testApi.clean).toBe('function');
    });

    it('has a run method', function () {
        expect(testApi.run).toBeDefined();
        expect(typeof testApi.run).toBe('function');
    });

    it('has a build method', function () {
        expect(testApi.build).toBeDefined();
        expect(typeof testApi.build).toBe('function');
    });

    it('has a removePlugin method', function () {
        expect(testApi.removePlugin).toBeDefined();
        expect(typeof testApi.removePlugin).toBe('function');
    });

    it('has a addPlugin method', function () {
        expect(testApi.addPlugin).toBeDefined();
        expect(typeof testApi.addPlugin).toBe('function');
    });

    it('has a prepare method', function () {
        expect(testApi.prepare).toBeDefined();
        expect(typeof testApi.prepare).toBe('function');
    });

    it('has a getPlatformInfo method', function () {
        expect(testApi.getPlatformInfo).toBeDefined();
        expect(typeof testApi.getPlatformInfo).toBe('function');
    });

});

// Static methods
// Static method: createPlatform
// returns promise fulfilled with Api
// emits error using provided emmitter on error

// Static method: updatePlatform
// returns a promise fulfilled with an Api
// emits error using provided emmitter on error

// Instance methods
// requirements, clean, run, build, removePlugin, addPlugin, prepare, getPlatformInfo
