1
0
Fork 0
arangodb/js/server/tests/shell-foxx-repository-event...

88 lines
3.0 KiB
JavaScript

/*jshint globalstrict:false, strict:false */
/*global describe, expect, it, beforeEach, createSpyObj */
var FoxxRepository = require("org/arangodb/foxx/repository").Repository,
Model = require("org/arangodb/foxx/model").Model;
describe('Model Events', function () {
'use strict';
var collection, instance, repository;
beforeEach(function () {
collection = createSpyObj('collection', [
'update',
'save',
'type',
'remove'
]);
collection.type.and.returnValue(2);
instance = new Model();
repository = new FoxxRepository(collection, {model: Model, random: '', beforeCalled: false, afterCalled: false});
});
it('should be possible to subscribe and emit events', function () {
expect(repository.on).toBeDefined();
expect(repository.emit).toBeDefined();
});
it('should emit beforeCreate and afterCreate events when creating the model', function () {
addHooks(repository, instance, 'Create');
expect(repository.save(instance)).toEqual(instance);
expect(repository.beforeCalled).toBe(true);
expect(repository.afterCalled).toBe(true);
});
it('should emit beforeSave and afterSave events when creating the model', function () {
addHooks(repository, instance, 'Save');
expect(repository.save(instance)).toEqual(instance);
expect(repository.beforeCalled).toBe(true);
expect(repository.afterCalled).toBe(true);
});
it('should emit beforeUpdate and afterUpdate events when updating the model', function () {
var newData = { newAttribute: 'test' };
addHooks(repository, instance, 'Update', newData);
expect(repository.update(instance, newData)).toEqual(instance);
expect(repository.beforeCalled).toBe(true);
expect(repository.afterCalled).toBe(true);
});
it('should emit beforeSave and afterSave events when updating the model', function () {
var newData = { newAttribute: 'test' };
addHooks(repository, instance, 'Save', newData);
expect(repository.update(instance, newData)).toEqual(instance);
expect(repository.beforeCalled).toBe(true);
expect(repository.afterCalled).toBe(true);
});
it('should emit beforeRemove and afterRemove events when removing the model', function () {
addHooks(repository, instance, 'Remove');
repository.remove(instance);
expect(repository.beforeCalled).toBe(true);
expect(repository.afterCalled).toBe(true);
});
});
function addHooks(repo, model, ev, dataToReceive) {
'use strict';
var random = String(Math.floor(Math.random() * 1000));
repo.on('before' + ev, function (self, data) {
expect(this).toEqual(repo);
expect(self).toEqual(model);
expect(data).toEqual(dataToReceive);
this.random = random;
this.beforeCalled = true;
});
repo.on('after' + ev, function (self, data) {
expect(this).toEqual(repo);
expect(self).toEqual(model);
expect(data).toEqual(dataToReceive);
this.afterCalled = true;
expect(this.beforeCalled).toBe(true);
expect(this.random).toEqual(random);
});
}