destructuring-assignment.js 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. /**
  2. * @fileoverview Rule to forbid or enforce destructuring assignment consistency.
  3. **/
  4. 'use strict';
  5. const rule = require('../../../lib/rules/destructuring-assignment');
  6. const RuleTester = require('eslint').RuleTester;
  7. require('babel-eslint');
  8. const parserOptions = {
  9. ecmaVersion: 2018,
  10. sourceType: 'module',
  11. ecmaFeatures: {
  12. jsx: true
  13. }
  14. };
  15. const ruleTester = new RuleTester({parserOptions});
  16. ruleTester.run('destructuring-assignment', rule, {
  17. valid: [{
  18. code: `const Foo = class extends React.PureComponent {
  19. render() {
  20. const { foo } = this.props;
  21. return <div>{foo}</div>;
  22. }
  23. };`,
  24. options: ['always'],
  25. parser: 'babel-eslint'
  26. }, {
  27. code: `const MyComponent = ({ id, className }) => (
  28. <div id={id} className={className} />
  29. );`
  30. }, {
  31. code: `const MyComponent = (props) => {
  32. const { id, className } = props;
  33. return <div id={id} className={className} />
  34. };`,
  35. parser: 'babel-eslint'
  36. }, {
  37. code: `const MyComponent = ({ id, className }) => (
  38. <div id={id} className={className} />
  39. );`,
  40. options: ['always']
  41. }, {
  42. code: `const MyComponent = (props) => {
  43. const { id, className } = props;
  44. return <div id={id} className={className} />
  45. };`
  46. }, {
  47. code: `const MyComponent = (props) => {
  48. const { id, className } = props;
  49. return <div id={id} className={className} />
  50. };`,
  51. options: ['always']
  52. }, {
  53. code: `const MyComponent = (props) => (
  54. <div id={id} props={props} />
  55. );`
  56. }, {
  57. code: `const MyComponent = (props) => (
  58. <div id={id} props={props} />
  59. );`,
  60. options: ['always']
  61. }, {
  62. code: `const MyComponent = (props, { color }) => (
  63. <div id={id} props={props} color={color} />
  64. );`
  65. }, {
  66. code: `const MyComponent = (props, { color }) => (
  67. <div id={id} props={props} color={color} />
  68. );`,
  69. options: ['always']
  70. }, {
  71. code: `const Foo = class extends React.PureComponent {
  72. render() {
  73. return <div>{this.props.foo}</div>;
  74. }
  75. };`,
  76. options: ['never']
  77. }, {
  78. code: `class Foo extends React.Component {
  79. doStuff() {}
  80. render() {
  81. return <div>{this.props.foo}</div>;
  82. }
  83. }`,
  84. options: ['never']
  85. }, {
  86. code: `const Foo = class extends React.PureComponent {
  87. render() {
  88. const { foo } = this.props;
  89. return <div>{foo}</div>;
  90. }
  91. };`
  92. }, {
  93. code: `const Foo = class extends React.PureComponent {
  94. render() {
  95. const { foo } = this.props;
  96. return <div>{foo}</div>;
  97. }
  98. };`,
  99. options: ['always'],
  100. parser: 'babel-eslint'
  101. }, {
  102. code: `const Foo = class extends React.PureComponent {
  103. render() {
  104. const { foo } = this.props;
  105. return <div>{foo}</div>;
  106. }
  107. };`
  108. }, {
  109. code: `const Foo = class extends React.PureComponent {
  110. render() {
  111. const { foo } = this.props;
  112. return <div>{foo}</div>;
  113. }
  114. };`,
  115. options: ['always'],
  116. parser: 'babel-eslint'
  117. }, {
  118. code: `const MyComponent = (props) => {
  119. const { h, i } = hi;
  120. return <div id={props.id} className={props.className} />
  121. };`,
  122. options: ['never'],
  123. parser: 'babel-eslint'
  124. }],
  125. invalid: [{
  126. code: `const MyComponent = (props) => {
  127. return (<div id={props.id} />)
  128. };`,
  129. errors: [
  130. {message: 'Must use destructuring props assignment'}
  131. ]
  132. }, {
  133. code: `const MyComponent = ({ id, className }) => (
  134. <div id={id} className={className} />
  135. );`,
  136. options: ['never'],
  137. errors: [
  138. {message: 'Must never use destructuring props assignment in SFC argument'}
  139. ]
  140. }, {
  141. code: `const MyComponent = (props, { color }) => (
  142. <div id={props.id} className={props.className} />
  143. );`,
  144. options: ['never'],
  145. errors: [
  146. {message: 'Must never use destructuring context assignment in SFC argument'}
  147. ]
  148. }, {
  149. code: `const Foo = class extends React.PureComponent {
  150. render() {
  151. return <div>{this.props.foo}</div>;
  152. }
  153. };`,
  154. errors: [
  155. {message: 'Must use destructuring props assignment'}
  156. ]
  157. }, {
  158. code: `const Foo = class extends React.PureComponent {
  159. render() {
  160. return <div>{this.state.foo}</div>;
  161. }
  162. };`,
  163. errors: [
  164. {message: 'Must use destructuring state assignment'}
  165. ]
  166. }, {
  167. code: `const Foo = class extends React.PureComponent {
  168. render() {
  169. return <div>{this.context.foo}</div>;
  170. }
  171. };`,
  172. errors: [
  173. {message: 'Must use destructuring context assignment'}
  174. ]
  175. }, {
  176. code: `class Foo extends React.Component {
  177. render() { return this.foo(); }
  178. foo() {
  179. return this.props.children;
  180. }
  181. }`,
  182. errors: [
  183. {message: 'Must use destructuring props assignment'}
  184. ]
  185. }, {
  186. code: `var Hello = React.createClass({
  187. render: function() {
  188. return <Text>{this.props.foo}</Text>;
  189. }
  190. });`,
  191. errors: [
  192. {message: 'Must use destructuring props assignment'}
  193. ]
  194. }, {
  195. code: `const Foo = class extends React.PureComponent {
  196. render() {
  197. const foo = this.props.foo;
  198. return <div>{foo}</div>;
  199. }
  200. };`,
  201. errors: [
  202. {message: 'Must use destructuring props assignment'}
  203. ]
  204. }, {
  205. code: `const Foo = class extends React.PureComponent {
  206. render() {
  207. const { foo } = this.props;
  208. return <div>{foo}</div>;
  209. }
  210. };`,
  211. options: ['never'],
  212. parser: 'babel-eslint',
  213. errors: [
  214. {message: 'Must never use destructuring props assignment'}
  215. ]
  216. }, {
  217. code: `const MyComponent = (props) => {
  218. const { id, className } = props;
  219. return <div id={id} className={className} />
  220. };`,
  221. options: ['never'],
  222. parser: 'babel-eslint',
  223. errors: [
  224. {message: 'Must never use destructuring props assignment'}
  225. ]
  226. }, {
  227. code: `const Foo = class extends React.PureComponent {
  228. render() {
  229. const { foo } = this.state;
  230. return <div>{foo}</div>;
  231. }
  232. };`,
  233. options: ['never'],
  234. parser: 'babel-eslint',
  235. errors: [
  236. {message: 'Must never use destructuring state assignment'}
  237. ]
  238. }]
  239. });