librariesTest.js (8797B)
1 describe("Zotero.Libraries", function() { 2 let groupName = 'test', 3 group, 4 builtInLibraries; 5 before(function* () { 6 builtInLibraries = [ 7 Zotero.Libraries.userLibraryID, 8 ]; 9 10 group = yield createGroup({ name: groupName }); 11 }); 12 13 it("should provide user library ID as .userLibraryID", function() { 14 assert.isDefined(Zotero.Libraries.userLibraryID); 15 assert(Number.isInteger(Zotero.Libraries.userLibraryID), ".userLibraryID is an integer"); 16 assert.isAbove(Zotero.Libraries.userLibraryID, 0); 17 }); 18 19 describe("#getAll()", function() { 20 it("should return an array of Zotero.Library instances", function() { 21 let libraries = Zotero.Libraries.getAll(); 22 assert.isArray(libraries); 23 assert(libraries.every(library => library instanceof Zotero.Library)); 24 }) 25 26 it("should return all libraries in sorted order", function* () { 27 // Add/remove a few group libraries beforehand to ensure that data is kept in sync 28 let library = yield createGroup(); 29 let tempLib = yield createGroup(); 30 yield tempLib.eraseTx(); 31 32 var libraries = Zotero.Libraries.getAll(); 33 var ids = libraries.map(library => library.libraryID); 34 var dbIDs = yield Zotero.DB.columnQueryAsync("SELECT libraryID FROM libraries"); 35 assert.sameMembers(ids, dbIDs); 36 assert.equal(dbIDs.length, ids.length, "returns correct number of IDs"); 37 38 // Check sort 39 assert.equal(ids[0], Zotero.Libraries.userLibraryID); 40 41 var last = ""; 42 var collation = Zotero.getLocaleCollation(); 43 for (let i = 2; i < libraries.length; i++) { 44 let current = libraries[i].name; 45 assert.isAbove( 46 collation.compareString(1, current, last), 47 0, 48 `'${current}' should sort after '${last}'` 49 ); 50 last = current; 51 } 52 53 // remove left-over library 54 yield library.eraseTx(); 55 }); 56 }); 57 58 describe("#exists()", function() { 59 it("should return true for all existing IDs", function() { 60 let ids = Zotero.Libraries.getAll().map(library => library.libraryID); 61 assert.isTrue(ids.reduce(function(res, id) { return res && Zotero.Libraries.exists(id) }, true)); 62 }); 63 it("should return false for a non-existing ID", function() { 64 assert.isFalse(Zotero.Libraries.exists(-1), "returns boolean false for a negative ID"); 65 let badID = Zotero.Libraries.getAll().map(library => library.libraryID).sort().pop() + 1; 66 assert.isFalse(Zotero.Libraries.exists(badID), "returns boolean false for a non-existent positive ID"); 67 }); 68 }); 69 describe("#getName()", function() { 70 it("should return correct library name for built-in libraries", function() { 71 assert.equal(Zotero.Libraries.getName(Zotero.Libraries.userLibraryID), Zotero.getString('pane.collections.library'), "user library name is correct"); 72 }); 73 it("should return correct name for a group library", function() { 74 assert.equal(Zotero.Libraries.getName(group.libraryID), groupName); 75 }); 76 it("should throw for invalid library ID", function() { 77 assert.throws(() => Zotero.Libraries.getName(-1), /^Invalid library ID /); 78 }); 79 }); 80 describe("#getType()", function() { 81 it("should return correct library type for built-in libraries", function() { 82 assert.equal(Zotero.Libraries.getType(Zotero.Libraries.userLibraryID), 'user', "user library type is correct"); 83 }); 84 it("should return correct library type for a group library", function() { 85 assert.equal(Zotero.Libraries.getType(group.libraryID), 'group'); 86 }); 87 it("should throw for invalid library ID", function() { 88 assert.throws(() => Zotero.Libraries.getType(-1), /^Invalid library ID /); 89 }); 90 }); 91 describe("#isEditable()", function() { 92 it("should always return true for user library", function() { 93 assert.isTrue(Zotero.Libraries.isEditable(Zotero.Libraries.userLibraryID)); 94 }); 95 it("should return correct state for a group library", function* () { 96 group.editable = true; 97 yield group.saveTx(); 98 assert.isTrue(Zotero.Libraries.isEditable(group.libraryID)); 99 100 group.editable = false; 101 yield group.saveTx(); 102 assert.isFalse(Zotero.Libraries.isEditable(group.libraryID)); 103 }); 104 it("should throw for invalid library ID", function() { 105 assert.throws(Zotero.Libraries.isEditable.bind(Zotero.Libraries, -1), /^Invalid library ID /); 106 }); 107 it("should not depend on filesEditable", function* () { 108 let editableStartState = Zotero.Libraries.isEditable(group.libraryID), 109 filesEditableStartState = Zotero.Libraries.isFilesEditable(group.libraryID); 110 111 // Test all combinations 112 // E: true, FE: true => true 113 yield Zotero.Libraries.setEditable(group.libraryID, true); 114 yield Zotero.Libraries.setFilesEditable(group.libraryID, true); 115 assert.isTrue(Zotero.Libraries.isEditable(group.libraryID)); 116 117 // E: false, FE: true => false 118 yield Zotero.Libraries.setEditable(group.libraryID, false); 119 assert.isFalse(Zotero.Libraries.isEditable(group.libraryID)); 120 121 // E: false, FE: false => false 122 yield Zotero.Libraries.setFilesEditable(group.libraryID, false); 123 assert.isFalse(Zotero.Libraries.isEditable(group.libraryID)); 124 125 // E: true, FE: false => true 126 yield Zotero.Libraries.setEditable(group.libraryID, true); 127 assert.isTrue(Zotero.Libraries.isEditable(group.libraryID)); 128 129 // Revert settings 130 yield Zotero.Libraries.setFilesEditable(group.libraryID, filesEditableStartState); 131 yield Zotero.Libraries.setEditable(group.libraryID, editableStartState); 132 }); 133 }); 134 describe("#setEditable()", function() { 135 it("should not allow changing editable state of built-in libraries", function* () { 136 for (let i=0; i<builtInLibraries.length; i++) { 137 yield assert.isRejected(Zotero.Libraries.setEditable(builtInLibraries[i])); 138 } 139 }); 140 it("should allow changing editable state for group library", function* () { 141 let startState = Zotero.Libraries.isEditable(group.libraryID); 142 yield Zotero.Libraries.setEditable(group.libraryID, !startState); 143 assert.equal(Zotero.Libraries.isEditable(group.libraryID), !startState, 'changes state'); 144 145 yield Zotero.Libraries.setEditable(group.libraryID, startState); 146 assert.equal(Zotero.Libraries.isEditable(group.libraryID), startState, 'reverts state'); 147 }); 148 it("should throw for invalid library ID", function() { 149 return assert.isRejected(Zotero.Libraries.setEditable(-1), /^Invalid library ID /); 150 }); 151 }); 152 describe("#isFilesEditable()", function() { 153 it("should throw for invalid library ID", function() { 154 assert.throws(Zotero.Libraries.isFilesEditable.bind(Zotero.Libraries, -1), /^Invalid library ID /); 155 }); 156 }); 157 describe("#setFilesEditable()", function() { 158 it("should not allow changing files editable state of built-in libraries", function* () { 159 for (let i=0; i<builtInLibraries.length; i++) { 160 yield assert.isRejected(Zotero.Libraries.setFilesEditable(builtInLibraries[i])); 161 } 162 }); 163 it("should allow changing files editable state for group library", function* () { 164 let startState = Zotero.Libraries.isFilesEditable(group.libraryID), 165 editableStartState = Zotero.Libraries.isEditable(group.libraryID); 166 167 // Since filesEditable is false for all non-editable libraries 168 yield Zotero.Libraries.setEditable(group.libraryID, true); 169 170 yield Zotero.Libraries.setFilesEditable(group.libraryID, !startState); 171 assert.equal(Zotero.Libraries.isFilesEditable(group.libraryID), !startState, 'changes state'); 172 173 yield Zotero.Libraries.setFilesEditable(group.libraryID, startState); 174 assert.equal(Zotero.Libraries.isFilesEditable(group.libraryID), startState, 'reverts state'); 175 176 yield Zotero.Libraries.setEditable(group.libraryID, editableStartState); 177 }); 178 it("should throw for invalid library ID", function* () { 179 return assert.isRejected(Zotero.Libraries.setFilesEditable(-1), /^Invalid library ID /); 180 }); 181 }); 182 describe("#isGroupLibrary()", function() { 183 it("should return false for non-group libraries", function() { 184 for (let i=0; i<builtInLibraries.length; i++) { 185 let id = builtInLibraries[i], 186 type = Zotero.Libraries.getType(id); 187 assert.isFalse(Zotero.Libraries.isGroupLibrary(id), "returns false for " + type + " library"); 188 } 189 }); 190 if("should return true for group library", function(){ 191 assert.isTrue(Zotero.Libraries.isGroupLibrary(group.libraryID)); 192 }) 193 it("should throw for invalid library ID", function() { 194 assert.throws(Zotero.Libraries.isGroupLibrary.bind(Zotero.Libraries, -1), /^Invalid library ID /); 195 }); 196 }); 197 describe("#hasTrash()", function() { 198 it("should return true for all library types", function() { 199 assert.isTrue(Zotero.Libraries.hasTrash(Zotero.Libraries.userLibraryID)); 200 assert.isTrue(Zotero.Libraries.hasTrash(group.libraryID)); 201 }); 202 it("should throw for invalid library ID", function() { 203 assert.throws(Zotero.Libraries.hasTrash.bind(Zotero.Libraries, -1), /^Invalid library ID /); 204 }); 205 }); 206 })