diff --git a/jest.config.js b/jest.config.js
new file mode 100644
index 0000000..a5c4be7
--- /dev/null
+++ b/jest.config.js
@@ -0,0 +1,13 @@
+// jest.config.js
+module.exports = {
+ collectCoverageFrom: ['src/**/*.{js,jsx}'],
+ coveragePathIgnorePatterns: [
+ '/node_modules/',
+ 'src/serviceWorker.js',
+ 'src/configureStore.js',
+ 'src/bees.js',
+ 'src/index.js',
+ 'src/tests/*.{js,jsx}',
+ 'src/__tests__/testing-helpers.js'
+ ]
+}
diff --git a/package.json b/package.json
index e3202d3..cb65595 100644
--- a/package.json
+++ b/package.json
@@ -15,7 +15,7 @@
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
- "test": "react-scripts test",
+ "test": "react-scripts test --testPathIgnorePatterns=src/__tests__/testing-helpers.js --env=jsdom",
"test:coverage": "react-scripts test --coverage --watchAll=false",
"eject": "react-scripts eject",
"lint": "eslint './src/**/*.{js,jsx}'",
@@ -24,19 +24,6 @@
"eslintConfig": {
"extends": "react-app"
},
- "jest": {
- "collectCoverageFrom": [
- "src/**/*.{js,jsx}"
- ],
- "coveragePathIgnorePatterns": [
- "/node_modules/",
- "src/serviceWorker.js",
- "src/configureStore.js",
- "src/bees.js",
- "src/index.js",
- "src/tests/*.{js,jsx}"
- ]
- },
"browserslist": {
"production": [
">0.2%",
@@ -50,6 +37,8 @@
]
},
"devDependencies": {
+ "@testing-library/jest-dom": "^5.1.1",
+ "@testing-library/react": "^9.4.0",
"babel-loader": "^8.0.6",
"cross-fetch": "^3.0.4",
"eslint": "^6.4.0",
diff --git a/src/__tests__/App.test.js b/src/__tests__/App.test.js
index 808228a..3b88e09 100644
--- a/src/__tests__/App.test.js
+++ b/src/__tests__/App.test.js
@@ -1,10 +1,7 @@
import React from 'react'
-import ReactDOM from 'react-dom'
import App from '../containers/App'
+import { renderWithRedux } from './testing-helpers'
-/**
- * This needs to be implemented to handle working with the Redux Store
- */
-it('renders the component on the DOM', () => {
- // To be implemented
+it('renders without crashing', () => {
+ expect(renderWithRedux())
})
diff --git a/src/__tests__/AuthButton.test.js b/src/__tests__/AuthButton.test.js
index c1583d0..cceddf4 100644
--- a/src/__tests__/AuthButton.test.js
+++ b/src/__tests__/AuthButton.test.js
@@ -1,6 +1,6 @@
import React from 'react'
-import ReactDOM from 'react-dom'
import AuthButton from '../containers/AuthButton'
+import { render } from '@testing-library/react'
describe('', () => {
let defaultProps = {
@@ -8,15 +8,24 @@ describe('', () => {
authorizationUrl: 'http://cloud.org/authorize'
}
+ it('renders without crashing', () => {
+ expect(render())
+ })
+
+ it('renders the auth button', () => {
+ const { getByTestId, debug } = render()
+ expect(getByTestId('auth-button')).toBeInTheDocument()
+ })
+
it('renders the Sign in', () => {
- // const wrapper = mount();
- // expect(wrapper).toBeTruthy;
- // expect(wrapper.text()).toEqual('Sign In');
+ const { getByTestId, debug } = render()
+ expect(getByTestId('auth-button')).toHaveTextContent(/sign in/i)
})
it('renders the Authorized', () => {
- // const wrapper = mount();
- // expect(wrapper).toBeTruthy;
- // expect(wrapper.text()).toEqual('Authorized');
+ const { getByTestId, debug } = render(
+
+ )
+ expect(getByTestId('auth-button')).toHaveTextContent(/authorized/i)
})
})
diff --git a/src/__tests__/ResourceNode.test.js b/src/__tests__/ResourceNode.test.js
index d917f93..820c69f 100644
--- a/src/__tests__/ResourceNode.test.js
+++ b/src/__tests__/ResourceNode.test.js
@@ -1,5 +1,26 @@
import React from 'react'
-import ReactDOM from 'react-dom'
import ResourceNode from '../containers/ResourceNode'
+import { render } from '@testing-library/react'
-it('renders the component on the DOM', () => {})
+const mockDispatch = jest.fn()
+
+const defaultProps = {
+ selected: false,
+ label: 'Ima label',
+ bytestream: { foo: 'bar ' },
+ dispatch: mockDispatch
+}
+
+it('renders without crashing', () => {
+ expect(render())
+})
+
+it('renders the resource node checkbox', () => {
+ const { getByTestId } = render()
+ expect(getByTestId('resource-node-checkbox')).toBeInTheDocument()
+})
+
+it('renders expand/collapse button', () => {
+ const { getByTestId } = render()
+ expect(getByTestId('expand-collapse-button')).toBeInTheDocument()
+})
diff --git a/src/__tests__/ResourceTree.test.js b/src/__tests__/ResourceTree.test.js
index 3ba2524..8af3847 100644
--- a/src/__tests__/ResourceTree.test.js
+++ b/src/__tests__/ResourceTree.test.js
@@ -1,5 +1,35 @@
import React from 'react'
-import ReactDOM from 'react-dom'
import ResourceTree from '../containers/ResourceTree'
+import { render } from '@testing-library/react'
-it('renders the component on the DOM', () => {})
+const mockDispatch = jest.fn()
+
+const defaultProps = {
+ selected: false,
+ root: false,
+ label: 'Ima label',
+ dispatch: mockDispatch,
+ container: { foo: 'bar' }
+}
+
+it('renders without crashing', () => {
+ expect(render())
+})
+
+it('renders resource tree wrapper element', () => {
+ const { getByTestId } = render()
+ expect(getByTestId('resource-tree-wrapper')).toBeInTheDocument()
+})
+
+it('renders primary checkbox', () => {
+ const { getByTestId } = render()
+ expect(getByTestId('primary-checkbox')).toBeInTheDocument()
+})
+
+it('renders expand/collapse button', () => {
+ const { getByTestId } = render()
+ expect(getByTestId('expand-collapse-button')).toBeInTheDocument()
+})
+
+// Not really sure yet how to test and
+// < ResourceNode /> presence in this component
diff --git a/src/__tests__/SelectProvider.test.js b/src/__tests__/SelectProvider.test.js
index 37971b2..88fbad0 100644
--- a/src/__tests__/SelectProvider.test.js
+++ b/src/__tests__/SelectProvider.test.js
@@ -1,5 +1,25 @@
import React from 'react'
-import ReactDOM from 'react-dom'
import SelectProvider from '../containers/SelectProvider'
+import { render } from '@testing-library/react'
-it('renders the component on the DOM', () => {})
+const mockFn = jest.fn()
+
+const defaultProps = {
+ selectedProvider: { foo: 'bar' },
+ providers: { items: [], id: 'ABC123', name: 'Ima provider 1' },
+ handleChange: mockFn
+}
+
+it('renders without crashing', () => {
+ expect(render())
+})
+
+it('renders the select provider form control', () => {
+ const { getByTestId } = render()
+ expect(getByTestId('select-provider-wrapper')).toBeInTheDocument()
+})
+
+it('renders the select element', () => {
+ const { getByTestId } = render()
+ expect(getByTestId('select-provider')).toBeInTheDocument()
+})
diff --git a/src/__tests__/UploadForm.test.js b/src/__tests__/UploadForm.test.js
index 90c3f33..ac35d10 100644
--- a/src/__tests__/UploadForm.test.js
+++ b/src/__tests__/UploadForm.test.js
@@ -1,5 +1,41 @@
import React from 'react'
-import ReactDOM from 'react-dom'
import UploadForm from '../containers/UploadForm'
+import { render } from '@testing-library/react'
-it('renders the component on the DOM', () => {})
+const mockOnUpload = jest.fn()
+const mockDispatch = jest.fn()
+
+const defaultProps = {
+ selectedProvider: { foo: 'bar' },
+ providers: { items: [], id: 'ABC123', name: 'Ima provider 1' },
+ currentAuthToken: { foo: 'bar ' },
+ currentSession: {},
+ rootContainer: {},
+ currentUpload: {},
+ dispatch: mockDispatch,
+ onUpload: mockOnUpload
+}
+
+it('renders without crashing', () => {
+ expect(render())
+})
+
+it('renders the form', () => {
+ const { getByTestId } = render()
+ expect(getByTestId('upload-form')).toBeInTheDocument()
+})
+
+it('renders the Select Providers section', () => {
+ const { getByTestId } = render()
+ expect(getByTestId('select-provider-wrapper')).toBeInTheDocument()
+})
+
+it('renders the resource tree section', () => {
+ const { getByTestId } = render()
+ expect(getByTestId('resource-tree-wrapper')).toBeInTheDocument()
+})
+
+it('renders the submit button', () => {
+ const { getByTestId } = render()
+ expect(getByTestId('upload-submit-button')).toBeInTheDocument()
+})
diff --git a/src/__tests__/testing-helpers.js b/src/__tests__/testing-helpers.js
new file mode 100644
index 0000000..a526d46
--- /dev/null
+++ b/src/__tests__/testing-helpers.js
@@ -0,0 +1,21 @@
+import React from 'react'
+import { Provider } from 'react-redux'
+import { render } from '@testing-library/react'
+import reducer from '../reducers'
+import configureStore from '../configureStore'
+
+// this is a handy function that I normally make available for all my tests
+// that deal with connected components.
+// you can provide initialState for the entire store that the ui is rendered with
+export function renderWithRedux(
+ ui,
+ { initialState, store = configureStore(initialState) } = {}
+) {
+ return {
+ ...render({ui}),
+ // adding `store` to the returned utilities to allow us
+ // to reference it in our tests (just try to avoid using
+ // this to test implementation details).
+ store
+ }
+}
diff --git a/src/containers/AuthButton.js b/src/containers/AuthButton.js
index 5a772ca..0b94870 100644
--- a/src/containers/AuthButton.js
+++ b/src/containers/AuthButton.js
@@ -1,36 +1,37 @@
-import React from 'react';
-import PropTypes from 'prop-types';
+import React from 'react'
+import PropTypes from 'prop-types'
+import Button from '@material-ui/core/Button'
+import { makeStyles } from '@material-ui/core/styles'
-import Button from '@material-ui/core/Button';
-import { withStyles } from '@material-ui/core/styles';
-
-class AuthButton extends React.Component {
- render() {
- const textContent = this.props.disabled ? 'Authorized' : 'Sign In';
- return (
-
- );
+const useStyles = makeStyles({
+ root: {
+ alignSelf: 'center'
}
+})
+
+const AuthButton = ({ handleClick, authorizationUrl, disabled }) => {
+ const classes = useStyles
+ const textContent = disabled ? 'Authorized' : 'Sign In'
+
+ return (
+
+ )
}
AuthButton.propTypes = {
- classes: PropTypes.object.isRequired,
handleClick: PropTypes.func.isRequired,
authorizationUrl: PropTypes.string.isRequired,
disabled: PropTypes.bool
-};
-
-const styles = {
- root: {
- alignSelf: 'center'
- }
-};
+}
-export default withStyles(styles)(AuthButton);
+export default AuthButton
diff --git a/src/containers/ResourceNode.js b/src/containers/ResourceNode.js
index 13fa24e..143b853 100644
--- a/src/containers/ResourceNode.js
+++ b/src/containers/ResourceNode.js
@@ -1,6 +1,5 @@
import React from 'react'
import PropTypes from 'prop-types'
-
import Checkbox from '@material-ui/core/Checkbox'
import IconButton from '@material-ui/core/IconButton'
import InsertDriveFileIcon from '@material-ui/icons/InsertDriveFile'
@@ -35,6 +34,7 @@ class ResourceNode extends React.Component {
return (
-
+
diff --git a/src/containers/ResourceTree.js b/src/containers/ResourceTree.js
index fd5d5b6..7b1cf17 100644
--- a/src/containers/ResourceTree.js
+++ b/src/containers/ResourceTree.js
@@ -1,12 +1,10 @@
import React from 'react'
import PropTypes from 'prop-types'
-
import Checkbox from '@material-ui/core/Checkbox'
import FolderIcon from '@material-ui/icons/Folder'
import FolderOpenIcon from '@material-ui/icons/FolderOpen'
import IconButton from '@material-ui/core/IconButton'
import { withStyles } from '@material-ui/core/styles'
-
import {
getContainer,
selectContainerForUpload,
@@ -52,11 +50,15 @@ class ResourceTree extends React.Component {
render() {
return (
-
+
{!this.props.root && (
- {inputLabel}
-
-
- );
+const useStyles = makeStyles({
+ root: {
+ display: 'flex',
+ flexWrap: 'wrap'
}
+})
+
+const SelectProvider = ({ selectedProvider, providers, handleChange }) => {
+ const classes = useStyles()
+ const value = selectedProvider.id ? selectedProvider.id : ''
+ const inputLabel = providers.isRequesting
+ ? 'Loading providers...'
+ : 'Select a storage provider'
+
+ return (
+
+ {inputLabel}
+
+
+ )
}
SelectProvider.propTypes = {
- classes: PropTypes.object.isRequired,
selectedProvider: PropTypes.object.isRequired,
- providers: PropTypes.object.isRequired,
+ providers: PropTypes.shape({
+ items: PropTypes.array,
+ id: PropTypes.string,
+ name: PropTypes.string
+ }),
handleChange: PropTypes.func.isRequired
-};
-
-const styles = {
- root: {
- display: 'flex',
- flexWrap: 'wrap'
- }
-};
+}
-export default withStyles(styles)(SelectProvider);
+export default SelectProvider
diff --git a/src/containers/UploadForm.js b/src/containers/UploadForm.js
index 2aca335..f435524 100644
--- a/src/containers/UploadForm.js
+++ b/src/containers/UploadForm.js
@@ -1,17 +1,16 @@
-import React from 'react';
-import PropTypes from 'prop-types';
+import React from 'react'
+import PropTypes from 'prop-types'
-import './UploadForm.css';
+import './UploadForm.css'
-import Button from '@material-ui/core/Button';
-import Grid from '@material-ui/core/Grid';
-import Paper from '@material-ui/core/Paper';
-import Typography from '@material-ui/core/Typography';
-import { withStyles } from '@material-ui/core/styles';
+import Button from '@material-ui/core/Button'
+import Grid from '@material-ui/core/Grid'
+import Typography from '@material-ui/core/Typography'
+import { withStyles } from '@material-ui/core/styles'
-import SelectProvider from './SelectProvider';
-import AuthButton from './AuthButton';
-import ResourceTree from './ResourceTree';
+import SelectProvider from './SelectProvider'
+import AuthButton from './AuthButton'
+import ResourceTree from './ResourceTree'
import {
selectProvider,
updateProviders,
@@ -21,7 +20,7 @@ import {
authorize,
createAuthorization,
createUpload
-} from '../actions';
+} from '../actions'
class UploadForm extends React.Component {
// This should be refactored
@@ -30,26 +29,26 @@ class UploadForm extends React.Component {
currentSessionEmpty: true,
rootContainerEmpty: true,
currentUploadEmpty: true
- };
+ }
constructor(props) {
- super(props);
- this.handleChangeProvider = this.handleChangeProvider.bind(this);
- this.handleClickAuthButton = this.handleClickAuthButton.bind(this);
- this.handleAuthorize = this.handleAuthorize.bind(this);
+ super(props)
+ this.handleChangeProvider = this.handleChangeProvider.bind(this)
+ this.handleClickAuthButton = this.handleClickAuthButton.bind(this)
+ this.handleAuthorize = this.handleAuthorize.bind(this)
/** @todo Investigate why
- );
+ )
}
}
@@ -301,7 +301,7 @@ UploadForm.propTypes = {
dispatch: PropTypes.func.isRequired,
onUpload: PropTypes.func
-};
+}
const styles = {
root: {},
@@ -317,6 +317,6 @@ const styles = {
resourceTree: {
padding: '0.65rem 0.85rem'
}
-};
+}
-export default withStyles(styles)(UploadForm);
+export default withStyles(styles)(UploadForm)
diff --git a/src/setupTests.js b/src/setupTests.js
new file mode 100644
index 0000000..c44951a
--- /dev/null
+++ b/src/setupTests.js
@@ -0,0 +1 @@
+import '@testing-library/jest-dom'
diff --git a/yarn.lock b/yarn.lock
index 76b19cc..72e40b9 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -853,6 +853,13 @@
dependencies:
regenerator-runtime "^0.13.2"
+"@babel/runtime@^7.6.2", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.3":
+ version "7.8.4"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.8.4.tgz#d79f5a2040f7caa24d53e563aad49cbc05581308"
+ integrity sha512-neAp3zt80trRVBI1x0azq6c57aNBqYZH8KhMm3TaB7wEI5Q4A2SHfBHE8w9gOhI/lrqxtEbXZgQIrHP+wvSGwQ==
+ dependencies:
+ regenerator-runtime "^0.13.2"
+
"@babel/template@^7.1.0", "@babel/template@^7.4.0", "@babel/template@^7.4.4", "@babel/template@^7.6.0":
version "7.6.0"
resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.6.0.tgz#7f0159c7f5012230dad64cca42ec9bdb5c9536e6"
@@ -1089,6 +1096,16 @@
"@types/istanbul-reports" "^1.1.1"
"@types/yargs" "^13.0.0"
+"@jest/types@^25.1.0":
+ version "25.1.0"
+ resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.1.0.tgz#b26831916f0d7c381e11dbb5e103a72aed1b4395"
+ integrity sha512-VpOtt7tCrgvamWZh1reVsGADujKigBUFTi19mlRjqEGsE8qH4r3s+skY33dNdXOwyZIvuftZ5tqdF1IgsMejMA==
+ dependencies:
+ "@types/istanbul-lib-coverage" "^2.0.0"
+ "@types/istanbul-reports" "^1.1.1"
+ "@types/yargs" "^15.0.0"
+ chalk "^3.0.0"
+
"@material-ui/core@^4.4.2":
version "4.4.2"
resolved "https://registry.yarnpkg.com/@material-ui/core/-/core-4.4.2.tgz#66a9423e533833d2867827e6fdf526adbdceb7c0"
@@ -1181,6 +1198,11 @@
resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b"
integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==
+"@sheerun/mutationobserver-shim@^0.3.2":
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/@sheerun/mutationobserver-shim/-/mutationobserver-shim-0.3.2.tgz#8013f2af54a2b7d735f71560ff360d3a8176a87b"
+ integrity sha512-vTCdPp/T/Q3oSqwHmZ5Kpa9oI7iLtGl3RQaA/NyLHikvcrPxACkkKVr/XzkSPJWXHRhKGzVvb0urJsbMlRxi1Q==
+
"@svgr/babel-plugin-add-jsx-attribute@^4.2.0":
version "4.2.0"
resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz#dadcb6218503532d6884b210e7f3c502caaa44b1"
@@ -1284,6 +1306,43 @@
"@svgr/plugin-svgo" "^4.3.1"
loader-utils "^1.2.3"
+"@testing-library/dom@^6.11.0":
+ version "6.12.2"
+ resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-6.12.2.tgz#5d549acf43f2e0c23b2abfd4e36d65594c3b2741"
+ integrity sha512-KCnvHra5fV+wDxg3wJObGvZFxq7v1DJt829GNFLuRDjKxVNc/B5AdsylNF5PMHFbWMXDsHwM26d2NZcZO9KjbQ==
+ dependencies:
+ "@babel/runtime" "^7.6.2"
+ "@sheerun/mutationobserver-shim" "^0.3.2"
+ "@types/testing-library__dom" "^6.0.0"
+ aria-query "3.0.0"
+ pretty-format "^24.9.0"
+ wait-for-expect "^3.0.0"
+
+"@testing-library/jest-dom@^5.1.1":
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.1.1.tgz#e88a5c08f9b9f36b384f948a0532eae2abbc8204"
+ integrity sha512-7xnmBFcUmmUVAUhFiZ/u3CxFh1e46THAwra4SiiKNCW4By26RedCRwEk0rtleFPZG0wlTSNOKDvJjWYy93dp0w==
+ dependencies:
+ "@babel/runtime" "^7.8.3"
+ "@types/testing-library__jest-dom" "^5.0.0"
+ chalk "^3.0.0"
+ css "^2.2.4"
+ css.escape "^1.5.1"
+ jest-diff "^25.1.0"
+ jest-matcher-utils "^25.1.0"
+ lodash "^4.17.15"
+ pretty-format "^25.1.0"
+ redent "^3.0.0"
+
+"@testing-library/react@^9.4.0":
+ version "9.4.0"
+ resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-9.4.0.tgz#b021ac8cb987c8dc54c6841875f745bf9b2e88e5"
+ integrity sha512-XdhDWkI4GktUPsz0AYyeQ8M9qS/JFie06kcSnUVcpgOwFjAu9vhwR83qBl+lw9yZWkbECjL8Hd+n5hH6C0oWqg==
+ dependencies:
+ "@babel/runtime" "^7.7.6"
+ "@testing-library/dom" "^6.11.0"
+ "@types/testing-library__react" "^9.1.2"
+
"@types/babel__core@^7.1.0":
version "7.1.3"
resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.3.tgz#e441ea7df63cd080dfcd02ab199e6d16a735fc30"
@@ -1317,6 +1376,11 @@
dependencies:
"@babel/types" "^7.3.0"
+"@types/color-name@^1.1.1":
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0"
+ integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==
+
"@types/eslint-visitor-keys@^1.0.0":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d"
@@ -1342,6 +1406,14 @@
"@types/istanbul-lib-coverage" "*"
"@types/istanbul-lib-report" "*"
+"@types/jest@*":
+ version "25.1.2"
+ resolved "https://registry.yarnpkg.com/@types/jest/-/jest-25.1.2.tgz#1c4c8770c27906c7d8def5d2033df9dbd39f60da"
+ integrity sha512-EsPIgEsonlXmYV7GzUqcvORsSS9Gqxw/OvkGwHfAdpjduNRxMlhsav0O5Kb0zijc/eXSO/uW6SJt9nwull8AUQ==
+ dependencies:
+ jest-diff "^25.1.0"
+ pretty-format "^25.1.0"
+
"@types/json-schema@^7.0.3":
version "7.0.3"
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.3.tgz#bdfd69d61e464dcc81b25159c270d75a73c1a636"
@@ -1357,6 +1429,13 @@
resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8"
integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==
+"@types/react-dom@*":
+ version "16.9.5"
+ resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.9.5.tgz#5de610b04a35d07ffd8f44edad93a71032d9aaa7"
+ integrity sha512-BX6RQ8s9D+2/gDhxrj8OW+YD4R+8hj7FEM/OJHGNR0KipE1h1mSsf39YeyC81qafkq+N3rU3h3RFbLSwE5VqUg==
+ dependencies:
+ "@types/react" "*"
+
"@types/react-transition-group@^4.2.0":
version "4.2.2"
resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.2.2.tgz#8c851c4598a23a3a34173069fb4c5c9e41c02e3f"
@@ -1377,6 +1456,28 @@
resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e"
integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==
+"@types/testing-library__dom@*", "@types/testing-library__dom@^6.0.0":
+ version "6.12.1"
+ resolved "https://registry.yarnpkg.com/@types/testing-library__dom/-/testing-library__dom-6.12.1.tgz#37af28fae051f9e3feed5684535b1540c97ae28b"
+ integrity sha512-cgqnEjxKk31tQt29j4baSWaZPNjQf3bHalj2gcHQTpW5SuHRal76gOpF0vypeEo6o+sS5inOvvNdzLY0B3FB2A==
+ dependencies:
+ pretty-format "^24.3.0"
+
+"@types/testing-library__jest-dom@^5.0.0":
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.0.1.tgz#cc7f384535a3d9597e27f58d38a795f5c137cc53"
+ integrity sha512-GiPXQBVF9O4DG9cssD2d266vozBJvC5Tnv6aeH5ujgYJgys1DYm9AFCz7YC+STR5ksGxq3zCt+yP8T1wbk2DFg==
+ dependencies:
+ "@types/jest" "*"
+
+"@types/testing-library__react@^9.1.2":
+ version "9.1.2"
+ resolved "https://registry.yarnpkg.com/@types/testing-library__react/-/testing-library__react-9.1.2.tgz#e33af9124c60a010fc03a34eff8f8a34a75c4351"
+ integrity sha512-CYaMqrswQ+cJACy268jsLAw355DZtPZGt3Jwmmotlcu8O/tkoXBI6AeZ84oZBJsIsesozPKzWzmv/0TIU+1E9Q==
+ dependencies:
+ "@types/react-dom" "*"
+ "@types/testing-library__dom" "*"
+
"@types/yargs-parser@*":
version "13.1.0"
resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-13.1.0.tgz#c563aa192f39350a1d18da36c5a8da382bbd8228"
@@ -1389,6 +1490,13 @@
dependencies:
"@types/yargs-parser" "*"
+"@types/yargs@^15.0.0":
+ version "15.0.3"
+ resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.3.tgz#41453a0bc7ab393e995d1f5451455638edbd2baf"
+ integrity sha512-XCMQRK6kfpNBixHLyHUsGmXrpEmFFxzMrcnSXFMziHd8CoNJo8l16FkHyQq4x+xbM7E2XL83/O78OD8u+iZTdQ==
+ dependencies:
+ "@types/yargs-parser" "*"
+
"@typescript-eslint/eslint-plugin@1.13.0":
version "1.13.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-1.13.0.tgz#22fed9b16ddfeb402fd7bcde56307820f6ebc49f"
@@ -1710,6 +1818,11 @@ ansi-regex@^4.0.0, ansi-regex@^4.1.0:
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997"
integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==
+ansi-regex@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75"
+ integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==
+
ansi-styles@^2.2.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
@@ -1722,6 +1835,14 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1:
dependencies:
color-convert "^1.9.0"
+ansi-styles@^4.0.0, ansi-styles@^4.1.0:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359"
+ integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==
+ dependencies:
+ "@types/color-name" "^1.1.1"
+ color-convert "^2.0.1"
+
anymatch@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
@@ -1750,7 +1871,7 @@ argparse@^1.0.7:
dependencies:
sprintf-js "~1.0.2"
-aria-query@^3.0.0:
+aria-query@3.0.0, aria-query@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-3.0.0.tgz#65b3fcc1ca1155a8c9ae64d6eee297f15d5133cc"
integrity sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=
@@ -2500,6 +2621,14 @@ chalk@^1.1.3:
strip-ansi "^3.0.0"
supports-color "^2.0.0"
+chalk@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4"
+ integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
chardet@^0.7.0:
version "0.7.0"
resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
@@ -2655,12 +2784,19 @@ color-convert@^1.9.0, color-convert@^1.9.1:
dependencies:
color-name "1.1.3"
+color-convert@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
+ integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
+ dependencies:
+ color-name "~1.1.4"
+
color-name@1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
-color-name@^1.0.0:
+color-name@^1.0.0, color-name@~1.1.4:
version "1.1.4"
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
@@ -3064,7 +3200,12 @@ css-what@2.1, css-what@^2.1.2:
resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2"
integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==
-css@^2.0.0:
+css.escape@^1.5.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb"
+ integrity sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s=
+
+css@^2.0.0, css@^2.2.4:
version "2.2.4"
resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929"
integrity sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==
@@ -3395,6 +3536,11 @@ diff-sequences@^24.9.0:
resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5"
integrity sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==
+diff-sequences@^25.1.0:
+ version "25.1.0"
+ resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-25.1.0.tgz#fd29a46f1c913fd66c22645dc75bffbe43051f32"
+ integrity sha512-nFIfVk5B/NStCsJ+zaPO4vYuLjlzQ6uFvPxzYyHlejNZ/UGa7G/n7peOXVrVNvRuyfstt+mZQYGpjxg9Z6N8Kw==
+
diffie-hellman@^5.0.0:
version "5.0.3"
resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
@@ -4644,6 +4790,11 @@ has-flag@^3.0.0:
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
+has-flag@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
+ integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+
has-symbols@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44"
@@ -4999,6 +5150,11 @@ imurmurhash@^0.1.4:
resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
+indent-string@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251"
+ integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==
+
indexes-of@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607"
@@ -5524,6 +5680,16 @@ jest-diff@^24.9.0:
jest-get-type "^24.9.0"
pretty-format "^24.9.0"
+jest-diff@^25.1.0:
+ version "25.1.0"
+ resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-25.1.0.tgz#58b827e63edea1bc80c1de952b80cec9ac50e1ad"
+ integrity sha512-nepXgajT+h017APJTreSieh4zCqnSHEJ1iT8HDlewu630lSJ4Kjjr9KNzm+kzGwwcpsDE6Snx1GJGzzsefaEHw==
+ dependencies:
+ chalk "^3.0.0"
+ diff-sequences "^25.1.0"
+ jest-get-type "^25.1.0"
+ pretty-format "^25.1.0"
+
jest-docblock@^24.3.0:
version "24.9.0"
resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-24.9.0.tgz#7970201802ba560e1c4092cc25cbedf5af5a8ce2"
@@ -5579,6 +5745,11 @@ jest-get-type@^24.9.0:
resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.9.0.tgz#1684a0c8a50f2e4901b6644ae861f579eed2ef0e"
integrity sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==
+jest-get-type@^25.1.0:
+ version "25.1.0"
+ resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-25.1.0.tgz#1cfe5fc34f148dc3a8a3b7275f6b9ce9e2e8a876"
+ integrity sha512-yWkBnT+5tMr8ANB6V+OjmrIJufHtCAqI5ic2H40v+tRqxDmE0PGnIiTyvRWFOMtmVHYpwRqyazDbTnhpjsGvLw==
+
jest-haste-map@^24.9.0:
version "24.9.0"
resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.9.0.tgz#b38a5d64274934e21fa417ae9a9fbeb77ceaac7d"
@@ -5638,6 +5809,16 @@ jest-matcher-utils@^24.9.0:
jest-get-type "^24.9.0"
pretty-format "^24.9.0"
+jest-matcher-utils@^25.1.0:
+ version "25.1.0"
+ resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-25.1.0.tgz#fa5996c45c7193a3c24e73066fc14acdee020220"
+ integrity sha512-KGOAFcSFbclXIFE7bS4C53iYobKI20ZWleAdAFun4W1Wz1Kkej8Ng6RRbhL8leaEvIOjGXhGf/a1JjO8bkxIWQ==
+ dependencies:
+ chalk "^3.0.0"
+ jest-diff "^25.1.0"
+ jest-get-type "^25.1.0"
+ pretty-format "^25.1.0"
+
jest-message-util@^24.9.0:
version "24.9.0"
resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-24.9.0.tgz#527f54a1e380f5e202a8d1149b0ec872f43119e3"
@@ -6494,6 +6675,11 @@ mimic-fn@^2.0.0:
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
+min-indent@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.0.tgz#cfc45c37e9ec0d8f0a0ec3dd4ef7f7c3abe39256"
+ integrity sha1-z8RcN+nsDY8KDsPdTvf3w6vjklY=
+
mini-css-extract-plugin@0.5.0:
version "0.5.0"
resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.5.0.tgz#ac0059b02b9692515a637115b0cc9fed3a35c7b0"
@@ -8118,7 +8304,7 @@ pretty-error@^2.1.1:
renderkid "^2.0.1"
utila "~0.4"
-pretty-format@^24.9.0:
+pretty-format@^24.3.0, pretty-format@^24.9.0:
version "24.9.0"
resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9"
integrity sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==
@@ -8128,6 +8314,16 @@ pretty-format@^24.9.0:
ansi-styles "^3.2.0"
react-is "^16.8.4"
+pretty-format@^25.1.0:
+ version "25.1.0"
+ resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.1.0.tgz#ed869bdaec1356fc5ae45de045e2c8ec7b07b0c8"
+ integrity sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ==
+ dependencies:
+ "@jest/types" "^25.1.0"
+ ansi-regex "^5.0.0"
+ ansi-styles "^4.0.0"
+ react-is "^16.12.0"
+
private@^0.1.6:
version "0.1.8"
resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
@@ -8389,6 +8585,11 @@ react-error-overlay@^6.0.1:
resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.1.tgz#b8d3cf9bb991c02883225c48044cb3ee20413e0f"
integrity sha512-V9yoTr6MeZXPPd4nV/05eCBvGH9cGzc52FN8fs0O0TVQ3HYYf1n7EgZVtHbldRq5xU9zEzoXIITjYNIfxDDdUw==
+react-is@^16.12.0:
+ version "16.12.0"
+ resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.12.0.tgz#2cc0fe0fba742d97fd527c42a13bec4eeb06241c"
+ integrity sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==
+
react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.8.6, react-is@^16.9.0:
version "16.9.0"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.9.0.tgz#21ca9561399aad0ff1a7701c01683e8ca981edcb"
@@ -8585,6 +8786,14 @@ recursive-readdir@2.2.2:
dependencies:
minimatch "3.0.4"
+redent@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f"
+ integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==
+ dependencies:
+ indent-string "^4.0.0"
+ strip-indent "^3.0.0"
+
redux-bees@^0.1.11:
version "0.1.11"
resolved "https://registry.yarnpkg.com/redux-bees/-/redux-bees-0.1.11.tgz#4507851c1b06e0047685601d95f5c7f54000b348"
@@ -9565,6 +9774,13 @@ strip-eof@^1.0.0:
resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=
+strip-indent@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001"
+ integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==
+ dependencies:
+ min-indent "^1.0.0"
+
strip-json-comments@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7"
@@ -9611,6 +9827,13 @@ supports-color@^6.1.0:
dependencies:
has-flag "^3.0.0"
+supports-color@^7.1.0:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1"
+ integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==
+ dependencies:
+ has-flag "^4.0.0"
+
svg-parser@^2.0.0:
version "2.0.2"
resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.2.tgz#d134cc396fa2681dc64f518330784e98bd801ec8"
@@ -10144,6 +10367,11 @@ w3c-xmlserializer@^1.1.2:
webidl-conversions "^4.0.2"
xml-name-validator "^3.0.0"
+wait-for-expect@^3.0.0:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/wait-for-expect/-/wait-for-expect-3.0.2.tgz#d2f14b2f7b778c9b82144109c8fa89ceaadaa463"
+ integrity sha512-cfS1+DZxuav1aBYbaO/kE06EOS8yRw7qOFoD3XtjTkYvCvh3zUvNST8DXK/nPaeqIzIv3P3kL3lRJn8iwOiSag==
+
walker@^1.0.7, walker@~1.0.5:
version "1.0.7"
resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb"