/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ import { render, fireEvent } from "@testing-library/react"; import { WrapWithProvider } from "test/jest/test-utils"; import { INITIAL_STATE } from "common/Reducers.sys.mjs"; import { WidgetMenuFooter } from "content-src/components/Widgets/WidgetMenuFooter"; import { actionTypes as at } from "common/Actions.mjs"; import { PREF_WIDGETS_ORDER } from "common/WidgetsRegistry.mjs"; function renderFooter(props = {}) { const dispatch = jest.fn(); const { container } = render( ); return { container, dispatch }; } describe("", () => { it("renders a divider, then Hide and Learn more in order", () => { const { container } = renderFooter(); const children = Array.from(container.querySelector("panel-list").children); // No sizeSubmenu passed and MoveSubmenu renders nothing without a movable // widget order, so only the divider + the two fixed items remain. expect(children.map(c => c.tagName.toLowerCase())).toEqual([ "hr", "panel-item", "panel-item", ]); expect(children[1].getAttribute("data-l10n-id")).toBe( "newtab-widget-menu-hide" ); expect(children[2].getAttribute("data-l10n-id")).toBe( "newtab-clock-widget-menu-learn-more" ); }); it("omits the divider when showDivider is false", () => { const { container } = renderFooter({ showDivider: false }); const children = Array.from(container.querySelector("panel-list").children); expect(children.map(c => c.tagName.toLowerCase())).toEqual([ "panel-item", "panel-item", ]); expect(container.querySelector("hr")).not.toBeInTheDocument(); }); it("renders the passed size submenu right after the divider, before Hide", () => { const { container } = renderFooter({ sizeSubmenu: ( ), }); const children = Array.from(container.querySelector("panel-list").children); expect(children[0].tagName.toLowerCase()).toBe("hr"); expect(children[1].getAttribute("data-testid")).toBe("size"); expect(children[2].getAttribute("data-l10n-id")).toBe( "newtab-widget-menu-hide" ); }); it("orders divider, size, Move, Hide, Learn more when movement is available", () => { const state = { ...INITIAL_STATE, Prefs: { ...INITIAL_STATE.Prefs, values: { ...INITIAL_STATE.Prefs.values, [PREF_WIDGETS_ORDER]: "clocks,weather", }, }, }; const { container } = render( } /> ); const children = Array.from(container.querySelector("panel-list").children); expect(children[0].tagName.toLowerCase()).toBe("hr"); expect(children[1].getAttribute("data-testid")).toBe("size"); expect(children[2].getAttribute("submenu")).toBe("clocks-move-submenu"); expect(children[3].getAttribute("data-l10n-id")).toBe( "newtab-widget-menu-hide" ); expect(children[4].getAttribute("data-l10n-id")).toBe( "newtab-clock-widget-menu-learn-more" ); }); it("dispatches SET_PREF(false) and WIDGETS_ENABLED telemetry on hide", () => { const onAfterHide = jest.fn(); const { container, dispatch } = renderFooter({ widgetName: "weather", enabledPref: "showWeather", widgetSize: "medium", onAfterHide, }); fireEvent.click( container.querySelector( "panel-item[data-l10n-id='newtab-widget-menu-hide']" ) ); expect(dispatch).toHaveBeenCalledTimes(2); expect(dispatch.mock.calls[0][0]).toMatchObject({ type: at.SET_PREF, data: { name: "showWeather", value: false }, }); expect(dispatch.mock.calls[1][0]).toMatchObject({ type: at.WIDGETS_ENABLED, data: { widget_name: "weather", widget_source: "context_menu", enabled: false, widget_size: "medium", }, }); expect(onAfterHide).toHaveBeenCalledTimes(1); }); it("opens Learn more in a new tab and runs onLearnMore after it", () => { const onLearnMore = jest.fn(); const { container, dispatch } = renderFooter({ onLearnMore }); fireEvent.click( container.querySelector( "panel-item[data-l10n-id='newtab-clock-widget-menu-learn-more']" ) ); expect(dispatch).toHaveBeenCalledTimes(1); expect(dispatch.mock.calls[0][0]).toMatchObject({ type: at.OPEN_LINK, data: { where: "tab" }, }); expect(onLearnMore).toHaveBeenCalledTimes(1); }); });