/*
 * Copyright 2015 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
 */
describe('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');
    });

});
