From 3f18ff19e73b9e303767c6d85f2a87d00ecc0e88 Mon Sep 17 00:00:00 2001 From: Sebastian Silbermann Date: Fri, 15 Nov 2019 13:57:34 +0100 Subject: [PATCH 1/2] [CardMedia] Test prop warning --- .../src/CardMedia/CardMedia.test.js | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/packages/material-ui/src/CardMedia/CardMedia.test.js b/packages/material-ui/src/CardMedia/CardMedia.test.js index e5da4e8352bfbc..5afc1e2568bc01 100644 --- a/packages/material-ui/src/CardMedia/CardMedia.test.js +++ b/packages/material-ui/src/CardMedia/CardMedia.test.js @@ -3,6 +3,7 @@ import { assert } from 'chai'; import { createMount, findOutermostIntrinsic, getClasses } from '@material-ui/core/test-utils'; import describeConformance from '../test-utils/describeConformance'; import CardMedia from './CardMedia'; +import consoleErrorMock from 'test/utils/consoleErrorMock'; describe('', () => { let mount; @@ -78,4 +79,24 @@ describe('', () => { assert.strictEqual(findOutermostIntrinsic(wrapper).props().src, undefined); }); }); + + describe('warnings', () => { + before(() => { + consoleErrorMock.spy(); + }); + + after(() => { + consoleErrorMock.reset(); + }); + + it('warns when neither `children`, nor `image`, nor `src` are provided', () => { + mount(); + + assert.strictEqual(consoleErrorMock.callCount(), 1); + assert.include( + consoleErrorMock.args()[0][0], + 'Material-UI: either `children`, `image` or `src` prop must be specified.', + ); + }); + }); }); From 8dec6d986356357f8105e4c6b46511d2c4b68032 Mon Sep 17 00:00:00 2001 From: Sebastian Silbermann Date: Fri, 15 Nov 2019 14:01:00 +0100 Subject: [PATCH 2/2] [CardMedia] Use propTypes for at least one check --- packages/material-ui/src/CardMedia/CardMedia.js | 14 +++++++------- .../material-ui/src/CardMedia/CardMedia.test.js | 2 ++ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/packages/material-ui/src/CardMedia/CardMedia.js b/packages/material-ui/src/CardMedia/CardMedia.js index 6f830760780bc1..0e88c028f2b9e7 100644 --- a/packages/material-ui/src/CardMedia/CardMedia.js +++ b/packages/material-ui/src/CardMedia/CardMedia.js @@ -2,6 +2,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import clsx from 'clsx'; import withStyles from '../styles/withStyles'; +import { chainPropTypes } from '@material-ui/utils'; export const styles = { /* Styles applied to the root element. */ @@ -36,12 +37,6 @@ const CardMedia = React.forwardRef(function CardMedia(props, ref) { ...other } = props; - if (process.env.NODE_ENV !== 'production') { - if (!children && !image && !src) { - console.error('Material-UI: either `children`, `image` or `src` prop must be specified.'); - } - } - const isMediaComponent = MEDIA_COMPONENTS.indexOf(Component) !== -1; const composedStyle = !isMediaComponent && image ? { backgroundImage: `url("${image}")`, ...style } : style; @@ -70,7 +65,12 @@ CardMedia.propTypes = { /** * The content of the component. */ - children: PropTypes.node, + children: chainPropTypes(PropTypes.node, props => { + if (!props.children && !props.image && !props.src) { + return new Error('Material-UI: either `children`, `image` or `src` prop must be specified.'); + } + return null; + }), /** * Override or extend the styles applied to the component. * See [CSS API](#css) below for more details. diff --git a/packages/material-ui/src/CardMedia/CardMedia.test.js b/packages/material-ui/src/CardMedia/CardMedia.test.js index 5afc1e2568bc01..1acc473eff3aaa 100644 --- a/packages/material-ui/src/CardMedia/CardMedia.test.js +++ b/packages/material-ui/src/CardMedia/CardMedia.test.js @@ -4,6 +4,7 @@ import { createMount, findOutermostIntrinsic, getClasses } from '@material-ui/co import describeConformance from '../test-utils/describeConformance'; import CardMedia from './CardMedia'; import consoleErrorMock from 'test/utils/consoleErrorMock'; +import PropTypes from 'prop-types'; describe('', () => { let mount; @@ -87,6 +88,7 @@ describe('', () => { after(() => { consoleErrorMock.reset(); + PropTypes.resetWarningCache(); }); it('warns when neither `children`, nor `image`, nor `src` are provided', () => {