import { actionCreators as ac } from "common/Actions.mjs"; import { ContentSection } from "content-src/components/CustomizeMenu/ContentSection/ContentSection"; import { mount } from "enzyme"; import React from "react"; import { INITIAL_STATE, reducers } from "common/Reducers.sys.mjs"; import { combineReducers, createStore } from "redux"; import { Provider } from "react-redux"; const DEFAULT_PROPS = { mayHaveWidgets: false, mayHaveWeather: true, mayHaveTimerWidget: false, mayHaveListsWidget: false, wallpapersEnabled: false, activeWallpaper: null, exitEventFired: false, enabledSections: { topSitesEnabled: true, pocketEnabled: true, weatherEnabled: true, showInferredPersonalizationEnabled: false, topSitesRowsCount: 1, }, enabledWidgets: { timerEnabled: false, listsEnabled: false, }, dispatch: sinon.stub(), setPref: sinon.stub(), openPreferences: sinon.stub(), pocketRegion: "US", mayHaveInferredPersonalization: false, mayHaveTopicSections: false, }; function WrapWithProvider({ children, state = INITIAL_STATE }) { const store = createStore(combineReducers(reducers), state); return {children}; } describe("ContentSection", () => { let wrapper; beforeEach(() => { wrapper = mount(); }); afterEach(() => { if (wrapper) { wrapper.unmount(); wrapper = null; } }); it("should render the component", () => { assert.ok(wrapper.exists()); }); it("should look for a data-event-source attribute and dispatch an event for INPUT", () => { wrapper.instance().onPreferenceSelect({ target: { nodeName: "INPUT", checked: true, dataset: { preference: "foo", eventSource: "bar" }, }, }); assert.calledWith( DEFAULT_PROPS.dispatch, ac.UserEvent({ event: "PREF_CHANGED", source: "bar", value: { status: true, menu_source: "CUSTOMIZE_MENU" }, }) ); assert.calledWith(DEFAULT_PROPS.setPref, "foo", true); }); it("should call setPref with parsed integer value for MOZ-SELECT", () => { wrapper.instance().onPreferenceSelect({ target: { nodeName: "MOZ-SELECT", value: "3", dataset: { preference: "topSitesRows" }, }, }); assert.calledWith(DEFAULT_PROPS.setPref, "topSitesRows", 3); }); it("should have data-event-source attributes on relevant pref changing inputs", () => { wrapper = mount(); assert.equal( wrapper.find("#weather-toggle").prop("data-event-source"), "WEATHER" ); assert.equal( wrapper.find("#shortcuts-toggle").prop("data-event-source"), "TOP_SITES" ); assert.equal( wrapper.find("#pocket-toggle").prop("data-event-source"), "TOP_STORIES" ); }); // Bug 1985305 - "Widgets Toggle Section" Layout it("renders the Widgets section when mayHaveWidgets = true", () => { wrapper = mount( ); assert.isTrue(wrapper.find(".widgets-section").exists()); }); it("does not render the Widgets section when mayHaveWidgets = false", () => { wrapper = mount( ); assert.isFalse(wrapper.find(".widgets-section").exists()); }); it("places Weather under Widgets when widgets are enabled and doesn't render default Weather placement", () => { wrapper = mount( ); assert.isTrue( wrapper.find(".widgets-section #weather-section #weather-toggle").exists() ); assert.isFalse(wrapper.find(".settings-toggles #weather-section").exists()); }); it("places Weather in the default area when widgets are disabled", () => { wrapper = mount( ); assert.isTrue( wrapper .find(".settings-toggles #weather-section #weather-toggle") .exists() ); assert.isFalse(wrapper.find(".widgets-section #weather-section").exists()); }); it("renders Lists toggle only when mayHaveListsWidget = true in Widgets section", () => { wrapper = mount( ); assert.isTrue( wrapper .find(".widgets-section #lists-widget-section #lists-toggle") .exists() ); wrapper.setProps({ children: ( ), }); assert.isFalse(wrapper.find("#lists-widget-section").exists()); }); it("renders Timer toggle only when mayHaveTimerWidget = true in Widgets section", () => { wrapper = mount( ); assert.isTrue( wrapper .find(".widgets-section #timer-widget-section #timer-toggle") .exists() ); wrapper.setProps({ children: ( ), }); assert.isFalse(wrapper.find("#timer-widget-section").exists()); }); it("should dispatch WIDGETS_ENABLED with widget_size=medium when widgetsMayBeMaximized is false", () => { const dispatch = sinon.spy(); wrapper = mount( ); wrapper.instance().onPreferenceSelect({ target: { nodeName: "INPUT", checked: true, dataset: { preference: "widgets.lists.enabled", eventSource: "WIDGET_LISTS", }, }, }); const widgetsEnabledCall = dispatch .getCalls() .find(call => call.args[0].type === "WIDGETS_ENABLED"); assert.ok(widgetsEnabledCall, "Expected WIDGETS_ENABLED to be dispatched"); assert.equal( widgetsEnabledCall.args[0].data.widget_size, "medium", "widget_size should be medium when widgets.system.maximized is false" ); }); it("should dispatch WIDGETS_ENABLED with widget_size=mini for Weather widget", () => { const dispatch = sinon.spy(); wrapper = mount( ); wrapper.instance().onPreferenceSelect({ target: { nodeName: "INPUT", checked: true, dataset: { preference: "showWeather", eventSource: "WEATHER", }, }, }); const widgetsEnabledCall = dispatch .getCalls() .find(call => call.args[0].type === "WIDGETS_ENABLED"); assert.ok(widgetsEnabledCall, "Expected WIDGETS_ENABLED to be dispatched"); assert.equal( widgetsEnabledCall.args[0].data.widget_name, "weather", "widget_name should be weather" ); assert.equal( widgetsEnabledCall.args[0].data.widget_size, "mini", "widget_size should always be mini for Weather widget" ); }); describe("SectionsMgmtPanel", () => { const STATE_WITH_SECTIONS = { ...INITIAL_STATE, DiscoveryStream: { ...INITIAL_STATE.DiscoveryStream, layout: [ { components: [ { type: "CardGrid", feed: { url: "https://example.com/feed", }, }, ], }, ], feeds: { data: { "https://example.com/feed": { data: { sections: [ { sectionKey: "technology", title: "Technology", receivedRank: 0, }, ], }, }, }, }, sectionPersonalization: {}, }, }; it("should not render SectionsMgmtPanel when mayHaveTopicSections is false", () => { wrapper = mount( ); assert.isFalse(wrapper.find("SectionsMgmtPanel").exists()); }); it("should render SectionsMgmtPanel when mayHaveTopicSections is true", () => { wrapper = mount( ); assert.isTrue(wrapper.find("SectionsMgmtPanel").exists()); }); it("should render SectionsMgmtPanel only when pocket is enabled and mayHaveTopicSections is true", () => { wrapper = mount( ); assert.isTrue(wrapper.find("SectionsMgmtPanel").exists()); }); }); // @nova-cleanup(remove-conditional): Remove novaEnabled condition from wallpapers section describe("wallpapers section (novaEnabled)", () => { // WallpaperCategories reads newtabWallpapers.wallpaper from the store; // provide it so the component doesn't crash on .includes() const WALLPAPER_STATE = { ...INITIAL_STATE, Prefs: { ...INITIAL_STATE.Prefs, values: { ...INITIAL_STATE.Prefs.values, "newtabWallpapers.wallpaper": "", }, }, }; const NOVA_PROPS = { novaEnabled: true, toggleWidgetsManagementPanel: sinon.stub(), showWidgetsManagementPanel: false, onSubpanelToggle: sinon.stub(), }; it("renders the wallpaper toggle", () => { wrapper = mount( ); assert.isTrue(wrapper.find("#wallpapers-toggle").exists()); }); it("shows WallpaperCategories when the wallpaper toggle is on", () => { wrapper = mount( ); assert.isTrue(wrapper.find(".category-list").exists()); }); it("hides WallpaperCategories when the wallpaper toggle is off", () => { wrapper = mount( ); assert.isFalse(wrapper.find(".category-list").exists()); }); // @nova-cleanup(remove-conditional): Remove the `.widgets-section` assertion once the novaEnabled condition is removed it("renders WidgetsManagementPanel instead of .widgets-section when novaEnabled and mayHaveWidgets are true", () => { wrapper = mount( ); assert.isTrue(wrapper.find("WidgetsManagementPanel").exists()); assert.isFalse(wrapper.find(".widgets-section").exists()); }); describe("widgets system toggle", () => { it("renders the widgets system toggle in ContentSection", () => { wrapper = mount( ); assert.isTrue(wrapper.find("#widgets-system-toggle").exists()); }); it("sets widgets-system-toggle pressed when widgetsEnabled is true", () => { wrapper = mount( ); assert.isTrue(wrapper.find("#widgets-system-toggle").prop("pressed")); }); it("sets widgets-system-toggle unpressed when widgetsEnabled is false", () => { wrapper = mount( ); assert.isNotOk(wrapper.find("#widgets-system-toggle").prop("pressed")); }); }); }); });