import React from "react"; import { mount } from "enzyme"; import { Provider } from "react-redux"; import { INITIAL_STATE, reducers } from "common/Reducers.sys.mjs"; import { combineReducers, createStore } from "redux"; import { CustomizeMenu } from "content-src/components/CustomizeMenu/CustomizeMenu"; import { ContentSection } from "content-src/components/CustomizeMenu/ContentSection/ContentSection"; const DEFAULT_STATE = { ...INITIAL_STATE, Prefs: { ...INITIAL_STATE.Prefs, values: { ...INITIAL_STATE.Prefs.values, "newtabWallpapers.wallpaper": "", }, }, }; function WrapWithProvider({ children, state = DEFAULT_STATE }) { const store = createStore(combineReducers(reducers), state); return {children}; } let wrapper; let sandbox; let DEFAULT_PROPS; describe("", () => { beforeEach(() => { sandbox = sinon.createSandbox(); DEFAULT_PROPS = { showing: false, onOpen: sandbox.stub(), onClose: sandbox.stub(), openPreferences: sandbox.stub(), setPref: sandbox.stub(), dispatch: sandbox.stub(), enabledSections: { topSitesEnabled: true, pocketEnabled: true, weatherEnabled: true, showInferredPersonalizationEnabled: false, topSitesRowsCount: 1, selectedWallpaper: "", }, enabledWidgets: { timerEnabled: false, listsEnabled: false }, wallpapersEnabled: false, activeWallpaper: null, pocketRegion: "US", mayHaveTopicSections: false, mayHaveInferredPersonalization: false, mayHaveWeather: true, mayHaveWidgets: false, mayHaveTimerWidget: false, mayHaveListsWidget: false, }; }); afterEach(() => { if (wrapper) { wrapper.unmount(); wrapper = null; } sandbox.restore(); }); it("renders the personalize button when not showing and calls onOpen on click", () => { wrapper = mount( ); const openBtn = wrapper.find(".personalize-button"); assert.isTrue(openBtn.exists(), "open button renders"); openBtn.simulate("click"); assert.calledOnce(DEFAULT_PROPS.onOpen); }); it("calls onOpen when pressing Enter on the personalize button", () => { wrapper = mount( ); wrapper.find(".personalize-button").simulate("keydown", { key: "Enter" }); assert.calledOnce(DEFAULT_PROPS.onOpen); }); it("renders the menu when showing = true and calls onClose from the close button", () => { wrapper = mount( ); const menu = wrapper.find(".customize-menu"); assert.isTrue(menu.exists(), "customize menu renders"); const closeBtn = wrapper.find("#close-button"); assert.isTrue(closeBtn.exists(), "close button renders"); closeBtn.simulate("click"); assert.calledOnce(DEFAULT_PROPS.onClose); }); it("passes key configuration props to ContentSection", () => { const PROPS = { ...DEFAULT_PROPS, showing: true, mayHaveWidgets: true, mayHaveTimerWidget: true, mayHaveListsWidget: true, wallpapersEnabled: true, enabledWidgets: { timerEnabled: true, listsEnabled: true }, }; wrapper = mount( ); const child = wrapper.find(ContentSection); assert.strictEqual(child.prop("mayHaveWidgets"), true); assert.strictEqual(child.prop("mayHaveTimerWidget"), true); assert.strictEqual(child.prop("mayHaveListsWidget"), true); assert.strictEqual(child.prop("wallpapersEnabled"), true); assert.deepEqual(child.prop("enabledWidgets"), { timerEnabled: true, listsEnabled: true, }); }); it("focuses the close button when onEntered is called", () => { wrapper = mount( ); const instance = wrapper.find("_CustomizeMenu").instance(); const mockFocus = sandbox.stub(); instance.closeButtonRef.current = { focus: mockFocus }; instance.onEntered(); assert.calledOnce(mockFocus); }); it("focuses the personalize button when onExited is called", () => { wrapper = mount( ); const instance = wrapper.find("_CustomizeMenu").instance(); const mockFocus = sandbox.stub(); instance.personalizeButtonRef.current = { focus: mockFocus }; instance.onExited(); assert.calledOnce(mockFocus); }); it("adds subpanel-open class when onSubpanelToggle is called", () => { wrapper = mount( ); const instance = wrapper.find("_CustomizeMenu").instance(); instance.onSubpanelToggle(true); wrapper.update(); const menu = wrapper.find(".customize-menu").hostNodes(); assert.isTrue(menu.hasClass("subpanel-open")); instance.onSubpanelToggle(false); wrapper.update(); const menuAfter = wrapper.find(".customize-menu").hostNodes(); assert.isFalse(menuAfter.hasClass("subpanel-open")); }); });