diff --git a/__tests__/components/DataListToolbar.test.jsx b/__tests__/components/DataListToolbar.test.jsx index 22b91e6530..be5e028d37 100644 --- a/__tests__/components/DataListToolbar.test.jsx +++ b/__tests__/components/DataListToolbar.test.jsx @@ -4,8 +4,6 @@ import DataListToolbar from '../../src/components/DataListToolbar'; describe('', () => { const columns = [{ name: 'Name', key: 'name', isSortable: true }]; - const noop = () => {}; - let toolbar; afterEach(() => { diff --git a/__tests__/components/Tooltip.test.jsx b/__tests__/components/Tooltip.test.jsx new file mode 100644 index 0000000000..7f09c5eaec --- /dev/null +++ b/__tests__/components/Tooltip.test.jsx @@ -0,0 +1,55 @@ +import React from 'react'; +import { mount } from 'enzyme'; +import Tooltip from '../../src/components/Tooltip'; + +describe('', () => { + let elem; + let content; + let mouseOverHandler; + let mouseOutHandler; + + test('initially renders without crashing', () => { + elem = mount(); + expect(elem.length).toBe(1); + }); + + test('shows/hides with mouse over and leave', () => { + elem = mount(); + mouseOverHandler = elem.find('.mouseOverHandler'); + mouseOutHandler = elem.find('.mouseOutHandler'); + expect(elem.state().isDisplayed).toBe(false); + elem.update(); + content = elem.find('.pf-c-tooltip__content'); + expect(content.length).toBe(0); + mouseOverHandler.props().onMouseOver(); + expect(elem.state().isDisplayed).toBe(true); + elem.update(); + content = elem.find('.pf-c-tooltip__content'); + expect(content.length).toBe(1); + mouseOutHandler.props().onMouseLeave(); + expect(elem.state().isDisplayed).toBe(false); + elem.update(); + content = elem.find('.pf-c-tooltip__content'); + expect(content.length).toBe(0); + }); + + test('shows/hides with focus and blur', () => { + elem = mount(); + mouseOverHandler = elem.find('.mouseOverHandler'); + mouseOutHandler = elem.find('.mouseOutHandler'); + expect(elem.state().isDisplayed).toBe(false); + elem.update(); + content = elem.find('.pf-c-tooltip__content'); + expect(content.length).toBe(0); + mouseOverHandler.props().onFocus(); + expect(elem.state().isDisplayed).toBe(true); + elem.update(); + content = elem.find('.pf-c-tooltip__content'); + expect(content.length).toBe(1); + mouseOutHandler.props().onBlur(); + expect(elem.state().isDisplayed).toBe(false); + elem.update(); + content = elem.find('.pf-c-tooltip__content'); + expect(content.length).toBe(0); + }); +}); diff --git a/__tests__/pages/Organizations.jsx b/__tests__/pages/Organizations.jsx deleted file mode 100644 index fdbc219cc8..0000000000 --- a/__tests__/pages/Organizations.jsx +++ /dev/null @@ -1,90 +0,0 @@ -import React from 'react'; -import { HashRouter } from 'react-router-dom'; - -import { mount } from 'enzyme'; - -import api from '../../src/api'; -import { API_ORGANIZATIONS } from '../../src/endpoints'; -import Organizations from '../../src/pages/Organizations'; - -describe('', () => { - let pageWrapper; - - const results = [ - { - id: 1, - name: 'org 1', - summary_fields: { - related_field_counts: { - users: 1, - teams: 1, - admins: 1 - } - } - }, - { - id: 2, - name: 'org 2', - summary_fields: { - related_field_counts: { - users: 1, - teams: 1, - admins: 1 - } - } - }, - { - id: 3, - name: 'org 3', - summary_fields: { - related_field_counts: { - users: 1, - teams: 1, - admins: 1 - } - } - }, - ]; - const count = results.length; - const response = { data: { count, results } }; - - beforeEach(() => { - api.get = jest.fn().mockImplementation(() => Promise.resolve(response)); - pageWrapper = mount(); - }); - - afterEach(() => { - pageWrapper.unmount(); - }); - - test('it renders expected content', () => { - const pageSections = pageWrapper.find('PageSection'); - const title = pageWrapper.find('Title'); - - expect(pageWrapper.length).toBe(1); - expect(pageSections.length).toBe(2); - expect(title.length).toBe(1); - expect(title.props().size).toBe('2xl'); - pageSections.forEach(section => { - expect(section.props().variant).toBeDefined(); - }); - expect(pageWrapper.find('ul').length).toBe(1); - expect(pageWrapper.find('ul li').length).toBe(0); - // will render all list items on update - pageWrapper.update(); - expect(pageWrapper.find('ul li').length).toBe(count); - }); - - test('API Organization endpoint is valid', () => { - expect(API_ORGANIZATIONS).toBeDefined(); - }); - - test('it displays a tooltip on delete hover', () => { - const tooltip = '.pf-c-tooltip__content'; - const deleteButton = 'button[aria-label="Delete"]'; - - expect(pageWrapper.find(tooltip).length).toBe(0); - pageWrapper.find(deleteButton).simulate('mouseover'); - expect(pageWrapper.find(tooltip).length).toBe(1); - }); -}); diff --git a/__tests__/pages/Organizations/components/OrganizationBreadcrumb.test.jsx b/__tests__/pages/Organizations/components/OrganizationBreadcrumb.test.jsx new file mode 100644 index 0000000000..bbb222555f --- /dev/null +++ b/__tests__/pages/Organizations/components/OrganizationBreadcrumb.test.jsx @@ -0,0 +1,18 @@ +import React from 'react'; +import { mount } from 'enzyme'; +import { MemoryRouter } from 'react-router-dom'; +import OrganizationBreadcrumb from '../../../../src/pages/Organizations/components/OrganizationBreadcrumb'; + +describe('', () => { + test('initially renders succesfully', () => { + mount( + + + + ); + }); +}); diff --git a/__tests__/pages/Organizations/components/OrganizationDetail.test.jsx b/__tests__/pages/Organizations/components/OrganizationDetail.test.jsx new file mode 100644 index 0000000000..a160ad8773 --- /dev/null +++ b/__tests__/pages/Organizations/components/OrganizationDetail.test.jsx @@ -0,0 +1,17 @@ +import React from 'react'; +import { mount } from 'enzyme'; +import { MemoryRouter } from 'react-router-dom'; +import OrganizationDetail from '../../../../src/pages/Organizations/components/OrganizationDetail'; + +describe('', () => { + test('initially renders succesfully', () => { + mount( + + + + ); + }); +}); diff --git a/__tests__/pages/Organizations/components/OrganizationEdit.test.jsx b/__tests__/pages/Organizations/components/OrganizationEdit.test.jsx new file mode 100644 index 0000000000..6a99eb2d84 --- /dev/null +++ b/__tests__/pages/Organizations/components/OrganizationEdit.test.jsx @@ -0,0 +1,16 @@ +import React from 'react'; +import { mount } from 'enzyme'; +import { MemoryRouter } from 'react-router-dom'; +import OrganizationEdit from '../../../../src/pages/Organizations/components/OrganizationEdit'; + +describe('', () => { + test('initially renders succesfully', () => { + mount( + + + + ); + }); +}); diff --git a/__tests__/pages/Organizations/components/OrganizationListItem.test.jsx b/__tests__/pages/Organizations/components/OrganizationListItem.test.jsx new file mode 100644 index 0000000000..aab249b197 --- /dev/null +++ b/__tests__/pages/Organizations/components/OrganizationListItem.test.jsx @@ -0,0 +1,14 @@ +import React from 'react'; +import { mount } from 'enzyme'; +import { MemoryRouter } from 'react-router-dom'; +import OrganizationListItem from '../../../../src/pages/Organizations/components/OrganizationListItem'; + +describe('', () => { + test('initially renders succesfully', () => { + mount( + + + + ); + }); +}); diff --git a/__tests__/pages/Organizations/index.test.jsx b/__tests__/pages/Organizations/index.test.jsx new file mode 100644 index 0000000000..c9fc5359ab --- /dev/null +++ b/__tests__/pages/Organizations/index.test.jsx @@ -0,0 +1,17 @@ +import React from 'react'; +import { MemoryRouter } from 'react-router-dom'; +import { mount } from 'enzyme'; +import Organizations from '../../../src/pages/Organizations/index'; + +describe('', () => { + test('initially renders succesfully', () => { + mount( + + + + ); + }); +}); diff --git a/__tests__/pages/Organizations/utils.test.jsx b/__tests__/pages/Organizations/utils.test.jsx new file mode 100644 index 0000000000..4b92cae0c1 --- /dev/null +++ b/__tests__/pages/Organizations/utils.test.jsx @@ -0,0 +1,13 @@ +import getTabName from '../../../src/pages/Organizations/utils'; + +describe('getTabName', () => { + test('returns tab name', () => { + expect(getTabName('details')).toBe('Details'); + expect(getTabName('users')).toBe('Users'); + expect(getTabName('teams')).toBe('Teams'); + expect(getTabName('admins')).toBe('Admins'); + expect(getTabName('notifications')).toBe('Notifications'); + expect(getTabName('unknown')).toBe(''); + expect(getTabName()).toBe(''); + }); +}); diff --git a/__tests__/pages/Organizations/views/Organization.add.test.jsx b/__tests__/pages/Organizations/views/Organization.add.test.jsx new file mode 100644 index 0000000000..c8822cfc38 --- /dev/null +++ b/__tests__/pages/Organizations/views/Organization.add.test.jsx @@ -0,0 +1,14 @@ +import React from 'react'; +import { mount } from 'enzyme'; +import OrganizationAdd from '../../../../src/pages/Organizations/views/Organization.add'; + +describe('', () => { + test('initially renders succesfully', () => { + mount( + + ); + }); +}); diff --git a/__tests__/pages/Organizations/views/Organization.view.test.jsx b/__tests__/pages/Organizations/views/Organization.view.test.jsx new file mode 100644 index 0000000000..c5dff0e2ef --- /dev/null +++ b/__tests__/pages/Organizations/views/Organization.view.test.jsx @@ -0,0 +1,17 @@ +import React from 'react'; +import { mount } from 'enzyme'; +import { MemoryRouter } from 'react-router-dom'; +import OrganizationView from '../../../../src/pages/Organizations/views/Organization.view'; + +describe('', () => { + test('initially renders succesfully', () => { + mount( + + + + ); + }); +}); diff --git a/__tests__/pages/Organizations/views/Organizations.list.test.jsx b/__tests__/pages/Organizations/views/Organizations.list.test.jsx new file mode 100644 index 0000000000..e26717d554 --- /dev/null +++ b/__tests__/pages/Organizations/views/Organizations.list.test.jsx @@ -0,0 +1,17 @@ +import React from 'react'; +import { mount } from 'enzyme'; +import { MemoryRouter } from 'react-router-dom'; +import OrganizationsList from '../../../../src/pages/Organizations/views/Organizations.list'; + +describe('', () => { + test('initially renders succesfully', () => { + mount( + + + + ); + }); +}); diff --git a/package.json b/package.json index a60cb4f397..19dad2c599 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "main": "index.jsx", "scripts": { "start": "webpack-dev-server --config ./webpack.config.js --mode development", - "test": "jest --watchAll --coverage", + "test": "jest --watch --coverage", "lint": "./node_modules/eslint/bin/eslint.js src/**/*.js src/**/*.jsx" }, "keywords": [], diff --git a/src/components/DataListToolbar/DataListToolbar.jsx b/src/components/DataListToolbar/DataListToolbar.jsx index a3fbb80d92..ba7ca9edc1 100644 --- a/src/components/DataListToolbar/DataListToolbar.jsx +++ b/src/components/DataListToolbar/DataListToolbar.jsx @@ -6,8 +6,6 @@ import { DropdownPosition, DropdownToggle, DropdownItem, - FormGroup, - KebabToggle, Level, LevelItem, TextInput, @@ -24,11 +22,14 @@ import { SortNumericUpIcon, TrashAltIcon, } from '@patternfly/react-icons'; +import { + Link +} from 'react-router-dom'; import Tooltip from '../Tooltip'; class DataListToolbar extends React.Component { - constructor(props) { + constructor (props) { super(props); const { sortedColumnKey } = this.props; @@ -72,15 +73,7 @@ class DataListToolbar extends React.Component { this.setState({ isSearchDropdownOpen: false, searchKey: key }); }; - onActionToggle = isActionDropdownOpen => { - this.setState({ isActionDropdownOpen }); - }; - - onActionSelect = ({ target }) => { - this.setState({ isActionDropdownOpen: false }); - }; - - render() { + render () { const { up } = DropdownPosition; const { columns, @@ -90,9 +83,10 @@ class DataListToolbar extends React.Component { onSort, sortedColumnKey, sortOrder, + addUrl } = this.props; const { - isActionDropdownOpen, + // isActionDropdownOpen, isSearchDropdownOpen, isSortDropdownOpen, searchKey, @@ -107,19 +101,29 @@ class DataListToolbar extends React.Component { .filter(({ key }) => key === sortedColumnKey); const sortedColumnName = sortedColumn.name; const isSortNumeric = sortedColumn.isNumeric; + const displayedSortIcon = () => { + let icon; + if (sortOrder === 'ascending') { + icon = isSortNumeric ? () : (); + } else { + icon = isSortNumeric ? () : (); + } + return icon; + }; return (
- + + id="select-all" + /> @@ -132,10 +136,12 @@ class DataListToolbar extends React.Component { isOpen={isSearchDropdownOpen} toggle={( + onToggle={this.onSearchDropdownToggle} + > { searchColumnName } - )}> + )} + > {columns.filter(({ key }) => key !== searchKey).map(({ key, name }) => ( { name } @@ -146,12 +152,14 @@ class DataListToolbar extends React.Component { type="search" aria-label="search text input" value={searchValue} - onChange={this.handleSearchInputChange}/> + onChange={this.handleSearchInputChange} + />