Skip to content

Commit 657b487

Browse files
phateddanez
authored andcommitted
Add importer tests for findAllComponentDefinitions resolver
1 parent 9f90ded commit 657b487

File tree

1 file changed

+104
-7
lines changed

1 file changed

+104
-7
lines changed

src/resolver/__tests__/findAllComponentDefinitions-test.js

Lines changed: 104 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,59 @@
77
*/
88

99
import { NodePath } from 'ast-types';
10-
import * as utils from '../../../tests/utils';
10+
import {
11+
getParser,
12+
parse as parseSource,
13+
statement,
14+
noopImporter,
15+
makeMockImporter,
16+
} from '../../../tests/utils';
1117
import findAllComponentDefinitions from '../findAllComponentDefinitions';
1218

1319
describe('findAllComponentDefinitions', () => {
14-
function parse(source, importer = utils.noopImporter) {
20+
function parse(source, importer = noopImporter) {
1521
return findAllComponentDefinitions(
16-
utils.parse(source),
17-
utils.getParser(),
22+
parseSource(source),
23+
getParser(),
1824
importer,
1925
);
2026
}
2127

28+
const mockImporter = makeMockImporter({
29+
obj: statement(`
30+
export default {};
31+
`).get('declaration'),
32+
33+
reactComponent: statement(`
34+
export default React.Component;
35+
import React from 'react';
36+
`).get('declaration'),
37+
38+
reactPureComponent: statement(`
39+
export default React.PureComponent;
40+
import React from 'react';
41+
`).get('declaration'),
42+
43+
jsxDiv: statement(`
44+
export default <div />;
45+
`).get('declaration'),
46+
47+
createElement: statement(`
48+
export default React.createElement('div', null);
49+
import React from 'react';
50+
`).get('declaration'),
51+
52+
arrowJsx: statement(`
53+
export default (props) => <div>{props.children}</div>;
54+
`).get('declaration'),
55+
56+
coloredView: statement(`
57+
export default function ColoredView(props, ref) {
58+
return <div ref={ref} style={{backgroundColor: props.color}} />
59+
};
60+
`).get('declaration'),
61+
});
62+
2263
describe('React.createClass', () => {
2364
it('finds React.createClass', () => {
2465
const source = `
@@ -34,6 +75,21 @@ describe('findAllComponentDefinitions', () => {
3475
expect(result[0].node.type).toBe('ObjectExpression');
3576
});
3677

78+
it('resolves imported values inside React.createClass', () => {
79+
const source = `
80+
import obj from 'obj';
81+
var React = require("React");
82+
var Component = React.createClass(obj);
83+
module.exports = Component;
84+
`;
85+
86+
const result = parse(source, mockImporter);
87+
expect(Array.isArray(result)).toBe(true);
88+
expect(result.length).toBe(1);
89+
expect(result[0] instanceof NodePath).toBe(true);
90+
expect(result[0].node.type).toBe('ObjectExpression');
91+
});
92+
3793
it('finds React.createClass, independent of the var name', () => {
3894
const source = `
3995
var R = require("React");
@@ -112,7 +168,20 @@ describe('findAllComponentDefinitions', () => {
112168
expect(result.length).toBe(4);
113169
});
114170

115-
it('finds React.createClass, independent of the var name', () => {
171+
it('resolves extends React.Component/React.PureComponent from import', () => {
172+
const source = `
173+
import Component from 'reactComponent';
174+
import PureComponent from 'reactPureComponent';
175+
class ComponentA extends Component {}
176+
var ComponentC = class extends PureComponent {}
177+
`;
178+
179+
const result = parse(source, mockImporter);
180+
expect(Array.isArray(result)).toBe(true);
181+
expect(result.length).toBe(2);
182+
});
183+
184+
it('finds React.Component, independent of the var name', () => {
116185
const source = `
117186
import R from 'React';
118187
class Component extends R.Component {};
@@ -123,7 +192,7 @@ describe('findAllComponentDefinitions', () => {
123192
expect(result.length).toBe(1);
124193
});
125194

126-
it('does not process X.createClass of other modules', () => {
195+
it('does not process X.Component of other modules', () => {
127196
const source = `
128197
import R from 'FakeReact';
129198
class Component extends R.Component {};
@@ -166,6 +235,21 @@ describe('findAllComponentDefinitions', () => {
166235
expect(result.length).toBe(7);
167236
});
168237

238+
it('resolve renders from imports', () => {
239+
const source = `
240+
import jsxDiv from 'jsxDiv';
241+
import createElement from 'createElement';
242+
import arrowJsx from 'arrowJsx';
243+
let ComponentA = () => jsxDiv;
244+
function ComponentB () { return createElement; }
245+
const ComponentC = function(props) { return arrowJsx(props); };
246+
`;
247+
248+
const result = parse(source, mockImporter);
249+
expect(Array.isArray(result)).toBe(true);
250+
expect(result.length).toBe(3);
251+
});
252+
169253
it('finds React.createElement, independent of the var name', () => {
170254
const source = `
171255
import AlphaBetters from 'react';
@@ -178,7 +262,7 @@ describe('findAllComponentDefinitions', () => {
178262
expect(result.length).toBe(1);
179263
});
180264

181-
it('does not process X.createClass of other modules', () => {
265+
it('does not process X.createElement of other modules', () => {
182266
const source = `
183267
import R from 'FakeReact';
184268
const ComponentA = () => R.createElement('div', null);
@@ -228,6 +312,19 @@ describe('findAllComponentDefinitions', () => {
228312
expect(result.length).toBe(1);
229313
expect(result[0].value.type).toEqual('CallExpression');
230314
});
315+
316+
it('resolves imported component wrapped with forwardRef', () => {
317+
const source = `
318+
import React from 'react';
319+
import ColoredView from 'coloredView';
320+
const ForwardedColoredView = React.forwardRef(ColoredView);
321+
`;
322+
323+
const result = parse(source, mockImporter);
324+
expect(Array.isArray(result)).toBe(true);
325+
expect(result.length).toBe(1);
326+
expect(result[0].value.type).toEqual('CallExpression');
327+
});
231328
});
232329

233330
describe('regressions', () => {

0 commit comments

Comments
 (0)