UNPKG

@netdata/charts

Version:

Netdata frontend SDK and chart utilities

312 lines (311 loc) 11.5 kB
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } import { renderHook, act } from "@testing-library/react"; import useHover, { useHovered } from "./useHover"; describe("useHover", function () { var mockElement; var mockOnHover; var mockOnBlur; beforeEach(function () { mockElement = { addEventListener: jest.fn(), removeEventListener: jest.fn(), parentElement: null }; mockOnHover = jest.fn(); mockOnBlur = jest.fn(); }); it("returns a ref object", function () { var _renderHook = renderHook(function () { return useHover({ onHover: mockOnHover, onBlur: mockOnBlur }, []); }), result = _renderHook.result; expect(result.current).toHaveProperty("current"); expect(result.current.current).toBeUndefined(); }); it("adds event listeners when ref.current is set", function () { var _renderHook2 = renderHook(function () { return useHover({ onHover: mockOnHover, onBlur: mockOnBlur }, []); }), result = _renderHook2.result, rerender = _renderHook2.rerender; act(function () { result.current.current = mockElement; }); rerender(); expect(mockElement.addEventListener).toHaveBeenCalledWith("mouseover", mockOnHover); expect(mockElement.addEventListener).toHaveBeenCalledWith("mouseout", expect.any(Function)); }); it("calls onHover when mouseover event is triggered", function () { var _renderHook3 = renderHook(function () { return useHover({ onHover: mockOnHover, onBlur: mockOnBlur }, []); }), result = _renderHook3.result, rerender = _renderHook3.rerender; act(function () { result.current.current = mockElement; }); rerender(); var mouseoverHandler = mockElement.addEventListener.mock.calls.find(function (call) { return call[0] === "mouseover"; })[1]; act(function () { mouseoverHandler(); }); expect(mockOnHover).toHaveBeenCalled(); }); it("calls onBlur when mouseout event is triggered and mouse leaves element", function () { var _renderHook4 = renderHook(function () { return useHover({ onHover: mockOnHover, onBlur: mockOnBlur, isOut: function isOut() { return true; } }, []); }), result = _renderHook4.result, rerender = _renderHook4.rerender; act(function () { result.current.current = mockElement; }); rerender(); var mouseoutHandler = mockElement.addEventListener.mock.calls.find(function (call) { return call[0] === "mouseout"; })[1]; var mockEvent = { relatedTarget: null }; act(function () { mouseoutHandler(mockEvent); }); expect(mockOnBlur).toHaveBeenCalled(); }); it("does not call onBlur when mouse moves to child element", function () { var childElement = { parentElement: mockElement }; var _renderHook5 = renderHook(function () { return useHover({ onHover: mockOnHover, onBlur: mockOnBlur }, []); }), result = _renderHook5.result, rerender = _renderHook5.rerender; act(function () { result.current.current = mockElement; }); rerender(); var mouseoutHandler = mockElement.addEventListener.mock.calls.find(function (call) { return call[0] === "mouseout"; })[1]; var mockEvent = { relatedTarget: childElement }; act(function () { mouseoutHandler(mockEvent); }); expect(mockOnBlur).not.toHaveBeenCalled(); }); it("removes event listeners on unmount", function () { var _renderHook6 = renderHook(function () { return useHover({ onHover: mockOnHover, onBlur: mockOnBlur }, []); }), result = _renderHook6.result, unmount = _renderHook6.unmount, rerender = _renderHook6.rerender; act(function () { result.current.current = mockElement; }); rerender(); var addedCalls = mockElement.addEventListener.mock.calls; var mouseoverHandler = addedCalls.find(function (call) { return call[0] === "mouseover"; })[1]; var mouseoutHandler = addedCalls.find(function (call) { return call[0] === "mouseout"; })[1]; unmount(); expect(mockElement.removeEventListener).toHaveBeenCalledWith("mouseover", mouseoverHandler); expect(mockElement.removeEventListener).toHaveBeenCalledWith("mouseout", mouseoutHandler); }); it("uses default isOut function when not provided", function () { var _renderHook7 = renderHook(function () { return useHover({ onHover: mockOnHover, onBlur: mockOnBlur }, []); }), result = _renderHook7.result, rerender = _renderHook7.rerender; act(function () { result.current.current = mockElement; }); rerender(); var mouseoutHandler = mockElement.addEventListener.mock.calls.find(function (call) { return call[0] === "mouseout"; })[1]; var mockEvent = { relatedTarget: null }; act(function () { mouseoutHandler(mockEvent); }); expect(mockOnBlur).toHaveBeenCalled(); }); it("handles dependencies correctly by re-running effect", function () { var deps = ["dep1"]; var _renderHook8 = renderHook(function () { return useHover({ onHover: mockOnHover, onBlur: mockOnBlur }, deps); }), rerender = _renderHook8.rerender; deps = ["dep2"]; rerender(); // Hook should handle dependency changes expect(mockOnHover).toBeDefined(); }); }); describe("useHovered", function () { it("returns array with ref and focused state", function () { var _renderHook9 = renderHook(function () { return useHovered(); }), result = _renderHook9.result; expect(Array.isArray(result.current)).toBe(true); expect(result.current).toHaveLength(2); var _result$current = _slicedToArray(result.current, 2), ref = _result$current[0], focused = _result$current[1]; expect(ref).toHaveProperty("current"); expect(_typeof(focused)).toBe("boolean"); }); it("initializes focused state to false", function () { var _renderHook10 = renderHook(function () { return useHovered(); }), result = _renderHook10.result; var _result$current2 = _slicedToArray(result.current, 2), focused = _result$current2[1]; expect(focused).toBe(false); }); it("sets focused to true on hover", function () { var mockElement = { addEventListener: jest.fn(), removeEventListener: jest.fn() }; var _renderHook11 = renderHook(function () { return useHovered(); }), result = _renderHook11.result, rerender = _renderHook11.rerender; act(function () { result.current[0].current = mockElement; }); rerender(); var onHover = mockElement.addEventListener.mock.calls.find(function (call) { return call[0] === "mouseover"; })[1]; act(function () { onHover(); }); var _result$current3 = _slicedToArray(result.current, 2), focusedAfterHover = _result$current3[1]; expect(focusedAfterHover).toBe(true); }); it("sets focused to false on blur", function () { var mockElement = { addEventListener: jest.fn(), removeEventListener: jest.fn() }; var _renderHook12 = renderHook(function () { return useHovered(); }), result = _renderHook12.result, rerender = _renderHook12.rerender; act(function () { result.current[0].current = mockElement; }); rerender(); var onHover = mockElement.addEventListener.mock.calls.find(function (call) { return call[0] === "mouseover"; })[1]; act(function () { onHover(); }); var onMouseout = mockElement.addEventListener.mock.calls.find(function (call) { return call[0] === "mouseout"; })[1]; act(function () { onMouseout({ relatedTarget: null }); }); var _result$current4 = _slicedToArray(result.current, 2), focusedAfterBlur = _result$current4[1]; expect(focusedAfterBlur).toBe(false); }); it("accepts custom options parameter", function () { var customOptions = { isOut: jest.fn(function () { return true; }) }; var _renderHook13 = renderHook(function () { return useHovered(customOptions); }), result = _renderHook13.result; expect(Array.isArray(result.current)).toBe(true); expect(result.current).toHaveLength(2); }); it("accepts dependencies parameter", function () { var deps = ["dep1", "dep2"]; var _renderHook14 = renderHook(function () { return useHovered({}, deps); }), result = _renderHook14.result; expect(Array.isArray(result.current)).toBe(true); expect(result.current).toHaveLength(2); }); it("handles no parameters", function () { var _renderHook15 = renderHook(function () { return useHovered(); }), result = _renderHook15.result; expect(Array.isArray(result.current)).toBe(true); expect(result.current).toHaveLength(2); }); it("provides stable ref reference", function () { var _renderHook16 = renderHook(function () { return useHovered(); }), result = _renderHook16.result, rerender = _renderHook16.rerender; var _result$current5 = _slicedToArray(result.current, 1), initialRef = _result$current5[0]; rerender(); var _result$current6 = _slicedToArray(result.current, 1), refAfterRerender = _result$current6[0]; expect(initialRef).toBe(refAfterRerender); }); });