Skip to content

Commit

Permalink
fix: allow json file as manual mock (#8159)
Browse files Browse the repository at this point in the history
  • Loading branch information
SimenB committed Mar 19, 2019
1 parent e04b034 commit aefa1eb
Show file tree
Hide file tree
Showing 7 changed files with 83 additions and 16 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Expand Up @@ -10,6 +10,7 @@
- `[jest-changed-files]` Change method of obtaining git root ([#8052](https://github.com/facebook/jest/pull/8052))
- `[jest-each]` Fix test function type ([#8145](https://github.com/facebook/jest/pull/8145))
- `[jest-fake-timers]` `getTimerCount` not taking immediates and ticks into account ([#8139](https://github.com/facebook/jest/pull/8139))
- `[jest-runtime]` Allow json file as manual mock ([#8159](https://github.com/facebook/jest/pull/8159))
- `[pretty-format]` Print `BigInt` as a readable number instead of `{}` ([#8138](https://github.com/facebook/jest/pull/8138))

### Chore & Maintenance
Expand Down
3 changes: 3 additions & 0 deletions e2e/mock-json/__mocks__/data.json
@@ -0,0 +1,3 @@
{
"foo": "bar"
}
18 changes: 18 additions & 0 deletions e2e/mock-json/__tests__/index.js
@@ -0,0 +1,18 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/

'use strict';

jest.mock('../data.json');

const extractData = require('../');

describe('extractData', () => {
it('should read the data', () => {
expect(extractData()).toEqual(['foo']);
});
});
3 changes: 3 additions & 0 deletions e2e/mock-json/data.json
@@ -0,0 +1,3 @@
{
"real": "data"
}
14 changes: 14 additions & 0 deletions e2e/mock-json/index.js
@@ -0,0 +1,14 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/

const data = require('./data.json');

function extractData() {
return Object.keys(data);
}

module.exports = extractData;
5 changes: 5 additions & 0 deletions e2e/mock-json/package.json
@@ -0,0 +1,5 @@
{
"jest": {
"testEnvironment": "node"
}
}
55 changes: 39 additions & 16 deletions packages/jest-runtime/src/index.ts
Expand Up @@ -341,19 +341,15 @@ class Runtime {
loaded: false,
};
moduleRegistry[modulePath] = localModule;
if (path.extname(modulePath) === '.json') {
localModule.exports = this._environment.global.JSON.parse(
stripBOM(fs.readFileSync(modulePath, 'utf8')),
);
} else if (path.extname(modulePath) === '.node') {
localModule.exports = require(modulePath);
} else {
// Only include the fromPath if a moduleName is given. Else treat as root.
const fromPath = moduleName ? from : null;
this._execModule(localModule, options, moduleRegistry, fromPath);
}

localModule.loaded = true;
this._loadModule(
localModule,
from,
moduleName,
modulePath,
options,
moduleRegistry,
);
}
return moduleRegistry[modulePath].exports;
}
Expand Down Expand Up @@ -430,11 +426,16 @@ class Runtime {
loaded: false,
};

// Only include the fromPath if a moduleName is given. Else treat as root.
const fromPath = moduleName ? from : null;
this._execModule(localModule, undefined, mockRegistry, fromPath);
this._loadModule(
localModule,
from,
moduleName,
modulePath,
undefined,
mockRegistry,
);

mockRegistry[moduleID] = localModule.exports;
localModule.loaded = true;
} else {
// Look for a real module to generate an automock from
mockRegistry[moduleID] = this._generateMock(from, moduleName);
Expand All @@ -443,6 +444,28 @@ class Runtime {
return mockRegistry[moduleID];
}

private _loadModule(
localModule: InitialModule,
from: Config.Path,
moduleName: string | undefined,
modulePath: Config.Path,
options: InternalModuleOptions | undefined,
moduleRegistry: ModuleRegistry,
) {
if (path.extname(modulePath) === '.json') {
localModule.exports = this._environment.global.JSON.parse(
stripBOM(fs.readFileSync(modulePath, 'utf8')),
);
} else if (path.extname(modulePath) === '.node') {
localModule.exports = require(modulePath);
} else {
// Only include the fromPath if a moduleName is given. Else treat as root.
const fromPath = moduleName ? from : null;
this._execModule(localModule, options, moduleRegistry, fromPath);
}
localModule.loaded = true;
}

requireModuleOrMock(from: Config.Path, moduleName: string) {
try {
if (this._shouldMock(from, moduleName)) {
Expand Down

0 comments on commit aefa1eb

Please sign in to comment.