jsx-no-undef.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. /**
  2. * @fileoverview Tests for jsx-no-undef
  3. * @author Yannick Croissant
  4. */
  5. 'use strict';
  6. // -----------------------------------------------------------------------------
  7. // Requirements
  8. // -----------------------------------------------------------------------------
  9. const eslint = require('eslint');
  10. const rule = require('../../../lib/rules/jsx-no-undef');
  11. const RuleTester = eslint.RuleTester;
  12. const parserOptions = {
  13. ecmaVersion: 2018,
  14. ecmaFeatures: {
  15. jsx: true
  16. }
  17. };
  18. // -----------------------------------------------------------------------------
  19. // Tests
  20. // -----------------------------------------------------------------------------
  21. const ruleTester = new RuleTester({parserOptions});
  22. const linter = ruleTester.linter || eslint.linter;
  23. linter.defineRule('no-undef', require('eslint/lib/rules/no-undef'));
  24. ruleTester.run('jsx-no-undef', rule, {
  25. valid: [{
  26. code: '/*eslint no-undef:1*/ var React, App; React.render(<App />);'
  27. }, {
  28. code: '/*eslint no-undef:1*/ var React, App; React.render(<App />);'
  29. }, {
  30. code: '/*eslint no-undef:1*/ var React; React.render(<img />);'
  31. }, {
  32. code: '/*eslint no-undef:1*/ var React; React.render(<x-gif />);'
  33. }, {
  34. code: '/*eslint no-undef:1*/ var React, app; React.render(<app.Foo />);'
  35. }, {
  36. code: '/*eslint no-undef:1*/ var React, app; React.render(<app.foo.Bar />);'
  37. }, {
  38. code: `
  39. /*eslint no-undef:1*/
  40. var React;
  41. class Hello extends React.Component {
  42. render() {
  43. return <this.props.tag />
  44. }
  45. }
  46. `
  47. }, {
  48. code: 'var React; React.render(<Text />);',
  49. globals: {
  50. Text: true
  51. }
  52. }, {
  53. code: `
  54. import Text from "cool-module";
  55. const TextWrapper = function (props) {
  56. return (
  57. <Text />
  58. );
  59. };
  60. `,
  61. parserOptions: Object.assign({sourceType: 'module'}, parserOptions),
  62. options: [{
  63. allowGlobals: false
  64. }],
  65. parser: 'babel-eslint'
  66. }],
  67. invalid: [{
  68. code: '/*eslint no-undef:1*/ var React; React.render(<App />);',
  69. errors: [{
  70. message: '\'App\' is not defined.'
  71. }]
  72. }, {
  73. code: '/*eslint no-undef:1*/ var React; React.render(<Appp.Foo />);',
  74. errors: [{
  75. message: '\'Appp\' is not defined.'
  76. }]
  77. }, {
  78. code: '/*eslint no-undef:1*/ var React; React.render(<Apppp:Foo />);',
  79. errors: [{
  80. message: '\'Apppp\' is not defined.'
  81. }]
  82. }, {
  83. code: '/*eslint no-undef:1*/ var React; React.render(<appp.Foo />);',
  84. errors: [{
  85. message: '\'appp\' is not defined.'
  86. }]
  87. }, {
  88. code: '/*eslint no-undef:1*/ var React; React.render(<appp.foo.Bar />);',
  89. errors: [{
  90. message: '\'appp\' is not defined.'
  91. }]
  92. }, {
  93. code: `
  94. const TextWrapper = function (props) {
  95. return (
  96. <Text />
  97. );
  98. };
  99. export default TextWrapper;
  100. `,
  101. parserOptions: Object.assign({sourceType: 'module'}, parserOptions),
  102. errors: [{
  103. message: '\'Text\' is not defined.'
  104. }],
  105. options: [{
  106. allowGlobals: false
  107. }],
  108. parser: 'babel-eslint',
  109. globals: {
  110. Text: true
  111. }
  112. }, {
  113. code: '/*eslint no-undef:1*/ var React; React.render(<Foo />);',
  114. errors: [{
  115. message: '\'Foo\' is not defined.'
  116. }]
  117. }]
  118. });