mirror of
https://github.com/hanzoai/vitest.git
synced 2026-09-24 17:04:25 +00:00
233 lines
7.2 KiB
TypeScript
233 lines
7.2 KiB
TypeScript
import { expect, test } from 'vitest'
|
|
import { render } from './utils'
|
|
|
|
const renderElementWithClasses = () =>
|
|
render(`
|
|
<div>
|
|
<button data-testid="delete-button" class="btn extra btn-danger">
|
|
Delete item
|
|
</button>
|
|
<button data-testid="cancel-button">
|
|
Cancel
|
|
</button>
|
|
<svg data-testid="svg-spinner" class="spinner clockwise">
|
|
<path />
|
|
</svg>
|
|
<div data-testid="only-one-class" class="alone"></div>
|
|
<div data-testid="no-classes"></div>
|
|
</div>
|
|
`)
|
|
|
|
test('.toHaveClass', () => {
|
|
const {queryByTestId} = renderElementWithClasses()
|
|
|
|
expect(queryByTestId('delete-button')).toHaveClass('btn')
|
|
expect(queryByTestId('delete-button')).toHaveClass('btn-danger')
|
|
expect(queryByTestId('delete-button')).toHaveClass('extra')
|
|
expect(queryByTestId('delete-button')).not.toHaveClass('xtra')
|
|
expect(queryByTestId('delete-button')).not.toHaveClass('btn xtra')
|
|
expect(queryByTestId('delete-button')).not.toHaveClass('btn', 'xtra')
|
|
expect(queryByTestId('delete-button')).not.toHaveClass('btn', 'extra xtra')
|
|
expect(queryByTestId('delete-button')).toHaveClass('btn btn-danger')
|
|
expect(queryByTestId('delete-button')).toHaveClass('btn', 'btn-danger')
|
|
expect(queryByTestId('delete-button')).toHaveClass(
|
|
'btn extra',
|
|
'btn-danger extra',
|
|
)
|
|
expect(queryByTestId('delete-button')).not.toHaveClass('btn-link')
|
|
expect(queryByTestId('cancel-button')).not.toHaveClass('btn-danger')
|
|
expect(queryByTestId('svg-spinner')).toHaveClass('spinner')
|
|
expect(queryByTestId('svg-spinner')).toHaveClass('clockwise')
|
|
expect(queryByTestId('svg-spinner')).not.toHaveClass('wise')
|
|
expect(queryByTestId('no-classes')).not.toHaveClass()
|
|
expect(queryByTestId('no-classes')).not.toHaveClass(' ')
|
|
|
|
expect(() =>
|
|
expect(queryByTestId('delete-button')).not.toHaveClass('btn'),
|
|
).toThrow()
|
|
expect(() =>
|
|
expect(queryByTestId('delete-button')).not.toHaveClass('btn-danger'),
|
|
).toThrow()
|
|
expect(() =>
|
|
expect(queryByTestId('delete-button')).not.toHaveClass('extra'),
|
|
).toThrow()
|
|
expect(() =>
|
|
expect(queryByTestId('delete-button')).toHaveClass('xtra'),
|
|
).toThrow()
|
|
expect(() =>
|
|
expect(queryByTestId('delete-button')).toHaveClass('btn', 'extra xtra'),
|
|
).toThrow()
|
|
expect(() =>
|
|
expect(queryByTestId('delete-button')).not.toHaveClass('btn btn-danger'),
|
|
).toThrow()
|
|
expect(() =>
|
|
expect(queryByTestId('delete-button')).not.toHaveClass('btn', 'btn-danger'),
|
|
).toThrow()
|
|
expect(() =>
|
|
expect(queryByTestId('delete-button')).toHaveClass('btn-link'),
|
|
).toThrow()
|
|
expect(() =>
|
|
expect(queryByTestId('cancel-button')).toHaveClass('btn-danger'),
|
|
).toThrow()
|
|
expect(() =>
|
|
expect(queryByTestId('svg-spinner')).not.toHaveClass('spinner'),
|
|
).toThrow()
|
|
expect(() =>
|
|
expect(queryByTestId('svg-spinner')).toHaveClass('wise'),
|
|
).toThrow()
|
|
expect(() =>
|
|
expect(queryByTestId('delete-button')).toHaveClass(),
|
|
).toThrow(/At least one expected class must be provided/)
|
|
expect(() =>
|
|
expect(queryByTestId('delete-button')).toHaveClass(''),
|
|
).toThrow(/At least one expected class must be provided/)
|
|
expect(() => expect(queryByTestId('no-classes')).toHaveClass()).toThrow(
|
|
/At least one expected class must be provided/,
|
|
)
|
|
expect(() =>
|
|
expect(queryByTestId('delete-button')).not.toHaveClass(),
|
|
).toThrow(/(none)/)
|
|
expect(() =>
|
|
expect(queryByTestId('delete-button')).not.toHaveClass(' '),
|
|
).toThrow(/(none)/)
|
|
})
|
|
|
|
test('.toHaveClass with regular expressions', () => {
|
|
const {queryByTestId} = renderElementWithClasses()
|
|
|
|
expect(queryByTestId('delete-button')).toHaveClass(/btn/)
|
|
expect(queryByTestId('delete-button')).toHaveClass(/danger/)
|
|
expect(queryByTestId('delete-button')).toHaveClass(
|
|
/-danger$/,
|
|
'extra',
|
|
/^btn-[a-z]+$/,
|
|
/\bbtn/,
|
|
)
|
|
|
|
// It does not match with "btn extra", even though it is a substring of the
|
|
// class "btn extra btn-danger". This is because the regular expression is
|
|
// matched against each class individually.
|
|
expect(queryByTestId('delete-button')).not.toHaveClass(/btn extra/)
|
|
|
|
expect(() =>
|
|
expect(queryByTestId('delete-button')).not.toHaveClass(/danger/),
|
|
).toThrow()
|
|
|
|
expect(() =>
|
|
expect(queryByTestId('delete-button')).toHaveClass(/dangerous/),
|
|
).toThrow()
|
|
})
|
|
|
|
test('.toHaveClass with exact mode option', () => {
|
|
const {queryByTestId} = renderElementWithClasses()
|
|
|
|
expect(queryByTestId('delete-button')).toHaveClass('btn extra btn-danger', {
|
|
exact: true,
|
|
})
|
|
expect(queryByTestId('delete-button')).not.toHaveClass('btn extra', {
|
|
exact: true,
|
|
})
|
|
expect(queryByTestId('delete-button')).not.toHaveClass(
|
|
'btn extra btn-danger foo',
|
|
{exact: true},
|
|
)
|
|
|
|
expect(queryByTestId('delete-button')).toHaveClass('btn extra btn-danger', {
|
|
exact: false,
|
|
})
|
|
expect(queryByTestId('delete-button')).toHaveClass('btn extra', {
|
|
exact: false,
|
|
})
|
|
expect(queryByTestId('delete-button')).not.toHaveClass(
|
|
'btn extra btn-danger foo',
|
|
{exact: false},
|
|
)
|
|
|
|
expect(queryByTestId('delete-button')).toHaveClass(
|
|
'btn',
|
|
'extra',
|
|
'btn-danger',
|
|
{exact: true},
|
|
)
|
|
expect(queryByTestId('delete-button')).not.toHaveClass('btn', 'extra', {
|
|
exact: true,
|
|
})
|
|
expect(queryByTestId('delete-button')).not.toHaveClass(
|
|
'btn',
|
|
'extra',
|
|
'btn-danger',
|
|
'foo',
|
|
{exact: true},
|
|
)
|
|
|
|
expect(queryByTestId('delete-button')).toHaveClass(
|
|
'btn',
|
|
'extra',
|
|
'btn-danger',
|
|
{exact: false},
|
|
)
|
|
expect(queryByTestId('delete-button')).toHaveClass('btn', 'extra', {
|
|
exact: false,
|
|
})
|
|
expect(queryByTestId('delete-button')).not.toHaveClass(
|
|
'btn',
|
|
'extra',
|
|
'btn-danger',
|
|
'foo',
|
|
{exact: false},
|
|
)
|
|
|
|
expect(queryByTestId('only-one-class')).toHaveClass('alone', {exact: true})
|
|
expect(queryByTestId('only-one-class')).not.toHaveClass('alone foo', {
|
|
exact: true,
|
|
})
|
|
expect(queryByTestId('only-one-class')).not.toHaveClass('alone', 'foo', {
|
|
exact: true,
|
|
})
|
|
|
|
expect(queryByTestId('only-one-class')).toHaveClass('alone', {exact: false})
|
|
expect(queryByTestId('only-one-class')).not.toHaveClass('alone foo', {
|
|
exact: false,
|
|
})
|
|
expect(queryByTestId('only-one-class')).not.toHaveClass('alone', 'foo', {
|
|
exact: false,
|
|
})
|
|
|
|
expect(() =>
|
|
expect(queryByTestId('only-one-class')).not.toHaveClass('alone', {
|
|
exact: true,
|
|
}),
|
|
).toThrow(/Expected the element not to have EXACTLY defined classes/)
|
|
|
|
expect(() =>
|
|
expect(queryByTestId('only-one-class')).toHaveClass('alone', 'foo', {
|
|
exact: true,
|
|
}),
|
|
).toThrow(/Expected the element to have EXACTLY defined classes/)
|
|
})
|
|
|
|
test('.toHaveClass combining {exact:true} and regular expressions throws an error', () => {
|
|
const {queryByTestId} = renderElementWithClasses()
|
|
|
|
expect(() =>
|
|
// @ts-expect-error regexp is not supported with exact
|
|
expect(queryByTestId('delete-button')).not.toHaveClass(/btn/, {
|
|
exact: true,
|
|
}),
|
|
).toThrow()
|
|
|
|
expect(() =>
|
|
expect(queryByTestId('delete-button')).not.toHaveClass(
|
|
// @ts-expect-error regexp is not supported with exact
|
|
/-danger$/,
|
|
'extra',
|
|
/\bbtn/,
|
|
{exact: true},
|
|
),
|
|
).toThrow()
|
|
|
|
expect(() =>
|
|
// @ts-expect-error regexp is not supported with exact
|
|
expect(queryByTestId('delete-button')).toHaveClass(/danger/, {exact: true}),
|
|
).toThrow()
|
|
}) |