forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			716 lines
		
	
	
	
		
			15 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			716 lines
		
	
	
	
		
			15 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| import {
 | |
|   EventEmitter,
 | |
|   FakePrefs,
 | |
|   FakensIPrefService,
 | |
|   GlobalOverrider,
 | |
|   FakeConsoleAPI,
 | |
|   FakeLogger,
 | |
| } from "newtab/test/unit/utils";
 | |
| import Adapter from "enzyme-adapter-react-16";
 | |
| import { chaiAssertions } from "newtab/test/schemas/pings";
 | |
| import enzyme from "enzyme";
 | |
| 
 | |
| enzyme.configure({ adapter: new Adapter() });
 | |
| 
 | |
| // Cause React warnings to make tests that trigger them fail
 | |
| const origConsoleError = console.error;
 | |
| console.error = function (msg, ...args) {
 | |
|   origConsoleError.apply(console, [msg, ...args]);
 | |
| 
 | |
|   if (
 | |
|     /(Invalid prop|Failed prop type|Check the render method|React Intl)/.test(
 | |
|       msg
 | |
|     )
 | |
|   ) {
 | |
|     throw new Error(msg);
 | |
|   }
 | |
| };
 | |
| 
 | |
| const req = require.context(".", true, /\.test\.jsx?$/);
 | |
| const files = req.keys();
 | |
| 
 | |
| // This exposes sinon assertions to chai.assert
 | |
| sinon.assert.expose(assert, { prefix: "" });
 | |
| 
 | |
| chai.use(chaiAssertions);
 | |
| 
 | |
| const overrider = new GlobalOverrider();
 | |
| 
 | |
| const RemoteSettings = name => ({
 | |
|   get: () => {
 | |
|     if (name === "attachment") {
 | |
|       return Promise.resolve([{ attachment: {} }]);
 | |
|     }
 | |
|     return Promise.resolve([]);
 | |
|   },
 | |
|   on: () => {},
 | |
|   off: () => {},
 | |
| });
 | |
| RemoteSettings.pollChanges = () => {};
 | |
| 
 | |
| class JSWindowActorParent {
 | |
|   sendAsyncMessage(name, data) {
 | |
|     return { name, data };
 | |
|   }
 | |
| }
 | |
| 
 | |
| class JSWindowActorChild {
 | |
|   sendAsyncMessage(name, data) {
 | |
|     return { name, data };
 | |
|   }
 | |
| 
 | |
|   sendQuery(name, data) {
 | |
|     return Promise.resolve({ name, data });
 | |
|   }
 | |
| 
 | |
|   get contentWindow() {
 | |
|     return {
 | |
|       Promise,
 | |
|     };
 | |
|   }
 | |
| }
 | |
| 
 | |
| // Detect plain object passed to lazy getter APIs, and set its prototype to
 | |
| // global object, and return the global object for further modification.
 | |
| // Returns the object if it's not plain object.
 | |
| //
 | |
| // This is a workaround to make the existing testharness and testcase keep
 | |
| // working even after lazy getters are moved to plain `lazy` object.
 | |
| const cachedPlainObject = new Set();
 | |
| function updateGlobalOrObject(object) {
 | |
|   // Given this function modifies the prototype, and the following
 | |
|   // condition doesn't meet on the second call, cache the result.
 | |
|   if (cachedPlainObject.has(object)) {
 | |
|     return global;
 | |
|   }
 | |
| 
 | |
|   if (Object.getPrototypeOf(object).constructor.name !== "Object") {
 | |
|     return object;
 | |
|   }
 | |
| 
 | |
|   cachedPlainObject.add(object);
 | |
|   Object.setPrototypeOf(object, global);
 | |
|   return global;
 | |
| }
 | |
| 
 | |
