Added tests for filter input field in Home
This commit is contained in:
parent
795466f7ca
commit
f64f01afa7
4 changed files with 112 additions and 31 deletions
|
@ -24,6 +24,12 @@ export default function Router() {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let homeProps = {
|
||||||
|
teamUrl: config.api + '/team/',
|
||||||
|
userUrl: config.api + '/user/',
|
||||||
|
cb: teamCallback
|
||||||
|
}
|
||||||
|
|
||||||
let userIdCallback = (el, teams) => {
|
let userIdCallback = (el, teams) => {
|
||||||
setMemberProps({
|
setMemberProps({
|
||||||
url: config.api + '/user/' + el,
|
url: config.api + '/user/' + el,
|
||||||
|
@ -34,7 +40,7 @@ export default function Router() {
|
||||||
return (
|
return (
|
||||||
<ReactRouter history={history}>
|
<ReactRouter history={history}>
|
||||||
<Switch>
|
<Switch>
|
||||||
<Route exact path="/" render={() => <Home props={teamCallback} />} />
|
<Route exact path="/" render={() => <Home props={homeProps} />} />
|
||||||
|
|
||||||
<Route exact path="/team" render={() => <Team props={teamProps} />} />
|
<Route exact path="/team" render={() => <Team props={teamProps} />} />
|
||||||
|
|
||||||
|
|
|
@ -2,17 +2,14 @@
|
||||||
import React, { useState, useEffect } from 'react'
|
import React, { useState, useEffect } from 'react'
|
||||||
import history from '../history.js'
|
import history from '../history.js'
|
||||||
import axios from 'axios'
|
import axios from 'axios'
|
||||||
import config from '../config.json'
|
|
||||||
import TeamList from '../components/TeamList.jsx'
|
import TeamList from '../components/TeamList.jsx'
|
||||||
import FilterForm from '../components/FilterForm.jsx'
|
import FilterForm from '../components/FilterForm.jsx'
|
||||||
import './Home.scss'
|
import './Home.scss'
|
||||||
|
|
||||||
export default function Home({ props }) {
|
export default function Home({ props }) {
|
||||||
// MARK: State
|
// MARK: State
|
||||||
let [loading, setLoading] = useState(true)
|
let [teams, setTeams] = useState(null)
|
||||||
let [loadingUsers, setLoadingUsers] = useState(true)
|
let [users, setUsers] = useState(null)
|
||||||
let [teams, setTeams] = useState([])
|
|
||||||
let [users, setUsers] = useState([])
|
|
||||||
let [filteredTeams, setFilteredTeams] = useState([])
|
let [filteredTeams, setFilteredTeams] = useState([])
|
||||||
|
|
||||||
// MARK: Effects
|
// MARK: Effects
|
||||||
|
@ -20,51 +17,43 @@ export default function Home({ props }) {
|
||||||
// MARK: - Load teams
|
// MARK: - Load teams
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
let fetchData = async () => {
|
let fetchData = async () => {
|
||||||
setLoading(true)
|
|
||||||
try {
|
try {
|
||||||
let result = await axios(config.api + '/team/')
|
let result = await axios.get(props.teamUrl)
|
||||||
if (result.data) {
|
if (result.data) {
|
||||||
setTeams(result.data)
|
setTeams(result.data)
|
||||||
setFilteredTeams(result.data)
|
setFilteredTeams(result.data)
|
||||||
}
|
}
|
||||||
setLoading(false)
|
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
setLoading(false)
|
console.log('Error loading users', err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fetchData()
|
fetchData()
|
||||||
}, [])
|
}, [props])
|
||||||
|
|
||||||
// MARK: - Load users
|
// MARK: - Load users
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
let fetchData = async () => {
|
let fetchData = async () => {
|
||||||
setLoadingUsers(true)
|
|
||||||
try {
|
try {
|
||||||
let result = await axios(config.api + '/user/')
|
let result = await axios.get(props.userUrl)
|
||||||
if (result.data) {
|
if (result.data) {
|
||||||
setUsers(result.data)
|
setUsers(result.data)
|
||||||
}
|
}
|
||||||
setLoadingUsers(false)
|
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
setLoadingUsers(false)
|
console.log('Error loading teams', err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fetchData()
|
fetchData()
|
||||||
}, [])
|
}, [props])
|
||||||
|
|
||||||
// MARK: Callbacks
|
// MARK: Callbacks
|
||||||
|
|
||||||
let selectTeam = selectedTeam => {
|
let selectTeam = selectedTeam => {
|
||||||
props(selectedTeam, users, teams)
|
props.cb(selectedTeam, users, teams)
|
||||||
history.push('/team')
|
history.push('/team')
|
||||||
}
|
}
|
||||||
|
|
||||||
let selectUser = selectedUser => {
|
|
||||||
console.log('Selected user ' + selectedUser)
|
|
||||||
}
|
|
||||||
|
|
||||||
let filterCallback = e => {
|
let filterCallback = e => {
|
||||||
let filtered = teams.filter(team => {
|
let filtered = teams.filter(team => {
|
||||||
return team.name.toUpperCase().includes(e.target.value.toUpperCase())
|
return team.name.toUpperCase().includes(e.target.value.toUpperCase())
|
||||||
|
@ -73,20 +62,24 @@ export default function Home({ props }) {
|
||||||
setFilteredTeams(filtered)
|
setFilteredTeams(filtered)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
|
||||||
// MARK: Return
|
// MARK: Return
|
||||||
return (
|
return (
|
||||||
<div className="home">
|
<div className="home">
|
||||||
<div className="header">
|
{users === null || teams === null ? (
|
||||||
|
<div data-testid="loading">Loading...</div>
|
||||||
|
) : (
|
||||||
|
teams !== undefined && (
|
||||||
|
<div data-testid="content">
|
||||||
|
<div data-testid="resolved" className="header">
|
||||||
<h1>Tempo teams</h1>
|
<h1>Tempo teams</h1>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<FilterForm filterCallback={filterCallback} />
|
<FilterForm filterCallback={filterCallback} />
|
||||||
|
|
||||||
{loading || loadingUsers ? (
|
<TeamList teams={filteredTeams} selectTeam={selectTeam} />
|
||||||
<div>Loading...</div>
|
</div>
|
||||||
) : (
|
|
||||||
teams !== undefined && (
|
|
||||||
<TeamList teams={filteredTeams} users={users} selectTeam={selectTeam} selectUser={selectUser} />
|
|
||||||
)
|
)
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|
83
src/views/Home.test.js
Normal file
83
src/views/Home.test.js
Normal file
|
@ -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(<Home />)
|
||||||
|
|
||||||
|
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(<Home props={mockProps} />)
|
||||||
|
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(<Home props={mockProps} />)
|
||||||
|
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(<Home props={mockProps} />)
|
||||||
|
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)
|
||||||
|
})
|
||||||
|
})
|
|
@ -27,7 +27,6 @@ describe('A team page', () => {
|
||||||
}
|
}
|
||||||
|
|
||||||
const { getByTestId, getByText } = render(<Team props={mockProps} />)
|
const { getByTestId, getByText } = render(<Team props={mockProps} />)
|
||||||
|
|
||||||
const resolvedLead = await waitForElement(() => getByTestId('resolved-lead'))
|
const resolvedLead = await waitForElement(() => getByTestId('resolved-lead'))
|
||||||
|
|
||||||
expect(resolvedLead).toHaveTextContent(mockProps.users[0].name)
|
expect(resolvedLead).toHaveTextContent(mockProps.users[0].name)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue