blob: 48798df56651dc18dfe29d2ea4b86cacf29b8d5d [file] [log] [blame]
import * as angular from 'angular';
import 'angular-mocks';
import 'angular-resource';
import {IModelStoreService, ModelStore} from './model.store';
import {Subject} from 'rxjs';
import {IWSEvent} from '../websocket/global';
import {StoreHelpers} from '../helpers/store.helpers';
import {ModelRest} from '../rest/model.rest';
import {AppConfig} from '../../config/app.config';
let service: IModelStoreService;
let httpBackend: ng.IHttpBackendService;
let $scope;
let WebSocket;
class MockWs {
private _list;
constructor() {
this._list = new Subject<IWSEvent>();
}
list() {
return this._list.asObservable();
}
next(event: IWSEvent) {
this._list.next(event);
}
}
const queryData = [
{id: 1, name: 'foo'},
{id: 1, name: 'bar'}
];
describe('The ModelStore service', () => {
beforeEach(() => {
angular
.module('ModelStore', ['ngResource'])
.service('WebSocket', MockWs)
.service('StoreHelpers', StoreHelpers) // TODO mock
.service('ModelRest', ModelRest) // TODO mock
.service('ModelStore', ModelStore);
angular.mock.module('ModelStore');
});
beforeEach(angular.mock.inject((
ModelStore: IModelStoreService,
$httpBackend: ng.IHttpBackendService,
_$rootScope_: ng.IRootScopeService,
_WebSocket_: any
) => {
service = ModelStore;
httpBackend = $httpBackend;
$scope = _$rootScope_;
WebSocket = _WebSocket_;
// ModelRest will call the backend
httpBackend.expectGET(`${AppConfig.apiEndpoint}/core/tests`)
.respond(queryData);
}));
it('should return an Observable', () => {
expect(typeof service.query('test').subscribe).toBe('function');
});
it('the first event should be the resource response', (done) => {
let event = 0;
service.query('test')
.subscribe(collection => {
event++;
if (event === 2) {
expect(collection[0].id).toEqual(queryData[0].id);
expect(collection[1].id).toEqual(queryData[1].id);
done();
}
});
$scope.$apply();
httpBackend.flush();
});
describe('when a web-socket event is received for that model', () => {
it('should update the collection', (done) => {
let event = 0;
service.query('test')
.subscribe(
collection => {
event++;
if (event === 3) {
expect(collection[0].id).toEqual(queryData[0].id);
expect(collection[1].id).toEqual(queryData[1].id);
expect(collection[2].id).toEqual(3);
expect(collection[2].name).toEqual('baz');
done();
}
},
err => {
console.log(err);
done(err);
}
);
window.setTimeout(() => {
WebSocket.next({
model: 'test',
msg: {
changed_fields: ['id'],
object: {id: 3, name: 'baz'},
pk: 3
}
});
}, 1);
$scope.$apply();
httpBackend.flush();
});
});
});