sa11y

@sa11y/vitest

Accessibility matcher for Vitest

Overview

The toBeAccessible() API from this library can be used in Vitest unit tests to test HTML elements or DOM for accessibility.

Note: The core accessibility logic is provided by @sa11y/matcher, which can be used directly for custom or framework-agnostic testing.

Install

Setup

The accessibility APIs need to be registered with Vitest before they can be used in tests.

Project level

You can set up the Sa11y API once at the project level to make it available to all the Vitest tests in the project.

import { setup } from '@sa11y/vitest';
// Register the Sa11y matcher with default options
setup();

// Register with custom options for automatic checks and DOM saving
setup({
    autoCheckOpts: { runAfterEach: true, cleanupAfterEach: true },
    renderedDOMSaveOpts: {
        /* your RenderedDOMSaveOpts here */
    },
});
import { defineConfig } from 'vitest/config';

export default defineConfig({
    test: {
        setupFiles: ['./vitest-setup.ts'],
    },
});

Test module level

You can also invoke setup before using the toBeAccessible API in individual test modules:

import { setup } from '@sa11y/vitest';

beforeAll(() => {
    setup();
});

Usage

import { setup } from '@sa11y/vitest';
import { extended, full } from '@sa11y/preset-rules';

beforeAll(() => {
    setup();
});

it('should be accessible', async () => {
    // Setup DOM to be tested for accessibility
    // ...

    // Assert that DOM is accessible (using base preset-rule)
    await expect(document).toBeAccessible();

    // Can be used to test accessibility of a specific HTML element
    const elem = document.getElementById('foo');
    await expect(elem).toBeAccessible();

    // To test using an extended ruleset with best practices and experimental rules
    await expect(document).toBeAccessible(extended);

    // To test using all rules provided by axe
    await expect(document).toBeAccessible(full);
});

Caveats

Automatic checks

The Sa11y Vitest API can be set up to be automatically invoked at the end of each test as an alternative to adding the toBeAccessible API at the end of each test.

import { setup } from '@sa11y/vitest';

setup({ autoCheckOpts: { runAfterEach: true } });

// To optionally clean up the body after running accessibility checks
setup({ autoCheckOpts: { runAfterEach: true, cleanupAfterEach: true } });

// To customize how/where the rendered DOM is saved during automatic checks
setup({
    autoCheckOpts: { runAfterEach: true },
    renderedDOMSaveOpts: {
        /* your RenderedDOMSaveOpts here */
    },
});

Options

autoCheckOpts:

Results Processor

A custom results processor is available for transforming accessibility errors in Vitest test results.
See the API: vitestResultsProcessor.