142 lines
4.0 KiB
Plaintext
142 lines
4.0 KiB
Plaintext
import expect from 'expect';
|
|
import { elementType } from 'jsx-ast-utils';
|
|
import getAccessibleChildText from '../../../src/util/getAccessibleChildText';
|
|
import JSXAttributeMock from '../../../__mocks__/JSXAttributeMock';
|
|
import JSXElementMock from '../../../__mocks__/JSXElementMock';
|
|
|
|
describe('getAccessibleChildText', () => {
|
|
it('returns the aria-label when present', () => {
|
|
expect(getAccessibleChildText(JSXElementMock(
|
|
'a',
|
|
[JSXAttributeMock('aria-label', 'foo')],
|
|
), elementType)).toBe('foo');
|
|
});
|
|
|
|
it('returns the aria-label instead of children', () => {
|
|
expect(getAccessibleChildText(JSXElementMock(
|
|
'a',
|
|
[JSXAttributeMock('aria-label', 'foo')],
|
|
[{ type: 'JSXText', value: 'bar' }],
|
|
), elementType)).toBe('foo');
|
|
});
|
|
|
|
it('skips elements with aria-hidden=true', () => {
|
|
expect(getAccessibleChildText(JSXElementMock(
|
|
'a',
|
|
[JSXAttributeMock('aria-hidden', 'true')],
|
|
), elementType)).toBe('');
|
|
});
|
|
|
|
it('returns literal value for JSXText child', () => {
|
|
expect(getAccessibleChildText(JSXElementMock(
|
|
'a',
|
|
[],
|
|
[{ type: 'JSXText', value: 'bar' }],
|
|
), elementType)).toBe('bar');
|
|
});
|
|
|
|
it('returns alt text for img child', () => {
|
|
expect(getAccessibleChildText(JSXElementMock(
|
|
'a',
|
|
[],
|
|
[JSXElementMock('img', [
|
|
JSXAttributeMock('src', 'some/path'),
|
|
JSXAttributeMock('alt', 'a sensible label'),
|
|
])],
|
|
), elementType)).toBe('a sensible label');
|
|
});
|
|
|
|
it('returns blank when alt tag is used on arbitrary element', () => {
|
|
expect(getAccessibleChildText(JSXElementMock(
|
|
'a',
|
|
[],
|
|
[JSXElementMock('span', [
|
|
JSXAttributeMock('alt', 'a sensible label'),
|
|
])],
|
|
), elementType)).toBe('');
|
|
});
|
|
|
|
it('returns literal value for JSXText child', () => {
|
|
expect(getAccessibleChildText(JSXElementMock(
|
|
'a',
|
|
[],
|
|
[{ type: 'Literal', value: 'bar' }],
|
|
), elementType)).toBe('bar');
|
|
});
|
|
|
|
it('returns trimmed literal value for JSXText child', () => {
|
|
expect(getAccessibleChildText(JSXElementMock(
|
|
'a',
|
|
[],
|
|
[{ type: 'Literal', value: ' bar ' }],
|
|
), elementType)).toBe('bar');
|
|
});
|
|
|
|
it('returns space-collapsed literal value for JSXText child', () => {
|
|
expect(getAccessibleChildText(JSXElementMock(
|
|
'a',
|
|
[],
|
|
[{ type: 'Literal', value: 'foo bar' }],
|
|
), elementType)).toBe('foo bar');
|
|
});
|
|
|
|
it('returns punctuation-stripped literal value for JSXText child', () => {
|
|
expect(getAccessibleChildText(JSXElementMock(
|
|
'a',
|
|
[],
|
|
[{ type: 'Literal', value: 'foo, bar. baz? foo; bar:' }],
|
|
), elementType)).toBe('foo bar baz foo bar');
|
|
});
|
|
|
|
it('returns recursive value for JSXElement child', () => {
|
|
expect(getAccessibleChildText(JSXElementMock(
|
|
'a',
|
|
[],
|
|
[JSXElementMock(
|
|
'span',
|
|
[],
|
|
[{ type: 'Literal', value: 'bar' }],
|
|
)],
|
|
), elementType)).toBe('bar');
|
|
});
|
|
|
|
it('skips children with aria-hidden-true', () => {
|
|
expect(getAccessibleChildText(JSXElementMock(
|
|
'a',
|
|
[],
|
|
[JSXElementMock(
|
|
'span',
|
|
[],
|
|
[JSXElementMock(
|
|
'span',
|
|
[JSXAttributeMock('aria-hidden', 'true')],
|
|
)],
|
|
)],
|
|
), elementType)).toBe('');
|
|
});
|
|
|
|
it('joins multiple children properly - no spacing', () => {
|
|
expect(getAccessibleChildText(JSXElementMock(
|
|
'a',
|
|
[],
|
|
[{ type: 'Literal', value: 'foo' }, { type: 'Literal', value: 'bar' }],
|
|
), elementType)).toBe('foo bar');
|
|
});
|
|
|
|
it('joins multiple children properly - with spacing', () => {
|
|
expect(getAccessibleChildText(JSXElementMock(
|
|
'a',
|
|
[],
|
|
[{ type: 'Literal', value: ' foo ' }, { type: 'Literal', value: ' bar ' }],
|
|
), elementType)).toBe('foo bar');
|
|
});
|
|
|
|
it('skips unknown elements', () => {
|
|
expect(getAccessibleChildText(JSXElementMock(
|
|
'a',
|
|
[],
|
|
[{ type: 'Literal', value: 'foo' }, { type: 'Unknown' }, { type: 'Literal', value: 'bar' }],
|
|
), elementType)).toBe('foo bar');
|
|
});
|
|
});
|