You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

169 lines
5.1 KiB

4 years ago
"use strict";
if (typeof window === "undefined") {
window = {};
}
var logMethods = [
"trace",
"debug",
"info",
"warn",
"error"
];
define(function () {
function getStorageKey(loggerName) {
var key = "loglevel";
if (loggerName) {
key += ":" + loggerName;
}
return key;
}
var self = {};
// Jasmine matcher to check the log level of a log object
self.toBeAtLevel = function toBeAtLevel(level) {
var log = this.actual;
var expectedWorkingCalls = log.levels.SILENT - log.levels[level.toUpperCase()];
var realLogMethod = window.console.log;
var priorCalls = realLogMethod.calls.length;
for (var ii = 0; ii < logMethods.length; ii++) {
var methodName = logMethods[ii];
log[methodName](methodName);
}
expect(realLogMethod.calls.length - priorCalls).toEqual(expectedWorkingCalls);
return true;
};
self.isCookieStorageAvailable = function isCookieStorageAvailable() {
if (window && window.document && window.document.cookie) {
// We need to check not just that the cookie objects are available, but that they work, because
// if we run from file:// URLs they appear present but are non-functional
window.document.cookie = "test=hi;";
var result = window.document.cookie.indexOf('test=hi') !== -1;
window.document.cookie = "test=; expires=Thu, 01 Jan 1970 00:00:01 GMT;";
return result;
} else {
return false;
}
};
self.isLocalStorageAvailable = function isLocalStorageAvailable() {
try {
return !!window.localStorage;
} catch (e){
return false;
}
};
self.isAnyLevelStoragePossible = function isAnyLevelStoragePossible() {
return self.isCookieStorageAvailable() || self.isLocalStorageAvailable();
};
self.toBeTheLevelStoredByCookie = function toBeTheLevelStoredByCookie(name) {
var level = this.actual.toUpperCase();
var storageKey = encodeURIComponent(getStorageKey(name));
if (window.document.cookie.indexOf(storageKey + "=" + level) !== -1) {
return true;
} else {
return false;
}
};
self.toBeTheLevelStoredByLocalStorage = function toBeTheLevelStoredByLocalStorage(name) {
var level = this.actual.toUpperCase();
if (window.localStorage[getStorageKey(name)] === level) {
return true;
}
return false;
};
// Jasmine matcher to check whether a given string was saved by loglevel
self.toBeTheStoredLevel = function toBeTheStoredLevel(name) {
return self.toBeTheLevelStoredByLocalStorage.call(this, name) ||
self.toBeTheLevelStoredByCookie.call(this, name);
};
self.setCookieStoredLevel = function setCookieStoredLevel(level, name) {
window.document.cookie =
encodeURIComponent(getStorageKey(name)) + "=" +
level.toUpperCase() + ";";
};
self.setLocalStorageStoredLevel = function setLocalStorageStoredLevel(level, name) {
window.localStorage[getStorageKey(name)] = level.toUpperCase();
};
self.setStoredLevel = function setStoredLevel(level, name) {
if (self.isCookieStorageAvailable()) {
self.setCookieStoredLevel(level, name);
}
if (self.isLocalStorageAvailable()) {
self.setLocalStorageStoredLevel(level, name);
}
};
self.clearStoredLevels = function clearStoredLevels() {
if (self.isLocalStorageAvailable()) {
window.localStorage.clear();
}
if (self.isCookieStorageAvailable()) {
var storedKeys = window.document.cookie.match(/(?:^|;\s)(loglevel(\:\w+)?)(?=\=)/g);
if (storedKeys) {
for (var i = 0; i < storedKeys.length; i++) {
window.document.cookie = storedKeys[i] + "=; expires=Thu, 01 Jan 1970 00:00:01 GMT;";
}
}
}
};
self.describeIf = function describeIf(condition, name, test) {
if (condition) {
jasmine.getEnv().describe(name, test);
}
};
self.itIf = function itIf(condition, name, test) {
if (condition) {
jasmine.getEnv().it(name, test);
}
};
// Forcibly reloads loglevel, and asynchronously hands the resulting log back to the given callback
// via Jasmine async magic
self.withFreshLog = function withFreshLog(toRun) {
require.undef("lib/loglevel");
var freshLog;
waitsFor(function() {
require(['lib/loglevel'], function(log) {
freshLog = log;
});
return typeof freshLog !== "undefined";
});
runs(function() {
toRun(freshLog);
});
};
// Wraps Jasmine's it(name, test) call to reload the loglevel dependency for the given test
self.itWithFreshLog = function itWithFreshLog(name, test) {
jasmine.getEnv().it(name, function() {
self.withFreshLog(test);
});
};
return self;
});