prefer-presence-queries.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.RULE_NAME = void 0;
  4. const create_testing_library_rule_1 = require("../create-testing-library-rule");
  5. const node_utils_1 = require("../node-utils");
  6. exports.RULE_NAME = 'prefer-presence-queries';
  7. exports.default = (0, create_testing_library_rule_1.createTestingLibraryRule)({
  8. name: exports.RULE_NAME,
  9. meta: {
  10. docs: {
  11. description: 'Ensure appropriate `get*`/`query*` queries are used with their respective matchers',
  12. recommendedConfig: {
  13. dom: 'error',
  14. angular: 'error',
  15. react: 'error',
  16. vue: 'error',
  17. marko: 'error',
  18. },
  19. },
  20. messages: {
  21. wrongPresenceQuery: 'Use `getBy*` queries rather than `queryBy*` for checking element is present',
  22. wrongAbsenceQuery: 'Use `queryBy*` queries rather than `getBy*` for checking element is NOT present',
  23. },
  24. schema: [
  25. {
  26. type: 'object',
  27. additionalProperties: false,
  28. properties: {
  29. presence: {
  30. type: 'boolean',
  31. },
  32. absence: {
  33. type: 'boolean',
  34. },
  35. },
  36. },
  37. ],
  38. type: 'suggestion',
  39. },
  40. defaultOptions: [
  41. {
  42. presence: true,
  43. absence: true,
  44. },
  45. ],
  46. create(context, [{ absence = true, presence = true }], helpers) {
  47. return {
  48. 'CallExpression Identifier'(node) {
  49. const expectCallNode = (0, node_utils_1.findClosestCallNode)(node, 'expect');
  50. const withinCallNode = (0, node_utils_1.findClosestCallNode)(node, 'within');
  51. if (!expectCallNode || !(0, node_utils_1.isMemberExpression)(expectCallNode.parent)) {
  52. return;
  53. }
  54. if (!helpers.isSyncQuery(node)) {
  55. return;
  56. }
  57. const isPresenceQuery = helpers.isGetQueryVariant(node);
  58. const expectStatement = expectCallNode.parent;
  59. const isPresenceAssert = helpers.isPresenceAssert(expectStatement);
  60. const isAbsenceAssert = helpers.isAbsenceAssert(expectStatement);
  61. if (!isPresenceAssert && !isAbsenceAssert) {
  62. return;
  63. }
  64. if (presence &&
  65. (withinCallNode || isPresenceAssert) &&
  66. !isPresenceQuery) {
  67. context.report({ node, messageId: 'wrongPresenceQuery' });
  68. }
  69. else if (!withinCallNode &&
  70. absence &&
  71. isAbsenceAssert &&
  72. isPresenceQuery) {
  73. context.report({ node, messageId: 'wrongAbsenceQuery' });
  74. }
  75. },
  76. };
  77. },
  78. });