prefer-todo.js 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.default = void 0;
  6. var _utils = require("@typescript-eslint/utils");
  7. var _utils2 = require("./utils");
  8. function isEmptyFunction(node) {
  9. if (!(0, _utils2.isFunction)(node)) {
  10. return false;
  11. }
  12. return node.body.type === _utils.AST_NODE_TYPES.BlockStatement && !node.body.body.length;
  13. }
  14. function createTodoFixer(jestFnCall, fixer) {
  15. if (jestFnCall.members.length) {
  16. return (0, _utils2.replaceAccessorFixer)(fixer, jestFnCall.members[0], 'todo');
  17. }
  18. return fixer.replaceText(jestFnCall.head.node, `${jestFnCall.head.local}.todo`);
  19. }
  20. const isTargetedTestCase = jestFnCall => {
  21. if (jestFnCall.members.some(s => (0, _utils2.getAccessorValue)(s) !== 'skip')) {
  22. return false;
  23. } // todo: we should support this too (needs custom fixer)
  24. if (jestFnCall.name.startsWith('x')) {
  25. return false;
  26. }
  27. return !jestFnCall.name.startsWith('f');
  28. };
  29. var _default = (0, _utils2.createRule)({
  30. name: __filename,
  31. meta: {
  32. docs: {
  33. category: 'Best Practices',
  34. description: 'Suggest using `test.todo`',
  35. recommended: false
  36. },
  37. messages: {
  38. emptyTest: 'Prefer todo test case over empty test case',
  39. unimplementedTest: 'Prefer todo test case over unimplemented test case'
  40. },
  41. fixable: 'code',
  42. schema: [],
  43. type: 'layout'
  44. },
  45. defaultOptions: [],
  46. create(context) {
  47. return {
  48. CallExpression(node) {
  49. const [title, callback] = node.arguments;
  50. const jestFnCall = (0, _utils2.parseJestFnCall)(node, context);
  51. if (!title || (jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) !== 'test' || !isTargetedTestCase(jestFnCall) || !(0, _utils2.isStringNode)(title)) {
  52. return;
  53. }
  54. if (callback && isEmptyFunction(callback)) {
  55. context.report({
  56. messageId: 'emptyTest',
  57. node,
  58. fix: fixer => [fixer.removeRange([title.range[1], callback.range[1]]), createTodoFixer(jestFnCall, fixer)]
  59. });
  60. }
  61. if ((0, _utils2.hasOnlyOneArgument)(node)) {
  62. context.report({
  63. messageId: 'unimplementedTest',
  64. node,
  65. fix: fixer => createTodoFixer(jestFnCall, fixer)
  66. });
  67. }
  68. }
  69. };
  70. }
  71. });
  72. exports.default = _default;