/*eslint max-nested-callbacks: ["error", 10]*/
import { ASRouterChild } from "actors/ASRouterChild.sys.mjs";
import { MESSAGE_TYPE_HASH as msg } from "common/ActorConstants.sys.mjs";
import { GlobalOverrider } from "test/unit/utils";

describe("ASRouterChild", () => {
  let asRouterChild = null;
  let globals = null;
  let overrider = null;
  let sandbox = null;
  beforeEach(() => {
    sandbox = sinon.createSandbox();
    globals = {
      Cu: {
        cloneInto: sandbox.stub().returns(Promise.resolve()),
      },
    };
    overrider = new GlobalOverrider();
    overrider.set(globals);
    asRouterChild = new ASRouterChild();
    asRouterChild.telemetry = {
      sendTelemetry: sandbox.stub(),
    };
    sandbox.stub(asRouterChild, "sendAsyncMessage");
    sandbox.stub(asRouterChild, "sendQuery").returns(Promise.resolve());
  });
  afterEach(() => {
    sandbox.restore();
    overrider.restore();
    asRouterChild = null;
  });
  describe("asRouterMessage", () => {
    describe("uses sendAsyncMessage for types that don't need an async response", () => {
      [
        msg.DISABLE_PROVIDER,
        msg.ENABLE_PROVIDER,
        msg.EXPIRE_QUERY_CACHE,
        msg.FORCE_WHATSNEW_PANEL,
        msg.IMPRESSION,
        msg.RESET_PROVIDER_PREF,
        msg.SET_PROVIDER_USER_PREF,
        msg.USER_ACTION,
      ].forEach(type => {
        it(`type ${type}`, () => {
          asRouterChild.asRouterMessage({
            type,
            data: {
              something: 1,
            },
          });
          sandbox.assert.calledOnce(asRouterChild.sendAsyncMessage);
          sandbox.assert.calledWith(asRouterChild.sendAsyncMessage, type, {
            something: 1,
          });
        });
      });
    });
    describe("use sends messages that need a response using sendQuery", () => {
      it("NEWTAB_MESSAGE_REQUEST", () => {
        const type = msg.NEWTAB_MESSAGE_REQUEST;
        asRouterChild.asRouterMessage({
          type,
          data: {
            something: 1,
          },
        });
        sandbox.assert.calledOnce(asRouterChild.sendQuery);
        sandbox.assert.calledWith(asRouterChild.sendQuery, type, {
          something: 1,
        });
      });
    });
  });
});
