mirror of
https://github.com/nasa/openmct.git
synced 2025-06-01 15:10:50 +00:00
Only persist latest mutated model. (#2295)
* Only persist latest mutated model. Fixes #2277 * Updated tests * Fixed style issues
This commit is contained in:
parent
a8ba3b3fdb
commit
98c8e19d93
@ -77,14 +77,19 @@ define([], function () {
|
|||||||
return promiseFn().then(nextFn);
|
return promiseFn().then(nextFn);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* Clear any existing persistence calls for object with given ID. This ensures only the most recent persistence
|
||||||
|
* call is executed. This should prevent stale objects being persisted and overwriting fresh ones.
|
||||||
|
*/
|
||||||
|
if (this.isScheduled(id)) {
|
||||||
|
this.clearTransactionsFor(id);
|
||||||
|
}
|
||||||
|
|
||||||
if (!this.isScheduled(id)) {
|
|
||||||
this.clearTransactionFns[id] =
|
this.clearTransactionFns[id] =
|
||||||
this.transactionService.addToTransaction(
|
this.transactionService.addToTransaction(
|
||||||
chain(onCommit, release),
|
chain(onCommit, release),
|
||||||
chain(onCancel, release)
|
chain(onCancel, release)
|
||||||
);
|
);
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -93,24 +93,33 @@ define(
|
|||||||
expect(mockOnCancel).toHaveBeenCalled();
|
expect(mockOnCancel).toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("ignores subsequent calls for the same object", function () {
|
describe("Adds callbacks to transaction", function () {
|
||||||
|
beforeEach(function () {
|
||||||
|
spyOn(manager, 'clearTransactionsFor');
|
||||||
|
manager.clearTransactionsFor.and.callThrough();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("and clears pending calls if same object", function () {
|
||||||
manager.addToTransaction(
|
manager.addToTransaction(
|
||||||
testId,
|
testId,
|
||||||
jasmine.createSpy(),
|
jasmine.createSpy(),
|
||||||
jasmine.createSpy()
|
jasmine.createSpy()
|
||||||
);
|
);
|
||||||
expect(mockTransactionService.addToTransaction.calls.count())
|
expect(manager.clearTransactionsFor).toHaveBeenCalledWith(testId);
|
||||||
.toEqual(1);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it("accepts subsequent calls for other objects", function () {
|
it("and does not clear pending calls if different object", function () {
|
||||||
manager.addToTransaction(
|
manager.addToTransaction(
|
||||||
'other-id',
|
'other-id',
|
||||||
jasmine.createSpy(),
|
jasmine.createSpy(),
|
||||||
jasmine.createSpy()
|
jasmine.createSpy()
|
||||||
);
|
);
|
||||||
expect(mockTransactionService.addToTransaction.calls.count())
|
expect(manager.clearTransactionsFor).not.toHaveBeenCalled();
|
||||||
.toEqual(2);
|
});
|
||||||
|
|
||||||
|
afterEach(function () {
|
||||||
|
expect(mockTransactionService.addToTransaction.calls.count()).toEqual(2);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it("does not remove callbacks from the transaction", function () {
|
it("does not remove callbacks from the transaction", function () {
|
||||||
|
@ -43,20 +43,10 @@ define([], function () {
|
|||||||
var mutationTopic = topic('mutation');
|
var mutationTopic = topic('mutation');
|
||||||
mutationTopic.listen(function (domainObject) {
|
mutationTopic.listen(function (domainObject) {
|
||||||
var persistence = domainObject.getCapability('persistence');
|
var persistence = domainObject.getCapability('persistence');
|
||||||
var wasActive = transactionService.isActive();
|
|
||||||
cacheService.put(domainObject.getId(), domainObject.getModel());
|
cacheService.put(domainObject.getId(), domainObject.getModel());
|
||||||
|
|
||||||
if (hasChanged(domainObject)) {
|
if (hasChanged(domainObject)) {
|
||||||
|
|
||||||
if (!wasActive) {
|
|
||||||
transactionService.startTransaction();
|
|
||||||
}
|
|
||||||
|
|
||||||
persistence.persist();
|
persistence.persist();
|
||||||
|
|
||||||
if (!wasActive) {
|
|
||||||
transactionService.commit();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -83,44 +83,27 @@ define(
|
|||||||
.toHaveBeenCalledWith(jasmine.any(Function));
|
.toHaveBeenCalledWith(jasmine.any(Function));
|
||||||
});
|
});
|
||||||
|
|
||||||
[false, true].forEach(function (isActive) {
|
it("calls persist if the model has changed", function () {
|
||||||
var verb = isActive ? "is" : "isn't";
|
mockModel.persisted = Date.now();
|
||||||
|
|
||||||
function onlyWhenInactive(expectation) {
|
//Mark the model dirty by setting the mutated date later than the last persisted date.
|
||||||
return isActive ? expectation.not : expectation;
|
mockModel.modified = mockModel.persisted + 1;
|
||||||
}
|
|
||||||
|
|
||||||
describe("when a transaction " + verb + " active", function () {
|
|
||||||
var innerVerb = isActive ? "does" : "doesn't";
|
|
||||||
|
|
||||||
beforeEach(function () {
|
|
||||||
mockTransactionService.isActive.and.returnValue(isActive);
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("and mutation occurs", function () {
|
|
||||||
beforeEach(function () {
|
|
||||||
mockMutationTopic.listen.calls.mostRecent()
|
mockMutationTopic.listen.calls.mostRecent()
|
||||||
.args[0](mockDomainObject);
|
.args[0](mockDomainObject);
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
it(innerVerb + " start a new transaction", function () {
|
|
||||||
onlyWhenInactive(
|
|
||||||
expect(mockTransactionService.startTransaction)
|
|
||||||
).toHaveBeenCalled();
|
|
||||||
});
|
|
||||||
|
|
||||||
it("calls persist", function () {
|
|
||||||
expect(mockPersistence.persist).toHaveBeenCalled();
|
expect(mockPersistence.persist).toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
|
|
||||||
it(innerVerb + " immediately commit", function () {
|
it("does not call persist if the model has not changed", function () {
|
||||||
onlyWhenInactive(
|
mockModel.persisted = Date.now();
|
||||||
expect(mockTransactionService.commit)
|
|
||||||
).toHaveBeenCalled();
|
mockModel.modified = mockModel.persisted;
|
||||||
});
|
|
||||||
});
|
mockMutationTopic.listen.calls.mostRecent()
|
||||||
});
|
.args[0](mockDomainObject);
|
||||||
|
|
||||||
|
expect(mockPersistence.persist).not.toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user