Skip to content

Commit d31480b

Browse files
committed
test(layers): add unit tests for FontAwesomeLayers
1 parent 2c84902 commit d31480b

File tree

3 files changed

+207
-2
lines changed

3 files changed

+207
-2
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565
"test": "jest",
6666
"test:watch": "jest --watch",
6767
"test:prepublish": "npm run install.6 && npm run test && npm run install.7 && npm run test",
68+
"validate": "npm run lint && npm run format:check && npm run validate-types && npm run test",
6869
"validate-types": "tsc --noEmit",
6970
"install.6": "npm --no-save install @fortawesome/fontawesome-svg-core@6.x @fortawesome/free-solid-svg-icons@6.x",
7071
"install.7": "npm --no-save install @fortawesome/fontawesome-svg-core@7.x @fortawesome/free-solid-svg-icons@7.x",

src/components/FontAwesomeLayers.tsx

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,8 +144,6 @@ const LayersText = ({
144144
: transform,
145145
})
146146

147-
console.log(textObject.abstract[0])
148-
149147
return textObject.abstract[0]
150148
}, [text, transform, className, inverse])
151149

Lines changed: 206 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,206 @@
1+
import React from 'react'
2+
3+
import { text, counter, parse } from '@fortawesome/fontawesome-svg-core'
4+
import { render, screen } from '@testing-library/react'
5+
6+
import { makeReactConverter } from '../../converter'
7+
import {
8+
FontAwesomeLayers,
9+
LayersText,
10+
LayersCounter,
11+
} from '../FontAwesomeLayers'
12+
13+
// Mock the converter module
14+
jest.mock('../../converter', () => ({
15+
makeReactConverter: jest.fn((abstractElement, props) =>
16+
React.createElement('span', {
17+
...props,
18+
'data-testid': 'converted-element',
19+
}),
20+
),
21+
}))
22+
23+
// Mock fontawesome-svg-core
24+
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
25+
jest.mock('@fortawesome/fontawesome-svg-core', () => ({
26+
...jest.requireActual('@fortawesome/fontawesome-svg-core'),
27+
text: jest.fn(() => ({
28+
abstract: [{ tag: 'span', attributes: {}, children: [] }],
29+
})),
30+
counter: jest.fn(() => ({
31+
abstract: [{ tag: 'span', attributes: {}, children: [] }],
32+
})),
33+
parse: {
34+
transform: jest.fn(),
35+
},
36+
}))
37+
38+
describe('FontAwesomeLayers', () => {
39+
beforeEach(() => {
40+
jest.clearAllMocks()
41+
})
42+
43+
it('renders with default classes', () => {
44+
render(<FontAwesomeLayers>content</FontAwesomeLayers>)
45+
46+
const element = screen.getByText('content')
47+
expect(element).toHaveClass('fa-layers', 'fa-fw')
48+
})
49+
50+
it('renders with custom className', () => {
51+
render(
52+
<FontAwesomeLayers className="custom-class">content</FontAwesomeLayers>,
53+
)
54+
55+
const element = screen.getByText('content')
56+
expect(element).toHaveClass('fa-layers', 'fa-fw', 'custom-class')
57+
})
58+
59+
it('renders with size wrapper', () => {
60+
render(<FontAwesomeLayers size="2x">content</FontAwesomeLayers>)
61+
62+
// eslint-disable-next-line testing-library/no-node-access
63+
const wrapper = screen.getByText('content').parentElement
64+
expect(wrapper).toHaveClass('fa-2x')
65+
})
66+
67+
it('passes through HTML attributes', () => {
68+
render(
69+
<FontAwesomeLayers data-testid="layers" id="test-id">
70+
content
71+
</FontAwesomeLayers>,
72+
)
73+
74+
const element = screen.getByTestId('layers')
75+
expect(element).toHaveAttribute('id', 'test-id')
76+
})
77+
78+
it('renders children correctly', () => {
79+
render(
80+
<FontAwesomeLayers>
81+
<span>child1</span>
82+
<span>child2</span>
83+
</FontAwesomeLayers>,
84+
)
85+
86+
expect(screen.getByText('child1')).toBeInTheDocument()
87+
expect(screen.getByText('child2')).toBeInTheDocument()
88+
})
89+
})
90+
91+
describe('LayersText', () => {
92+
it('renders text component', () => {
93+
render(<LayersText text="Hello" />)
94+
95+
expect(screen.getByTestId('converted-element')).toBeInTheDocument()
96+
})
97+
98+
it('handles inverse prop', () => {
99+
render(<LayersText text="Hello" inverse />)
100+
101+
expect(text).toHaveBeenCalledWith(
102+
'Hello',
103+
expect.objectContaining({
104+
classes: expect.arrayContaining(['fa-inverse']) as string[],
105+
}),
106+
)
107+
})
108+
109+
it('handles className prop', () => {
110+
render(<LayersText text="Hello" className="custom-class another-class" />)
111+
112+
expect(text).toHaveBeenCalledWith(
113+
'Hello',
114+
expect.objectContaining({
115+
classes: expect.arrayContaining([
116+
'custom-class',
117+
'another-class',
118+
]) as string[],
119+
}),
120+
)
121+
})
122+
123+
it('handles transform as string', () => {
124+
render(<LayersText text="Hello" transform="shrink-6" />)
125+
126+
// eslint-disable-next-line @typescript-eslint/unbound-method
127+
expect(parse.transform).toHaveBeenCalledWith('shrink-6')
128+
expect(text).toHaveBeenCalled()
129+
})
130+
131+
it('handles transform as object', () => {
132+
const transformObj = { size: 0.5 }
133+
render(<LayersText text="Hello" transform={transformObj} />)
134+
135+
expect(text).toHaveBeenCalledWith(
136+
'Hello',
137+
expect.objectContaining({
138+
transform: transformObj,
139+
}),
140+
)
141+
})
142+
143+
it('passes through style and attributes', () => {
144+
const style = { color: 'red' }
145+
render(<LayersText text="Hello" style={style} data-testid="text-layer" />)
146+
147+
expect(makeReactConverter).toHaveBeenCalledWith(
148+
expect.any(Object),
149+
expect.objectContaining({
150+
style,
151+
'data-testid': 'text-layer',
152+
}),
153+
)
154+
})
155+
})
156+
157+
describe('LayersCounter', () => {
158+
it('renders counter component with number', () => {
159+
render(<LayersCounter count={42} />)
160+
161+
expect(screen.getByTestId('converted-element')).toBeInTheDocument()
162+
})
163+
164+
it('renders counter component with string', () => {
165+
render(<LayersCounter count="99+" />)
166+
167+
expect(counter).toHaveBeenCalledWith('99+', expect.any(Object))
168+
})
169+
170+
it('handles className prop', () => {
171+
render(<LayersCounter count={5} className="badge red" />)
172+
173+
expect(counter).toHaveBeenCalledWith(
174+
5,
175+
expect.objectContaining({
176+
classes: ['badge', 'red'],
177+
}),
178+
)
179+
})
180+
181+
it('handles undefined className', () => {
182+
render(<LayersCounter count={5} />)
183+
184+
expect(counter).toHaveBeenCalledWith(
185+
5,
186+
expect.objectContaining({
187+
classes: undefined,
188+
}),
189+
)
190+
})
191+
192+
it('passes through style and attributes', () => {
193+
const style = { backgroundColor: 'tomato' }
194+
render(
195+
<LayersCounter count={10} style={style} data-testid="counter-layer" />,
196+
)
197+
198+
expect(makeReactConverter).toHaveBeenCalledWith(
199+
expect.any(Object),
200+
expect.objectContaining({
201+
style,
202+
'data-testid': 'counter-layer',
203+
}),
204+
)
205+
})
206+
})

0 commit comments

Comments
 (0)