Skip to content

Commit 3e89744

Browse files
phateddanez
authored andcommitted
Add importer tests for findAllExportedComponentDefinitions resolver
1 parent 251b0f7 commit 3e89744

File tree

1 file changed

+242
-8
lines changed

1 file changed

+242
-8
lines changed

src/resolver/__tests__/findAllExportedComponentDefinitions-test.js

Lines changed: 242 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,59 @@
66
*
77
*/
88

9-
import * as utils from '../../../tests/utils';
9+
import {
10+
getParser,
11+
parse as parseSource,
12+
statement,
13+
noopImporter,
14+
makeMockImporter,
15+
} from '../../../tests/utils';
1016

1117
import findAllExportedComponentDefinitions from '../findAllExportedComponentDefinitions';
1218

1319
describe('findAllExportedComponentDefinitions', () => {
1420
function parse(source) {
15-
return utils.parse(source);
21+
return parseSource(source);
1622
}
1723

18-
function findComponents(path, importer = utils.noopImporter) {
19-
return findAllExportedComponentDefinitions(
20-
path,
21-
utils.getParser(),
22-
importer,
23-
);
24+
function findComponents(path, importer = noopImporter) {
25+
return findAllExportedComponentDefinitions(path, getParser(), importer);
2426
}
2527

28+
const mockImporter = makeMockImporter({
29+
createClass: statement(`
30+
export default React.createClass({});
31+
import React from 'react';
32+
`).get('declaration'),
33+
34+
classDec: statement(`
35+
export default class Component extends React.Component {};
36+
import React from 'react';
37+
`).get('declaration'),
38+
39+
classExpr: statement(`
40+
export default Component;
41+
var Component = class extends React.Component {};
42+
import React from 'react';
43+
`).get('declaration'),
44+
45+
statelessJsx: statement(`
46+
export default () => <div />;
47+
`).get('declaration'),
48+
49+
statelessCreateElement: statement(`
50+
export default () => React.createElement('div', {});
51+
import React from 'react';
52+
`).get('declaration'),
53+
54+
forwardRef: statement(`
55+
export default React.forwardRef((props, ref) => (
56+
<div ref={ref} style={{backgroundColor: props.color}} />
57+
));
58+
import React from 'react';
59+
`).get('declaration'),
60+
});
61+
2662
describe('CommonJS module exports', () => {
2763
describe('React.createClass', () => {
2864
it('finds React.createClass', () => {
@@ -67,6 +103,16 @@ describe('findAllExportedComponentDefinitions', () => {
67103

68104
expect(actual.length).toBe(0);
69105
});
106+
107+
it('resolves an imported variable to React.createClass', () => {
108+
const parsed = parse(`
109+
import Component from 'createClass';
110+
module.exports = Component;
111+
`);
112+
const actual = findComponents(parsed, mockImporter);
113+
114+
expect(actual.length).toBe(1);
115+
});
70116
});
71117

72118
describe('class definitions', () => {
@@ -104,6 +150,26 @@ describe('findAllExportedComponentDefinitions', () => {
104150

105151
expect(actual.length).toBe(1);
106152
});
153+
154+
it('resolves an imported variable to class declaration', () => {
155+
const parsed = parse(`
156+
import Component from 'classDec';
157+
module.exports = Component;
158+
`);
159+
const actual = findComponents(parsed, mockImporter);
160+
161+
expect(actual.length).toBe(1);
162+
});
163+
164+
it('resolves an imported variable to class expression', () => {
165+
const parsed = parse(`
166+
import Component from 'classExpr';
167+
module.exports = Component;
168+
`);
169+
const actual = findComponents(parsed, mockImporter);
170+
171+
expect(actual.length).toBe(1);
172+
});
107173
});
108174

109175
describe('stateless components', () => {
@@ -141,6 +207,26 @@ describe('findAllExportedComponentDefinitions', () => {
141207

142208
expect(actual.length).toBe(0);
143209
});
210+
211+
it('resolves an imported stateless component with JSX', () => {
212+
const parsed = parse(`
213+
import Component from 'statelessJsx';
214+
module.exports = Component;
215+
`);
216+
const actual = findComponents(parsed, mockImporter);
217+
218+
expect(actual.length).toBe(1);
219+
});
220+
221+
it('resolves an imported stateless component with React.createElement', () => {
222+
const parsed = parse(`
223+
import Component from 'statelessCreateElement';
224+
module.exports = Component;
225+
`);
226+
const actual = findComponents(parsed, mockImporter);
227+
228+
expect(actual.length).toBe(1);
229+
});
144230
});
145231

146232
describe('forwardRef components', () => {
@@ -185,6 +271,17 @@ describe('findAllExportedComponentDefinitions', () => {
185271
expect(actual.length).toBe(1);
186272
expect(actual[0].value.type).toEqual('CallExpression');
187273
});
274+
275+
it('resolves an imported forwardRef component', () => {
276+
const parsed = parse(`
277+
import Component from 'forwardRef';
278+
module.exports = Component;
279+
`);
280+
const actual = findComponents(parsed, mockImporter);
281+
282+
expect(actual.length).toBe(1);
283+
expect(actual[0].value.type).toEqual('CallExpression');
284+
});
188285
});
189286

190287
describe('module.exports = <C>; / exports.foo = <C>;', () => {
@@ -310,6 +407,17 @@ describe('findAllExportedComponentDefinitions', () => {
310407

311408
expect(actual.length).toBe(1);
312409
});
410+
411+
it('supports imported components', () => {
412+
const parsed = parse(`
413+
import Component from 'createClass';
414+
exports.ComponentA = Component;
415+
exports.ComponentB = Component;
416+
`);
417+
const actual = findComponents(parsed, mockImporter);
418+
419+
expect(actual.length).toBe(1);
420+
});
313421
});
314422

315423
describe('class definition', () => {
@@ -377,6 +485,17 @@ describe('findAllExportedComponentDefinitions', () => {
377485

378486
expect(actual.length).toBe(1);
379487
});
488+
489+
it('supports imported components', () => {
490+
const parsed = parse(`
491+
import Component from 'classDec';
492+
exports.ComponentA = Component;
493+
exports.ComponentB = Component;
494+
`);
495+
const actual = findComponents(parsed, mockImporter);
496+
497+
expect(actual.length).toBe(1);
498+
});
380499
});
381500
});
382501
});
@@ -463,6 +582,16 @@ describe('findAllExportedComponentDefinitions', () => {
463582

464583
expect(actual.length).toBe(1);
465584
});
585+
586+
it('supports imported components', () => {
587+
const parsed = parse(`
588+
import Component from 'createClass';
589+
export default Component;
590+
`);
591+
const actual = findComponents(parsed, mockImporter);
592+
593+
expect(actual.length).toBe(1);
594+
});
466595
});
467596

468597
describe('class definition', () => {
@@ -529,6 +658,16 @@ describe('findAllExportedComponentDefinitions', () => {
529658

530659
expect(actual.length).toBe(1);
531660
});
661+
662+
it('supports imported components', () => {
663+
const parsed = parse(`
664+
import Component from 'classDec';
665+
export default Component;
666+
`);
667+
const actual = findComponents(parsed, mockImporter);
668+
669+
expect(actual.length).toBe(1);
670+
});
532671
});
533672

534673
describe('forwardRef components', () => {
@@ -573,6 +712,16 @@ describe('findAllExportedComponentDefinitions', () => {
573712
expect(actual.length).toBe(1);
574713
expect(actual[0].value.type).toEqual('CallExpression');
575714
});
715+
716+
it('supports imported components', () => {
717+
const parsed = parse(`
718+
import Component from 'forwardRef';
719+
export default Component;
720+
`);
721+
const actual = findComponents(parsed, mockImporter);
722+
723+
expect(actual.length).toBe(1);
724+
});
576725
});
577726
});
578727

