/*
 * 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 -- Web Socket Event Service - Unit Tests
 */

// NOTE WsEventService does not exist

xdescribe('factory: fw/remote/wsevent.js', function () {
    var $log, fs, wse;

    beforeEach(module('onosRemote'));

    beforeEach(inject(function (_$log_, FnService, WsEventService) {
        $log = _$log_;
        fs = FnService;
        wse = WsEventService;
        wse.resetSid();
    }));


    it('should define WsEventService', function () {
        expect(wse).toBeDefined();
    });

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

    var event,
        fakeWs = {
            send: function (ev) {
                event = ev;
            }
        };

    it('should construct an event object with no payload', function ()  {
        wse.sendEvent(fakeWs, 'foo');
        expect(event.event).toEqual('foo');
        expect(event.sid).toEqual(1);
        expect(event.payload).toEqual({});
    });

    it('should construct an event object with some payload', function ()  {
        wse.sendEvent(fakeWs, 'bar', { val: 42 });
        expect(event.event).toEqual('bar');
        expect(event.sid).toEqual(1);
        expect(event.payload).toEqual({ val: 42 });
    });

    it('should increment the sid', function () {
        wse.sendEvent(fakeWs, 'one');
        expect(event.event).toEqual('one');
        expect(event.sid).toEqual(1);

        wse.sendEvent(fakeWs, 'dos');
        expect(event.event).toEqual('dos');
        expect(event.sid).toEqual(2);

        wse.sendEvent(fakeWs, 'tres');
        expect(event.event).toEqual('tres');
        expect(event.sid).toEqual(3);
    });

});
