2014-11-26 02:30:30 +00:00
|
|
|
/*global define,Promise,describe,it,expect,beforeEach,waitsFor,jasmine*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* MCTRepresentationSpec. Created by vwoeltje on 11/6/14.
|
|
|
|
*/
|
|
|
|
define(
|
|
|
|
["../../src/creation/CreationService"],
|
|
|
|
function (CreationService) {
|
|
|
|
"use strict";
|
|
|
|
|
|
|
|
describe("The creation service", function () {
|
2014-11-26 06:35:30 +00:00
|
|
|
var mockPersistenceService,
|
|
|
|
mockQ,
|
|
|
|
mockLog,
|
|
|
|
mockParentObject,
|
|
|
|
mockMutationCapability,
|
|
|
|
mockPersistenceCapability,
|
|
|
|
mockCapabilities,
|
|
|
|
creationService;
|
|
|
|
|
|
|
|
function mockPromise(value) {
|
|
|
|
return (value && value.then) ? value : {
|
|
|
|
then: function (callback) {
|
|
|
|
return mockPromise(callback(value));
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
function mockReject(value) {
|
|
|
|
return {
|
|
|
|
then: function (callback, error) {
|
|
|
|
return mockPromise(error(value));
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
beforeEach(function () {
|
|
|
|
mockPersistenceService = jasmine.createSpyObj(
|
|
|
|
"persistenceService",
|
|
|
|
[ "createObject" ]
|
|
|
|
);
|
|
|
|
mockQ = { when: mockPromise, reject: mockReject };
|
|
|
|
mockLog = jasmine.createSpyObj(
|
|
|
|
"$log",
|
|
|
|
[ "error", "warn", "info", "debug" ]
|
|
|
|
);
|
|
|
|
mockParentObject = jasmine.createSpyObj(
|
|
|
|
"parentObject",
|
|
|
|
[ "getId", "getCapability", "useCapability" ]
|
|
|
|
);
|
|
|
|
mockMutationCapability = jasmine.createSpyObj(
|
|
|
|
"mutation",
|
|
|
|
[ "invoke" ]
|
|
|
|
);
|
|
|
|
mockPersistenceCapability = jasmine.createSpyObj(
|
|
|
|
"persistence",
|
|
|
|
[ "persist", "getSpace" ]
|
|
|
|
);
|
|
|
|
mockCapabilities = {
|
|
|
|
mutation: mockMutationCapability,
|
|
|
|
persistence: mockPersistenceCapability
|
|
|
|
};
|
|
|
|
|
|
|
|
mockPersistenceService.createObject.andReturn(
|
|
|
|
mockPromise(true)
|
|
|
|
);
|
|
|
|
|
|
|
|
mockParentObject.getCapability.andCallFake(function (key) {
|
|
|
|
return mockCapabilities[key];
|
|
|
|
});
|
|
|
|
mockParentObject.useCapability.andCallFake(function (key, value) {
|
|
|
|
return mockCapabilities[key].invoke(value);
|
|
|
|
});
|
|
|
|
|
|
|
|
mockMutationCapability.invoke.andReturn(mockPromise(true));
|
|
|
|
mockPersistenceCapability.getSpace.andReturn("testSpace");
|
|
|
|
|
|
|
|
creationService = new CreationService(
|
|
|
|
mockPersistenceService,
|
|
|
|
mockQ,
|
|
|
|
mockLog
|
|
|
|
);
|
|
|
|
});
|
|
|
|
|
|
|
|
it("allows new objects to be created", function () {
|
|
|
|
var model = { someKey: "some value" };
|
|
|
|
creationService.createObject(model, mockParentObject);
|
|
|
|
expect(mockPersistenceService.createObject).toHaveBeenCalledWith(
|
|
|
|
"testSpace",
|
|
|
|
jasmine.any(String), // the object id; generated UUID
|
|
|
|
model
|
|
|
|
);
|
|
|
|
});
|
|
|
|
|
|
|
|
it("adds new id's to the parent's composition", function () {
|
|
|
|
var model = { someKey: "some value" },
|
|
|
|
parentModel = { composition: ["notAnyUUID"] };
|
|
|
|
creationService.createObject(model, mockParentObject);
|
|
|
|
|
|
|
|
// Invoke the mutation callback
|
|
|
|
expect(mockMutationCapability.invoke).toHaveBeenCalled();
|
|
|
|
mockMutationCapability.invoke.mostRecentCall.args[0](parentModel);
|
|
|
|
|
|
|
|
// Should have a longer composition now, with the new UUID
|
|
|
|
expect(parentModel.composition.length).toEqual(2);
|
|
|
|
});
|
|
|
|
|
|
|
|
it("warns if parent has no composition", function () {
|
|
|
|
var model = { someKey: "some value" },
|
|
|
|
parentModel = { };
|
|
|
|
creationService.createObject(model, mockParentObject);
|
|
|
|
|
|
|
|
// Verify precondition; no prior warnings
|
|
|
|
expect(mockLog.warn).not.toHaveBeenCalled();
|
|
|
|
|
|
|
|
// Invoke the mutation callback
|
|
|
|
expect(mockMutationCapability.invoke).toHaveBeenCalled();
|
|
|
|
mockMutationCapability.invoke.mostRecentCall.args[0](parentModel);
|
|
|
|
|
|
|
|
// Should have a longer composition now, with the new UUID
|
|
|
|
expect(mockLog.warn).toHaveBeenCalled();
|
|
|
|
// Composition should still be undefined
|
|
|
|
expect(parentModel.composition).toBeUndefined();
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
it("warns if parent has no persistence capability", function () {
|
|
|
|
// Callbacks
|
|
|
|
var success = jasmine.createSpy("success"),
|
|
|
|
failure = jasmine.createSpy("failure");
|
|
|
|
|
|
|
|
mockCapabilities.persistence = undefined;
|
|
|
|
creationService.createObject({}, mockParentObject).then(
|
|
|
|
success,
|
|
|
|
failure
|
|
|
|
);
|
|
|
|
|
|
|
|
// Should have warned and rejected the promise
|
|
|
|
expect(mockLog.warn).toHaveBeenCalled();
|
|
|
|
expect(success).not.toHaveBeenCalled();
|
|
|
|
expect(failure).toHaveBeenCalled();
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
it("logs an error when mutaton fails", function () {
|
|
|
|
// If mutation of the parent fails, we've lost the
|
|
|
|
// created object - this is an error.
|
|
|
|
var model = { someKey: "some value" },
|
|
|
|
parentModel = { composition: ["notAnyUUID"] };
|
|
|
|
|
|
|
|
mockMutationCapability.invoke.andReturn(mockPromise(false));
|
|
|
|
|
|
|
|
creationService.createObject(model, mockParentObject);
|
|
|
|
|
|
|
|
expect(mockLog.error).toHaveBeenCalled();
|
|
|
|
});
|
|
|
|
|
2014-11-26 02:30:30 +00:00
|
|
|
|
|
|
|
});
|
|
|
|
}
|
|
|
|
);
|