From 7c0019ae10a83a92313f5428a97c2e30d12e070f Mon Sep 17 00:00:00 2001 From: geido Date: Mon, 22 Feb 2021 15:20:14 +0200 Subject: [PATCH 1/3] Add tests for ErrorBoundary --- .../ErrorBoundary/ErrorBoundary.test.tsx | 62 ++++++++++++++++ .../src/components/ErrorBoundary/index.jsx | 70 +++++++++++++++++++ 2 files changed, 132 insertions(+) create mode 100644 superset-frontend/src/components/ErrorBoundary/ErrorBoundary.test.tsx create mode 100644 superset-frontend/src/components/ErrorBoundary/index.jsx diff --git a/superset-frontend/src/components/ErrorBoundary/ErrorBoundary.test.tsx b/superset-frontend/src/components/ErrorBoundary/ErrorBoundary.test.tsx new file mode 100644 index 0000000000000..75ddc1c6fa9dd --- /dev/null +++ b/superset-frontend/src/components/ErrorBoundary/ErrorBoundary.test.tsx @@ -0,0 +1,62 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import { render, screen } from 'spec/helpers/testing-library'; +import ErrorBoundary from '.'; + +const mockedProps = { + children: Error children, + onError: () => null, + showMessage: false, +}; + +const Child = () => { + throw new Error('Thrown error'); +}; + +test('should render', () => { + const { container } = render( + + + , + ); + expect(container).toBeInTheDocument(); +}); + +test('should not render an error message', () => { + render( + + + , + ); + expect(screen.queryByText('Unexpected error')).not.toBeInTheDocument(); +}); + +test('should render an error message', () => { + const messageProps = { + ...mockedProps, + showMessage: true, + }; + render( + + + , + ); + expect(screen.getByText('Unexpected error')).toBeInTheDocument(); +}); diff --git a/superset-frontend/src/components/ErrorBoundary/index.jsx b/superset-frontend/src/components/ErrorBoundary/index.jsx new file mode 100644 index 0000000000000..1066598b6addf --- /dev/null +++ b/superset-frontend/src/components/ErrorBoundary/index.jsx @@ -0,0 +1,70 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import PropTypes from 'prop-types'; +import { t } from '@superset-ui/core'; +import ErrorMessageWithStackTrace from '../ErrorMessage/ErrorMessageWithStackTrace'; + +const propTypes = { + children: PropTypes.node.isRequired, + onError: PropTypes.func, + showMessage: PropTypes.bool, +}; +const defaultProps = { + onError: () => {}, + showMessage: true, +}; + +export default class ErrorBoundary extends React.Component { + constructor(props) { + super(props); + this.state = { error: null, info: null }; + } + + componentDidCatch(error, info) { + this.props.onError(error, info); + this.setState({ error, info }); + } + + render() { + const { error, info } = this.state; + if (error) { + const firstLine = error.toString(); + const message = ( + + {t('Unexpected error')} + {firstLine ? `: ${firstLine}` : ''} + + ); + if (this.props.showMessage) { + return ( + + ); + } + return null; + } + return this.props.children; + } +} +ErrorBoundary.propTypes = propTypes; +ErrorBoundary.defaultProps = defaultProps; From 17836a2d2ec696c6991f58bf6155d303d176869e Mon Sep 17 00:00:00 2001 From: geido Date: Mon, 22 Feb 2021 15:26:58 +0200 Subject: [PATCH 2/3] Remove original ErrorBoundary file --- .../src/components/ErrorBoundary.jsx | 70 ------------------- 1 file changed, 70 deletions(-) delete mode 100644 superset-frontend/src/components/ErrorBoundary.jsx diff --git a/superset-frontend/src/components/ErrorBoundary.jsx b/superset-frontend/src/components/ErrorBoundary.jsx deleted file mode 100644 index ba76af3dbbff7..0000000000000 --- a/superset-frontend/src/components/ErrorBoundary.jsx +++ /dev/null @@ -1,70 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -import React from 'react'; -import PropTypes from 'prop-types'; -import { t } from '@superset-ui/core'; -import ErrorMessageWithStackTrace from './ErrorMessage/ErrorMessageWithStackTrace'; - -const propTypes = { - children: PropTypes.node.isRequired, - onError: PropTypes.func, - showMessage: PropTypes.bool, -}; -const defaultProps = { - onError: () => {}, - showMessage: true, -}; - -export default class ErrorBoundary extends React.Component { - constructor(props) { - super(props); - this.state = { error: null, info: null }; - } - - componentDidCatch(error, info) { - this.props.onError(error, info); - this.setState({ error, info }); - } - - render() { - const { error, info } = this.state; - if (error) { - const firstLine = error.toString(); - const message = ( - - {t('Unexpected error')} - {firstLine ? `: ${firstLine}` : ''} - - ); - if (this.props.showMessage) { - return ( - - ); - } - return null; - } - return this.props.children; - } -} -ErrorBoundary.propTypes = propTypes; -ErrorBoundary.defaultProps = defaultProps; From 2c06e035e46988d17a8c9b5aee0789ecf2e76b18 Mon Sep 17 00:00:00 2001 From: geido Date: Mon, 1 Mar 2021 18:52:03 +0200 Subject: [PATCH 3/3] Prefer absolute path --- superset-frontend/src/components/ErrorBoundary/index.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/superset-frontend/src/components/ErrorBoundary/index.jsx b/superset-frontend/src/components/ErrorBoundary/index.jsx index 1066598b6addf..7bc00758afd98 100644 --- a/superset-frontend/src/components/ErrorBoundary/index.jsx +++ b/superset-frontend/src/components/ErrorBoundary/index.jsx @@ -19,7 +19,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { t } from '@superset-ui/core'; -import ErrorMessageWithStackTrace from '../ErrorMessage/ErrorMessageWithStackTrace'; +import ErrorMessageWithStackTrace from 'src/components/ErrorMessage/ErrorMessageWithStackTrace'; const propTypes = { children: PropTypes.node.isRequired,