From 7c26305d4f00470316fcf38e17f4b72c0af881fa Mon Sep 17 00:00:00 2001 From: Tim Seckinger Date: Sat, 19 Jan 2019 16:46:37 +0100 Subject: [PATCH] Fix automock for numeric function names (#7653) --- CHANGELOG.md | 1 + .../jest-mock/src/__tests__/jest_mock.test.js | 35 ++++++++++--------- packages/jest-mock/src/index.js | 10 ++++-- 3 files changed, 27 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3842cf0ae463..75104aa76199 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -53,6 +53,7 @@ ### Fixes +- `[jest-mock]` Fix automock for numeric function names ([#7653](https://github.com/facebook/jest/pull/7653)) - `[jest-config]` Ensure `existsSync` is only called with a string parameter ([#7607](https://github.com/facebook/jest/pull/7607)) - `[expect]` `toStrictEqual` considers sparseness of arrays. ([#7591](https://github.com/facebook/jest/pull/7591)) - `[jest-cli]` Fix empty coverage data for untested files ([#7388](https://github.com/facebook/jest/pull/7388)) diff --git a/packages/jest-mock/src/__tests__/jest_mock.test.js b/packages/jest-mock/src/__tests__/jest_mock.test.js index 432023561f83..bd38cb281806 100644 --- a/packages/jest-mock/src/__tests__/jest_mock.test.js +++ b/packages/jest-mock/src/__tests__/jest_mock.test.js @@ -70,7 +70,7 @@ describe('moduleMocker', () => { expect(mock.name).toBe('foo'); }); - it('escapes illegal characters in function name property', () => { + it('fixes illegal function name properties', () => { function getMockFnWithOriginalName(name) { const fn = () => {}; Object.defineProperty(fn, 'name', {value: name}); @@ -78,21 +78,12 @@ describe('moduleMocker', () => { return moduleMocker.generateFromMetadata(moduleMocker.getMetadata(fn)); } - expect( - getMockFnWithOriginalName('foo-bar').name === 'foo$bar', - ).toBeTruthy(); - expect( - getMockFnWithOriginalName('foo-bar-2').name === 'foo$bar$2', - ).toBeTruthy(); - expect( - getMockFnWithOriginalName('foo-bar-3').name === 'foo$bar$3', - ).toBeTruthy(); - expect( - getMockFnWithOriginalName('foo/bar').name === 'foo$bar', - ).toBeTruthy(); - expect( - getMockFnWithOriginalName('foo𠮷bar').name === 'foo𠮷bar', - ).toBeTruthy(); + expect(getMockFnWithOriginalName('1').name).toBe('$1'); + expect(getMockFnWithOriginalName('foo-bar').name).toBe('foo$bar'); + expect(getMockFnWithOriginalName('foo-bar-2').name).toBe('foo$bar$2'); + expect(getMockFnWithOriginalName('foo-bar-3').name).toBe('foo$bar$3'); + expect(getMockFnWithOriginalName('foo/bar').name).toBe('foo$bar'); + expect(getMockFnWithOriginalName('foo𠮷bar').name).toBe('foo𠮷bar'); }); it('special cases the mockConstructor name', () => { @@ -348,6 +339,18 @@ describe('moduleMocker', () => { ).not.toThrow(); }); + it('mocks functions with numeric names', () => { + const obj = { + 1: () => {}, + }; + + const objMock = moduleMocker.generateFromMetadata( + moduleMocker.getMetadata(obj), + ); + + expect(typeof objMock[1]).toBe('function'); + }); + describe('mocked functions', () => { it('tracks calls to mocks', () => { const fn = moduleMocker.fn(); diff --git a/packages/jest-mock/src/index.js b/packages/jest-mock/src/index.js index de67933b542f..4424fbc88bf7 100644 --- a/packages/jest-mock/src/index.js +++ b/packages/jest-mock/src/index.js @@ -623,9 +623,13 @@ class ModuleMockerClass { return mockConstructor; } - // It's a syntax error to define functions with a reserved keyword - // as name. - if (RESERVED_KEYWORDS[name]) { + if ( + // It's a syntax error to define functions with a reserved keyword + // as name. + RESERVED_KEYWORDS[name] || + // It's also a syntax error to define functions with a name that starts with a number + /^\d/.test(name) + ) { name = '$' + name; }