fune/browser/components/asrouter/tests/unit/ASRouterNewTabHook.test.js
Mike Conley 662b9e4bf2 Bug 1868838 - Move ASRouterNewTabHook into browser/components/asrouter/modules. r=pdahiya
This causes the mocha/chai tests for newtab to break because of the failure
to import the ASRouterNewTabHook module from within ASRouterParent. This will
get fixed in the next patch in the stack which moves the actors.

Differential Revision: https://phabricator.services.mozilla.com/D198871
2024-01-29 18:52:19 +00:00

153 lines
6.2 KiB
JavaScript

/*eslint max-nested-callbacks: ["error", 10]*/
import { ASRouterNewTabHook } from "modules/ASRouterNewTabHook.sys.mjs";
describe("ASRouterNewTabHook", () => {
let sandbox = null;
let initParams = null;
beforeEach(() => {
sandbox = sinon.createSandbox();
initParams = {
router: {
init: sandbox.stub().callsFake(() => {
// Fake the initialization
initParams.router.initialized = true;
}),
uninit: sandbox.stub(),
},
messageHandler: {
handleCFRAction: {},
handleTelemetry: {},
},
createStorage: () => Promise.resolve({}),
};
});
afterEach(() => {
sandbox.restore();
});
describe("ASRouterNewTabHook", () => {
describe("getInstance", () => {
it("awaits createInstance and router init before returning instance", async () => {
const getInstanceCall = sandbox.spy();
const waitForInstance =
ASRouterNewTabHook.getInstance().then(getInstanceCall);
await ASRouterNewTabHook.createInstance(initParams);
await waitForInstance;
assert.callOrder(initParams.router.init, getInstanceCall);
});
});
describe("createInstance", () => {
it("calls router init", async () => {
await ASRouterNewTabHook.createInstance(initParams);
assert.calledOnce(initParams.router.init);
});
it("only calls router init once", async () => {
initParams.router.init.callsFake(() => {
initParams.router.initialized = true;
});
await ASRouterNewTabHook.createInstance(initParams);
await ASRouterNewTabHook.createInstance(initParams);
assert.calledOnce(initParams.router.init);
});
});
describe("destroy", () => {
it("disconnects new tab, uninits ASRouter, and destroys instance", async () => {
await ASRouterNewTabHook.createInstance(initParams);
const instance = await ASRouterNewTabHook.getInstance();
const destroy = instance.destroy.bind(instance);
sandbox.stub(instance, "destroy").callsFake(destroy);
ASRouterNewTabHook.destroy();
assert.calledOnce(initParams.router.uninit);
assert.calledOnce(instance.destroy);
assert.isNotNull(instance);
assert.isNull(instance._newTabMessageHandler);
});
});
describe("instance", () => {
let routerParams = null;
let messageHandler = null;
let instance = null;
beforeEach(async () => {
messageHandler = {
clearChildMessages: sandbox.stub().resolves(),
clearChildProviders: sandbox.stub().resolves(),
updateAdminState: sandbox.stub().resolves(),
};
initParams.router.init.callsFake(params => {
routerParams = params;
});
await ASRouterNewTabHook.createInstance(initParams);
instance = await ASRouterNewTabHook.getInstance();
});
describe("connect", () => {
it("before connection messageHandler methods are not called", async () => {
routerParams.clearChildMessages([1]);
routerParams.clearChildProviders(["test_provider"]);
routerParams.updateAdminState({ messages: {} });
assert.notCalled(messageHandler.clearChildMessages);
assert.notCalled(messageHandler.clearChildProviders);
assert.notCalled(messageHandler.updateAdminState);
});
it("after connect updateAdminState and clearChildMessages calls are forwarded to handler", async () => {
instance.connect(messageHandler);
routerParams.clearChildMessages([1]);
routerParams.clearChildProviders(["test_provider"]);
routerParams.updateAdminState({ messages: {} });
assert.called(messageHandler.clearChildMessages);
assert.called(messageHandler.clearChildProviders);
assert.called(messageHandler.updateAdminState);
});
it("calls from before connection are dropped", async () => {
routerParams.clearChildMessages([1]);
routerParams.clearChildProviders(["test_provider"]);
routerParams.updateAdminState({ messages: {} });
instance.connect(messageHandler);
routerParams.clearChildMessages([1]);
routerParams.clearChildProviders(["test_provider"]);
routerParams.updateAdminState({ messages: {} });
assert.calledOnce(messageHandler.clearChildMessages);
assert.calledOnce(messageHandler.clearChildProviders);
assert.calledOnce(messageHandler.updateAdminState);
});
});
describe("disconnect", () => {
it("calls after disconnect are dropped", async () => {
instance.connect(messageHandler);
instance.disconnect();
routerParams.clearChildMessages([1]);
routerParams.clearChildProviders(["test_provider"]);
routerParams.updateAdminState({ messages: {} });
assert.notCalled(messageHandler.clearChildMessages);
assert.notCalled(messageHandler.clearChildProviders);
assert.notCalled(messageHandler.updateAdminState);
});
it("only calls from when there is a connection are forwarded", async () => {
routerParams.clearChildMessages([1]);
routerParams.clearChildProviders(["foo"]);
routerParams.updateAdminState({ messages: {} });
instance.connect(messageHandler);
routerParams.clearChildMessages([200]);
routerParams.clearChildProviders(["bar"]);
routerParams.updateAdminState({
messages: {
data: "accept",
},
});
instance.disconnect();
routerParams.clearChildMessages([1]);
routerParams.clearChildProviders(["foo"]);
routerParams.updateAdminState({ messages: {} });
assert.calledOnce(messageHandler.clearChildMessages);
assert.calledOnce(messageHandler.clearChildProviders);
assert.calledOnce(messageHandler.updateAdminState);
assert.calledWith(messageHandler.clearChildMessages, [200]);
assert.calledWith(messageHandler.clearChildProviders, ["bar"]);
assert.calledWith(messageHandler.updateAdminState, {
messages: {
data: "accept",
},
});
});
});
});
});
});