www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | Submodules | README | LICENSE

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 })