Skip to content

Commit 2bdefc1

Browse files
committed
Merge branch 'main' of https://github.com/Pythagora-io/pythagora into main
2 parents fb071ca + 7fed39e commit 2bdefc1

File tree

1 file changed

+218
-0
lines changed

1 file changed

+218
-0
lines changed
Lines changed: 218 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,218 @@
1+
describe('processAst', () => {
2+
const { processAst } = require('../../../../../src/utils/code.js');
3+
const babelParser = require("@babel/parser");
4+
5+
test('module.exports object', () => {
6+
const code = `
7+
function func1() {}
8+
module.exports = {
9+
func1
10+
};
11+
`;
12+
13+
const ast = babelParser.parse(code);
14+
const mockCallback = jest.fn();
15+
processAst(ast, mockCallback);
16+
expect(mockCallback.mock.calls[1][0]).toBe('func1');
17+
expect(mockCallback.mock.calls[1][2]).toBe('exportObj');
18+
});
19+
20+
test('ES6 export and function declarations', () => {
21+
const code = `
22+
export function func1() {}
23+
export default function func2() {}
24+
`;
25+
const ast = babelParser.parse(code, { sourceType: 'module' });
26+
const mockCallback = jest.fn();
27+
processAst(ast, mockCallback);
28+
expect(mockCallback.mock.calls.length).toBe(4);
29+
expect(mockCallback.mock.calls[0][0]).toBe('func1');
30+
expect(mockCallback.mock.calls[0][2]).toBe('exportFnDef');
31+
expect(mockCallback.mock.calls[2][0]).toBe('func2');
32+
expect(mockCallback.mock.calls[2][2]).toBe('exportFn');
33+
});
34+
35+
test('module.exports and function declaration, function expression', () => {
36+
const code = `
37+
function func1() {}
38+
module.exports = func1;
39+
module.exports.func2 = function() {};
40+
`;
41+
const ast = babelParser.parse(code);
42+
const mockCallback = jest.fn();
43+
processAst(ast, mockCallback);
44+
expect(mockCallback.mock.calls.length).toBe(3);
45+
expect(mockCallback.mock.calls[1][0]).toBe('func1');
46+
expect(mockCallback.mock.calls[1][2]).toBe('exportFn');
47+
expect(mockCallback.mock.calls[2][0]).toBe('func2');
48+
expect(mockCallback.mock.calls[2][2]).toBe('exportObj');
49+
});
50+
51+
test('module.exports and function expression with arrow function', () => {
52+
const code = `
53+
const func1 = () => {};
54+
module.exports = {
55+
func1
56+
};
57+
`;
58+
const ast = babelParser.parse(code);
59+
const mockCallback = jest.fn();
60+
processAst(ast, mockCallback);
61+
expect(mockCallback.mock.calls.length).toBe(2);
62+
expect(mockCallback.mock.calls[1][0]).toBe('func1');
63+
expect(mockCallback.mock.calls[1][2]).toBe('exportObj');
64+
});
65+
66+
test('TypeScript exports', () => {
67+
const code = `
68+
function func1() {}
69+
exports.func1 = func1;
70+
`;
71+
const ast = babelParser.parse(code);
72+
const mockCallback = jest.fn();
73+
processAst(ast, mockCallback);
74+
expect(mockCallback.mock.calls.length).toBe(2);
75+
expect(mockCallback.mock.calls[1][0]).toBe('func1');
76+
expect(mockCallback.mock.calls[1][2]).toBe('exportObj');
77+
});
78+
79+
test('ClassMethods', () => {
80+
const code = `
81+
class MyClass {
82+
method1() {}
83+
};
84+
module.exports = MyClass;
85+
`;
86+
const ast = babelParser.parse(code);
87+
const mockCallback = jest.fn();
88+
processAst(ast, mockCallback);
89+
expect(mockCallback.mock.calls.length).toBe(2);
90+
expect(mockCallback.mock.calls[0][0]).toBe('MyClass.method1');
91+
});
92+
93+
test('anonymous arrow function added to exports', () => {
94+
const code = `
95+
const myFunc = () => {};
96+
module.exports.myFunc = myFunc;
97+
`;
98+
99+
const ast = babelParser.parse(code);
100+
const mockCallback = jest.fn();
101+
processAst(ast, mockCallback);
102+
expect(mockCallback.mock.calls.length).toBe(2);
103+
expect(mockCallback.mock.calls[1][0]).toBe('myFunc');
104+
expect(mockCallback.mock.calls[1][2]).toBe('exportObj');
105+
});
106+
107+
test('named function expression added to exports', () => {
108+
const code = `
109+
const namedFunc = function myFunc() {};
110+
module.exports.myFunc = namedFunc;
111+
`;
112+
113+
const ast = babelParser.parse(code);
114+
const mockCallback = jest.fn();
115+
processAst(ast, mockCallback);
116+
expect(mockCallback.mock.calls.length).toBe(2);
117+
expect(mockCallback.mock.calls[1][0]).toBe('myFunc');
118+
expect(mockCallback.mock.calls[1][2]).toBe('exportObj');
119+
});
120+
121+
test('export object with default', () => {
122+
const code = `
123+
function func1() {}
124+
function func2() {}
125+
export default {
126+
func1,
127+
func2
128+
};
129+
`;
130+
131+
const ast = babelParser.parse(code, { sourceType: 'module' });
132+
const mockCallback = jest.fn();
133+
processAst(ast, mockCallback);
134+
expect(mockCallback.mock.calls.length).toBe(4);
135+
expect(mockCallback.mock.calls[2][0]).toBe('func1');
136+
expect(mockCallback.mock.calls[2][2]).toBe('exportObj');
137+
expect(mockCallback.mock.calls[3][0]).toBe('func2');
138+
expect(mockCallback.mock.calls[3][2]).toBe('exportObj');
139+
});
140+
141+
test('export class with methods', () => {
142+
const code = `
143+
export class MyClass {
144+
method1() {}
145+
method2() {}
146+
}
147+
`;
148+
149+
const ast = babelParser.parse(code, { sourceType: 'module' });
150+
const mockCallback = jest.fn();
151+
processAst(ast, mockCallback);
152+
expect(mockCallback.mock.calls.length).toBe(3);
153+
expect(mockCallback.mock.calls[0][0]).toBe('MyClass');
154+
expect(mockCallback.mock.calls[0][2]).toBe('exportFnDef');
155+
expect(mockCallback.mock.calls[1][0]).toBe('MyClass.method1');
156+
expect(mockCallback.mock.calls[2][0]).toBe('MyClass.method2');
157+
});
158+
});
159+
160+
describe('processAst coverage tests', () => {
161+
const { processAst } = require('../../../../../src/utils/code.js');
162+
const babelParser = require("@babel/parser");
163+
164+
test('module exports named function expression', () => {
165+
const code = `
166+
module.exports = function namedFunc() {};
167+
`;
168+
169+
const ast = babelParser.parse(code);
170+
const mockCallback = jest.fn();
171+
processAst(ast, mockCallback);
172+
expect(mockCallback.mock.calls.length).toBe(1);
173+
expect(mockCallback.mock.calls[0][0]).toBe('namedFunc');
174+
expect(mockCallback.mock.calls[0][2]).toBe('exportFnDef');
175+
});
176+
177+
test('module.exports anonymous function', () => {
178+
const code = `
179+
module.exports = function() {};
180+
`;
181+
182+
const ast = babelParser.parse(code);
183+
const mockCallback = jest.fn();
184+
processAst(ast, mockCallback);
185+
expect(mockCallback.mock.calls.length).toBe(1);
186+
const anonFuncRegex = /^anon_func_\d+_\d+$/;
187+
expect(mockCallback.mock.calls[0][0]).toMatch(anonFuncRegex);
188+
expect(mockCallback.mock.calls[0][2]).toBe('exportFnDef');
189+
});
190+
191+
test('Export default unnamed class', () => {
192+
const code = `
193+
export default class {};
194+
`;
195+
const ast = babelParser.parse(code, { sourceType: 'module' });
196+
const mockCallback = jest.fn();
197+
processAst(ast, mockCallback);
198+
expect(mockCallback.mock.calls.length).toBe(1);
199+
expect(mockCallback.mock.calls[0][0]).toBe(undefined);
200+
expect(mockCallback.mock.calls[0][1]).toBe(null);
201+
expect(mockCallback.mock.calls[0][2]).toBe('exportFnDef');
202+
});
203+
204+
test('Export named variable declaration', () => {
205+
const code = `
206+
const func1 = () => {};
207+
export { func1 };
208+
`;
209+
const ast = babelParser.parse(code, { sourceType: 'module' });
210+
const mockCallback = jest.fn();
211+
processAst(ast, mockCallback);
212+
expect(mockCallback.mock.calls.length).toBe(2);
213+
expect(mockCallback.mock.calls[1][0]).toBe('func1');
214+
expect(mockCallback.mock.calls[1][1]).toBe(null);
215+
expect(mockCallback.mock.calls[1][2]).toBe('exportObj');
216+
});
217+
218+
});

0 commit comments

Comments
 (0)