test-helpers.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. "use strict";
  2. if (typeof window === "undefined") {
  3. window = {};
  4. }
  5. var logMethods = [
  6. "trace",
  7. "debug",
  8. "info",
  9. "warn",
  10. "error"
  11. ];
  12. define(function () {
  13. function getStorageKey(loggerName) {
  14. var key = "loglevel";
  15. if (loggerName) {
  16. key += ":" + loggerName;
  17. }
  18. return key;
  19. }
  20. var self = {};
  21. // Jasmine matcher to check the log level of a log object
  22. self.toBeAtLevel = function toBeAtLevel(level) {
  23. var log = this.actual;
  24. var expectedWorkingCalls = log.levels.SILENT - log.levels[level.toUpperCase()];
  25. var realLogMethod = window.console.log;
  26. var priorCalls = realLogMethod.calls.length;
  27. for (var ii = 0; ii < logMethods.length; ii++) {
  28. var methodName = logMethods[ii];
  29. log[methodName](methodName);
  30. }
  31. expect(realLogMethod.calls.length - priorCalls).toEqual(expectedWorkingCalls);
  32. return true;
  33. };
  34. self.isCookieStorageAvailable = function isCookieStorageAvailable() {
  35. if (window && window.document && window.document.cookie) {
  36. // We need to check not just that the cookie objects are available, but that they work, because
  37. // if we run from file:// URLs they appear present but are non-functional
  38. window.document.cookie = "test=hi;";
  39. var result = window.document.cookie.indexOf('test=hi') !== -1;
  40. window.document.cookie = "test=; expires=Thu, 01 Jan 1970 00:00:01 GMT;";
  41. return result;
  42. } else {
  43. return false;
  44. }
  45. };
  46. self.isLocalStorageAvailable = function isLocalStorageAvailable() {
  47. try {
  48. return !!window.localStorage;
  49. } catch (e){
  50. return false;
  51. }
  52. };
  53. self.isAnyLevelStoragePossible = function isAnyLevelStoragePossible() {
  54. return self.isCookieStorageAvailable() || self.isLocalStorageAvailable();
  55. };
  56. self.toBeTheLevelStoredByCookie = function toBeTheLevelStoredByCookie(name) {
  57. var level = this.actual === undefined ? undefined : this.actual.toUpperCase();
  58. var storageKey = encodeURIComponent(getStorageKey(name));
  59. if(level === undefined) {
  60. return window.document.cookie.indexOf(storageKey + "=") === -1;
  61. } else if (window.document.cookie.indexOf(storageKey + "=" + level) !== -1) {
  62. return true;
  63. } else {
  64. return false;
  65. }
  66. };
  67. self.toBeTheLevelStoredByLocalStorage = function toBeTheLevelStoredByLocalStorage(name) {
  68. var level = this.actual === undefined ? undefined : this.actual.toUpperCase();
  69. if (window.localStorage[getStorageKey(name)] === level) {
  70. return true;
  71. }
  72. return false;
  73. };
  74. // Jasmine matcher to check whether a given string was saved by loglevel
  75. self.toBeTheStoredLevel = function toBeTheStoredLevel(name) {
  76. return self.toBeTheLevelStoredByLocalStorage.call(this, name) ||
  77. self.toBeTheLevelStoredByCookie.call(this, name);
  78. };
  79. self.setCookieStoredLevel = function setCookieStoredLevel(level, name) {
  80. window.document.cookie =
  81. encodeURIComponent(getStorageKey(name)) + "=" +
  82. level.toUpperCase() + ";";
  83. };
  84. self.setLocalStorageStoredLevel = function setLocalStorageStoredLevel(level, name) {
  85. window.localStorage[getStorageKey(name)] = level.toUpperCase();
  86. };
  87. self.setStoredLevel = function setStoredLevel(level, name) {
  88. if (self.isCookieStorageAvailable()) {
  89. self.setCookieStoredLevel(level, name);
  90. }
  91. if (self.isLocalStorageAvailable()) {
  92. self.setLocalStorageStoredLevel(level, name);
  93. }
  94. };
  95. self.clearStoredLevels = function clearStoredLevels() {
  96. if (self.isLocalStorageAvailable()) {
  97. window.localStorage.clear();
  98. }
  99. if (self.isCookieStorageAvailable()) {
  100. var storedKeys = window.document.cookie.match(/(?:^|;\s)(loglevel(\:\w+)?)(?=\=)/g);
  101. if (storedKeys) {
  102. for (var i = 0; i < storedKeys.length; i++) {
  103. window.document.cookie = storedKeys[i] + "=; expires=Thu, 01 Jan 1970 00:00:01 GMT;";
  104. }
  105. }
  106. }
  107. };
  108. self.describeIf = function describeIf(condition, name, test) {
  109. if (condition) {
  110. jasmine.getEnv().describe(name, test);
  111. }
  112. };
  113. self.itIf = function itIf(condition, name, test) {
  114. if (condition) {
  115. jasmine.getEnv().it(name, test);
  116. }
  117. };
  118. // Forcibly reloads loglevel, and asynchronously hands the resulting log back to the given callback
  119. // via Jasmine async magic
  120. self.withFreshLog = function withFreshLog(toRun) {
  121. require.undef("lib/loglevel");
  122. var freshLog;
  123. waitsFor(function() {
  124. require(['lib/loglevel'], function(log) {
  125. freshLog = log;
  126. });
  127. return typeof freshLog !== "undefined";
  128. });
  129. runs(function() {
  130. toRun(freshLog);
  131. });
  132. };
  133. // Wraps Jasmine's it(name, test) call to reload the loglevel dependency for the given test
  134. self.itWithFreshLog = function itWithFreshLog(name, test) {
  135. jasmine.getEnv().it(name, function() {
  136. self.withFreshLog(test);
  137. });
  138. };
  139. return self;
  140. });