Team tests (ongoing)
This commit is contained in:
parent
f2303fb70c
commit
97509a85d7
7 changed files with 283 additions and 230 deletions
|
@ -10,6 +10,10 @@
|
||||||
"plugins": ["prettier"],
|
"plugins": ["prettier"],
|
||||||
"rules": {
|
"rules": {
|
||||||
"prettier/prettier": "error",
|
"prettier/prettier": "error",
|
||||||
"no-unused-vars": 1
|
"no-unused-vars": 1,
|
||||||
}
|
"react/prop-types": 0
|
||||||
|
},
|
||||||
|
'extends': [
|
||||||
|
'plugin:react/recommended'
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,50 +6,70 @@ import Team from '../views/Team'
|
||||||
import Member from '../views/Member'
|
import Member from '../views/Member'
|
||||||
import config from '../config.json'
|
import config from '../config.json'
|
||||||
|
|
||||||
history.listen(location => {
|
history.listen(() => {
|
||||||
window.scrollTo(0, 0)
|
window.scrollTo(0, 0)
|
||||||
})
|
})
|
||||||
|
|
||||||
export default function Router(props) {
|
export default function Router() {
|
||||||
let [team, setTeam] = useState([])
|
// let [team, setTeam] = useState([])
|
||||||
let [allTeams, setAllTeams] = useState([])
|
let [allTeams, setAllTeams] = useState([])
|
||||||
let [users, setUsers] = useState([])
|
// let [users, setUsers] = useState([])
|
||||||
let [memberProps, setMemberProps] = useState({})
|
let [memberProps, setMemberProps] = useState({})
|
||||||
|
let [teamProps, setTeamProps] = useState({})
|
||||||
|
|
||||||
let teamCallback = (el) => {
|
let teamCallback = (teamId, users) => {
|
||||||
setTeam(el)
|
// Remove this:
|
||||||
|
// setTeam(teamId)
|
||||||
|
|
||||||
|
// Leave:
|
||||||
|
setTeamProps({
|
||||||
|
url: config.api + '/team/' + teamId,
|
||||||
|
team: teamId,
|
||||||
|
users: users,
|
||||||
|
cb: userIdCallback
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
let usersCallback = (el) => {
|
let usersCallback = el => {
|
||||||
setUsers(el)
|
setUsers(el)
|
||||||
}
|
}
|
||||||
|
|
||||||
let userIdCallback = (el) => {
|
let userIdCallback = el => {
|
||||||
setMemberProps({
|
setMemberProps({
|
||||||
url: config.api + '/user/' + el,
|
url: config.api + '/user/' + el,
|
||||||
teams: allTeams
|
teams: allTeams
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
let allTeamsCallback = (el) => {
|
let allTeamsCallback = el => {
|
||||||
setAllTeams(el)
|
setAllTeams(el)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// <Route
|
||||||
|
// exact
|
||||||
|
// path="/team"
|
||||||
|
// render={props => <Team teamProps={team} usersProps={users} userIdCallback={userIdCallback} {...props} />}
|
||||||
|
// />
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ReactRouter history={history}>
|
<ReactRouter history={history}>
|
||||||
<Switch>
|
<Switch>
|
||||||
<Route
|
<Route
|
||||||
exact path='/'
|
exact
|
||||||
render={(props) => <Home teamCallback={teamCallback} usersCallback={usersCallback} allTeamsCallback={allTeamsCallback} {...props} />}
|
path="/"
|
||||||
|
render={props => (
|
||||||
|
<Home
|
||||||
|
teamCallback={teamCallback}
|
||||||
|
usersCallback={usersCallback}
|
||||||
|
allTeamsCallback={allTeamsCallback}
|
||||||
|
{...props}
|
||||||
/>
|
/>
|
||||||
<Route
|
)}
|
||||||
exact path='/team'
|
|
||||||
render={(props) => <Team teamProps={team} usersProps={users} userIdCallback={userIdCallback} {...props} />}
|
|
||||||
/>
|
|
||||||
<Route
|
|
||||||
exact path='/member'
|
|
||||||
render={(props) => <Member props={memberProps} />}
|
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
<Route exact path="/team" render={() => <Team props={teamProps} />} />
|
||||||
|
|
||||||
|
<Route exact path="/member" render={() => <Member props={memberProps} />} />
|
||||||
</Switch>
|
</Switch>
|
||||||
</ReactRouter>
|
</ReactRouter>
|
||||||
)
|
)
|
||||||
|
|
|
@ -26,8 +26,7 @@ export default function Member({ props }) {
|
||||||
return null
|
return null
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
} catch (err) {
|
||||||
catch(err) {
|
|
||||||
history.push('/')
|
history.push('/')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -42,37 +41,38 @@ export default function Member({ props }) {
|
||||||
|
|
||||||
// MARK: Return
|
// MARK: Return
|
||||||
return (
|
return (
|
||||||
<div className='member'>
|
<div className="member">
|
||||||
|
{user === null ? (
|
||||||
{user === null ? (<div data-testid='loading'>Loading...</div>) : (
|
<div data-testid="loading">Loading...</div>
|
||||||
user !== undefined &&
|
) : (
|
||||||
|
user !== undefined && (
|
||||||
<div>
|
<div>
|
||||||
<div className='header'>
|
<div className="header">
|
||||||
<span data-testid='resolved'><h1>Member {user.name}</h1></span>
|
<span data-testid="resolved">
|
||||||
|
<h1>Member {user.name}</h1>
|
||||||
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className='back'>
|
<div className="back">
|
||||||
<button className='back-btn' onClick={navBack}>{`< Back to team`}</button>
|
<button className="back-btn" onClick={navBack}>{`< Back to team`}</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<h2>Username:</h2>
|
<h2>Username:</h2>
|
||||||
<div className='username'>
|
<div className="username">
|
||||||
<p>{user.username}</p>
|
<p>{user.username}</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<h2>Member of:</h2>
|
<h2>Member of:</h2>
|
||||||
<ul className='list'>
|
<ul className="list">
|
||||||
{teamNames.map((name, index) => (
|
{teamNames.map((name, index) => (
|
||||||
<li className='list-item' key={index}>
|
<li className="list-item" key={index}>
|
||||||
<div className='username'>
|
<div className="username">{name}</div>
|
||||||
{name}
|
|
||||||
</div>
|
|
||||||
</li>
|
</li>
|
||||||
))}
|
))}
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
)
|
||||||
)}
|
)}
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,12 +5,13 @@ import '@testing-library/react/cleanup-after-each'
|
||||||
import axiosMock from 'axios'
|
import axiosMock from 'axios'
|
||||||
import Member from './Member'
|
import Member from './Member'
|
||||||
|
|
||||||
it('Renders without crashing', () => {
|
describe('A members page', () => {
|
||||||
|
it('should render without crashing', () => {
|
||||||
const { getByTestId } = render(<Member />)
|
const { getByTestId } = render(<Member />)
|
||||||
expect(getByTestId('loading')).toHaveTextContent('Loading...')
|
expect(getByTestId('loading')).toHaveTextContent('Loading...')
|
||||||
})
|
})
|
||||||
|
|
||||||
it('Fetches and displays data', async () => {
|
it('should fetch and display data', async () => {
|
||||||
const callData = {
|
const callData = {
|
||||||
username: 'goodpanda',
|
username: 'goodpanda',
|
||||||
member_teams: [3],
|
member_teams: [3],
|
||||||
|
@ -29,3 +30,4 @@ it('Fetches and displays data', async () => {
|
||||||
expect(axiosMock.get).toHaveBeenCalledTimes(1)
|
expect(axiosMock.get).toHaveBeenCalledTimes(1)
|
||||||
expect(axiosMock.get).toHaveBeenCalledWith(address.url)
|
expect(axiosMock.get).toHaveBeenCalledWith(address.url)
|
||||||
})
|
})
|
||||||
|
})
|
||||||
|
|
|
@ -2,14 +2,11 @@
|
||||||
import React, { useState, useEffect } from 'react'
|
import React, { useState, useEffect } from 'react'
|
||||||
import axios from 'axios'
|
import axios from 'axios'
|
||||||
import history from '../history.js'
|
import history from '../history.js'
|
||||||
import config from '../config.json'
|
|
||||||
import FilterForm from '../components/FilterForm.jsx'
|
import FilterForm from '../components/FilterForm.jsx'
|
||||||
import './Team.scss'
|
import './Team.scss'
|
||||||
|
|
||||||
// teamProps, usersProps, userIdCallback
|
|
||||||
export default function Team(props) {
|
export default function Team(props) {
|
||||||
// MARK: State
|
// MARK: State
|
||||||
let [loading, setLoading] = useState(true)
|
|
||||||
let [team, setTeam] = useState([])
|
let [team, setTeam] = useState([])
|
||||||
let [members, setMembers] = useState([])
|
let [members, setMembers] = useState([])
|
||||||
let [filteredMembers, setFilteredMembers] = useState([])
|
let [filteredMembers, setFilteredMembers] = useState([])
|
||||||
|
@ -18,14 +15,13 @@ export default function Team(props) {
|
||||||
// MARK: - Load user info from Tempo backend on initialization
|
// MARK: - Load user info from Tempo backend on initialization
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
let fetchData = async () => {
|
let fetchData = async () => {
|
||||||
setLoading(true)
|
|
||||||
try {
|
try {
|
||||||
let result = await axios(config.api + '/team/' + props.teamProps.id)
|
let result = await axios(props.url)
|
||||||
if (result.data) {
|
if (result.data) {
|
||||||
setTeam(result.data)
|
setTeam(result.data)
|
||||||
|
|
||||||
result.data.members.map(memberId => {
|
result.data.members.map(memberId => {
|
||||||
let arr = props.usersProps.filter(el => el.id === memberId)
|
let arr = props.users.filter(el => el.id === memberId)
|
||||||
if (arr[0] !== undefined) {
|
if (arr[0] !== undefined) {
|
||||||
let tupple = {
|
let tupple = {
|
||||||
name: arr[0].name,
|
name: arr[0].name,
|
||||||
|
@ -33,21 +29,16 @@ export default function Team(props) {
|
||||||
}
|
}
|
||||||
setMembers(t => [...t, tupple])
|
setMembers(t => [...t, tupple])
|
||||||
setFilteredMembers(t => [...t, tupple])
|
setFilteredMembers(t => [...t, tupple])
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
history.push('/')
|
history.push('/')
|
||||||
}
|
}
|
||||||
|
|
||||||
return null
|
return null
|
||||||
})
|
})
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
history.push('/')
|
history.push('/')
|
||||||
}
|
}
|
||||||
setLoading(false)
|
} catch (err) {
|
||||||
}
|
|
||||||
catch(err) {
|
|
||||||
setLoading(false)
|
|
||||||
console.log('Fetch data error: ' + err)
|
console.log('Fetch data error: ' + err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -56,22 +47,26 @@ export default function Team(props) {
|
||||||
}, [props])
|
}, [props])
|
||||||
|
|
||||||
// MARK: Helpers
|
// MARK: Helpers
|
||||||
let userData = (userId) => {
|
let userData = userId => {
|
||||||
let arr = props.usersProps.filter(el => el.id === userId)
|
if (props.users === undefined) {
|
||||||
|
history.push('/')
|
||||||
|
} else {
|
||||||
|
let arr = props.users.filter(el => el.id === userId)
|
||||||
|
|
||||||
if (arr[0] !== undefined) {
|
if (arr[0] !== undefined) {
|
||||||
return arr[0].name
|
return arr[0].name
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
history.push('/')
|
history.push('/')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let selectUser = (id) => {
|
let selectUser = id => {
|
||||||
props.userIdCallback(id)
|
props.cb(id)
|
||||||
history.push('/member')
|
history.push('/member')
|
||||||
}
|
}
|
||||||
|
|
||||||
let filterCallback = (e) => {
|
let filterCallback = e => {
|
||||||
let filtered = members.filter(member => {
|
let filtered = members.filter(member => {
|
||||||
return member.name.toUpperCase().includes(e.target.value.toUpperCase())
|
return member.name.toUpperCase().includes(e.target.value.toUpperCase())
|
||||||
})
|
})
|
||||||
|
@ -85,43 +80,44 @@ export default function Team(props) {
|
||||||
|
|
||||||
// MARK: Return
|
// MARK: Return
|
||||||
return (
|
return (
|
||||||
<div className='team'>
|
<div className="team">
|
||||||
|
{props.team !== undefined && (
|
||||||
{props.teamProps !== undefined &&
|
<div className="header">
|
||||||
<div className='header'>
|
<h1>Team {props.team.name}</h1>
|
||||||
<h1>Team {props.teamProps.name}</h1>
|
|
||||||
</div>
|
</div>
|
||||||
}
|
)}
|
||||||
|
|
||||||
<div className='back'>
|
<div className="back">
|
||||||
<button className='back-btn' onClick={navBack}>{`< Back to teams`}</button>
|
<button className="back-btn" onClick={navBack}>{`< Back to teams`}</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<FilterForm filterCallback={filterCallback} />
|
<FilterForm filterCallback={filterCallback} />
|
||||||
|
|
||||||
{loading ? (<div>Loading...</div>) : (
|
{team.length == 0 ? (
|
||||||
team !== undefined &&
|
<div data-testId="loading">Loading...</div>
|
||||||
|
) : (
|
||||||
|
team !== undefined && (
|
||||||
<div>
|
<div>
|
||||||
<h2>Team lead</h2>
|
<h2>Team lead</h2>
|
||||||
|
|
||||||
<button className='selector-btn' onClick={() => selectUser(team.lead)}>
|
<button data-testId="resolved" className="selector-btn" onClick={() => selectUser(team.lead)}>
|
||||||
{userData(team.lead)}
|
{userData(team.lead)}
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<h2>Team members</h2>
|
<h2>Team members</h2>
|
||||||
|
|
||||||
<ul className='list'>
|
<ul className="list">
|
||||||
{filteredMembers.map((member, index) => (
|
{filteredMembers.map((member, index) => (
|
||||||
<li className = 'list-item' key={index}>
|
<li className="list-item" key={index}>
|
||||||
<button className='selector-btn' onClick={() => selectUser(member.id)}>
|
<button className="selector-btn" onClick={() => selectUser(member.id)}>
|
||||||
{member.name}
|
{member.name}
|
||||||
</button>
|
</button>
|
||||||
</li>
|
</li>
|
||||||
))}
|
))}
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
)
|
||||||
)}
|
)}
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
31
src/views/Team.test.js
Normal file
31
src/views/Team.test.js
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
import React from 'react'
|
||||||
|
import { 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 Team from './Team'
|
||||||
|
|
||||||
|
describe('A team page', () => {
|
||||||
|
it('should render without crashing', () => {
|
||||||
|
const { getByTestId } = render(<Team />)
|
||||||
|
|
||||||
|
expect(getByTestId('loading')).toHaveTextContent('Loading...')
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should fetch and display data', async () => {
|
||||||
|
const callData = {
|
||||||
|
teamProps: {
|
||||||
|
id: 3
|
||||||
|
},
|
||||||
|
usersProps: [{ name: 'UserName' }]
|
||||||
|
}
|
||||||
|
|
||||||
|
axiosMock.get.mockResolvedValueOnce({ data: callData })
|
||||||
|
|
||||||
|
const address = { url: '/team3' }
|
||||||
|
const { getByTestId } = render(<Team props={address} />)
|
||||||
|
const resolvedSpan = await waitForElement(() => getByTestId('resolved'))
|
||||||
|
|
||||||
|
expeted(resolvedSpan).toHaveContent('Team')
|
||||||
|
})
|
||||||
|
})
|
Loading…
Add table
Add a link
Reference in a new issue