Alternating uuid logic and tests
This commit is contained in:
@@ -154,7 +154,7 @@ class AccountMenu {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
modelManager.resetLocalMemory();
|
modelManager.resetLocalMemory();
|
||||||
storageManager.clearAllModels().them(() => {
|
storageManager.clearAllModels().then(() => {
|
||||||
block();
|
block();
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -83,29 +83,27 @@ class ModelManager extends SFModelManager {
|
|||||||
|
|
||||||
// remove from relevant array, but don't remove from all items.
|
// remove from relevant array, but don't remove from all items.
|
||||||
// This way, it's removed from the display, but still synced via get dirty items
|
// This way, it's removed from the display, but still synced via get dirty items
|
||||||
if(item.content_type == "Tag") {
|
this.removeItemFromRespectiveArray(item);
|
||||||
_.pull(this.tags, item);
|
|
||||||
} else if(item.content_type == "Note") {
|
|
||||||
_.pull(this.notes, item);
|
|
||||||
} else if(item.content_type == "Extension") {
|
|
||||||
_.pull(this._extensions, item);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
removeItemLocally(item, callback) {
|
removeItemLocally(item, callback) {
|
||||||
super.removeItemLocally(item, callback);
|
super.removeItemLocally(item, callback);
|
||||||
|
|
||||||
if(item.content_type == "Tag") {
|
this.removeItemFromRespectiveArray(item);
|
||||||
_.pull(this.tags, item);
|
|
||||||
} else if(item.content_type == "Note") {
|
|
||||||
_.pull(this.notes, item);
|
|
||||||
} else if(item.content_type == "Extension") {
|
|
||||||
_.pull(this._extensions, item);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.storageManager.deleteModel(item).then(callback);
|
this.storageManager.deleteModel(item).then(callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
removeItemFromRespectiveArray(item) {
|
||||||
|
if(item.content_type == "Tag") {
|
||||||
|
_.remove(this.tags, {uuid: item.uuid});
|
||||||
|
} else if(item.content_type == "Note") {
|
||||||
|
_.remove(this.notes, {uuid: item.uuid});
|
||||||
|
} else if(item.content_type == "Extension") {
|
||||||
|
_.remove(this._extensions, {uuid: item.uuid});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Misc
|
Misc
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ export default class LocalStorageManager extends SFStorageManager {
|
|||||||
// clear only models
|
// clear only models
|
||||||
for(var key in localStorage) {
|
for(var key in localStorage) {
|
||||||
if(key.startsWith("item-")) {
|
if(key.startsWith("item-")) {
|
||||||
this.removeItem(`item-${item.uuid}`);
|
this.removeItem(key);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -290,6 +290,65 @@ describe("syncing", () => {
|
|||||||
}
|
}
|
||||||
}).timeout(10000);
|
}).timeout(10000);
|
||||||
|
|
||||||
|
it("handles signing in and merging data", async () => {
|
||||||
|
|
||||||
|
let syncManager = new SFSyncManager(modelManager, Factory.globalStorageManager(), Factory.globalHttpManager());
|
||||||
|
|
||||||
|
syncManager.setEventHandler(() => {})
|
||||||
|
|
||||||
|
// be offline
|
||||||
|
syncManager.setKeyRequestHandler(async () => {
|
||||||
|
return {
|
||||||
|
offline: true
|
||||||
|
};
|
||||||
|
})
|
||||||
|
|
||||||
|
modelManager.resetLocalMemory();
|
||||||
|
let pair = createRelatedNoteTagPair();
|
||||||
|
let noteParams = pair[0];
|
||||||
|
let tagParams = pair[1];
|
||||||
|
|
||||||
|
modelManager.mapResponseItemsToLocalModels([noteParams, tagParams]);
|
||||||
|
let originalNote = modelManager.allItemsMatchingTypes(["Note"])[0];
|
||||||
|
let originalTag = modelManager.allItemsMatchingTypes(["Tag"])[0];
|
||||||
|
originalNote.setDirty(true);
|
||||||
|
originalTag.setDirty(true);
|
||||||
|
|
||||||
|
await syncManager.sync();
|
||||||
|
|
||||||
|
expect(originalTag.content.references.length).to.equal(1);
|
||||||
|
expect(originalTag.notes.length).to.equal(1);
|
||||||
|
expect(originalNote.tags.length).to.equal(1);
|
||||||
|
|
||||||
|
// go online
|
||||||
|
syncManager.setKeyRequestHandler(async () => {
|
||||||
|
return {
|
||||||
|
keys: await authManager.keys(),
|
||||||
|
offline: false
|
||||||
|
};
|
||||||
|
})
|
||||||
|
|
||||||
|
// when signing in, all local items are cleared from storage (but kept in memory; to clear desktop logs),
|
||||||
|
// then resaved with alternated uuids.
|
||||||
|
await Factory.globalStorageManager().clearAllModels();
|
||||||
|
return expect(syncManager.markAllItemsDirtyAndSaveOffline(true)).to.be.fulfilled.then(() => {
|
||||||
|
let note = modelManager.allItemsMatchingTypes(["Note"])[0];
|
||||||
|
let tag = modelManager.allItemsMatchingTypes(["Tag"])[0];
|
||||||
|
|
||||||
|
expect(modelManager.allItems.length).to.equal(2);
|
||||||
|
|
||||||
|
expect(note.uuid).to.not.equal(originalNote.uuid);
|
||||||
|
expect(tag.uuid).to.not.equal(originalTag.uuid);
|
||||||
|
|
||||||
|
expect(tag.content.references.length).to.equal(1);
|
||||||
|
expect(note.content.references.length).to.equal(0);
|
||||||
|
|
||||||
|
expect(note.referencingObjects.length).to.equal(1);
|
||||||
|
expect(tag.notes.length).to.equal(1);
|
||||||
|
expect(note.tags.length).to.equal(1);
|
||||||
|
});
|
||||||
|
})
|
||||||
|
|
||||||
it('duplicating a tag should maintian its relationships', async () => {
|
it('duplicating a tag should maintian its relationships', async () => {
|
||||||
modelManager.resetLocalMemory();
|
modelManager.resetLocalMemory();
|
||||||
let pair = createRelatedNoteTagPair();
|
let pair = createRelatedNoteTagPair();
|
||||||
|
|||||||
Reference in New Issue
Block a user