/
isReactComponentClass-test.js
153 lines (124 loc) · 4.71 KB
/
isReactComponentClass-test.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
*/
import { expression, statement, parse } from '../../../tests/utils';
import isReactComponentClass from '../isReactComponentClass';
describe('isReactComponentClass', () => {
describe('render method', () => {
it('ignores class declarations with a render method without superclass', () => {
const def = statement('class Foo { render() {}}');
expect(isReactComponentClass(def)).toBe(false);
});
it('ignores class expression with a render method without superclass', () => {
const def = expression('class { render() {}}');
expect(isReactComponentClass(def)).toBe(false);
});
it('ignores static render methods', () => {
const def = statement('class Foo { static render() {}}');
expect(isReactComponentClass(def)).toBe(false);
});
it('ignores dynamic render methods', () => {
const def = statement('class Foo { static [render]() {}}');
expect(isReactComponentClass(def)).toBe(false);
});
it('ignores getter or setter render methods', () => {
let def = statement('class Foo { get render() {}}');
expect(isReactComponentClass(def)).toBe(false);
def = statement('class Foo { set render(value) {}}');
expect(isReactComponentClass(def)).toBe(false);
});
});
describe('JSDoc @extends React.Component', () => {
it('accepts class declarations declaring `@extends React.Component` in JSDoc', () => {
const def = parse(`
var React = require('react');
/**
* @class Foo
* @extends React.Component
*/
class Foo extends Bar {}
`).get('body', 1);
expect(isReactComponentClass(def)).toBe(true);
});
});
describe('React.Component inheritance', () => {
it('accepts class declarations extending React.Component', () => {
const def = parse(`
var React = require('react');
class Foo extends React.Component {}
`).get('body', 1);
expect(isReactComponentClass(def)).toBe(true);
});
it('accepts class expressions extending React.Component', () => {
const def = parse(`
var React = require('react');
var Foo = class extends React.Component {}
`).get('body', 1, 'declarations', 0, 'init');
expect(isReactComponentClass(def)).toBe(true);
});
it('resolves the super class reference', () => {
const def = parse(`
var {Component} = require('react');
var C = Component;
class Foo extends C {}
`).get('body', 2);
expect(isReactComponentClass(def)).toBe(true);
});
it('does not accept references to other modules', () => {
const def = parse(`
var {Component} = require('FakeReact');
class Foo extends Component {}
`).get('body', 1);
expect(isReactComponentClass(def)).toBe(false);
});
it('does not consider super class if render method is present', () => {
const def = parse(`
var {Component} = require('FakeReact');
class Foo extends Component { render() {} }
`).get('body', 1);
expect(isReactComponentClass(def)).toBe(true);
});
});
describe('React.PureComponent inheritance', () => {
it('accepts class declarations extending React.PureComponent', () => {
const def = parse(`
var React = require('react');
class Foo extends React.PureComponent {}
`).get('body', 1);
expect(isReactComponentClass(def)).toBe(true);
});
it('accepts class expressions extending React.PureComponent', () => {
const def = parse(`
var React = require('react');
var Foo = class extends React.PureComponent {}
`).get('body', 1, 'declarations', 0, 'init');
expect(isReactComponentClass(def)).toBe(true);
});
it('resolves the super class reference', () => {
const def = parse(`
var {PureComponent} = require('react');
var C = PureComponent;
class Foo extends C {}
`).get('body', 2);
expect(isReactComponentClass(def)).toBe(true);
});
it('does not accept references to other modules', () => {
const def = parse(`
var {PureComponent} = require('FakeReact');
class Foo extends PureComponent {}
`).get('body', 1);
expect(isReactComponentClass(def)).toBe(false);
});
it('does not consider super class if render method is present', () => {
const def = parse(`
var {PureComponent} = require('FakeReact');
class Foo extends PureComponent { render() {} }
`).get('body', 1);
expect(isReactComponentClass(def)).toBe(true);
});
});
});