diff --git a/src/components/Router.jsx b/src/components/Router.jsx index b6ea30f..cdb74c8 100644 --- a/src/components/Router.jsx +++ b/src/components/Router.jsx @@ -24,6 +24,12 @@ export default function Router() { }) } + let homeProps = { + teamUrl: config.api + '/team/', + userUrl: config.api + '/user/', + cb: teamCallback + } + let userIdCallback = (el, teams) => { setMemberProps({ url: config.api + '/user/' + el, @@ -34,7 +40,7 @@ export default function Router() { return ( - } /> + } /> } /> diff --git a/src/views/Home.jsx b/src/views/Home.jsx index 2e76295..ccd39f6 100644 --- a/src/views/Home.jsx +++ b/src/views/Home.jsx @@ -2,17 +2,14 @@ import React, { useState, useEffect } from 'react' import history from '../history.js' import axios from 'axios' -import config from '../config.json' import TeamList from '../components/TeamList.jsx' import FilterForm from '../components/FilterForm.jsx' import './Home.scss' export default function Home({ props }) { // MARK: State - let [loading, setLoading] = useState(true) - let [loadingUsers, setLoadingUsers] = useState(true) - let [teams, setTeams] = useState([]) - let [users, setUsers] = useState([]) + let [teams, setTeams] = useState(null) + let [users, setUsers] = useState(null) let [filteredTeams, setFilteredTeams] = useState([]) // MARK: Effects @@ -20,51 +17,43 @@ export default function Home({ props }) { // MARK: - Load teams useEffect(() => { let fetchData = async () => { - setLoading(true) try { - let result = await axios(config.api + '/team/') + let result = await axios.get(props.teamUrl) if (result.data) { setTeams(result.data) setFilteredTeams(result.data) } - setLoading(false) } catch (err) { - setLoading(false) + console.log('Error loading users', err) } } fetchData() - }, []) + }, [props]) // MARK: - Load users useEffect(() => { let fetchData = async () => { - setLoadingUsers(true) try { - let result = await axios(config.api + '/user/') + let result = await axios.get(props.userUrl) if (result.data) { setUsers(result.data) } - setLoadingUsers(false) } catch (err) { - setLoadingUsers(false) + console.log('Error loading teams', err) } } fetchData() - }, []) + }, [props]) // MARK: Callbacks let selectTeam = selectedTeam => { - props(selectedTeam, users, teams) + props.cb(selectedTeam, users, teams) history.push('/team') } - let selectUser = selectedUser => { - console.log('Selected user ' + selectedUser) - } - let filterCallback = e => { let filtered = teams.filter(team => { return team.name.toUpperCase().includes(e.target.value.toUpperCase()) @@ -73,20 +62,24 @@ export default function Home({ props }) { setFilteredTeams(filtered) } + // + // MARK: Return return (
-
-

Tempo teams

-
- - - - {loading || loadingUsers ? ( -
Loading...
+ {users === null || teams === null ? ( +
Loading...
) : ( teams !== undefined && ( - +
+
+

Tempo teams

+
+ + + + +
) )}
diff --git a/src/views/Home.test.js b/src/views/Home.test.js new file mode 100644 index 0000000..e8d4847 --- /dev/null +++ b/src/views/Home.test.js @@ -0,0 +1,83 @@ +import React from 'react' +import { fireEvent, render, waitForElement } from '@testing-library/react' +import '@testing-library/jest-dom/extend-expect' +import '@testing-library/react/cleanup-after-each' +import axiosMock from 'axios' +import Home from './Home' + +describe('A Home page', () => { + it('should render without crashing', () => { + const { getByTestId } = render() + + expect(getByTestId('loading')).toHaveTextContent('Loading...') + }) + + it('should fetch data and display teams', async () => { + let callData = [ + { name: 'Mock team 1', id: 1 }, + { name: 'Mock team 2', id: 2 }, + { name: 'Mock team 3', id: 3 }, + { name: 'Mock team 4', id: 4 }, + { name: 'Mock team 5', id: 5 } + ] + + axiosMock.get.mockResolvedValueOnce({ data: callData }) + + const mockProps = { + selectTeam: 'testing' + } + + const { getByTestId, getByText } = render() + const resolved = await waitForElement(() => getByTestId('resolved')) + + expect(resolved).toHaveTextContent('Tempo teams') + expect(getByText(callData[2].name)).toBeInTheDocument() + }) + + it('should display correct filtered results', async () => { + let callData = [ + { name: 'Mock team 1', id: 1 }, + { name: 'Mock team 2', id: 2 }, + { name: 'Mock team 3', id: 3 }, + { name: 'Mock team 4', id: 4 }, + { name: 'Mock team 5', id: 5 } + ] + + axiosMock.get.mockResolvedValueOnce({ data: callData }) + + const mockProps = { + selectTeam: 'testing' + } + + const { getByPlaceholderText, getByText } = render() + const resolved = await waitForElement(() => getByPlaceholderText('Filter')) + + fireEvent.change(resolved, { target: { value: '2' } }) + expect(getByText(callData[1].name)).toBeInTheDocument() + }) + + it('should not display filtered out results', async () => { + let callData = [ + { name: 'Mock team 1', id: 1 }, + { name: 'Mock team 2', id: 2 }, + { name: 'Mock team 3', id: 3 }, + { name: 'Mock team 4', id: 4 }, + { name: 'Mock team 5', id: 5 } + ] + + axiosMock.get.mockResolvedValueOnce({ data: callData }) + + const mockProps = { + selectTeam: 'testing' + } + + const { getByPlaceholderText, getByTestId } = render() + const resolved = await waitForElement(() => getByPlaceholderText('Filter')) + + fireEvent.change(resolved, { target: { value: '2' } }) + expect(getByTestId('content')).not.toHaveTextContent(callData[0].name) + expect(getByTestId('content')).not.toHaveTextContent(callData[2].name) + expect(getByTestId('content')).not.toHaveTextContent(callData[3].name) + expect(getByTestId('content')).not.toHaveTextContent(callData[4].name) + }) +}) diff --git a/src/views/Team.test.js b/src/views/Team.test.js index 4daa64c..6b8270f 100644 --- a/src/views/Team.test.js +++ b/src/views/Team.test.js @@ -27,7 +27,6 @@ describe('A team page', () => { } const { getByTestId, getByText } = render() - const resolvedLead = await waitForElement(() => getByTestId('resolved-lead')) expect(resolvedLead).toHaveTextContent(mockProps.users[0].name)