Библиотека aria-query предназначена для работы с ARIA-ролями, состояниями и свойствами в контексте веб-разработки и тестирования. Она предоставляет структурированные данные о допустимых ролях, их свойствах и отношениях между ними. Основными модулями являются:
Эти структуры данных используются для проверки правильного применения ARIA в интерфейсах и для построения динамических валидаторов в тестах.
Каждая роль представлена объектом с ключевыми полями:
name – уникальное имя роли (button,
checkbox, dialog).abstract – флаг, определяющий, является ли роль
абстрактной и не может применяться напрямую.requiredProps – список обязательных ARIA-свойств.superClass – наследование от других ролей, формирующее
иерархию.props – все свойства, которые можно назначать элементу
с данной ролью.Пример извлечения информации о роли button:
import { roles } from 'aria-query';
const buttonRole = roles.get('button');
console.log(buttonRole.requiredProps); // []
console.log(buttonRole.props); // Set { 'aria-pressed', 'aria-expanded', ... }
Таким образом можно динамически проверять соответствие элементов заявленным требованиям ARIA.
elementRoles позволяет определить, какие роли допустимы
для конкретного HTML-элемента, и наоборот, какие элементы могут
принимать заданную роль. Структура объекта следующая:
div, button,
a).Пример проверки, может ли элемент <span> быть
кнопкой:
import { elementRoles } from 'aria-query';
const spanRoles = elementRoles.get('span');
console.log(spanRoles.has('button')); // true или false
Это особенно полезно при юнит-тестировании, когда нужно убедиться, что компоненты используют корректные ARIA-атрибуты в зависимости от их HTML-тегов.
Каждая роль имеет набор свойств (props), которые можно
использовать для валидации компонентов:
import { roles } from 'aria-query';
const checkboxRole = roles.get('checkbox');
if (checkboxRole.props.has('aria-checked')) {
console.log('Элемент с ролью checkbox поддерживает aria-checked');
}
Можно комбинировать проверку наличия роли и соответствие свойств, чтобы юнит-тесты автоматически выявляли ошибки доступности.
import { elementRoles } from 'aria-query';
import { render } from '@testing-library/react';
test('span не должен иметь недопустимую роль', () => {
const { container } = render(<span role="menuitem">Item</span>);
const spanRoles = elementRoles.get('span');
const assignedRole = container.querySelector('span').getAttribute('role');
expect(spanRoles.has(assignedRole)).toBe(true);
});
import { roles } from 'aria-query';
test('checkbox должен иметь aria-checked', () => {
const checkbox = document.createElement('div');
checkbox.setAttribute('role', 'checkbox');
checkbox.setAttribute('aria-checked', 'true');
const roleInfo = roles.get(checkbox.getAttribute('role'));
roleInfo.requiredProps.forEach(prop => {
expect(checkbox.hasAttribute(prop)).toBe(true);
});
});
Использование roles и elementRoles
позволяет создавать универсальные функции для тестирования всех
компонентов:
function validateComponentRole(element) {
const role = element.getAttribute('role');
if (!role) return true;
const roleData = roles.get(role);
const tagName = element.tagName.toLowerCase();
const validRoles = elementRoles.get(tagName);
return validRoles.has(role) && [...roleData.requiredProps].every(prop => element.hasAttribute(prop));
}
Эта функция может быть интегрирована в цикл по всем компонентам, обеспечивая систематическую проверку доступности.
При работе с компонентами React aria-query помогает:
Пример:
import { render } from '@testing-library/react';
import { roles } from 'aria-query';
import Checkbox from './Checkbox';
test('Checkbox компонент корректно обновляет aria-checked', () => {
const { getByRole } = render(<Checkbox checked={true} />);
const checkbox = getByRole('checkbox');
expect(checkbox.getAttribute('aria-checked')).toBe('true');
});
Использование aria-query в юнит-тестах позволяет:
Библиотека обеспечивает высокий уровень уверенности в корректности доступности интерфейсов за счет строгой типизации ролей и свойств, что делает её незаменимым инструментом при разработке современных веб-компонентов.