UNPKG

@artsy/fresnel

Version:

An SSR compatible approach to CSS media query based responsive layouts for React.

712 lines (643 loc) 31.9 kB
"use strict"; function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } require("jest-styled-components"); var _react = _interopRequireDefault(require("react")); var _reactTestRenderer = _interopRequireWildcard(require("react-test-renderer")); var _styledComponents = require("styled-components"); var _Media = require("../Media"); var _Breakpoints = require("../Breakpoints"); var _MediaQueries = require("../MediaQueries"); var _server = _interopRequireDefault(require("react-dom/server")); var _reactDom = _interopRequireDefault(require("react-dom")); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _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(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } function _templateObject() { var data = _taggedTemplateLiteral(["\n ", "\n "]); _templateObject = function _templateObject() { return data; }; return data; } function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); } var config = { breakpoints: { "extra-small": 0, small: 768, medium: 1024, large: 1120 }, interactions: { hover: "not all and (hover:hover)" } }; var _createMedia = (0, _Media.createMedia)(config), Media = _createMedia.Media, MediaContextProvider = _createMedia.MediaContextProvider, createMediaStyle = _createMedia.createMediaStyle, SortedBreakpoints = _createMedia.SortedBreakpoints, findBreakpointAtWidth = _createMedia.findBreakpointAtWidth, findBreakpointsForWidths = _createMedia.findBreakpointsForWidths, valuesWithBreakpointProps = _createMedia.valuesWithBreakpointProps; var mediaQueries = new _MediaQueries.MediaQueries(config.breakpoints, config.interactions); describe("utilities", function () { it("returns a list of breakpoints sorted from small to large", function () { expect(SortedBreakpoints).toEqual(["extra-small", "small", "medium", "large"]); }); it("returns the breakpoint that supports the given width", function () { expect(findBreakpointAtWidth(-42)).toEqual(undefined); expect(findBreakpointAtWidth(42)).toEqual("extra-small"); expect(findBreakpointAtWidth(767)).toEqual("extra-small"); expect(findBreakpointAtWidth(768)).toEqual("small"); expect(findBreakpointAtWidth(1042)).toEqual("medium"); expect(findBreakpointAtWidth(9999)).toEqual("large"); }); it("returns the breakpoints from the first through the last given widths", function () { expect(findBreakpointsForWidths(-42, -21)).toEqual(undefined); expect(findBreakpointsForWidths(42, 767)).toEqual(["extra-small"]); expect(findBreakpointsForWidths(42, 768)).toEqual(["extra-small", "small"]); expect(findBreakpointsForWidths(42, 1042)).toEqual(["extra-small", "small", "medium"]); expect(findBreakpointsForWidths(768, 9999)).toEqual(["small", "medium", "large"]); }); it("maps a list of responsive values to breakpoint props", function () { expect(valuesWithBreakpointProps([1])).toEqual([[1, { greaterThanOrEqual: "extra-small" }]]); expect(valuesWithBreakpointProps([1, 2])).toEqual([[1, { at: "extra-small" }], [2, { greaterThanOrEqual: "small" }]]); expect(valuesWithBreakpointProps([1, 2, 2, 3])).toEqual([[1, { at: "extra-small" }], [2, { between: ["small", "large"] }], [3, { greaterThanOrEqual: "large" }]]); expect(valuesWithBreakpointProps([2, 2, 2, 3])).toEqual([[2, { between: ["extra-small", "large"] }], [3, { greaterThanOrEqual: "large" }]]); }); }); describe("Media", function () { beforeEach(function () { (0, _styledComponents.injectGlobal)(_templateObject(), createMediaStyle()); }); afterEach(function () { // @ts-ignore window.matchMedia = undefined; }); describe("concerning errors and warnings", function () { var errorLogger = global.console.error; var warnLogger = global.console.warn; afterEach(function () { global.console.error = errorLogger; global.console.warn = warnLogger; }); it("throws when trying to use mutually exclusive props", function () { global.console.error = jest.fn(); expect(function () { _reactTestRenderer.default.create(_react.default.createElement(Media, { lessThan: "small", at: "extra-small" }, "ohai")); }).toThrow(); }); it("warns when using `at` in conjunction with the largest breakpoint", function () { global.console.warn = jest.fn(); _reactTestRenderer.default.create(_react.default.createElement(Media, { at: "large" }, "ohai")).toJSON(); expect(global.console.warn).toHaveBeenCalled(); }); }); describe("concerning styling", function () { it("doesn’t add any size to the layout", function () { var query = _reactTestRenderer.default.create(_react.default.createElement(Media, { lessThan: "small" }, "ohai")).toJSON(); expect(query.type).toEqual("div"); expect(query).toHaveStyleRule("margin", "0"); expect(query).toHaveStyleRule("padding", "0"); }); it("applies additional classNames passed as props", function () { var query = _reactTestRenderer.default.create(_react.default.createElement(Media, { lessThan: "small", className: "foo" }, "ohai")).toJSON(); expect(query.props.className).toContain("foo"); }); it("includes only style rules for specified breakpoint keys", function () { var defaultMediaStyles = createMediaStyle(); expect(defaultMediaStyles).toContain(".fresnel-between-small-large"); var subsetMediaStyles = createMediaStyle([_Breakpoints.BreakpointConstraint.at, _Breakpoints.BreakpointConstraint.greaterThan]); expect(subsetMediaStyles).not.toContain(".fresnel-between-small-large"); expect(subsetMediaStyles).toContain(".fresnel-at-extra-small"); }); }); describe("concerning breakpoints", function () { it("creates a container that will only display when the page size is less than the specified breakpoint", function () { var query = _reactTestRenderer.default.create(_react.default.createElement(Media, { lessThan: "small" }, "ohai")).toJSON(); expect(query.type).toEqual("div"); expect(query).toHaveStyleRule("display", "none!important", { media: "not all and (max-width:767.98px)" }); }); it("creates a container that will only display when the page size is greater than or equal to the next breakpoint of the specified breakpoint", function () { var query = _reactTestRenderer.default.create(_react.default.createElement(Media, { greaterThan: "medium" }, "ohai")).toJSON(); expect(query.type).toEqual("div"); expect(query).toHaveStyleRule("display", "none!important", { media: "not all and (min-width:1120px)" }); }); it("creates a container that will only display when the page size is greater than or equal to the specified breakpoint", function () { var query = _reactTestRenderer.default.create(_react.default.createElement(Media, { greaterThanOrEqual: "medium" }, "ohai")).toJSON(); expect(query.type).toEqual("div"); expect(query).toHaveStyleRule("display", "none!important", { media: "not all and (min-width:1024px)" }); }); it("creates a container that will only display when the page size is between the specified breakpoints", function () { var query = _reactTestRenderer.default.create(_react.default.createElement(Media, { between: ["small", "large"] }, "ohai")).toJSON(); expect(query.type).toEqual("div"); expect(query).toHaveStyleRule("display", "none!important", { media: "not all and (min-width:768px) and (max-width:1119.98px)" }); }); describe("concerning shortcuts", function () { // FIXME: styled-components reconciliation issues. Output is right yet the // generated classNames don't match xit("creates a container that will only display when the page size is between the specified breakpoint and the next one", function () { expect(_reactTestRenderer.default.create(_react.default.createElement(Media, { at: "extra-small" }, "ohai")).toJSON()).toEqual(_reactTestRenderer.default.create(_react.default.createElement(Media, { between: ["extra-small", "small"] }, "ohai")).toJSON()); expect(_reactTestRenderer.default.create(_react.default.createElement(Media, { at: "small" }, "ohai")).toJSON()).toEqual(_reactTestRenderer.default.create(_react.default.createElement(Media, { between: ["small", "medium"] }, "ohai")).toJSON()); expect(_reactTestRenderer.default.create(_react.default.createElement(Media, { at: "medium" }, "ohai")).toJSON()).toEqual(_reactTestRenderer.default.create(_react.default.createElement(Media, { between: ["medium", "large"] }, "ohai")).toJSON()); expect(_reactTestRenderer.default.create(_react.default.createElement(Media, { at: "large" }, "ohai")).toJSON()).toEqual(_reactTestRenderer.default.create(_react.default.createElement(Media, { greaterThanOrEqual: "large" }, "ohai")).toJSON()); }); }); }); describe("concerning interactions", function () { it("creates a container that will only display when the interaction media query matches", function () { var query = _reactTestRenderer.default.create(_react.default.createElement(Media, { interaction: "hover" }, "ohai")).toJSON(); expect(query.type).toEqual("div"); expect(query).toHaveStyleRule("display", "none!important", { media: "not all and (hover:hover)" }); }); }); describe("with a render prop", function () { it("yields the class name so it can be applied to another element", function () { var query = _reactTestRenderer.default.create(_react.default.createElement(Media, { lessThan: "small" }, function (className) { return _react.default.createElement("span", { className: className }, "ohai"); })).toJSON(); expect(query.type).toEqual("span"); expect(query).toHaveStyleRule("display", "none!important", { media: "not all and (max-width:767.98px)" }); }); it("yields wether or not the element’s children should be rendered", function () { var query = _reactTestRenderer.default.create(_react.default.createElement(MediaContextProvider, { onlyMatch: ["extra-small", "small"] }, _react.default.createElement(Media, { at: "extra-small" }, function (_, renderChildren) { return _react.default.createElement("span", null, renderChildren && "extra-small"); }), _react.default.createElement(Media, { at: "small" }, function (_, renderChildren) { return _react.default.createElement("span", null, renderChildren && "small"); }), _react.default.createElement(Media, { at: "medium" }, function (_, renderChildren) { return _react.default.createElement("span", null, renderChildren && "medium"); }))); expect(query.root.findAllByType("span").map(function (div) { return div.props.children; }).filter(Boolean)).toEqual(["extra-small", "small"]); }); }); describe("with a context", function () { it("renders only matching `at` breakpoints", function () { var query = _reactTestRenderer.default.create(_react.default.createElement(MediaContextProvider, { onlyMatch: ["extra-small", "small"] }, _react.default.createElement(Media, { at: "extra-small" }, "extra-small"), _react.default.createElement(Media, { at: "small" }, "small"), _react.default.createElement(Media, { at: "medium" }, "medium"))); expect(query.root.findAllByType("div").map(function (div) { return div.props.children; }).filter(Boolean)).toEqual(["extra-small", "small"]); }); it("renders only matching `lessThan` breakpoints", function () { var query = _reactTestRenderer.default.create(_react.default.createElement(MediaContextProvider, { onlyMatch: ["small", "medium"] }, _react.default.createElement(Media, { lessThan: "small" }, "extra-small"), _react.default.createElement(Media, { lessThan: "medium" }, "small"), _react.default.createElement(Media, { lessThan: "large" }, "medium"))); expect(query.root.findAllByType("div").map(function (div) { return div.props.children; }).filter(Boolean)).toEqual(["small", "medium"]); }); it("renders only matching `greaterThan` breakpoints", function () { var query = _reactTestRenderer.default.create(_react.default.createElement(MediaContextProvider, { onlyMatch: ["small", "medium"] }, _react.default.createElement(Media, { greaterThan: "extra-small" }, "small"), _react.default.createElement(Media, { greaterThan: "small" }, "medium"), _react.default.createElement(Media, { greaterThan: "medium" }, "large"))); expect(query.root.findAllByType("div").map(function (div) { return div.props.children; }).filter(Boolean)).toEqual(["small", "medium"]); }); it("renders only matching `greaterThanOrEqual` breakpoints", function () { var query = _reactTestRenderer.default.create(_react.default.createElement(MediaContextProvider, { onlyMatch: ["small", "medium"] }, _react.default.createElement(Media, { greaterThanOrEqual: "small" }, "small"), _react.default.createElement(Media, { greaterThanOrEqual: "medium" }, "medium"), _react.default.createElement(Media, { greaterThanOrEqual: "large" }, "large"))); expect(query.root.findAllByType("div").map(function (div) { return div.props.children; }).filter(Boolean)).toEqual(["small", "medium"]); }); it("renders only matching `between` breakpoints", function () { var query = _reactTestRenderer.default.create(_react.default.createElement(MediaContextProvider, { onlyMatch: ["medium", "large"] }, _react.default.createElement(Media, { between: ["extra-small", "medium"] }, "extra-small - medium"), _react.default.createElement(Media, { between: ["small", "large"] }, "small - large"))); expect(query.root.findAllByType("div").map(function (div) { return div.props.children; }).filter(Boolean)).toEqual(["small - large"]); }); it("renders only matching interactions", function () { var query = _reactTestRenderer.default.create(_react.default.createElement(MediaContextProvider, { onlyMatch: ["hover"] }, _react.default.createElement(Media, { interaction: "hover" }, "hover"), _react.default.createElement(Media, { between: ["small", "large"] }, "small - large"))); expect(query.root.findAllByType("div").map(function (div) { return div.props.children; }).filter(Boolean)).toEqual(["hover"]); }); describe("client-side with dynamic media query API available", function () { Object.entries({ breakpoint: "medium", interaction: "hover" }).forEach(function (_ref) { var _ref2 = _slicedToArray(_ref, 2), type = _ref2[0], mediaQuery = _ref2[1]; it("only renders the current ".concat(type, " media query"), function () { mockCurrentDynamicBreakpoint(mediaQuery); var query = _reactTestRenderer.default.create(_react.default.createElement(MediaContextProvider, { onlyMatch: ["small", mediaQuery] }, _react.default.createElement(Media, { at: "extra-small" }, _react.default.createElement("span", { className: "extra-small" })), _react.default.createElement(Media, { at: "medium" }, _react.default.createElement("span", { className: "medium" })), _react.default.createElement(Media, { at: "large" }, _react.default.createElement("span", { className: "large" })), _react.default.createElement(Media, { interaction: "hover" }, _react.default.createElement("span", { className: "hover" })))); expect(query.root.findAllByType("span").length).toEqual(1); expect(query.root.findByProps({ className: mediaQuery })).not.toBeNull(); }); }); it("disables usage of dynamic API to further narrow down", function () { mockCurrentDynamicBreakpoint("medium"); var query = _reactTestRenderer.default.create(_react.default.createElement(MediaContextProvider, { onlyMatch: ["extra-small", "medium", "large"], disableDynamicMediaQueries: true }, _react.default.createElement(Media, { at: "extra-small" }, _react.default.createElement("span", { className: "extra-small" })), _react.default.createElement(Media, { at: "medium" }, _react.default.createElement("span", { className: "medium" })), _react.default.createElement(Media, { at: "large" }, _react.default.createElement("span", { className: "large" })))); expect(query.root.findAllByType("span").length).toEqual(3); }); it("does not render anything if the current breakpoint isn’t in the already narrowed down set", function () { mockCurrentDynamicBreakpoint("large"); var query = _reactTestRenderer.default.create(_react.default.createElement(MediaContextProvider, { onlyMatch: ["small", "medium"] }, _react.default.createElement(Media, { at: "extra-small" }, _react.default.createElement("span", { className: "extra-small" })), _react.default.createElement(Media, { at: "medium" }, _react.default.createElement("span", { className: "medium" })), _react.default.createElement(Media, { at: "large" }, _react.default.createElement("span", { className: "large" })))); expect(query.root.findAllByType("span").length).toEqual(0); }); }); }); describe("during hydration", function () { // FIXME: Unable to reproduce this here, so we'll do a more synthetic test. xit("does not warn about Media components that do not match and are empty", function (done) { var spy = jest.spyOn(console, "error"); var App = function App() { return _react.default.createElement(MediaContextProvider, null, _react.default.createElement(Media, { at: "extra-small" }, _react.default.createElement("div", { className: "extra-small" })), _react.default.createElement(Media, { at: "medium" }, _react.default.createElement("div", { className: "medium" })), _react.default.createElement(Media, { greaterThanOrEqual: "large" }, _react.default.createElement("div", { className: "large" }))); }; var container = document.createElement("div"); document.body.appendChild(container); mockCurrentDynamicBreakpoint("medium"); container.innerHTML = _server.default.renderToString(_react.default.createElement(App, null)); _reactDom.default.hydrate(_react.default.createElement(App, null), container, function () { expect(spy).not.toHaveBeenCalled(); done(); }); }); // This is the best we can do until we figure out a way to reproduce a // warning, as per above. it("does not warn about Media components that do not match and are empty", function () { mockCurrentDynamicBreakpoint("medium"); var query = _reactTestRenderer.default.create(_react.default.createElement(MediaContextProvider, null, _react.default.createElement(Media, { at: "extra-small" }, _react.default.createElement("span", { className: "extra-small" })), _react.default.createElement(Media, { at: "medium" }, _react.default.createElement("span", { className: "medium" })), _react.default.createElement(Media, { at: "large" }, _react.default.createElement("span", { className: "large" })))).toJSON(); expect(query.find(function (e) { return e.props.className.includes("extra-small"); }).props.suppressHydrationWarning).toEqual(true); }); }); describe("prevent nested unnecessary renders", function () { it("only renders one element when Media is nested within Media", function () { var query = _reactTestRenderer.default.create(_react.default.createElement(MediaContextProvider, null, _react.default.createElement(Media, { at: "medium" }, _react.default.createElement(Media, { at: "extra-small" }, _react.default.createElement("span", { className: "extra-small" })), _react.default.createElement(Media, { at: "medium" }, _react.default.createElement("span", { className: "medium" })), _react.default.createElement(Media, { at: "large" }, _react.default.createElement("span", { className: "large" }))))); expect(query.root.findAllByProps({ className: "extra-small" }, { deep: true }).length).toBe(0); expect(query.root.findAllByProps({ className: "large" }, { deep: true }).length).toBe(0); expect(query.root.findAllByProps({ className: "medium" }, { deep: true }).length).toBe(1); }); it("renders no spans with deep nesting where parent has no intersection with children", function () { var query = _reactTestRenderer.default.create(_react.default.createElement(MediaContextProvider, null, _react.default.createElement(Media, { at: "extra-small" }, _react.default.createElement(Media, { at: "medium" }, _react.default.createElement(Media, { at: "extra-small" }, _react.default.createElement("span", { className: "extra-small" })), _react.default.createElement(Media, { at: "medium" }, _react.default.createElement("span", { className: "medium" })), _react.default.createElement(Media, { at: "large" }, _react.default.createElement("span", { className: "large" }))), _react.default.createElement(Media, { at: "large" }, _react.default.createElement("span", { className: "large" }))))); expect(query.root.findAllByType("span", { deep: true }).length).toBe(0); }); it("renders multiple spans in path, without rendering spans that don't intersect", function () { var query = _reactTestRenderer.default.create(_react.default.createElement(MediaContextProvider, null, _react.default.createElement(Media, { at: "extra-small" }, _react.default.createElement("span", null), _react.default.createElement(Media, { at: "extra-small" }, _react.default.createElement("span", null), _react.default.createElement(Media, { at: "extra-small" }, _react.default.createElement("span", null)), _react.default.createElement(Media, { at: "medium" }, _react.default.createElement("span", null))), _react.default.createElement(Media, { at: "medium" }, _react.default.createElement("span", null))))); expect(query.root.findAllByType("span", { deep: true }).length).toBe(3); }); it("renders correct Media when using greaterThan prop", function () { var query = _reactTestRenderer.default.create(_react.default.createElement(MediaContextProvider, null, _react.default.createElement(Media, { greaterThan: "small" }, _react.default.createElement(Media, { at: "extra-small" }, _react.default.createElement("span", null)), _react.default.createElement(Media, { at: "small" }, _react.default.createElement("span", null)), _react.default.createElement(Media, { at: "medium" }, _react.default.createElement("span", null)), _react.default.createElement(Media, { at: "large" }, _react.default.createElement("span", null))))); expect(query.root.findAllByType("span", { deep: true }).length).toBe(2); }); it("renders correct Media when using greaterThanOrEqual prop", function () { var query = _reactTestRenderer.default.create(_react.default.createElement(MediaContextProvider, null, _react.default.createElement(Media, { greaterThanOrEqual: "small" }, _react.default.createElement(Media, { at: "extra-small" }, _react.default.createElement("span", null)), _react.default.createElement(Media, { at: "small" }, _react.default.createElement("span", null)), _react.default.createElement(Media, { at: "medium" }, _react.default.createElement("span", null)), _react.default.createElement(Media, { at: "large" }, _react.default.createElement("span", null))))); expect(query.root.findAllByType("span", { deep: true }).length).toBe(3); }); it("renders correct Media when using lessThan prop", function () { var query = _reactTestRenderer.default.create(_react.default.createElement(MediaContextProvider, null, _react.default.createElement(Media, { lessThan: "small" }, _react.default.createElement(Media, { at: "extra-small" }, _react.default.createElement("span", null)), _react.default.createElement(Media, { at: "small" }, _react.default.createElement("span", null)), _react.default.createElement(Media, { at: "medium" }, _react.default.createElement("span", null)), _react.default.createElement(Media, { at: "large" }, _react.default.createElement("span", null))))); expect(query.root.findAllByType("span", { deep: true }).length).toBe(1); }); it("renders correct Media when using between prop", function () { var query = _reactTestRenderer.default.create(_react.default.createElement(MediaContextProvider, null, _react.default.createElement(Media, { between: ["small", "large"] }, _react.default.createElement(Media, { at: "extra-small" }, _react.default.createElement("span", null)), _react.default.createElement(Media, { at: "small" }, _react.default.createElement("span", null)), _react.default.createElement(Media, { at: "medium" }, _react.default.createElement("span", null)), _react.default.createElement(Media, { at: "large" }, _react.default.createElement("span", null))))); expect(query.root.findAllByType("span", { deep: true }).length).toBe(2); }); }); // TODO: This actually doesn’t make sense, I think, because if the user // decides to not use a provider they are opting for rendering all // variants. We just need to make sure to document this well. xdescribe("without a context provider", function () { it("only renders the current breakpoint", function () { mockCurrentDynamicBreakpoint("medium"); var query = _reactTestRenderer.default.create(_react.default.createElement(_react.default.Fragment, null, _react.default.createElement(Media, { at: "extra-small" }, _react.default.createElement("span", { className: "extra-small" })), _react.default.createElement(Media, { at: "medium" }, _react.default.createElement("span", { className: "medium" })), _react.default.createElement(Media, { at: "large" }, _react.default.createElement("span", { className: "large" })))); expect(query.root.findAllByType("span").length).toEqual(1); expect(query.root.findByProps({ className: "medium" })).not.toBeNull(); }); }); }); function mockCurrentDynamicBreakpoint(at) { window.matchMedia = jest.fn(function (mediaQuery) { var key = Object.entries(mediaQueries.dynamicResponsiveMediaQueries).find(function (_ref3) { var _ref4 = _slicedToArray(_ref3, 2), _ = _ref4[0], query = _ref4[1]; return mediaQuery === query; })[0]; // Return mock object that only matches the mocked breakpoint return { matches: key === at, addListener: jest.fn(), removeListener: jest.fn() }; }); } //# sourceMappingURL=Media.test.js.map