Skip to content

Commit bd4b46a

Browse files
jgozgnapse
authored andcommitted
feat: accept multiple classname arguments in toHaveClass (#31)
* Accept array of classnames in toHaveClass * Switch to variable argument list
1 parent 011bb5a commit bd4b46a

File tree

4 files changed

+28
-3
lines changed

4 files changed

+28
-3
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,7 @@ import 'jest-dom/extend-expect'
219219
// </button>
220220
expect(getByTestId(container, 'delete-button')).toHaveClass('extra')
221221
expect(getByTestId(container, 'delete-button')).toHaveClass('btn-danger btn')
222+
expect(getByTestId(container, 'delete-button')).toHaveClass('btn-danger', 'btn')
222223
expect(getByTestId(container, 'delete-button')).not.toHaveClass('btn-link')
223224
// ...
224225
```

extend-expect.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ declare namespace jest {
55
toBeEmpty(): R
66
toContainElement(element: HTMLElement): R
77
toHaveAttribute(attr: string, value?: string): R
8-
toHaveClass(className: string): R
8+
toHaveClass(...classNames: string[]): R
99
toHaveStyle(css: string): R
1010
toHaveTextContent(text: string | RegExp): R
1111
toHaveFocus(): R

src/__tests__/index.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,17 +224,29 @@ test('.toHaveClass', () => {
224224
</div>
225225
`)
226226

227+
expect(queryByTestId('delete-button')).toHaveClass()
227228
expect(queryByTestId('delete-button')).toHaveClass('btn')
228229
expect(queryByTestId('delete-button')).toHaveClass('btn-danger')
229230
expect(queryByTestId('delete-button')).toHaveClass('extra')
230231
expect(queryByTestId('delete-button')).not.toHaveClass('xtra')
232+
expect(queryByTestId('delete-button')).not.toHaveClass('btn xtra')
233+
expect(queryByTestId('delete-button')).not.toHaveClass('btn', 'xtra')
234+
expect(queryByTestId('delete-button')).not.toHaveClass('btn', 'extra xtra')
231235
expect(queryByTestId('delete-button')).toHaveClass('btn btn-danger')
236+
expect(queryByTestId('delete-button')).toHaveClass('btn', 'btn-danger')
237+
expect(queryByTestId('delete-button')).toHaveClass(
238+
'btn extra',
239+
'btn-danger extra',
240+
)
232241
expect(queryByTestId('delete-button')).not.toHaveClass('btn-link')
233242
expect(queryByTestId('cancel-button')).not.toHaveClass('btn-danger')
234243
expect(queryByTestId('svg-spinner')).toHaveClass('spinner')
235244
expect(queryByTestId('svg-spinner')).toHaveClass('clockwise')
236245
expect(queryByTestId('svg-spinner')).not.toHaveClass('wise')
237246

247+
expect(() =>
248+
expect(queryByTestId('delete-button')).not.toHaveClass(),
249+
).toThrowError()
238250
expect(() =>
239251
expect(queryByTestId('delete-button')).not.toHaveClass('btn'),
240252
).toThrowError()
@@ -247,9 +259,18 @@ test('.toHaveClass', () => {
247259
expect(() =>
248260
expect(queryByTestId('delete-button')).toHaveClass('xtra'),
249261
).toThrowError()
262+
expect(() =>
263+
expect(queryByTestId('delete-button')).toHaveClass('xtra'),
264+
).toThrowError()
265+
expect(() =>
266+
expect(queryByTestId('delete-button')).toHaveClass('btn', 'extra xtra'),
267+
).toThrowError()
250268
expect(() =>
251269
expect(queryByTestId('delete-button')).not.toHaveClass('btn btn-danger'),
252270
).toThrowError()
271+
expect(() =>
272+
expect(queryByTestId('delete-button')).not.toHaveClass('btn', 'btn-danger'),
273+
).toThrowError()
253274
expect(() =>
254275
expect(queryByTestId('delete-button')).toHaveClass('btn-link'),
255276
).toThrowError()

src/to-have-class.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,13 @@ function isSubset(subset, superset) {
1212
return subset.every(item => superset.includes(item))
1313
}
1414

15-
export function toHaveClass(htmlElement, expectedClassNames) {
15+
export function toHaveClass(htmlElement, ...expectedClassNames) {
1616
checkHtmlElement(htmlElement, toHaveClass, this)
1717
const received = splitClassNames(htmlElement.getAttribute('class'))
18-
const expected = splitClassNames(expectedClassNames)
18+
const expected = expectedClassNames.reduce(
19+
(acc, className) => acc.concat(splitClassNames(className)),
20+
[],
21+
)
1922
return {
2023
pass: isSubset(expected, received),
2124
message: () => {

0 commit comments

Comments
 (0)