197 lines
8.0 KiB
JavaScript
197 lines
8.0 KiB
JavaScript
/*****************************************************************************
|
|
* Open MCT, Copyright (c) 2014-2016, United States Government
|
|
* as represented by the Administrator of the National Aeronautics and Space
|
|
* Administration. All rights reserved.
|
|
*
|
|
* Open MCT is 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.
|
|
*
|
|
* Open MCT includes source code licensed under additional open source
|
|
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
|
* this source code distribution or the Licensing information page available
|
|
* at runtime from the About dialog for additional information.
|
|
*****************************************************************************/
|
|
|
|
/**
|
|
* PersistenceCapabilitySpec. Created by vwoeltje on 11/6/14.
|
|
*/
|
|
define(
|
|
["../../src/capabilities/PersistenceCapability"],
|
|
function (PersistenceCapability) {
|
|
|
|
describe("The persistence capability", function () {
|
|
var mockPersistenceService,
|
|
mockIdentifierService,
|
|
mockDomainObject,
|
|
mockIdentifier,
|
|
mockNofificationService,
|
|
mockCacheService,
|
|
mockQ,
|
|
key = "persistence key",
|
|
id = "object identifier",
|
|
model,
|
|
SPACE = "some space",
|
|
persistence,
|
|
happyPromise;
|
|
|
|
function asPromise(value, doCatch) {
|
|
return (value || {}).then ? value : {
|
|
then: function (callback) {
|
|
return asPromise(callback(value));
|
|
},
|
|
catch: function (callback) {
|
|
//Define a default 'happy' catch, that skips over the
|
|
// catch callback
|
|
return doCatch ? asPromise(callback(value)) : asPromise(value);
|
|
}
|
|
};
|
|
}
|
|
|
|
beforeEach(function () {
|
|
happyPromise = asPromise(true);
|
|
model = { someKey: "some value", name: "domain object"};
|
|
|
|
mockPersistenceService = jasmine.createSpyObj(
|
|
"persistenceService",
|
|
["updateObject", "readObject", "createObject", "deleteObject"]
|
|
);
|
|
|
|
mockIdentifierService = jasmine.createSpyObj(
|
|
'identifierService',
|
|
['parse', 'generate']
|
|
);
|
|
mockIdentifier = jasmine.createSpyObj(
|
|
'identifier',
|
|
['getSpace', 'getKey', 'getDefinedSpace']
|
|
);
|
|
mockQ = jasmine.createSpyObj(
|
|
"$q",
|
|
["reject", "when"]
|
|
);
|
|
mockNofificationService = jasmine.createSpyObj(
|
|
"notificationService",
|
|
["error"]
|
|
);
|
|
mockCacheService = jasmine.createSpyObj(
|
|
"cacheService",
|
|
["get", "put", "remove", "all"]
|
|
);
|
|
|
|
mockDomainObject = {
|
|
getId: function () {
|
|
return id;
|
|
},
|
|
getModel: function () {
|
|
return model;
|
|
},
|
|
useCapability: jasmine.createSpy()
|
|
};
|
|
// Simulate mutation capability
|
|
mockDomainObject.useCapability.andCallFake(function (capability, mutator) {
|
|
if (capability === 'mutation') {
|
|
model = mutator(model) || model;
|
|
}
|
|
});
|
|
mockIdentifierService.parse.andReturn(mockIdentifier);
|
|
mockIdentifier.getSpace.andReturn(SPACE);
|
|
mockIdentifier.getKey.andReturn(key);
|
|
mockQ.when.andCallFake(asPromise);
|
|
persistence = new PersistenceCapability(
|
|
mockCacheService,
|
|
mockPersistenceService,
|
|
mockIdentifierService,
|
|
mockNofificationService,
|
|
mockQ,
|
|
mockDomainObject
|
|
);
|
|
});
|
|
|
|
describe("successful persistence", function () {
|
|
beforeEach(function () {
|
|
mockPersistenceService.updateObject.andReturn(happyPromise);
|
|
mockPersistenceService.createObject.andReturn(happyPromise);
|
|
});
|
|
it("creates unpersisted objects with the persistence service", function () {
|
|
// Verify precondition; no call made during constructor
|
|
expect(mockPersistenceService.createObject).not.toHaveBeenCalled();
|
|
|
|
persistence.persist();
|
|
|
|
expect(mockPersistenceService.createObject).toHaveBeenCalledWith(
|
|
SPACE,
|
|
key,
|
|
model
|
|
);
|
|
});
|
|
|
|
it("updates previously persisted objects with the persistence service", function () {
|
|
// Verify precondition; no call made during constructor
|
|
expect(mockPersistenceService.updateObject).not.toHaveBeenCalled();
|
|
|
|
model.persisted = 12321;
|
|
persistence.persist();
|
|
|
|
expect(mockPersistenceService.updateObject).toHaveBeenCalledWith(
|
|
SPACE,
|
|
key,
|
|
model
|
|
);
|
|
});
|
|
|
|
it("reports which persistence space an object belongs to", function () {
|
|
expect(persistence.getSpace()).toEqual(SPACE);
|
|
});
|
|
|
|
it("updates persisted timestamp on persistence", function () {
|
|
model.modified = 12321;
|
|
persistence.persist();
|
|
expect(model.persisted).toEqual(12321);
|
|
});
|
|
it("refreshes the domain object model from persistence", function () {
|
|
var refreshModel = {someOtherKey: "some other value"};
|
|
model.persisted = 1;
|
|
mockPersistenceService.readObject.andReturn(asPromise(refreshModel));
|
|
persistence.refresh();
|
|
expect(model).toEqual(refreshModel);
|
|
});
|
|
|
|
it("does not trigger error notification on successful" +
|
|
" persistence", function () {
|
|
persistence.persist();
|
|
expect(mockQ.reject).not.toHaveBeenCalled();
|
|
expect(mockNofificationService.error).not.toHaveBeenCalled();
|
|
});
|
|
});
|
|
|
|
describe("unsuccessful persistence", function () {
|
|
var sadPromise = {
|
|
then: function (callback) {
|
|
return asPromise(callback(0), true);
|
|
}
|
|
};
|
|
beforeEach(function () {
|
|
mockPersistenceService.createObject.andReturn(sadPromise);
|
|
});
|
|
it("rejects on falsey persistence result", function () {
|
|
persistence.persist();
|
|
expect(mockQ.reject).toHaveBeenCalled();
|
|
});
|
|
|
|
it("notifies user on persistence failure", function () {
|
|
persistence.persist();
|
|
expect(mockQ.reject).toHaveBeenCalled();
|
|
expect(mockNofificationService.error).toHaveBeenCalled();
|
|
});
|
|
});
|
|
});
|
|
}
|
|
);
|