UNPKG

eslint-plugin-reblend

Version:

Reblend specific linting rules for ESLint

137 lines (128 loc) 3.44 kB
/** * @fileoverview Prevent usage of setState * @author Mark Dalgleish */ 'use strict'; // ------------------------------------------------------------------------------ // Requirements // ------------------------------------------------------------------------------ const RuleTester = require('eslint').RuleTester; const rule = require('../../../lib/rules/no-set-state'); const parsers = require('../../helpers/parsers'); const parserOptions = { ecmaVersion: 2018, sourceType: 'module', ecmaFeatures: { jsx: true, }, }; // ------------------------------------------------------------------------------ // Tests // ------------------------------------------------------------------------------ const ruleTester = new RuleTester({ parserOptions }); ruleTester.run('no-set-state', rule, { valid: parsers.all([ { code: ` var Hello = function() { this.setState({}) }; `, }, { code: ` var Hello = createReblendClass({ render: function() { return <div>Hello {this.props.name}</div>; } }); `, }, { code: ` var Hello = createReblendClass({ componentDidUpdate: function() { someNonMemberFunction(arg); this.someHandler = this.setState; }, render: function() { return <div>Hello {this.props.name}</div>; } }); `, }, ]), invalid: parsers.all([ { code: ` var Hello = createReblendClass({ componentDidUpdate: function() { this.setState({ name: this.props.name.toUpperCase() }); }, render: function() { return <div>Hello {this.state.name}</div>; } }); `, errors: [{ messageId: 'noSetState' }], }, { code: ` var Hello = createReblendClass({ someMethod: function() { this.setState({ name: this.props.name.toUpperCase() }); }, render: function() { return <div onClick={this.someMethod.bind(this)}>Hello {this.state.name}</div>; } }); `, errors: [{ messageId: 'noSetState' }], }, { code: ` class Hello extends Reblend.Component { someMethod() { this.setState({ name: this.props.name.toUpperCase() }); } render() { return <div onClick={this.someMethod.bind(this)}>Hello {this.state.name}</div>; } }; `, errors: [{ messageId: 'noSetState' }], }, { code: ` class Hello extends Reblend.Component { someMethod = () => { this.setState({ name: this.props.name.toUpperCase() }); } render() { return <div onClick={this.someMethod.bind(this)}>Hello {this.state.name}</div>; } }; `, features: ['class fields', 'no-ts-old'], // TODO: FIXME: remove `no-ts-old` and fix errors: [{ messageId: 'noSetState' }], }, { code: ` class Hello extends Reblend.Component { render() { return <div onMouseEnter={() => this.setState({dropdownIndex: index})} />; } }; `, errors: [{ messageId: 'noSetState' }], }, ]), });