/*
 * 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 -- Widget -- Table Builder Service - Unit Tests
 */

describe('factory: fw/widget/tableBuilder.js', function () {
    var $log, $rootScope, fs, tbs, is;

    var mockObj,
        mockWss = {
            bindHandlers: function () {},
            sendEvent: function () {},
            unbindHandlers: function () {}
        };

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

    beforeEach(function () {
        module(function ($provide) {
            $provide.value('WebSocketService', mockWss);
        });
    });

    beforeEach(inject(function (_$log_, _$rootScope_,
                                FnService, TableBuilderService, IconService) {
        $log = _$log_;
        $rootScope = _$rootScope_;
        fs = FnService;
        tbs = TableBuilderService;
        is = IconService;
    }));

    function mockSelCb(event, sel) {}

    beforeEach(function () {
        mockObj = {
            scope: $rootScope.$new(),
            tag: 'foo',
            selCb: mockSelCb
        };
    });

    afterEach(function () {
        mockObj = {};
    });

    it('should define TableBuilderService', function () {
        expect(tbs).toBeDefined();
    });

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

    it('should verify sortCb', function () {
        spyOn(mockWss, 'sendEvent');
        expect(mockObj.scope.sortCallback).not.toBeDefined();
        tbs.buildTable(mockObj);
        expect(mockObj.scope.sortCallback).toBeDefined();
        expect(mockWss.sendEvent).toHaveBeenCalled();
    });

    it('should set tableData', function () {
        expect(mockObj.scope.tableData).not.toBeDefined();
        tbs.buildTable(mockObj);
        expect(fs.isA(mockObj.scope.tableData)).toBeTruthy();
        expect(mockObj.scope.tableData.length).toBe(0);
    });

    it('should unbind handlers on destroyed scope', function () {
        spyOn(mockWss, 'unbindHandlers');
        tbs.buildTable(mockObj);
        expect(mockWss.unbindHandlers).not.toHaveBeenCalled();
        mockObj.scope.$destroy();
        expect(mockWss.unbindHandlers).toHaveBeenCalled();
    });

});
