"use strict"; describe("Advanced Search", function () { var win, zp; before(function* () { yield resetDB({ thisArg: this, skipBundledFiles: true }); win = yield loadZoteroPane(); zp = win.ZoteroPane; }); after(function () { win.close(); }); it("should perform a search", function* () { var item = yield createDataObject('item', { setTitle: true }); var promise = waitForWindow('chrome://zotero/content/advancedSearch.xul'); zp.openAdvancedSearchWindow(); var searchWin = yield promise; // Add condition var searchBox = searchWin.document.getElementById('zotero-search-box'); var s = new Zotero.Search(); s.addCondition('title', 'is', item.getField('title')) searchBox.search = s; // Run search and wait for results var o = searchWin.ZoteroAdvancedSearch; var deferred = Zotero.Promise.defer(); o.search(); var iv = o.itemsView; iv.addEventListener('load', () => deferred.resolve()); yield deferred.promise; // Check results assert.equal(iv.rowCount, 1); var index = iv.getRowIndexByID(item.id); assert.isNumber(index); searchWin.close(); item.eraseTx(); }); describe("Conditions", function () { var searchWin, searchBox, conditions; before(function* () { var promise = waitForWindow('chrome://zotero/content/advancedSearch.xul'); zp.openAdvancedSearchWindow(); searchWin = yield promise; searchBox = searchWin.document.getElementById('zotero-search-box'); conditions = searchBox.id('conditions'); }); after(function () { searchWin.close(); }); describe("Collection", function () { it("should show collections and saved searches", function* () { var col1 = yield createDataObject('collection', { name: "A" }); var col2 = yield createDataObject('collection', { name: "C", parentID: col1.id }); var col3 = yield createDataObject('collection', { name: "D", parentID: col2.id }); var col4 = yield createDataObject('collection', { name: "B" }); var search1 = yield createDataObject('search', { name: "A" }); var search2 = yield createDataObject('search', { name: "B" }); // Add condition var s = new Zotero.Search(); s.addCondition('title', 'is', ''); searchBox.search = s; var searchCondition = conditions.firstChild; var conditionsMenu = searchCondition.id('conditionsmenu'); var valueMenu = searchCondition.id('valuemenu'); assert.isTrue(valueMenu.hidden); // Select 'Collection' condition for (let i = 0; i < conditionsMenu.itemCount; i++) { let menuitem = conditionsMenu.getItemAtIndex(i); if (menuitem.value == 'collection') { menuitem.click(); break; } } assert.isFalse(valueMenu.hidden); assert.equal(valueMenu.itemCount, 6); var valueMenuItem = valueMenu.getItemAtIndex(1); assert.equal(valueMenuItem.getAttribute('label'), "- " + col2.name); assert.equal(valueMenuItem.getAttribute('value'), "C" + col2.key); valueMenuItem = valueMenu.getItemAtIndex(2); assert.equal(valueMenuItem.getAttribute('label'), " - " + col3.name); assert.equal(valueMenuItem.getAttribute('value'), "C" + col3.key); valueMenuItem = valueMenu.getItemAtIndex(4); assert.equal(valueMenuItem.getAttribute('label'), search1.name); assert.equal(valueMenuItem.getAttribute('value'), "S" + search1.key); valueMenuItem = valueMenu.getItemAtIndex(5); assert.equal(valueMenuItem.getAttribute('label'), search2.name); assert.equal(valueMenuItem.getAttribute('value'), "S" + search2.key); yield Zotero.Collections.erase([col1.id, col2.id, col3.id, col4.id]); yield Zotero.Searches.erase([search1.id, search2.id]); }); it("should be selected for 'savedSearch' condition", function* () { var search = yield createDataObject('search', { name: "A" }); var s = new Zotero.Search(); s.addCondition('savedSearch', 'is', search.key); searchBox.search = s; var searchCondition = conditions.firstChild; var conditionsMenu = searchCondition.id('conditionsmenu'); var valueMenu = searchCondition.id('valuemenu'); assert.equal(conditionsMenu.selectedItem.value, 'collection'); assert.isFalse(valueMenu.hidden); assert.equal(valueMenu.selectedItem.value, "S" + search.key); yield search.eraseTx(); }); it("should set 'savedSearch' condition when a search is selected", function* () { var collection = yield createDataObject('collection', { name: "A" }); var search = yield createDataObject('search', { name: "B" }); var s = new Zotero.Search(); s.addCondition('title', 'is', ''); searchBox.search = s; var searchCondition = conditions.firstChild; var conditionsMenu = searchCondition.id('conditionsmenu'); var valueMenu = searchCondition.id('valuemenu'); // Select 'Collection' condition for (let i = 0; i < conditionsMenu.itemCount; i++) { let menuitem = conditionsMenu.getItemAtIndex(i); if (menuitem.value == 'collection') { menuitem.click(); break; } } for (let i = 0; i < valueMenu.itemCount; i++) { let menuitem = valueMenu.getItemAtIndex(i); if (menuitem.getAttribute('value') == "S" + search.key) { menuitem.click(); break; } } searchBox.updateSearch(); var condition = searchBox.search.getConditions()[0]; assert.equal(condition.condition, 'savedSearch'); assert.equal(condition.value, search.key); yield collection.eraseTx(); yield search.eraseTx(); }); it("should update when the library is changed", function* () { var group = yield getGroup(); var groupLibraryID = group.libraryID; var collection1 = yield createDataObject('collection', { name: "A" }); var search1 = yield createDataObject('search', { name: "B" }); var collection2 = yield createDataObject('collection', { name: "C", libraryID: groupLibraryID }); var search2 = yield createDataObject('search', { name: "D", libraryID: groupLibraryID }); var s = new Zotero.Search(); s.addCondition('title', 'is', ''); searchBox.search = s; var searchCondition = conditions.firstChild; var conditionsMenu = searchCondition.id('conditionsmenu'); var valueMenu = searchCondition.id('valuemenu'); // Select 'Collection' condition for (let i = 0; i < conditionsMenu.itemCount; i++) { let menuitem = conditionsMenu.getItemAtIndex(i); if (menuitem.value == 'collection') { menuitem.click(); break; } } for (let i = 0; i < valueMenu.itemCount; i++) { let menuitem = valueMenu.getItemAtIndex(i); if (menuitem.getAttribute('value') == "S" + search1.key) { menuitem.click(); break; } } assert.equal(valueMenu.value, "S" + search1.key); var libraryMenu = searchWin.document.getElementById('libraryMenu'); for (let i = 0; i < libraryMenu.itemCount; i++) { let menuitem = libraryMenu.getItemAtIndex(i); // Switch to group library if (menuitem.getAttribute('libraryID') == groupLibraryID) { menuitem.click(); break; } } var values = []; valueMenu = searchCondition.id('valuemenu') assert.equal(valueMenu.value, "C" + collection2.key); for (let i = 0; i < valueMenu.itemCount; i++) { let menuitem = valueMenu.getItemAtIndex(i); values.push(menuitem.getAttribute('value')); } assert.notInclude(values, "C" + collection1.key); assert.notInclude(values, "S" + search1.key); assert.include(values, "C" + collection2.key); assert.include(values, "S" + search2.key); yield Zotero.Collections.erase([collection1.id, collection2.id]); yield Zotero.Searches.erase([search1.id, search2.id]); }); }); describe("Saved Search", function () { it("shouldn't appear", function* () { var searchCondition = conditions.firstChild; var conditionsMenu = searchCondition.id('conditionsmenu'); // Make sure "Saved Search" isn't present for (let i = 0; i < conditionsMenu.itemCount; i++) { let menuitem = conditionsMenu.getItemAtIndex(i); if (menuitem.value == 'savedSearch') { assert.fail(); } } }); }); }); });