blob: 7adaf070a9eb83aba3dc8b724d4ff7a1e1dfe271 [file] [log] [blame]
/*
* Copyright 2017-present Open Networking Foundation
* 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.
*/
import * as angular from 'angular';
import 'angular-mocks';
import {IWSEvent, IWSEventService, WebSocketEvent} from './global';
const MockAppCfg = {
apiEndpoint: 'http://xos-test:3000/api',
websocketClient: 'http://xos-test:3000'
};
class MockSocket {
private cbs = {};
public on(event: string, cb: any) {
this.cbs[event] = cb;
}
public send(evt: string, data: any) {
const cb = this.cbs[evt];
cb(data);
}
public clean() {
this.cbs = {};
}
}
describe('The WebSocket service', () => {
let service, observable, mockWS;
beforeEach(() => {
mockWS = new MockSocket();
angular
.module('WebSocketEvent', [])
.service('WebSocket', WebSocketEvent)
.constant('AppConfig', MockAppCfg)
.value('SocketIo', {socket: mockWS});
angular.mock.module('WebSocketEvent');
});
beforeEach(angular.mock.inject((
WebSocket: IWSEventService
) => {
service = WebSocket;
observable = service['_events'];
spyOn(observable, 'next');
}));
afterEach(() => {
mockWS.clean();
observable.next.calls.reset();
});
it('should have a list method', () => {
expect(service.list).toBeDefined();
});
describe('the update event', () => {
it('should update the base class', () => {
const data: IWSEvent = {
model: 'Test',
msg: {
pk: 1,
changed_fields: ['name'],
object: {}
}
};
mockWS.send('update', data);
expect(observable.next).toHaveBeenCalledWith(data);
expect(observable.next.calls.count()).toBe(1);
});
it('should not update the class if the changed_fields are not useful to the UI', () => {
const data: IWSEvent = {
model: 'Test',
msg: {
pk: 1,
changed_fields: ['created', 'updated', 'backend_register', 'backend_status', 'policy_status'],
object: {}
}
};
mockWS.send('update', data);
expect(observable.next).not.toHaveBeenCalled();
});
it('should update parent classes (if any)', () => {
const data: IWSEvent = {
model: 'ONOSApp',
msg: {
pk: 1,
changed_fields: ['name'],
object: {
class_names: 'ONOSApp,ONOSApp_decl,ServiceInstance,XOSBase,Model,PlModelMixIn,AttributeMixin,object'
}
}
};
mockWS.send('update', data);
expect(observable.next).toHaveBeenCalledWith(data);
const siEvent = data;
siEvent.model = 'ServiceInstance';
siEvent.skip_notification = true;
expect(observable.next).toHaveBeenCalledWith(siEvent);
expect(observable.next.calls.count()).toBe(2);
});
});
describe('the remove event', () => {
it('should trigger the remove event', () => {
const data: IWSEvent = {
model: 'Test',
msg: {
pk: 1,
changed_fields: [],
object: {}
},
};
mockWS.send('remove', data);
expect(observable.next).toHaveBeenCalledWith(data);
});
it('should update parent classes (if any)', () => {
const data: IWSEvent = {
model: 'ONOSApp',
msg: {
pk: 1,
changed_fields: ['name'],
object: {
class_names: 'ONOSApp,ONOSApp_decl,ServiceInstance,XOSBase,Model,PlModelMixIn,AttributeMixin,object'
}
}
};
mockWS.send('remove', data);
expect(observable.next).toHaveBeenCalledWith(data);
const siEvent = data;
siEvent.model = 'ServiceInstance';
siEvent.skip_notification = true;
expect(observable.next).toHaveBeenCalledWith(siEvent);
expect(observable.next.calls.count()).toBe(2);
});
it('should update derived class if the original is _decl', () => {
const data: IWSEvent = {
model: 'ONOSApp_decl',
msg: {
pk: 1,
changed_fields: ['name'],
object: {
class_names: 'ONOSApp_decl,ServiceInstance,XOSBase,Model,PlModelMixIn,AttributeMixin,object'
}
}
};
mockWS.send('remove', data);
const nextData = angular.copy(data);
nextData.model = 'ONOSApp';
expect(observable.next).toHaveBeenCalledWith(nextData);
const declEvent = nextData;
declEvent.model = 'ServiceInstance';
declEvent.skip_notification = true;
expect(observable.next).toHaveBeenCalledWith(declEvent);
expect(observable.next.calls.count()).toBe(2);
});
});
});