import { actionCreators as ac, actionTypes as at, } from "common/Actions.sys.mjs"; import { ASRouterAdminInner, CollapseToggle, DiscoveryStreamAdmin, Personalization, ToggleStoryButton, } from "content-src/components/ASRouterAdmin/ASRouterAdmin"; import { ASRouterUtils } from "content-src/asrouter/asrouter-utils"; import { GlobalOverrider } from "test/unit/utils"; import React from "react"; import { shallow } from "enzyme"; describe("ASRouterAdmin", () => { let globalOverrider; let sandbox; let wrapper; let globals; let FAKE_PROVIDER_PREF = [ { enabled: true, id: "snippets_local_testing", localProvider: "SnippetsProvider", type: "local", }, ]; let FAKE_PROVIDER = [ { enabled: true, id: "snippets_local_testing", localProvider: "SnippetsProvider", messages: [], type: "local", }, ]; beforeEach(() => { globalOverrider = new GlobalOverrider(); sandbox = sinon.createSandbox(); sandbox.stub(ASRouterUtils, "getPreviewEndpoint").returns("foo"); globals = { ASRouterMessage: sandbox.stub().resolves(), ASRouterAddParentListener: sandbox.stub(), ASRouterRemoveParentListener: sandbox.stub(), }; globalOverrider.set(globals); wrapper = shallow( ); }); afterEach(() => { sandbox.restore(); globalOverrider.restore(); }); it("should render ASRouterAdmin component", () => { assert.ok(wrapper.exists()); }); it("should send ADMIN_CONNECT_STATE on mount", () => { assert.calledOnce(globals.ASRouterMessage); assert.calledWith(globals.ASRouterMessage, { type: "ADMIN_CONNECT_STATE", data: { endpoint: "foo" }, }); }); it("should set a .collapsed class on the outer div if props.collapsed is true", () => { wrapper.setProps({ collapsed: true }); assert.isTrue(wrapper.find(".asrouter-admin").hasClass("collapsed")); }); it("should set a .expanded class on the outer div if props.collapsed is false", () => { wrapper.setProps({ collapsed: false }); assert.isTrue(wrapper.find(".asrouter-admin").hasClass("expanded")); assert.isFalse(wrapper.find(".asrouter-admin").hasClass("collapsed")); }); describe("#getSection", () => { it("should render a message provider section by default", () => { assert.equal(wrapper.find("h2").at(1).text(), "Messages"); }); it("should render a targeting section for targeting route", () => { wrapper = shallow( ); assert.equal(wrapper.find("h2").at(0).text(), "Targeting Utilities"); }); it("should render a DS section for DS route", () => { wrapper = shallow( ); assert.equal(wrapper.find("h2").at(0).text(), "Discovery Stream"); }); it("should render two error messages", () => { wrapper = shallow( ); const firstError = { timestamp: Date.now() + 100, error: { message: "first" }, }; const secondError = { timestamp: Date.now(), error: { message: "second" }, }; wrapper.setState({ providers: [{ id: "foo", errors: [firstError, secondError] }], }); assert.equal( wrapper.find("tbody tr").at(0).find("td").at(0).text(), "foo" ); assert.lengthOf(wrapper.find("tbody tr"), 2); assert.equal( wrapper.find("tbody tr").at(0).find("td").at(1).text(), secondError.error.message ); }); }); describe("#render", () => { beforeEach(() => { wrapper.setState({ providerPrefs: [], providers: [], userPrefs: {}, }); }); describe("#renderProviders", () => { it("should render the provider", () => { wrapper.setState({ providerPrefs: FAKE_PROVIDER_PREF, providers: FAKE_PROVIDER, }); // Header + 1 item assert.lengthOf(wrapper.find(".message-item"), 2); }); }); describe("#renderMessages", () => { beforeEach(() => { sandbox.stub(ASRouterUtils, "blockById").resolves(); sandbox.stub(ASRouterUtils, "unblockById").resolves(); sandbox.stub(ASRouterUtils, "overrideMessage").resolves({ foo: "bar" }); sandbox.stub(ASRouterUtils, "sendMessage").resolves(); wrapper.setState({ messageFilter: "all", messageBlockList: [], messageImpressions: { foo: 2 }, groups: [{ id: "messageProvider", enabled: true }], providers: [{ id: "messageProvider", enabled: true }], }); }); it("should render a message when no filtering is applied", () => { wrapper.setState({ messages: [ { id: "foo", provider: "messageProvider", groups: ["messageProvider"], }, ], }); assert.lengthOf(wrapper.find(".message-id"), 1); wrapper.find(".message-item button.primary").simulate("click"); assert.calledOnce(ASRouterUtils.blockById); assert.calledWith(ASRouterUtils.blockById, "foo"); }); it("should render a blocked message", () => { wrapper.setState({ messages: [ { id: "foo", groups: ["messageProvider"], provider: "messageProvider", }, ], messageBlockList: ["foo"], }); assert.lengthOf(wrapper.find(".message-item.blocked"), 1); wrapper.find(".message-item.blocked button").simulate("click"); assert.calledOnce(ASRouterUtils.unblockById); assert.calledWith(ASRouterUtils.unblockById, "foo"); }); it("should render a message if provider matches filter", () => { wrapper.setState({ messageFilter: "messageProvider", messages: [ { id: "foo", provider: "messageProvider", groups: ["messageProvider"], }, ], }); assert.lengthOf(wrapper.find(".message-id"), 1); }); it("should override with the selected message", async () => { wrapper.setState({ messageFilter: "messageProvider", messages: [ { id: "foo", provider: "messageProvider", groups: ["messageProvider"], }, ], }); assert.lengthOf(wrapper.find(".message-id"), 1); wrapper.find(".message-item button.show").simulate("click"); assert.calledOnce(ASRouterUtils.overrideMessage); assert.calledWith(ASRouterUtils.overrideMessage, "foo"); await ASRouterUtils.overrideMessage(); assert.equal(wrapper.state().foo, "bar"); }); it("should hide message if provider filter changes", () => { wrapper.setState({ messageFilter: "messageProvider", messages: [ { id: "foo", provider: "messageProvider", groups: ["messageProvider"], }, ], }); assert.lengthOf(wrapper.find(".message-id"), 1); wrapper.find("select").simulate("change", { target: { value: "bar" } }); assert.lengthOf(wrapper.find(".message-id"), 0); }); it("should not display Reset All button if provider filter value is set to all or test providers", () => { wrapper.setState({ messageFilter: "messageProvider", messages: [ { id: "foo", provider: "messageProvider", groups: ["messageProvider"], }, ], }); assert.lengthOf(wrapper.find(".messages-reset"), 1); wrapper.find("select").simulate("change", { target: { value: "all" } }); assert.lengthOf(wrapper.find(".messages-reset"), 0); wrapper .find("select") .simulate("change", { target: { value: "test_local_testing" } }); assert.lengthOf(wrapper.find(".messages-reset"), 0); }); it("should trigger disable and enable provider on Reset All button click", () => { wrapper.setState({ messageFilter: "messageProvider", messages: [ { id: "foo", provider: "messageProvider", groups: ["messageProvider"], }, ], providerPrefs: [ { id: "messageProvider", }, ], }); wrapper.find(".messages-reset").simulate("click"); assert.calledTwice(ASRouterUtils.sendMessage); assert.calledWith(ASRouterUtils.sendMessage, { type: "DISABLE_PROVIDER", data: "messageProvider", }); assert.calledWith(ASRouterUtils.sendMessage, { type: "ENABLE_PROVIDER", data: "messageProvider", }); }); }); }); describe("#DiscoveryStream", () => { let state = {}; let dispatch; beforeEach(() => { dispatch = sandbox.stub(); state = { config: { enabled: true, layout_endpoint: "", }, layout: [], spocs: { frequency_caps: [], }, feeds: { data: {}, }, }; wrapper = shallow( ); }); it("should render a DiscoveryStreamAdmin component", () => { assert.equal(wrapper.find("h3").at(0).text(), "Endpoint variant"); }); it("should render a spoc in DiscoveryStreamAdmin component", () => { state.spocs = { frequency_caps: [], data: { spocs: { items: [ { id: 12345, }, ], }, }, }; wrapper = shallow( ); wrapper.instance().onStoryToggle({ id: 12345 }); const messageSummary = wrapper.find(".message-summary").at(0); const pre = messageSummary.find("pre").at(0); const spocText = pre.text(); assert.equal(spocText, '{\n "id": 12345\n}'); }); it("should fire restorePrefDefaults with DISCOVERY_STREAM_CONFIG_RESET_DEFAULTS", () => { wrapper.find("button").at(0).simulate("click"); assert.calledWith( dispatch, ac.OnlyToMain({ type: at.DISCOVERY_STREAM_CONFIG_RESET_DEFAULTS, }) ); }); it("should fire config change with DISCOVERY_STREAM_CONFIG_CHANGE", () => { wrapper.find("button").at(1).simulate("click"); assert.calledWith( dispatch, ac.OnlyToMain({ type: at.DISCOVERY_STREAM_CONFIG_CHANGE, data: { enabled: true, layout_endpoint: "" }, }) ); }); it("should fire expireCache with DISCOVERY_STREAM_DEV_EXPIRE_CACHE", () => { wrapper.find("button").at(2).simulate("click"); assert.calledWith( dispatch, ac.OnlyToMain({ type: at.DISCOVERY_STREAM_DEV_EXPIRE_CACHE, }) ); }); it("should fire systemTick with DISCOVERY_STREAM_DEV_SYSTEM_TICK", () => { wrapper.find("button").at(3).simulate("click"); assert.calledWith( dispatch, ac.OnlyToMain({ type: at.DISCOVERY_STREAM_DEV_SYSTEM_TICK, }) ); }); it("should fire idleDaily with DISCOVERY_STREAM_DEV_IDLE_DAILY", () => { wrapper.find("button").at(4).simulate("click"); assert.calledWith( dispatch, ac.OnlyToMain({ type: at.DISCOVERY_STREAM_DEV_IDLE_DAILY, }) ); }); it("should fire syncRemoteSettings with DISCOVERY_STREAM_DEV_SYNC_RS", () => { wrapper.find("button").at(5).simulate("click"); assert.calledWith( dispatch, ac.OnlyToMain({ type: at.DISCOVERY_STREAM_DEV_SYNC_RS, }) ); }); it("should fire setConfigValue with DISCOVERY_STREAM_CONFIG_SET_VALUE", () => { const name = "name"; const value = "value"; wrapper.instance().setConfigValue(name, value); assert.calledWith( dispatch, ac.OnlyToMain({ type: at.DISCOVERY_STREAM_CONFIG_SET_VALUE, data: { name, value }, }) ); }); }); describe("#Personalization", () => { let dispatch; beforeEach(() => { dispatch = sandbox.stub(); wrapper = shallow( ); }); it("should render with pref checkbox, lastUpdated, and initialized", () => { assert.lengthOf(wrapper.find("TogglePrefCheckbox"), 1); assert.equal( wrapper.find("td").at(1).text(), "Personalization Last Updated" ); assert.equal( wrapper.find("td").at(2).text(), new Date(1000).toLocaleString() ); assert.equal( wrapper.find("td").at(3).text(), "Personalization Initialized" ); assert.equal(wrapper.find("td").at(4).text(), "true"); }); it("should render with no data with no last updated", () => { wrapper = shallow( ); assert.equal(wrapper.find("td").at(2).text(), "(no data)"); }); it("should dispatch DISCOVERY_STREAM_PERSONALIZATION_TOGGLE", () => { wrapper.instance().togglePersonalization(); assert.calledWith( dispatch, ac.OnlyToMain({ type: at.DISCOVERY_STREAM_PERSONALIZATION_TOGGLE, }) ); }); }); describe("#ToggleStoryButton", () => { it("should fire onClick in toggle button", async () => { let result = ""; function onClick(spoc) { result = spoc; } wrapper = shallow(); wrapper.find("button").simulate("click"); assert.equal(result, "spoc"); }); }); }); describe("CollapseToggle", () => { let wrapper; beforeEach(() => { wrapper = shallow(); }); describe("rendering inner content", () => { it("should not render ASRouterAdminInner for about:newtab (no hash)", () => { wrapper.setProps({ location: { hash: "", routes: [""] } }); assert.lengthOf(wrapper.find(ASRouterAdminInner), 0); }); it("should render ASRouterAdminInner for about:newtab#asrouter and subroutes", () => { wrapper.setProps({ location: { hash: "#asrouter", routes: [""] } }); assert.lengthOf(wrapper.find(ASRouterAdminInner), 1); wrapper.setProps({ location: { hash: "#asrouter-foo", routes: [""] } }); assert.lengthOf(wrapper.find(ASRouterAdminInner), 1); }); it("should render ASRouterAdminInner for about:newtab#devtools and subroutes", () => { wrapper.setProps({ location: { hash: "#devtools", routes: [""] } }); assert.lengthOf(wrapper.find(ASRouterAdminInner), 1); wrapper.setProps({ location: { hash: "#devtools-foo", routes: [""] } }); assert.lengthOf(wrapper.find(ASRouterAdminInner), 1); }); }); });