Components.utils.import("resource://gre/modules/Services.jsm"); Services.scriptloader.loadSubScript("resource://zotero/polyfill.js"); Components.utils.import("resource://gre/modules/osfile.jsm"); var EventUtils = Components.utils.import("resource://zotero-unit/EventUtils.jsm"); var ZoteroUnit = Components.classes["@zotero.org/zotero/tests-clh;1"]. getService(Components.interfaces.nsISupports). wrappedJSObject; var dump = ZoteroUnit.dump; // Mocha HTML reporter doesn't show deepEqual diffs, so we change this. chai.config.truncateThreshold = 0 function quit(failed) { // Quit with exit status if(!failed) { OS.File.writeAtomic(OS.Path.join(OS.Constants.Path.profileDir, "success"), new Uint8Array(0)); } if(!ZoteroUnit.noquit) { setTimeout(function () { Components.classes['@mozilla.org/toolkit/app-startup;1'] .getService(Components.interfaces.nsIAppStartup) .quit(Components.interfaces.nsIAppStartup.eForceQuit); }, 250); } } if (ZoteroUnit.makeTestData) { let dataPath = getTestDataDirectory().path; Zotero.Prefs.set("export.citePaperJournalArticleURL", true); let dataFiles = [ { name: 'allTypesAndFields', func: generateAllTypesAndFieldsData }, { name: 'itemJSON', func: generateItemJSONData, args: [null] }, { name: 'citeProcJSExport', func: generateCiteProcJSExportData }, { name: 'translatorExportLegacy', func: generateTranslatorExportData, args: [true] }, { name: 'translatorExport', func: generateTranslatorExportData, args: [false] } ]; Zotero.Promise.coroutine(function* () { yield Zotero.initializationPromise; for (let i=0; i prefBranch.prefHasUserValue(key)) .forEach(key => ZoteroUnit.customPrefs[key] = Zotero.Prefs.get(key)); }); /** * Clear all prefs, and reset those set in runtests.sh to original values */ function resetPrefs() { Components.utils.import("resource://zotero/config.js"); var prefBranch = Services.prefs.getBranch(ZOTERO_CONFIG.PREF_BRANCH); prefBranch.getChildList("", {}).forEach(key => { var origVal = ZoteroUnit.customPrefs[key]; if (origVal !== undefined) { if (origVal != Zotero.Prefs.get(key)) { Zotero.Prefs.set(key, ZoteroUnit.customPrefs[key]); } } else if (prefBranch.prefHasUserValue(key)) { Zotero.Prefs.clear(key) } }); } afterEach(function () { resetPrefs(); }); var assert = chai.assert, expect = chai.expect; // Set up tests to run var run = ZoteroUnit.runTests; if (run && ZoteroUnit.tests) { function getTestFilename(test) { // Remove any directory prefixes e.g. tests/fooTest.js, test/tests/fooTest.js test = test.split(/[/\\]/).pop(); // Allow foo, fooTest, fooTest.js test = test.replace(/\.js$/, ""); test = test.replace(/Test$/, ""); return test + "Test.js"; } var testDirectory = getTestDataDirectory().parent, testFiles = []; if(ZoteroUnit.tests == "all") { var enumerator = testDirectory.directoryEntries; let startFile = ZoteroUnit.startAt ? getTestFilename(ZoteroUnit.startAt) : false; let started = !startFile; let stopFile = ZoteroUnit.stopAt ? getTestFilename(ZoteroUnit.stopAt) : false; while(enumerator.hasMoreElements()) { var file = enumerator.getNext().QueryInterface(Components.interfaces.nsIFile); if (file.leafName.endsWith(".js")) { testFiles.push(file.leafName); } } testFiles.sort(); // Find the start and stop files let startPos = 0; let stopPos = testFiles.length - 1; for (let i = 0; i < testFiles.length; i++) { if (testFiles[i] == startFile) { startPos = i; } if (testFiles[i] == stopFile) { stopPos = i; break; } } if (startFile && startPos == 0 && startFile != testFiles[0]) { dump(`Invalid start file ${startFile}\n`); } testFiles = testFiles.slice(startPos, stopPos + 1); } else { var specifiedTests = ZoteroUnit.tests.split(","); for (let test of specifiedTests) { let fname = getTestFilename(test); let file = testDirectory.clone(); file.append(fname); if (!file.exists()) { dump("Invalid test file "+test+"\n"); run = false; quit(true); } testFiles.push(fname); } } for(var fname of testFiles) { var el = document.createElement("script"); el.type = "application/javascript"; el.src = "resource://zotero-unit-tests/"+fname; el.async = false; document.body.appendChild(el); } } if(run) { window.onload = async function () { await Zotero.Schema.schemaUpdatePromise; // Make a copy of the database that can be used in resetDB() var dbFile = Zotero.DataDirectory.getDatabase(); await OS.File.copy(dbFile, dbFile + '-test-template'); initPDFToolsPath(); return mocha.run(); }; }