@@ -657,6 +806,17 @@ describe('findAllExportedComponentDefinitions', () => {
657806

658807
expect(actual.length).toBe(1);
659808
});
809+
810+
it('supports imported components', () => {
811+
const parsed = parse(`
812+
import Component from 'createClass';
813+
export let ComponentA = Component;
814+
export let ComponentB = Component;
815+
`);
816+
const actual = findComponents(parsed, mockImporter);
817+
818+
expect(actual.length).toBe(1);
819+
});
660820
});
661821

662822
describe('class definition', () => {
@@ -743,6 +903,17 @@ describe('findAllExportedComponentDefinitions', () => {
743903
expect(actual.length).toBe(1);
744904
expect(actual[0].node.type).toBe('ClassExpression');
745905
});
906+
907+
it('supports imported components', () => {
908+
const parsed = parse(`
909+
import Component from 'classDec';
910+
export let ComponentA = Component;
911+
export let ComponentB = Component;
912+
`);
913+
const actual = findComponents(parsed, mockImporter);
914+
915+
expect(actual.length).toBe(1);
916+
});
746917
});
747918

748919
describe('stateless components', () => {
@@ -821,6 +992,17 @@ describe('findAllExportedComponentDefinitions', () => {
821992
expect(actual.length).toBe(1);
822993
expect(actual[0].node.type).toBe('FunctionExpression');
823994
});
995+
996+
it('supports imported components', () => {
997+
const parsed = parse(`
998+
import Component1 from 'statelessJsx';
999+
import Component2 from 'statelessCreateElement';
1000+
export var ComponentA = Component1, ComponentB = Component2;
1001+
`);
1002+
const actual = findComponents(parsed, mockImporter);
1003+
1004+
expect(actual.length).toBe(2);
1005+
});
8241006
});
8251007

