/*
 * Copyright 2015-present Open Networking Laboratory
 *
 * Licensed 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.
 */

/*
 ONOS GUI -- Remote -- REST Service - Unit Tests
 */
xdescribe('factory: fw/remote/rest.js', function() {
    var $log, $httpBackend, fs, rs, promise;

    beforeEach(module('onosUtil', 'onosRemote'));

    beforeEach(module(function($provide) {
        $provide.factory('$location', function (){
            return {
                protocol: function () { return 'http'; },
                host: function () { return 'foo'; },
                port: function () { return '80'; }
            };
        })
    }));

    beforeEach(inject(function (_$log_, _$httpBackend_, FnService, RestService) {
        $log = _$log_;
        $httpBackend = _$httpBackend_;
        fs = FnService;
        rs = RestService;
    }));

    it('should define RestService', function () {
        expect(rs).toBeDefined();
    });

    it('should define api functions', function () {
        expect(fs.areFunctions(rs, [
            'get'
        ])).toBeTruthy();
    });

    var mockData = {
        id: 1,
        prop: 'abc'
    };

    it('should fetch remote data', function () {
        var called = 0,
            capture = null;
        $httpBackend.whenGET(/.*/).respond(mockData);
        spyOn($log, 'warn');

        rs.get('bar', function (data) {
            called++;
            capture = data;
        });

        expect(called).toEqual(0);
        expect(capture).toBeNull();
        $httpBackend.flush();
        expect(called).toEqual(1);
        expect(capture).toEqual(mockData);
        expect($log.warn).not.toHaveBeenCalled();
    });

    it('should fail to fetch remote data', function () {
        var called = 0,
            capture = null;
        $httpBackend.whenGET(/.*/).respond(404, 'Not Found');
        spyOn($log, 'warn');

        rs.get('bar', function (data) {
            called++;
            capture = data;
        });

        expect(called).toEqual(0);
        expect(capture).toBeNull();
        $httpBackend.flush();
        expect(called).toEqual(0);
        expect(capture).toBeNull();
        expect($log.warn).toHaveBeenCalledWith(
            'Failed to retrieve JSON data: http://foo:80/onos/ui/rs/bar',
            404, 'Not Found');
    });

});