| const TEST_GLOBAL = {
 | |
|   JSWindowActorParent,
 | |
|   JSWindowActorChild,
 | |
|   AboutReaderParent: {
 | |
|     addMessageListener: (messageName, listener) => {},
 | |
|     removeMessageListener: (messageName, listener) => {},
 | |
|   },
 | |
|   AboutWelcomeTelemetry: class {
 | |
|     submitGleanPingForPing() {}
 | |
|   },
 | |
|   AddonManager: {
 | |
|     getActiveAddons() {
 | |
|       return Promise.resolve({ addons: [], fullData: false });
 | |
|     },
 | |
|   },
 | |
|   AppConstants: {
 | |
|     MOZILLA_OFFICIAL: true,
 | |
|     MOZ_APP_VERSION: "69.0a1",
 | |
|     isChinaRepack() {
 | |
|       return false;
 | |
|     },
 | |
|     isPlatformAndVersionAtMost() {
 | |
|       return false;
 | |
|     },
 | |
|     platform: "win",
 | |
|   },
 | |
|   ASRouterPreferences: {
 | |
|     console: new FakeConsoleAPI({
 | |
|       maxLogLevel: "off", // set this to "debug" or "all" to get more ASRouter logging in tests
 | |
|       prefix: "ASRouter",
 | |
|     }),
 | |
|   },
 | |
|   AWScreenUtils: {
 | |
|     evaluateTargetingAndRemoveScreens() {
 | |
|       return true;
 | |
|     },
 | |
|     async removeScreens() {
 | |
|       return true;
 | |
|     },
 | |
|     evaluateScreenTargeting() {
 | |
|       return true;
 | |
|     },
 | |
|   },
 | |
|   BrowserUtils: {
 | |
|     sendToDeviceEmailsSupported() {
 | |
|       return true;
 | |
|     },
 | |
|   },
 | |
|   UpdateUtils: { getUpdateChannel() {} },
 | |
|   BasePromiseWorker: class {
 | |
|     constructor() {
 | |
|       this.ExceptionHandlers = [];
 | |
|     }
 | |
|     post() {}
 | |
|   },
 | |
|   browserSearchRegion: "US",
 | |
|   BrowserWindowTracker: { getTopWindow() {} },
 | |
|   ChromeUtils: {
 | |
|     defineLazyGetter(object, name, f) {
 | |
|       updateGlobalOrObject(object)[name] = f();
 | |
|     },
 | |
|     defineModuleGetter: updateGlobalOrObject,
 | |
|     defineESModuleGetters: updateGlobalOrObject,
 | |
|     generateQI() {
 | |
|       return {};
 | |
|     },
 | |
|     import() {
 | |
|       return global;
 | |
|     },
 | |
|     importESModule() {
 | |
|       return global;
 | |
|     },
 | |
|   },
 | |
|   ClientEnvironment: {
 | |
|     get userId() {
 | |
|       return "foo123";
 | |
|     },
 | |
|   },
 | |
|   Components: {
 | |
|     Constructor(classId) {
 | |
|       switch (classId) {
 | |
|         case "@mozilla.org/referrer-info;1":
 | |
|           return function (referrerPolicy, sendReferrer, originalReferrer) {
 | |
|             this.referrerPolicy = referrerPolicy;
 | |
|             this.sendReferrer = sendReferrer;
 | |
|             this.originalReferrer = originalReferrer;
 | |
|           };
 | |
|       }
 | |
|       return function () {};
 | |
|     },
 | |
|     isSuccessCode: () => true,
 | |
|   },
 | |
|   ConsoleAPI: FakeConsoleAPI,
 | |
|   // NB: These are functions/constructors
 | |
|   // eslint-disable-next-line object-shorthand
 | |
|   ContentSearchUIController: function () {},
 | |
|   // eslint-disable-next-line object-shorthand
 | |
|   ContentSearchHandoffUIController: function () {},
 | |
|   Cc: {
 | |
|     "@mozilla.org/browser/nav-bookmarks-service;1": {
 | |
|       addObserver() {},
 | |
|       getService() {
 | |
|         return this;
 | |
|       },
 | |
|       removeObserver() {},
 | |
|       SOURCES: {},
 | |
|       TYPE_BOOKMARK: {},
 | |
|     },
 | |
|     "@mozilla.org/browser/nav-history-service;1": {
 | |
|       addObserver() {},
 | |
|       executeQuery() {},
 | |
|       getNewQuery() {},
 | |
|       getNewQueryOptions() {},
 | |
|       getService() {
 | |
|         return this;
 | |
|       },
 | |
|       insert() {},
 | |
|       markPageAsTyped() {},
 | |
|       removeObserver() {},
 | |
|     },
 | |
|     "@mozilla.org/io/string-input-stream;1": {
 | |
|       createInstance() {
 | |
|         return {};
 | |
|       },
 | |
|     },
 | |
|     "@mozilla.org/security/hash;1": {
 | |
|       createInstance() {
 | |
|         return {
 | |
|           init() {},
 | |
|           updateFromStream() {},
 | |
|           finish() {
 | |
|             return "0";
 | |
|           },
 | |
|         };
 | |
|       },
 | |
|     },
 | |
|     "@mozilla.org/updates/update-checker;1": { createInstance() {} },
 | |
|     "@mozilla.org/widget/useridleservice;1": {
 | |
|       getService() {
 | |
|         return {
 | |
|           idleTime: 0,
 | |
|           addIdleObserver() {},
 | |
|           removeIdleObserver() {},
 | |
|         };
 | |
|       },
 | |
|     },
 | |
|     "@mozilla.org/streamConverters;1": {
 | |
|       getService() {
 | |
|         return this;
 | |
|       },
 | |
|     },
 | |
|     "@mozilla.org/network/stream-loader;1": {
 | |
|       createInstance() {
 | |
|         return {};
 | |
|       },
 | |
|     },
 | |
|   },
 | |
|   Ci: {
 | |
|     nsICryptoHash: {},
 | |
|     nsIReferrerInfo: { UNSAFE_URL: 5 },
 | |
|     nsITimer: { TYPE_ONE_SHOT: 1 },
 | |
|     nsIWebProgressListener: { LOCATION_CHANGE_SAME_DOCUMENT: 1 },
 | |
|     nsIDOMWindow: Object,
 | |
|     nsITrackingDBService: {
 | |
|       TRACKERS_ID: 1,
 | |
|       TRACKING_COOKIES_ID: 2,
 | |
|       CRYPTOMINERS_ID: 3,
 | |
|       FINGERPRINTERS_ID: 4,
 | |
|       SOCIAL_ID: 5,
 | |
|     },
 | |
|     nsICookieBannerService: {
 | |
|       MODE_DISABLED: 0,
 | |
|       MODE_REJECT: 1,
 | |
|       MODE_REJECT_OR_ACCEPT: 2,
 | |
|       MODE_UNSET: 3,
 | |
|     },
 | |
|   },
 | |
|   Cu: {
 | |
|     importGlobalProperties() {},
 | |
|     now: () => window.performance.now(),
 | |
|     cloneInto: o => JSON.parse(JSON.stringify(o)),
 | |
|   },
 | |
|   console: {
 | |
|     ...console,
 | |
|     error() {},
 | |
|   },
 | |
|   dump() {},
 | |
|   EveryWindow: {
 | |
|     registerCallback: (id, init, uninit) => {},
 | |
|     unregisterCallback: id => {},
 | |
|   },
 | |
|   setTimeout: window.setTimeout.bind(window),
 | |
|   clearTimeout: window.clearTimeout.bind(window),
 | |
|   fetch() {},
 | |
|   // eslint-disable-next-line object-shorthand
 | |
|   Image: function () {}, // NB: This is a function/constructor
 | |
|   IOUtils: {
 | |
|     writeJSON() {
 | |
|       return Promise.resolve(0);
 | |
|     },
 | |
|     readJSON() {
 | |
|       return Promise.resolve({});
 | |
|     },
 | |
|     read() {
 | |
|       return Promise.resolve(new Uint8Array());
 | |
|     },
 | |
|     makeDirectory() {
 | |
|       return Promise.resolve(0);
 | |
|     },
 | |
|     write() {
 | |
|       return Promise.resolve(0);
 | |
|     },
 | |
|     exists() {
 | |
|       return Promise.resolve(0);
 | |
|     },
 | |
|     remove() {
 | |
|       return Promise.resolve(0);
 | |
|     },
 | |
|     stat() {
 | |
|       return Promise.resolve(0);
 | |
|     },
 | |
|   },
 | |
|   NewTabUtils: {
 | |
|     activityStreamProvider: {
 | |
|       getTopFrecentSites: () => [],
 | |
|       executePlacesQuery: async (sql, options) => ({ sql, options }),
 | |
|     },
 | |
|   },
 | |
|   OS: {
 | |
|     File: {
 | |
|       writeAtomic() {},
 | |
|       makeDir() {},
 | |
|       stat() {},
 | |
|       Error: {},
 | |
|       read() {},
 | |
|       exists() {},
 | |
|       remove() {},
 | |
|       removeEmptyDir() {},
 | |
|     },
 | |
|     Path: {
 | |
|       join() {
 | |
|         return "/";
 | |
|       },
 | |
|     },
 | |
|     Constants: {
 | |
|       Path: {
 | |
|         localProfileDir: "/",
 | |
|       },
 | |
|     },
 | |
|   },
 | |
|   PathUtils: {
 | |
|     join(...parts) {
 | |
|       return parts[parts.length - 1];
 | |
|     },
 | |
|     joinRelative(...parts) {
 | |
|       return parts[parts.length - 1];
 | |
|     },
 | |
|     getProfileDir() {
 | |
|       return Promise.resolve("/");
 | |
|     },
 | |
|     getLocalProfileDir() {
 | |
|       return Promise.resolve("/");
 | |
|     },
 | |
|   },
 | |
|   PlacesUtils: {
 | |
|     get bookmarks() {
 | |
|       return TEST_GLOBAL.Cc["@mozilla.org/browser/nav-bookmarks-service;1"];
 | |
|     },
 | |
|     get history() {
 | |
|       return TEST_GLOBAL.Cc["@mozilla.org/browser/nav-history-service;1"];
 | |
|     },
 | |
|     observers: {
 | |
|       addListener() {},
 | |
|       removeListener() {},
 | |
|     },
 | |
|   },
 | |
|   Preferences: FakePrefs,
 | |
|   PrivateBrowsingUtils: {
 | |
|     isBrowserPrivate: () => false,
 | |
|     isWindowPrivate: () => false,
 | |
|     permanentPrivateBrowsing: false,
 | |
|   },
 | |
|   DownloadsViewUI: {
 | |
|     getDisplayName: () => "filename.ext",
 | |
|     getSizeWithUnits: () => "1.5 MB",
 | |
|   },
 | |
|   FileUtils: {
 | |
|     // eslint-disable-next-line object-shorthand
 | |
|     File: function () {}, // NB: This is a function/constructor
 | |
|   },
 | |
|   Region: {
 | |
|     home: "US",
 | |
|     REGION_TOPIC: "browser-region-updated",
 | |
|   },
 | |
|   Services: {
 | |
|     dirsvc: {
 | |
|       get: () => ({ parent: { parent: { path: "appPath" } } }),
 | |
|     },
 | |
|     env: {
 | |
|       set: () => undefined,
 | |
|     },
 | |
|     locale: {
 | |
|       get appLocaleAsBCP47() {
 | |
|         return "en-US";
 | |
|       },
 | |
|       negotiateLanguages() {},
 | |
|     },
 | |
|     urlFormatter: { formatURL: str => str, formatURLPref: str => str },
 | |
|     mm: {
 | |
|       addMessageListener: (msg, cb) => this.receiveMessage(),
 | |
|       removeMessageListener() {},
 | |
|     },
 | |
|     obs: {
 | |
|       addObserver() {},
 | |
|       removeObserver() {},
 | |
|       notifyObservers() {},
 | |
|     },
 | |
|     telemetry: {
 | |
|       setEventRecordingEnabled: () => {},
 | |
|       recordEvent: eventDetails => {},
 | |
|       scalarSet: () => {},
 | |
|       keyedScalarAdd: () => {},
 | |
|     },
 | |
|     uuid: {
 | |
|       generateUUID() {
 | |
|         return "{foo-123-foo}";
 | |
|       },
 | |
|     },
 | |
|     console: { logStringMessage: () => {} },
 | |
|     prefs: new FakensIPrefService(),
 | |
|     tm: {
 | |
|       dispatchToMainThread: cb => cb(),
 | |
|       idleDispatchToMainThread: cb => cb(),
 | |
|     },
 | |
|     eTLD: {
 | |
|       getBaseDomain({ spec }) {
 | |
|         return spec.match(/\/([^/]+)/)[1];
 | |
|       },
 | |
|       getBaseDomainFromHost(host) {
 | |
|         return host.match(/.*?(\w+\.\w+)$/)[1];
 | |
|       },
 | |
|       getPublicSuffix() {},
 | |
|     },
 | |
|     io: {
 | |
|       newURI: spec => ({
 | |
|         mutate: () => ({
 | |
|           setRef: ref => ({
 | |
|             finalize: () => ({
 | |
|               ref,
 | |
|               spec,
 | |
|             }),
 | |
|           }),
 | |
|         }),
 | |
|         spec,
 | |
|       }),
 | |
|     },
 | |
|     search: {
 | |
|       init() {
 | |
|         return Promise.resolve();
 | |
|       },
 | |
|       getVisibleEngines: () =>
 | |
|         Promise.resolve([{ identifier: "google" }, { identifier: "bing" }]),
 | |
|       defaultEngine: {
 | |
|         identifier: "google",
 | |
|         searchForm:
 | |
|           "https://www.google.com/search?q=&ie=utf-8&oe=utf-8&client=firefox-b",
 | |
|         aliases: ["@google"],
 | |
|       },
 | |
|       defaultPrivateEngine: {
 | |
|         identifier: "bing",
 | |
|         searchForm: "https://www.bing.com",
 | |
|         aliases: ["@bing"],
 | |
|       },
 | |
|       getEngineByAlias: async () => null,
 | |
|     },
 | |
|     scriptSecurityManager: {
 | |
|       createNullPrincipal() {},
 | |
|       getSystemPrincipal() {},
 | |
|     },
 | |
|     wm: {
 | |
|       getMostRecentWindow: () => window,
 | |
|       getMostRecentBrowserWindow: () => window,
 | |
|       getEnumerator: () => [],
 | |
|     },
 | |
|     ww: { registerNotification() {}, unregisterNotification() {} },
 | |
|     appinfo: { appBuildID: "20180710100040", version: "69.0a1" },
 | |
|     scriptloader: { loadSubScript: () => {} },
 | |
|     startup: {
 | |
|       getStartupInfo() {
 | |
|         return {
 | |
|           process: {
 | |
|             getTime() {
 | |
|               return 1588010448000;
 | |
|             },
 | |
|           },
 | |
|         };
 | |
|       },
 | |
|     },
 | |
|   },
 | |
|   XPCOMUtils: {
 | |
|     defineLazyGlobalGetters: updateGlobalOrObject,
 | |
|     defineLazyModuleGetters: updateGlobalOrObject,
 | |
|     defineLazyServiceGetter: updateGlobalOrObject,
 | |
|     defineLazyServiceGetters: updateGlobalOrObject,
 | |
|     defineLazyPreferenceGetter(object, name) {
 | |
|       updateGlobalOrObject(object)[name] = "";
 | |
|     },
 | |
|     generateQI() {
 | |
|       return {};
 | |
|     },
 | |
|   },
 | |
|   EventEmitter,
 | |
|   ShellService: {
 | |
|     doesAppNeedPin: () => false,
 | |
|     isDefaultBrowser: () => true,
 | |
|   },
 | |
|   FilterExpressions: {
 | |
|     eval() {
 | |
|       return Promise.resolve(false);
 | |
|     },
 | |
|   },
 | |
|   RemoteSettings,
 | |
|   Localization: class {
 | |
|     async formatMessages(stringsIds) {
 | |
|       return Promise.resolve(
 | |
|         stringsIds.map(({ id, args }) => ({ value: { string_id: id, args } }))
 | |
|       );
 | |
|     }
 | |
|     async formatValue(stringId) {
 | |
|       return Promise.resolve(stringId);
 | |
|     }
 | |
|   },
 | |
|   FxAccountsConfig: {
 | |
|     promiseConnectAccountURI(id) {
 | |
|       return Promise.resolve(id);
 | |
|     },
 | |
|   },
 | |
|   FX_MONITOR_OAUTH_CLIENT_ID: "fake_client_id",
 | |
|   ExperimentAPI: {
 | |
|     getExperiment() {},
 | |
|     getExperimentMetaData() {},
 | |
|     getRolloutMetaData() {},
 | |
|   },
 | |
|   NimbusFeatures: {
 | |
|     glean: {
 | |
|       getVariable() {},
 | |
|     },
 | |
|     newtab: {
 | |
|       getVariable() {},
 | |
|       getAllVariables() {},
 | |
|       onUpdate() {},
 | |
|       offUpdate() {},
 | |
|     },
 | |
|     pocketNewtab: {
 | |
|       getVariable() {},
 | |
|       getAllVariables() {},
 | |
|       onUpdate() {},
 | |
|       offUpdate() {},
 | |
|     },
 | |
|     cookieBannerHandling: {
 | |
|       getVariable() {},
 | |
|     },
 | |
|   },
 | |
|   TelemetryEnvironment: {
 | |
|     setExperimentActive() {},
 | |
|     currentEnvironment: {
 | |
|       profile: {
 | |
|         creationDate: 16587,
 | |
|       },
 | |
|       settings: {},
 | |
|     },
 | |
|   },
 | |
|   TelemetryStopwatch: {
 | |
|     start: () => {},
 | |
|     finish: () => {},
 | |
|   },
 | |
|   Sampling: {
 | |
|     ratioSample(seed, ratios) {
 | |
|       return Promise.resolve(0);
 | |
|     },
 | |
|   },
 | |
|   BrowserHandler: {
 | |
|     get kiosk() {
 | |
|       return false;
 | |
|     },
 | |
|   },
 | |
|   TelemetrySession: {
 | |
|     getMetadata(reason) {
 | |
|       return {
 | |
|         reason,
 | |
|         sessionId: "fake_session_id",
 | |
|       };
 | |
|     },
 | |
|   },
 | |
|   PageThumbs: {
 | |
|     addExpirationFilter() {},
 | |
|     removeExpirationFilter() {},
 | |
|   },
 | |
|   Logger: FakeLogger,
 | |
|   getFxAccountsSingleton() {},
 | |
|   AboutNewTab: {},
 | |
|   Glean: {
 | |
|     newtab: {
 | |
|       opened: {
 | |
|         record() {},
 | |
|       },
 | |
|       closed: {
 | |
|         record() {},
 | |
|       },
 | |
|       locale: {
 | |
|         set() {},
 | |
|       },
 | |
|       newtabCategory: {
 | |
|         set() {},
 | |
|       },
 | |
|       homepageCategory: {
 | |
|         set() {},
 | |
|       },
 | |
|       blockedSponsors: {
 | |
|         set() {},
 | |
|       },
 | |
|       sovAllocation: {
 | |
|         set() {},
 | |
|       },
 | |
|     },
 | |
|     newtabSearch: {
 | |
|       enabled: {
 | |
|         set() {},
 | |
|       },
 | |
|     },
 | |
|     pocket: {
 | |
|       enabled: {
 | |
|         set() {},
 | |
|       },
 | |
|       impression: {
 | |
|         record() {},
 | |
|       },
 | |
|       isSignedIn: {
 | |
|         set() {},
 | |
|       },
 | |
|       sponsoredStoriesEnabled: {
 | |
|         set() {},
 | |
|       },
 | |
|       click: {
 | |
|         record() {},
 | |
|       },
 | |
|       save: {
 | |
|         record() {},
 | |
|       },
 | |
|       topicClick: {
 | |
|         record() {},
 | |
|       },
 | |
|     },
 | |
|     topsites: {
 | |
|       enabled: {
 | |
|         set() {},
 | |
|       },
 | |
|       sponsoredEnabled: {
 | |
|         set() {},
 | |
|       },
 | |
|       impression: {
 | |
|         record() {},
 | |
|       },
 | |
|       click: {
 | |
|         record() {},
 | |
|       },
 | |
|       rows: {
 | |
|         set() {},
 | |
|       },
 | |
|       showPrivacyClick: {
 | |
|         record() {},
 | |
|       },
 | |
|       dismiss: {
 | |
|         record() {},
 | |
|       },
 | |
|       prefChanged: {
 | |
|         record() {},
 | |
|       },
 | |
|     },
 | |
|     topSites: {
 | |
|       pingType: {
 | |
|         set() {},
 | |
|       },
 | |
|       position: {
 | |
|         set() {},
 | |
|       },
 | |
|       source: {
 | |
|         set() {},
 | |
|       },
 | |
|       tileId: {
 | |
|         set() {},
 | |
|       },
 | |
|       reportingUrl: {
 | |
|         set() {},
 | |
|       },
 | |
|       advertiser: {
 | |
|         set() {},
 | |
|       },
 | |
|       contextId: {
 | |
|         set() {},
 | |
|       },
 | |
|     },
 | |
|   },
 | |
|   GleanPings: {
 | |
|     newtab: {
 | |
|       submit() {},
 | |
|     },
 | |
|     topSites: {
 | |
|       submit() {},
 | |
|     },
 | |
|   },
 | |
|   Utils: {
 | |
|     SERVER_URL: "bogus://foo",
 | |
|   },
 | |
| };
 | |
| overrider.set(TEST_GLOBAL);
 | |
| 
 | |
| describe("asrouter", () => {
 | |
|   after(() => overrider.restore());
 | |
|   files.forEach(file => req(file));
 | |
| });
 | 