8261008
describe('forwardRef components', () => {
@@ -841,6 +1023,17 @@ describe('findAllExportedComponentDefinitions', () => {
8411023
expect(actual.length).toBe(1);
8421024
expect(actual[0].value.type).toEqual('CallExpression');
8431025
});
1026+
1027+
it('supports imported components', () => {
1028+
const parsed = parse(`
1029+
import Component from 'forwardRef';
1030+
export let ComponentA = Component;
1031+
export let ComponentB = Component;
1032+
`);
1033+
const actual = findComponents(parsed, mockImporter);
1034+
1035+
expect(actual.length).toBe(1);
1036+
});
8441037
});
8451038
});
8461039

@@ -935,6 +1128,16 @@ describe('findAllExportedComponentDefinitions', () => {
9351128

9361129
expect(actual.length).toBe(1);
9371130
});
1131+
1132+
it('supports imported components', () => {
1133+
const parsed = parse(`
1134+
import Component from 'createClass';
1135+
export { Component, Component as ComponentB };
1136+
`);
1137+
const actual = findComponents(parsed, mockImporter);
1138+
1139+
expect(actual.length).toBe(1);
1140+
});
9381141
});
9391142

9401143
describe('class definition', () => {
@@ -1025,6 +1228,16 @@ describe('findAllExportedComponentDefinitions', () => {
10251228
expect(actual.length).toBe(1);
10261229
expect(actual[0].node.type).toBe('ClassExpression');
10271230
});
1231+
1232+
it('supports imported components', () => {
1233+
const parsed = parse(`
1234+
import Component from 'classDec';
1235+
export { Component, Component as ComponentB };
1236+
`);
1237+
const actual = findComponents(parsed, mockImporter);
1238+
1239+
expect(actual.length).toBe(1);
1240+
});
10281241
});
10291242

10301243
describe('stateless components', () => {
@@ -1101,6 +1314,17 @@ describe('findAllExportedComponentDefinitions', () => {
11011314
expect(actual.length).toBe(1);
11021315
expect(actual[0].node.type).toBe('ArrowFunctionExpression');
11031316
});
1317+
1318+
it('supports imported components', () => {
1319+
const parsed = parse(`
1320+
import ComponentA from 'statelessJsx';
1321+
import ComponentB from 'statelessCreateElement';
1322+
export { ComponentA, ComponentB };
1323+
`);
1324+
const actual = findComponents(parsed, mockImporter);
1325+
1326+
expect(actual.length).toBe(2);
1327+
});
11041328
});
11051329

11061330
describe('forwardRef components', () => {
@@ -1123,6 +1347,16 @@ describe('findAllExportedComponentDefinitions', () => {
11231347
expect(actual.length).toBe(1);
11241348
expect(actual[0].value.type).toEqual('CallExpression');
11251349
});
1350+
1351+
it('supports imported components', () => {
1352+
const parsed = parse(`
1353+
import Component from 'forwardRef';
1354+
export { Component, Component as ComponentB };
1355+
`);
1356+
const actual = findComponents(parsed, mockImporter);
1357+
1358+
expect(actual.length).toBe(1);
1359+
});
11261360
});
11271361
});
11281362

0 commit comments

Comments
 (0)