require-optimization.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. /**
  2. * @fileoverview Enforce React components to have a shouldComponentUpdate method
  3. * @author Evgueni Naverniouk
  4. */
  5. 'use strict';
  6. const rule = require('../../../lib/rules/require-optimization');
  7. const RuleTester = require('eslint').RuleTester;
  8. const parserOptions = {
  9. ecmaVersion: 2018,
  10. sourceType: 'module',
  11. ecmaFeatures: {
  12. jsx: true
  13. }
  14. };
  15. const MESSAGE = 'Component is not optimized. Please add a shouldComponentUpdate method.';
  16. const ruleTester = new RuleTester({parserOptions});
  17. ruleTester.run('react-require-optimization', rule, {
  18. valid: [{
  19. code: `
  20. class A {}
  21. `
  22. }, {
  23. code: `
  24. import React from "react";
  25. class YourComponent extends React.Component {
  26. shouldComponentUpdate () {}
  27. }
  28. `
  29. }, {
  30. code: `
  31. import React, {Component} from "react";
  32. class YourComponent extends Component {
  33. shouldComponentUpdate () {}
  34. }
  35. `
  36. }, {
  37. code: `
  38. import React, {Component} from "react";
  39. @reactMixin.decorate(PureRenderMixin)
  40. class YourComponent extends Component {
  41. componetnDidMount () {}
  42. render() {}
  43. }
  44. `,
  45. parser: 'babel-eslint'
  46. }, {
  47. code: `
  48. import React from "react";
  49. createReactClass({
  50. shouldComponentUpdate: function () {}
  51. })
  52. `
  53. }, {
  54. code: `
  55. import React from "react";
  56. createReactClass({
  57. mixins: [PureRenderMixin]
  58. })
  59. `
  60. }, {
  61. code: `
  62. @reactMixin.decorate(PureRenderMixin)
  63. class DecoratedComponent extends Component {}
  64. `,
  65. parser: 'babel-eslint'
  66. }, {
  67. code: `
  68. const FunctionalComponent = function (props) {
  69. return <div />;
  70. }
  71. `,
  72. parser: 'babel-eslint'
  73. }, {
  74. code: `
  75. function FunctionalComponent(props) {
  76. return <div />;
  77. }
  78. `,
  79. parser: 'babel-eslint'
  80. }, {
  81. code: `
  82. const FunctionalComponent = (props) => {
  83. return <div />;
  84. }
  85. `,
  86. parser: 'babel-eslint'
  87. }, {
  88. code: `
  89. @bar
  90. @pureRender
  91. @foo
  92. class DecoratedComponent extends Component {}
  93. `,
  94. parser: 'babel-eslint',
  95. options: [{allowDecorators: ['renderPure', 'pureRender']}]
  96. }, {
  97. code: `
  98. import React from "react";
  99. class YourComponent extends React.PureComponent {}
  100. `,
  101. parser: 'babel-eslint',
  102. options: [{allowDecorators: ['renderPure', 'pureRender']}]
  103. }, {
  104. code: `
  105. import React, {PureComponent} from "react";
  106. class YourComponent extends PureComponent {}
  107. `,
  108. parser: 'babel-eslint',
  109. options: [{allowDecorators: ['renderPure', 'pureRender']}]
  110. }, {
  111. code: `
  112. const obj = { prop: [,,,,,] }
  113. `
  114. }],
  115. invalid: [{
  116. code: `
  117. import React from "react";
  118. class YourComponent extends React.Component {}
  119. `,
  120. errors: [{
  121. message: MESSAGE
  122. }]
  123. }, {
  124. code: `
  125. import React from "react";
  126. class YourComponent extends React.Component {
  127. handleClick() {}
  128. render() {
  129. return <div onClick={this.handleClick}>123</div>
  130. }
  131. }
  132. `,
  133. parser: 'babel-eslint',
  134. errors: [{
  135. message: MESSAGE
  136. }]
  137. }, {
  138. code: `
  139. import React, {Component} from "react";
  140. class YourComponent extends Component {}
  141. `,
  142. errors: [{
  143. message: MESSAGE
  144. }]
  145. }, {
  146. code: `
  147. import React from "react";
  148. createReactClass({})
  149. `,
  150. errors: [{
  151. message: MESSAGE
  152. }]
  153. }, {
  154. code: `
  155. import React from "react";
  156. createReactClass({
  157. mixins: [RandomMixin]
  158. })
  159. `,
  160. errors: [{
  161. message: MESSAGE
  162. }]
  163. }, {
  164. code: `
  165. @reactMixin.decorate(SomeOtherMixin)
  166. class DecoratedComponent extends Component {}
  167. `,
  168. errors: [{
  169. message: MESSAGE
  170. }],
  171. parser: 'babel-eslint'
  172. }, {
  173. code: `
  174. @bar
  175. @pure
  176. @foo
  177. class DecoratedComponent extends Component {}
  178. `,
  179. errors: [{
  180. message: MESSAGE
  181. }],
  182. parser: 'babel-eslint',
  183. options: [{allowDecorators: ['renderPure', 'pureRender']}]
  184. }]
  185. });