to-have-accessible-errormessage.js 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.toHaveAccessibleErrorMessage = toHaveAccessibleErrorMessage;
  6. var _utils = require("./utils");
  7. const ariaInvalidName = 'aria-invalid';
  8. const validStates = ['false'];
  9. // See `aria-errormessage` spec at https://www.w3.org/TR/wai-aria-1.2/#aria-errormessage
  10. function toHaveAccessibleErrorMessage(htmlElement, expectedAccessibleErrorMessage) {
  11. var _htmlElement$ownerDoc, _htmlElement$ownerDoc2;
  12. (0, _utils.checkHtmlElement)(htmlElement, toHaveAccessibleErrorMessage, this);
  13. const to = this.isNot ? 'not to' : 'to';
  14. const method = this.isNot ? '.not.toHaveAccessibleErrorMessage' : '.toHaveAccessibleErrorMessage';
  15. // Enforce Valid Id
  16. const errormessageId = htmlElement.getAttribute('aria-errormessage');
  17. const errormessageIdInvalid = !!errormessageId && /\s+/.test(errormessageId);
  18. if (errormessageIdInvalid) {
  19. return {
  20. pass: false,
  21. message: () => {
  22. return (0, _utils.getMessage)(this, this.utils.matcherHint(method, 'element'), "Expected element's `aria-errormessage` attribute to be empty or a single, valid ID", '', 'Received', `aria-errormessage="${errormessageId}"`);
  23. }
  24. };
  25. }
  26. // See `aria-invalid` spec at https://www.w3.org/TR/wai-aria-1.2/#aria-invalid
  27. const ariaInvalidVal = htmlElement.getAttribute(ariaInvalidName);
  28. const fieldValid = !htmlElement.hasAttribute(ariaInvalidName) || validStates.includes(ariaInvalidVal);
  29. // Enforce Valid `aria-invalid` Attribute
  30. if (fieldValid) {
  31. return {
  32. pass: false,
  33. message: () => {
  34. return (0, _utils.getMessage)(this, this.utils.matcherHint(method, 'element'), 'Expected element to be marked as invalid with attribute', `${ariaInvalidName}="${String(true)}"`, 'Received', htmlElement.hasAttribute('aria-invalid') ? `${ariaInvalidName}="${htmlElement.getAttribute(ariaInvalidName)}` : null);
  35. }
  36. };
  37. }
  38. const error = (0, _utils.normalize)((_htmlElement$ownerDoc = (_htmlElement$ownerDoc2 = htmlElement.ownerDocument.getElementById(errormessageId)) == null ? void 0 : _htmlElement$ownerDoc2.textContent) != null ? _htmlElement$ownerDoc : '');
  39. return {
  40. pass: expectedAccessibleErrorMessage === undefined ? Boolean(error) : expectedAccessibleErrorMessage instanceof RegExp ? expectedAccessibleErrorMessage.test(error) : this.equals(error, expectedAccessibleErrorMessage),
  41. message: () => {
  42. return (0, _utils.getMessage)(this, this.utils.matcherHint(method, 'element'), `Expected element ${to} have accessible error message`, expectedAccessibleErrorMessage != null ? expectedAccessibleErrorMessage : '', 'Received', error);
  43. }
  44. };
  45. }