Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
80668 views
1
/**
2
* Copyright (c) 2014, Facebook, Inc. All rights reserved.
3
*
4
* This source code is licensed under the BSD-style license found in the
5
* LICENSE file in the root directory of this source tree. An additional grant
6
* of patent rights can be found in the PATENTS file in the same directory.
7
*/
8
'use strict';
9
10
jest.autoMockOff();
11
12
var path = require('path');
13
var q = require('q');
14
var utils = require('../../lib/utils');
15
16
describe('HasteModuleLoader', function() {
17
var HasteModuleLoader;
18
var mockEnvironment;
19
var resourceMap;
20
21
var CONFIG = utils.normalizeConfig({
22
name: 'HasteModuleLoader-tests',
23
rootDir: path.join(__dirname, 'test_root')
24
});
25
26
function buildLoader() {
27
if (!resourceMap) {
28
return HasteModuleLoader.loadResourceMap(CONFIG).then(function(map) {
29
resourceMap = map;
30
return buildLoader();
31
});
32
} else {
33
return q(new HasteModuleLoader(CONFIG, mockEnvironment, resourceMap));
34
}
35
}
36
37
beforeEach(function() {
38
HasteModuleLoader = require('../HasteModuleLoader');
39
40
mockEnvironment = {
41
global: {
42
console: {},
43
mockClearTimers: jest.genMockFn(),
44
JSON: JSON
45
},
46
runSourceText: jest.genMockFn().mockImplementation(function(codeStr) {
47
/* jshint evil:true */
48
return (new Function('return ' + codeStr))();
49
})
50
};
51
});
52
53
describe('requireModule', function() {
54
pit('finds @providesModule modules', function() {
55
return buildLoader().then(function(loader) {
56
var exports = loader.requireModule(null, 'RegularModule');
57
expect(exports.isRealModule).toBe(true);
58
});
59
});
60
61
pit('throws on non-existant @providesModule modules', function() {
62
return buildLoader().then(function(loader) {
63
expect(function() {
64
loader.requireModule(null, 'DoesntExist');
65
}).toThrow('Cannot find module \'DoesntExist\' from \'.\'');
66
});
67
});
68
69
pit('finds relative-path modules without file extension', function() {
70
return buildLoader().then(function(loader) {
71
var exports = loader.requireModule(
72
__filename,
73
'./test_root/RegularModule'
74
);
75
expect(exports.isRealModule).toBe(true);
76
});
77
});
78
79
pit('finds relative-path modules with file extension', function() {
80
return buildLoader().then(function(loader) {
81
var exports = loader.requireModule(
82
__filename,
83
'./test_root/RegularModule.js'
84
);
85
expect(exports.isRealModule).toBe(true);
86
});
87
});
88
89
pit('throws on non-existant relative-path modules', function() {
90
return buildLoader().then(function(loader) {
91
expect(function() {
92
loader.requireModule(__filename, './DoesntExist');
93
}).toThrow(
94
'Cannot find module \'./DoesntExist\' from \'' + __filename + '\''
95
);
96
});
97
});
98
99
pit('finds node core built-in modules', function() {
100
return buildLoader().then(function(loader) {
101
expect(function() {
102
loader.requireModule(null, 'fs');
103
}).not.toThrow();
104
});
105
});
106
107
pit('finds and loads JSON files without file extension', function() {
108
return buildLoader().then(function(loader) {
109
var exports = loader.requireModule(__filename, './test_root/JSONFile');
110
expect(exports.isJSONModule).toBe(true);
111
});
112
});
113
114
pit('finds and loads JSON files with file extension', function() {
115
return buildLoader().then(function(loader) {
116
var exports = loader.requireModule(
117
__filename,
118
'./test_root/JSONFile.json'
119
);
120
expect(exports.isJSONModule).toBe(true);
121
});
122
});
123
124
pit('requires a JSON file twice successfully', function() {
125
return buildLoader().then(function(loader) {
126
var exports1 = loader.requireModule(
127
__filename,
128
'./test_root/JSONFile.json'
129
);
130
var exports2 = loader.requireModule(
131
__filename,
132
'./test_root/JSONFile.json'
133
);
134
expect(exports1.isJSONModule).toBe(true);
135
expect(exports2.isJSONModule).toBe(true);
136
expect(exports1).toBe(exports2);
137
});
138
});
139
140
describe('features I want to remove, but must exist for now', function() {
141
/**
142
* I'd like to kill this and make all tests use something more explicit
143
* when they want a manual mock, like:
144
*
145
* require.mock('MyManualMock');
146
* var ManuallyMocked = require('ManuallyMocked');
147
*
148
* --or--
149
*
150
* var ManuallyMocked = require.manualMock('ManuallyMocked');
151
*
152
* For now, however, this is built-in and many tests rely on it, so we
153
* must support it until we can do some cleanup.
154
*/
155
pit('provides manual mock when real module doesnt exist', function() {
156
return buildLoader().then(function(loader) {
157
var exports = loader.requireModule(
158
__filename,
159
'ExclusivelyManualMock'
160
);
161
expect(exports.isExclusivelyManualMockModule).toBe(true);
162
});
163
});
164
165
/**
166
* requireModule() should *always* return the real module. Mocks should
167
* only be returned by requireMock().
168
*
169
* See the 'overrides real modules with manual mock when one exists' test
170
* for more info on why I want to kill this feature.
171
*/
172
pit('doesnt override real modules with manual mocks when explicitly ' +
173
'marked with .dontMock()', function() {
174
return buildLoader().then(function(loader) {
175
loader.requireModule(__filename, 'jest-runtime')
176
.dontMock('ManuallyMocked');
177
178
var exports = loader.requireModule(__filename, 'ManuallyMocked');
179
expect(exports.isManualMockModule).toBe(false);
180
});
181
});
182
183
/**
184
* This test is only in this section because it seems sketchy to be able
185
* to load up a module without pulling it from the registry. I need to do
186
* more investigation to understand the reasoning behind this before I
187
* declare it unnecessary and condemn it.
188
*/
189
pit('doesnt read from the module registry when bypassModuleRegistry is ' +
190
'set', function() {
191
return buildLoader().then(function(loader) {
192
var registryExports = loader.requireModule(
193
__filename,
194
'RegularModule'
195
);
196
registryExports.setModuleStateValue('registry');
197
198
var bypassedExports = loader.requireModule(
199
__filename,
200
'RegularModule',
201
true
202
);
203
expect(bypassedExports.getModuleStateValue()).not.toBe('registry');
204
});
205
});
206
207
pit('doesnt write to the module registry when bypassModuleRegistry is ' +
208
'set', function() {
209
return buildLoader().then(function(loader) {
210
var registryExports = loader.requireModule(
211
__filename,
212
'RegularModule'
213
);
214
registryExports.setModuleStateValue('registry');
215
216
var bypassedExports = loader.requireModule(
217
__filename,
218
'RegularModule',
219
true
220
);
221
bypassedExports.setModuleStateValue('bypassed');
222
223
expect(registryExports.getModuleStateValue()).toBe('registry');
224
});
225
});
226
});
227
});
228
});
229
230