Tests: Rework collection/search-in-trash tests
- Update for auto-`skipSelect` on collections and searches - Remove interdependencies that prevented independent runs - Remove unnecessary manual object names - Remove unnecessary delay - Switch to new convenience selection functions - Switch to customary object naming
This commit is contained in:
parent
173f4c491e
commit
621435be68
2 changed files with 88 additions and 91 deletions
|
@ -209,39 +209,41 @@ describe("Zotero.CollectionTree", function() {
|
||||||
})
|
})
|
||||||
|
|
||||||
describe("Trash for collections/searches", function () {
|
describe("Trash for collections/searches", function () {
|
||||||
var one, two, three;
|
|
||||||
for (let objectType of ['collection', 'search']) {
|
for (let objectType of ['collection', 'search']) {
|
||||||
it(`should remove deleted ${objectType} from collectionTree`, async function () {
|
it(`should remove deleted ${objectType} from collectionTree`, async function () {
|
||||||
var ran = Zotero.Utilities.randomString();
|
var o1 = await createDataObject(objectType);
|
||||||
one = await createDataObject(objectType, { name: ran + "_DELETE_ONE" });
|
var o2 = await createDataObject(objectType);
|
||||||
two = await createDataObject(objectType, { name: ran + "_DELETE_TWO" });
|
var o3 = await createDataObject(objectType);
|
||||||
three = await createDataObject(objectType, { name: ran + "_DELETE_THREE" });
|
|
||||||
|
|
||||||
// Move them to trash
|
// Move them to trash
|
||||||
one.deleted = true;
|
o1.deleted = true;
|
||||||
two.deleted = true;
|
o2.deleted = true;
|
||||||
three.deleted = true;
|
o3.deleted = true;
|
||||||
await one.saveTx();
|
await o1.saveTx();
|
||||||
await two.saveTx();
|
await o2.saveTx();
|
||||||
await three.saveTx();
|
await o3.saveTx();
|
||||||
|
|
||||||
// Make sure they're gone from collectionTree
|
// Make sure they're gone from collectionTree
|
||||||
assert.isFalse(cv.getRowIndexByID(one.treeViewID));
|
assert.isFalse(cv.getRowIndexByID(o1.treeViewID));
|
||||||
assert.isFalse(cv.getRowIndexByID(two.treeViewID));
|
assert.isFalse(cv.getRowIndexByID(o2.treeViewID));
|
||||||
assert.isFalse(cv.getRowIndexByID(three.treeViewID));
|
assert.isFalse(cv.getRowIndexByID(o3.treeViewID));
|
||||||
})
|
});
|
||||||
|
|
||||||
it(`should put restored ${objectType} back into collectionTree`, async function () {
|
it(`should put restored ${objectType} back into collectionTree`, async function () {
|
||||||
await cv.selectByID("T" + userLibraryID);
|
var o1 = await createDataObject(objectType, { deleted: true });
|
||||||
await waitForItemsLoad(win);
|
var o2 = await createDataObject(objectType, { deleted: true });
|
||||||
|
var o3 = await createDataObject(objectType, { deleted: true });
|
||||||
|
|
||||||
|
await selectTrash(win);
|
||||||
|
|
||||||
// Restore
|
// Restore
|
||||||
await Zotero.DB.executeTransaction(async function () {
|
await Zotero.DB.executeTransaction(async function () {
|
||||||
one.deleted = false;
|
o1.deleted = false;
|
||||||
two.deleted = false;
|
o2.deleted = false;
|
||||||
three.deleted = false;
|
o3.deleted = false;
|
||||||
await one.save({ skipSelect: true });
|
await o1.save();
|
||||||
await two.save({ skipSelect: true });
|
await o2.save();
|
||||||
await three.save({ skipSelect: true });
|
await o3.save();
|
||||||
});
|
});
|
||||||
|
|
||||||
// Check if trash is still selected
|
// Check if trash is still selected
|
||||||
|
@ -249,60 +251,66 @@ describe("Zotero.CollectionTree", function() {
|
||||||
assert.equal(cv.selection.focused, trashRow);
|
assert.equal(cv.selection.focused, trashRow);
|
||||||
|
|
||||||
// Check if restored entries are back in collectionTree
|
// Check if restored entries are back in collectionTree
|
||||||
assert.isNumber(cv.getRowIndexByID(one.treeViewID));
|
assert.isNumber(cv.getRowIndexByID(o1.treeViewID));
|
||||||
assert.isNumber(cv.getRowIndexByID(two.treeViewID));
|
assert.isNumber(cv.getRowIndexByID(o2.treeViewID));
|
||||||
assert.isNumber(cv.getRowIndexByID(three.treeViewID));
|
assert.isNumber(cv.getRowIndexByID(o3.treeViewID));
|
||||||
// Make sure it's all gone from trash
|
// Make sure it's all gone from trash
|
||||||
assert.isFalse(zp.itemsView.getRowIndexByID(one.treeViewID));
|
assert.isFalse(zp.itemsView.getRowIndexByID(o1.treeViewID));
|
||||||
assert.isFalse(zp.itemsView.getRowIndexByID(two.treeViewID));
|
assert.isFalse(zp.itemsView.getRowIndexByID(o2.treeViewID));
|
||||||
assert.isFalse(zp.itemsView.getRowIndexByID(three.treeViewID));
|
assert.isFalse(zp.itemsView.getRowIndexByID(o3.treeViewID));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
it(`should delete subcollections when parent is deleted`, async function () {
|
it("should delete subcollections when parent is deleted", async function () {
|
||||||
var ran = Zotero.Utilities.randomString();
|
var c1 = await createDataObject('collection');
|
||||||
one = await createDataObject('collection', { name: ran + "_DELETE_ONE" });
|
var c2 = await createDataObject('collection', { parentID: c1.id });
|
||||||
two = await createDataObject('collection', { name: ran + "_DELETE_TWO", parentID: one.id });
|
var c3 = await createDataObject('collection', { parentID: c2.id });
|
||||||
three = await createDataObject('collection', { name: ran + "_DELETE_THREE", parentID: two.id });
|
|
||||||
|
|
||||||
|
// Expand to bottom
|
||||||
|
await select(win, c3);
|
||||||
// Select top parent
|
// Select top parent
|
||||||
cv.selection.select(cv.getRowIndexByID(one.treeViewID));
|
await select(win, c1);
|
||||||
// Move parent to trash
|
// Move parent to trash
|
||||||
await cv.deleteSelection();
|
await cv.deleteSelection();
|
||||||
|
|
||||||
// Make sure they're gone from collectionTree
|
// Make sure they're gone from collectionTree
|
||||||
assert.isFalse(cv.getRowIndexByID(one.treeViewID));
|
assert.isFalse(cv.getRowIndexByID(c1.treeViewID));
|
||||||
assert.isFalse(cv.getRowIndexByID(two.treeViewID));
|
assert.isFalse(cv.getRowIndexByID(c2.treeViewID));
|
||||||
assert.isFalse(cv.getRowIndexByID(three.treeViewID));
|
assert.isFalse(cv.getRowIndexByID(c3.treeViewID));
|
||||||
})
|
})
|
||||||
|
|
||||||
it(`should restore deleted subcollections with parent`, async function () {
|
it("should restore deleted subcollections with parent", async function () {
|
||||||
await cv.selectByID("T" + userLibraryID);
|
var c1 = await createDataObject('collection', { deleted: true });
|
||||||
|
var c2 = await createDataObject('collection', { parentID: c1.id });
|
||||||
|
var c3 = await createDataObject('collection', { parentID: c2.id });
|
||||||
|
|
||||||
|
await selectTrash(win);
|
||||||
|
|
||||||
// Restore items
|
// Restore items
|
||||||
await waitForItemsLoad(win);
|
zp.itemsView.selectItem(c1.treeViewID);
|
||||||
zp.itemsView.selectItem(one.treeViewID);
|
|
||||||
await zp.restoreSelectedItems();
|
await zp.restoreSelectedItems();
|
||||||
|
|
||||||
// Check if trash is still selected
|
// Check if trash is still selected
|
||||||
let trashRow = cv.getRowIndexByID("T" + userLibraryID);
|
let trashRow = cv.getRowIndexByID("T" + userLibraryID);
|
||||||
assert.equal(cv.selection.focused, trashRow);
|
assert.equal(cv.selection.focused, trashRow);
|
||||||
|
|
||||||
// Check if restored collections are back in collectionTree
|
// Check if restored collections are back in collectionTree
|
||||||
let parentRowIndex = cv.getRowIndexByID(one.treeViewID);
|
let parentRowIndex = cv.getRowIndexByID(c1.treeViewID);
|
||||||
await cv.toggleOpenState(parentRowIndex);
|
await cv.toggleOpenState(parentRowIndex);
|
||||||
assert.equal(cv.getRow(parentRowIndex).level, 1);
|
assert.equal(cv.getRow(parentRowIndex).level, 1);
|
||||||
await Zotero.Promise.delay(5000);
|
|
||||||
let middleRowIndex = cv.getRowIndexByID(two.treeViewID);
|
let middleRowIndex = cv.getRowIndexByID(c2.treeViewID);
|
||||||
|
await cv.toggleOpenState(middleRowIndex);
|
||||||
assert.equal(cv.getRow(middleRowIndex).level, 2);
|
assert.equal(cv.getRow(middleRowIndex).level, 2);
|
||||||
let bottomRowindex = cv.getRowIndexByID(three.treeViewID);
|
|
||||||
assert.equal(cv.getRow(bottomRowindex).level, 3);
|
let bottomRowIndex = cv.getRowIndexByID(c3.treeViewID);
|
||||||
|
assert.equal(cv.getRow(bottomRowIndex).level, 3);
|
||||||
await waitForItemsLoad(win);
|
|
||||||
//Make sure they're gone from trash
|
// Make sure they're gone from trash
|
||||||
assert.isFalse(zp.itemsView.getRowIndexByID(one.treeViewID));
|
assert.isFalse(zp.itemsView.getRowIndexByID(c1.treeViewID));
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe("#notify()", function () {
|
describe("#notify()", function () {
|
||||||
it("should select a new collection", function* () {
|
it("should select a new collection", function* () {
|
||||||
// Create collection
|
// Create collection
|
||||||
|
|
|
@ -759,15 +759,12 @@ describe("Zotero.ItemTree", function() {
|
||||||
});
|
});
|
||||||
|
|
||||||
describe("Trash", function () {
|
describe("Trash", function () {
|
||||||
var one, two, three;
|
|
||||||
it("should remove untrashed parent item when last trashed child is deleted", function* () {
|
it("should remove untrashed parent item when last trashed child is deleted", function* () {
|
||||||
var userLibraryID = Zotero.Libraries.userLibraryID;
|
|
||||||
var item = yield createDataObject('item');
|
var item = yield createDataObject('item');
|
||||||
var note = yield createDataObject(
|
var note = yield createDataObject(
|
||||||
'item', { itemType: 'note', parentID: item.id, deleted: true }
|
'item', { itemType: 'note', parentID: item.id, deleted: true }
|
||||||
);
|
);
|
||||||
yield cv.selectByID("T" + userLibraryID);
|
yield selectTrash(win);
|
||||||
yield waitForItemsLoad(win);
|
|
||||||
assert.isNumber(zp.itemsView.getRowIndexByID(item.id));
|
assert.isNumber(zp.itemsView.getRowIndexByID(item.id));
|
||||||
var promise = waitForDialog();
|
var promise = waitForDialog();
|
||||||
yield zp.emptyTrash();
|
yield zp.emptyTrash();
|
||||||
|
@ -779,65 +776,57 @@ describe("Zotero.ItemTree", function() {
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should show only top-most trashed collection", async function() {
|
it("should show only top-most trashed collection", async function() {
|
||||||
var userLibraryID = Zotero.Libraries.userLibraryID;
|
var c1 = await createDataObject('collection', { deleted: true });
|
||||||
var ran = Zotero.Utilities.randomString();
|
var c2 = await createDataObject('collection', { parentID: c1.id });
|
||||||
var objectType = "collection";
|
var c3 = await createDataObject('collection', { parentID: c2.id });
|
||||||
one = await createDataObject(objectType, { name: ran + "_DELETE_ONE" });
|
|
||||||
two = await createDataObject(objectType, { name: ran + "_DELETE_TWO", parentID: one.id });
|
|
||||||
three = await createDataObject(objectType, { name: ran + "_DELETE_THREE", parentID: two.id });
|
|
||||||
|
|
||||||
one.deleted = true;
|
|
||||||
await one.saveTx();
|
|
||||||
|
|
||||||
// Go to trash
|
// Go to trash
|
||||||
await zp.collectionsView.selectByID("T" + userLibraryID);
|
await selectTrash(win);
|
||||||
await waitForItemsLoad(win);
|
|
||||||
|
|
||||||
// Make sure only top-level collection shows
|
// Make sure only top-level collection shows
|
||||||
assert.isNumber(itemsView.getRowIndexByID(one.treeViewID));
|
assert.isNumber(itemsView.getRowIndexByID(c1.treeViewID));
|
||||||
assert.isFalse(itemsView.getRowIndexByID(two.treeViewID));
|
assert.isFalse(itemsView.getRowIndexByID(c2.treeViewID));
|
||||||
assert.isFalse(itemsView.getRowIndexByID(three.treeViewID));
|
assert.isFalse(itemsView.getRowIndexByID(c3.treeViewID));
|
||||||
})
|
})
|
||||||
|
|
||||||
it("should restore all subcollections when parent is restored", async function() {
|
it("should restore all subcollections when parent is restored", async function() {
|
||||||
var userLibraryID = Zotero.Libraries.userLibraryID;
|
var c1 = await createDataObject('collection', { deleted: true });
|
||||||
|
var c2 = await createDataObject('collection', { parentID: c1.id });
|
||||||
|
var c3 = await createDataObject('collection', { parentID: c2.id });
|
||||||
|
|
||||||
// Go to trash
|
// Go to trash
|
||||||
await zp.collectionsView.selectByID("T" + userLibraryID);
|
await selectTrash(win);
|
||||||
await waitForItemsLoad(win);
|
|
||||||
|
|
||||||
// Restore
|
// Restore
|
||||||
await itemsView.selectItem(one.treeViewID);
|
await itemsView.selectItem(c1.treeViewID);
|
||||||
await zp.restoreSelectedItems();
|
await zp.restoreSelectedItems();
|
||||||
|
|
||||||
// Make sure it's gone from trash
|
// Make sure it's gone from trash
|
||||||
assert.isFalse(zp.itemsView.getRowIndexByID(one.treeViewID));
|
assert.isFalse(zp.itemsView.getRowIndexByID(c1.treeViewID));
|
||||||
assert.isFalse(zp.itemsView.getRowIndexByID(two.treeViewID));
|
assert.isFalse(zp.itemsView.getRowIndexByID(c2.treeViewID));
|
||||||
assert.isFalse(zp.itemsView.getRowIndexByID(three.treeViewID));
|
assert.isFalse(zp.itemsView.getRowIndexByID(c3.treeViewID));
|
||||||
|
|
||||||
// Make sure it shows up back in collectionTree
|
// Make sure it shows up back in collectionTree
|
||||||
assert.isNumber(zp.collectionsView.getRowIndexByID(one.treeViewID));
|
assert.isNumber(zp.collectionsView.getRowIndexByID(c1.treeViewID));
|
||||||
})
|
})
|
||||||
|
|
||||||
for (let objectType of ['collection', 'search']) {
|
for (let objectType of ['collection', 'search']) {
|
||||||
it(`should remove ${objectType} from trash on delete`, async function (){
|
it(`should remove ${objectType} from trash on delete`, async function (){
|
||||||
var userLibraryID = Zotero.Libraries.userLibraryID;
|
var o1 = await createDataObject(objectType, { deleted: true });
|
||||||
var ran = Zotero.Utilities.randomString();
|
var o2 = await createDataObject(objectType, { deleted: true });
|
||||||
one = await createDataObject(objectType, { name: ran + "_DELETE_ONE", deleted: true });
|
var o3 = await createDataObject(objectType, { deleted: true });
|
||||||
two = await createDataObject(objectType, { name: ran + "_DELETE_TWO", deleted: true });
|
|
||||||
three = await createDataObject(objectType, { name: ran + "_DELETE_THREE", deleted: true });
|
|
||||||
|
|
||||||
// Go to trash
|
// Go to trash
|
||||||
await zp.collectionsView.selectByID("T" + userLibraryID);
|
await selectTrash(win);
|
||||||
await waitForItemsLoad(win);
|
|
||||||
|
|
||||||
// Permanently delete
|
// Permanently delete
|
||||||
await itemsView.selectItems([one.treeViewID, two.treeViewID, three.treeViewID]);
|
await itemsView.selectItems([o1.treeViewID, o2.treeViewID, o3.treeViewID]);
|
||||||
await itemsView.deleteSelection();
|
await itemsView.deleteSelection();
|
||||||
|
|
||||||
// Make sure it's gone from trash
|
// Make sure it's gone from trash
|
||||||
assert.isFalse(zp.itemsView.getRowIndexByID(one.treeViewID));
|
assert.isFalse(zp.itemsView.getRowIndexByID(o1.treeViewID));
|
||||||
assert.isFalse(zp.itemsView.getRowIndexByID(two.treeViewID));
|
assert.isFalse(zp.itemsView.getRowIndexByID(o2.treeViewID));
|
||||||
assert.isFalse(zp.itemsView.getRowIndexByID(three.treeViewID));
|
assert.isFalse(zp.itemsView.getRowIndexByID(o3.treeViewID));
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue