Removing automatically reset modules between test run

Reviewed By: bestander

Differential Revision: D3886125

fbshipit-source-id: c8f47c3466add1e2c89649a1c6f47b01f0d7a89e
This commit is contained in:
Cristian Carlesso 2016-09-19 12:30:50 -07:00 committed by Facebook Github Bot 3
parent d41c3950eb
commit 7b2080e118
9 changed files with 717 additions and 657 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1,3 +1,12 @@
/**
* Copyright (c) 2013-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
'use strict'; 'use strict';
jest.autoMockOff(); jest.autoMockOff();
@ -6,7 +15,9 @@ const getProjectDependencies = require('../getProjectDependencies');
const path = require('path'); const path = require('path');
describe('getProjectDependencies', () => { describe('getProjectDependencies', () => {
beforeEach(() => {
jest.resetModules();
});
it('should return an array of project dependencies', () => { it('should return an array of project dependencies', () => {
jest.setMock( jest.setMock(
path.join(process.cwd(), './package.json'), path.join(process.cwd(), './package.json'),

View File

@ -21,6 +21,7 @@ jest.setMock(
describe('link', () => { describe('link', () => {
beforeEach(() => { beforeEach(() => {
jest.resetModules();
delete require.cache[require.resolve('../link')]; delete require.cache[require.resolve('../link')];
log.level = 'silent'; log.level = 'silent';
}); });

View File

@ -17,7 +17,6 @@
"jestSupport/env.js" "jestSupport/env.js"
], ],
"timers": "fake", "timers": "fake",
"resetModules": true,
"moduleNameMapper": { "moduleNameMapper": {
"^image![a-zA-Z0-9$_-]+$": "GlobalImageStub", "^image![a-zA-Z0-9$_-]+$": "GlobalImageStub",
"^[./a-zA-Z0-9$_-]+\\.png$": "RelativeImageStub" "^[./a-zA-Z0-9$_-]+\\.png$": "RelativeImageStub"

View File

@ -21,6 +21,7 @@ describe('code transformation worker:', () => {
let extractDependencies, transform; let extractDependencies, transform;
beforeEach(() => { beforeEach(() => {
jest.resetModules();
({transformCode} = require('..')); ({transformCode} = require('..'));
extractDependencies = extractDependencies =
require('../extract-dependencies').mockReturnValue({}); require('../extract-dependencies').mockReturnValue({});
@ -58,18 +59,22 @@ describe('code transformation worker:', () => {
}); });
}); });
it('removes the leading assignment to `module.exports` before passing on the result if the file is a JSON file, even if minified', done => { it(
const result = { 'removes the leading assignment to `module.exports` before passing ' +
code: 'p.exports={a:1,b:2}', 'on the result if the file is a JSON file, even if minified',
}; done => {
transform.mockImplementation((_, callback) => const result = {
callback(null, result)); code: 'p.exports={a:1,b:2}',
};
transform.mockImplementation((_, callback) =>
callback(null, result));
transformCode(transform, 'aribtrary/file.json', 'b', {}, (_, data) => { transformCode(transform, 'aribtrary/file.json', 'b', {}, (_, data) => {
expect(data.code).toBe('{a:1,b:2}'); expect(data.code).toBe('{a:1,b:2}');
done(); done();
}); });
}); }
);
it('removes shebang when present', done => { it('removes shebang when present', done => {
const shebang = '#!/usr/bin/env node'; const shebang = '#!/usr/bin/env node';
@ -110,35 +115,51 @@ describe('code transformation worker:', () => {
}); });
}); });
it('uses `dependencies` and `dependencyOffsets` provided by `extractDependencies` for the result', done => { it(
const dependencyData = { 'uses `dependencies` and `dependencyOffsets` ' +
dependencies: ['arbitrary', 'list', 'of', 'dependencies'], 'provided by `extractDependencies` for the result',
dependencyOffsets: [12, 119, 185, 328, 471], done => {
}; const dependencyData = {
extractDependencies.mockReturnValue(dependencyData); dependencies: ['arbitrary', 'list', 'of', 'dependencies'],
dependencyOffsets: [12, 119, 185, 328, 471],
};
extractDependencies.mockReturnValue(dependencyData);
transformCode(transform, 'filename', 'code', {}, (_, data) => { transformCode(transform, 'filename', 'code', {}, (_, data) => {
expect(data).toEqual(objectContaining(dependencyData)); expect(data).toEqual(objectContaining(dependencyData));
done(); done();
}); });
}); }
);
it('does not extract requires if files are marked as "extern"', done => { it('does not extract requires if files are marked as "extern"', done => {
transformCode(transform, 'filename', 'code', {extern: true}, (_, {dependencies, dependencyOffsets}) => { transformCode(
expect(extractDependencies).not.toBeCalled(); transform,
expect(dependencies).toEqual([]); 'filename',
expect(dependencyOffsets).toEqual([]); 'code',
done(); {extern: true},
}); (_, {dependencies, dependencyOffsets}) => {
expect(extractDependencies).not.toBeCalled();
expect(dependencies).toEqual([]);
expect(dependencyOffsets).toEqual([]);
done();
}
);
}); });
it('does not extract requires of JSON files', done => { it('does not extract requires of JSON files', done => {
transformCode(transform, 'arbitrary.json', '{"arbitrary":"json"}', {}, (_, {dependencies, dependencyOffsets}) => { transformCode(
expect(extractDependencies).not.toBeCalled(); transform,
expect(dependencies).toEqual([]); 'arbitrary.json',
expect(dependencyOffsets).toEqual([]); '{"arbitrary":"json"}',
done(); {},
}); (_, {dependencies, dependencyOffsets}) => {
expect(extractDependencies).not.toBeCalled();
expect(dependencies).toEqual([]);
expect(dependencyOffsets).toEqual([]);
done();
}
);
}); });
}); });

View File

@ -26,6 +26,7 @@ let FileWatcher;
describe('processRequest', () => { describe('processRequest', () => {
let SourceMapConsumer, Bundler, Server, AssetServer, Promise; let SourceMapConsumer, Bundler, Server, AssetServer, Promise;
beforeEach(() => { beforeEach(() => {
jest.resetModules();
SourceMapConsumer = require('source-map').SourceMapConsumer; SourceMapConsumer = require('source-map').SourceMapConsumer;
Bundler = require('../../Bundler'); Bundler = require('../../Bundler');
Server = require('../'); Server = require('../');
@ -253,52 +254,55 @@ describe('processRequest', () => {
jest.runAllTicks(); jest.runAllTicks();
}); });
it('does not rebuild the bundles that contain a file when that file is changed, even when hot loading is enabled', () => { it(
const bundleFunc = jest.fn(); 'does not rebuild the bundles that contain a file ' +
bundleFunc 'when that file is changed, even when hot loading is enabled',
.mockReturnValueOnce( () => {
Promise.resolve({ const bundleFunc = jest.fn();
getSource: () => 'this is the first source', bundleFunc
getSourceMap: () => {}, .mockReturnValueOnce(
getEtag: () => () => 'this is an etag', Promise.resolve({
}) getSource: () => 'this is the first source',
) getSourceMap: () => {},
.mockReturnValue( getEtag: () => () => 'this is an etag',
Promise.resolve({ })
getSource: () => 'this is the rebuilt source', )
getSourceMap: () => {}, .mockReturnValue(
getEtag: () => () => 'this is an etag', Promise.resolve({
}) getSource: () => 'this is the rebuilt source',
); getSourceMap: () => {},
getEtag: () => () => 'this is an etag',
})
);
Bundler.prototype.bundle = bundleFunc; Bundler.prototype.bundle = bundleFunc;
server = new Server(options); server = new Server(options);
server.setHMRFileChangeListener(() => {}); server.setHMRFileChangeListener(() => {});
requestHandler = server.processRequest.bind(server); requestHandler = server.processRequest.bind(server);
makeRequest(requestHandler, 'mybundle.bundle?runModule=true') makeRequest(requestHandler, 'mybundle.bundle?runModule=true')
.done(response => { .done(response => {
expect(response.body).toEqual('this is the first source'); expect(response.body).toEqual('this is the first source');
expect(bundleFunc.mock.calls.length).toBe(1); expect(bundleFunc.mock.calls.length).toBe(1);
}); });
jest.runAllTicks(); jest.runAllTicks();
triggerFileChange('all','path/file.js', options.projectRoots[0]); triggerFileChange('all','path/file.js', options.projectRoots[0]);
jest.runAllTimers(); jest.runAllTimers();
jest.runAllTicks(); jest.runAllTicks();
expect(bundleFunc.mock.calls.length).toBe(1); expect(bundleFunc.mock.calls.length).toBe(1);
server.setHMRFileChangeListener(null); server.setHMRFileChangeListener(null);
makeRequest(requestHandler, 'mybundle.bundle?runModule=true') makeRequest(requestHandler, 'mybundle.bundle?runModule=true')
.done(response => { .done(response => {
expect(response.body).toEqual('this is the rebuilt source'); expect(response.body).toEqual('this is the rebuilt source');
expect(bundleFunc.mock.calls.length).toBe(2); expect(bundleFunc.mock.calls.length).toBe(2);
}); });
jest.runAllTicks(); jest.runAllTicks();
}); });
}); });
@ -382,7 +386,10 @@ describe('processRequest', () => {
server.processRequest(req, res); server.processRequest(req, res);
jest.runAllTimers(); jest.runAllTimers();
expect(AssetServer.prototype.get).toBeCalledWith('imgs/主页/logo.png', undefined); expect(AssetServer.prototype.get).toBeCalledWith(
'imgs/\u{4E3B}\u{9875}/logo.png',
undefined
);
expect(res.setHeader).toBeCalledWith('Cache-Control', 'max-age=31536000'); expect(res.setHeader).toBeCalledWith('Cache-Control', 'max-age=31536000');
expect(res.end).toBeCalledWith('i am image'); expect(res.end).toBeCalledWith('i am image');
}); });

View File

@ -22,6 +22,7 @@ describe('FileWatcher', () => {
let config; let config;
beforeEach(() => { beforeEach(() => {
jest.resetModules();
const sane = require('sane'); const sane = require('sane');
WatchmanWatcher = sane.WatchmanWatcher; WatchmanWatcher = sane.WatchmanWatcher;
WatchmanWatcher.prototype.once.mockImplementation( WatchmanWatcher.prototype.once.mockImplementation(

View File

@ -40,6 +40,8 @@ describe('DependencyGraph', function() {
} }
beforeEach(function() { beforeEach(function() {
jest.resetModules();
Module = require('../Module'); Module = require('../Module');
const fileWatcher = { const fileWatcher = {
on: function() { on: function() {
@ -245,7 +247,7 @@ describe('DependencyGraph', function() {
...defaults, ...defaults,
roots: [root], roots: [root],
}); });
return getOrderedDependenciesAsJSON(dgraph, '/root/index.js', null, false).then(function(deps) { return getOrderedDependenciesAsJSON(dgraph, '/root/index.js', null, false).then((deps) => {
expect(deps) expect(deps)
.toEqual([ .toEqual([
{ {
@ -1918,7 +1920,7 @@ describe('DependencyGraph', function() {
}); });
}); });
pit('should support browser mapping of a package to a file ("' + fieldName + '")', function() { pit('should support browser mapping of a package to a file ("' + fieldName + '")', () => {
var root = '/root'; var root = '/root';
setMockFileSystem({ setMockFileSystem({
'root': { 'root': {
@ -2337,7 +2339,8 @@ describe('DependencyGraph', function() {
'node-package-c': 'rn-package-c', 'node-package-c': 'rn-package-c',
}, },
}), }),
'index.js': 'require("node-package-a"); require("node-package-b"); require("node-package-c");', 'index.js':
'require("node-package-a"); require("node-package-b"); require("node-package-c");',
'node_modules': { 'node_modules': {
'node-package-a': { 'node-package-a': {
'package.json': JSON.stringify({ 'package.json': JSON.stringify({
@ -2510,50 +2513,53 @@ describe('DependencyGraph', function() {
}); });
}); });
pit('should only use `extraNodeModules` after checking all possible filesystem locations', () => { pit(
const root = '/root'; 'should only use `extraNodeModules` after checking all possible filesystem locations',
setMockFileSystem({ () => {
[root.slice(1)]: { const root = '/root';
'index.js': 'require("bar")', setMockFileSystem({
'node_modules': { 'bar.js': '' }, [root.slice(1)]: {
'provides-bar': { 'index.js': '' }, 'index.js': 'require("bar")',
}, 'node_modules': { 'bar.js': '' },
}); 'provides-bar': { 'index.js': '' },
},
});
var dgraph = new DependencyGraph({ var dgraph = new DependencyGraph({
...defaults, ...defaults,
roots: [root], roots: [root],
extraNodeModules: { extraNodeModules: {
'bar': root + '/provides-bar', 'bar': root + '/provides-bar',
}, },
}); });
return getOrderedDependenciesAsJSON(dgraph, '/root/index.js').then(deps => { return getOrderedDependenciesAsJSON(dgraph, '/root/index.js').then(deps => {
expect(deps) expect(deps)
.toEqual([ .toEqual([
{ {
id: '/root/index.js', id: '/root/index.js',
path: '/root/index.js', path: '/root/index.js',
dependencies: ['bar'], dependencies: ['bar'],
isAsset: false, isAsset: false,
isAsset_DEPRECATED: false, isAsset_DEPRECATED: false,
isJSON: false, isJSON: false,
isPolyfill: false, isPolyfill: false,
resolution: undefined, resolution: undefined,
}, },
{ {
id: '/root/node_modules/bar.js', id: '/root/node_modules/bar.js',
path: '/root/node_modules/bar.js', path: '/root/node_modules/bar.js',
dependencies: [], dependencies: [],
isAsset: false, isAsset: false,
isAsset_DEPRECATED: false, isAsset_DEPRECATED: false,
isJSON: false, isJSON: false,
isPolyfill: false, isPolyfill: false,
resolution: undefined, resolution: undefined,
}, },
]); ]);
}); });
}); }
);
pit('should be able to resolve paths within `extraNodeModules`', () => { pit('should be able to resolve paths within `extraNodeModules`', () => {
const root = '/root'; const root = '/root';

View File

@ -1,3 +1,12 @@
/**
* Copyright (c) 2013-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
// Copyright Joyent, Inc. and other Node contributors. // Copyright Joyent, Inc. and other Node contributors.
// //
// Permission is hereby granted, free of charge, to any person obtaining a // Permission is hereby granted, free of charge, to any person obtaining a
@ -50,6 +59,7 @@ describe('fast-path', () => {
}; };
beforeEach(function() { beforeEach(function() {
jest.resetModules();
process.platform = 'linux'; process.platform = 'linux';
}); });