Skip to content

Commit c9dd551

Browse files
authored
Merge pull request #135 from primer/circle-badge-tests
Improve CircleBadge test coverage, tidy up
2 parents 28520e8 + 9ab459c commit c9dd551

File tree

2 files changed

+29
-25
lines changed

2 files changed

+29
-25
lines changed

src/CircleBadge.js

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,20 @@ import React from 'react'
22
import PropTypes from 'prop-types'
33
import classnames from 'classnames'
44

5+
const ICON_CLASS = 'CircleBadge-icon'
6+
57
const CircleBadge = ({tag: Tag = 'div', size = 'medium', bg, children, ...rest}) => {
6-
const generateContent = () =>
7-
React.Children.map(children, child => {
8-
const {className = '', ...rest} = child.props
9-
const newProps = {...rest}
10-
if (!className || !className.includes('CircleBadge-icon')) {
11-
newProps.className = classnames('CircleBadge-icon', className)
12-
}
13-
return React.cloneElement(child, newProps)
14-
})
8+
const mappedChildren = React.Children.map(children, child => {
9+
let {className = ''} = child.props
10+
if (!className.includes(ICON_CLASS)) {
11+
className = classnames(ICON_CLASS, className)
12+
}
13+
return React.cloneElement(child, {className})
14+
})
1515
const classes = classnames('CircleBadge', `CircleBadge--${size}`, bg && `bg-${bg}`)
1616
return (
1717
<Tag className={classes} {...rest}>
18-
{generateContent()}
18+
{mappedChildren}
1919
</Tag>
2020
)
2121
}

src/__tests__/CircleBadge.js

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ describe('CircleBadge', () => {
1212
it('renders medium by default', () => {
1313
expect(rendersClass(<CircleBadge />, 'CircleBadge--medium')).toEqual(true)
1414
})
15+
1516
it('respects tag prop', () => {
1617
expect(
1718
render(
@@ -27,6 +28,7 @@ describe('CircleBadge', () => {
2728
)
2829
)
2930
})
31+
3032
it('applies title', () => {
3133
expect(
3234
render(
@@ -36,29 +38,31 @@ describe('CircleBadge', () => {
3638
).props['title']
3739
).toEqual('primer logo')
3840
})
41+
3942
it('adds bg class', () => {
4043
expect(rendersClass(<CircleBadge bg="blue" />, 'bg-blue')).toEqual(true)
4144
})
42-
it('adds CircleBadge--icon class to children', () => {
43-
const comp = mount(<CircleBadge>{imgInput}</CircleBadge>).render()
44-
expect(
45-
comp
46-
.children()
47-
.first()
48-
.hasClass('CircleBadge-icon')
49-
).toEqual(true)
45+
46+
it('adds CircleBadge-icon class to children', () => {
47+
const comp = mount(<CircleBadge>{imgInput}</CircleBadge>)
48+
expect(comp.find('img').hasClass('CircleBadge-icon')).toEqual(true)
49+
})
50+
51+
it('does not duplicate "CircleBadge-icon" classes', () => {
52+
const comp = mount(
53+
<CircleBadge>
54+
<img className="CircleBadge-icon" alt="" src="primer.jpg" />
55+
</CircleBadge>
56+
)
57+
expect(comp.find('img').props().className).toEqual('CircleBadge-icon')
5058
})
59+
5160
it('preserves child class names', () => {
5261
const comp = mount(
5362
<CircleBadge>
5463
<img className="primer" alt="" src="primer.jpg" />
5564
</CircleBadge>
56-
).render()
57-
expect(
58-
comp
59-
.children()
60-
.first()
61-
.hasClass('primer')
62-
).toEqual(true)
65+
)
66+
expect(comp.find('img').hasClass('primer')).toEqual(true)
6367
})
6468
})

0 commit comments

Comments
 (0)